+ + + + View Source + + + Plausible.Teams.Adapter.Read.Invitations + (Plausible v0.0.1) + +
+ + +Transition adapter for new schema reads
+From ed60dddd9d9261570fcf4e301bcda61d1498401f Mon Sep 17 00:00:00 2001
From: "github-merge-queue[bot]"
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -261,54 +261,54 @@ a configuredExamples
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
@@ -369,95 +369,95 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
@@ -502,92 +502,92 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html
index d776a03176..328dde4774 100644
--- a/Plausible.Cldr.Currency.html
+++ b/Plausible.Cldr.Currency.html
@@ -14,7 +14,7 @@
-
+
@@ -419,11 +419,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -433,12 +433,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -448,7 +448,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -499,11 +499,11 @@ The default is :all
. See Example
MyApp.Cldr.Currency.currencies_for_locale!("en")
- => %{
FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -513,12 +513,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -528,7 +528,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -586,13 +586,13 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -600,15 +600,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -616,7 +616,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -675,12 +675,12 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -688,14 +688,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -703,7 +703,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -744,15 +744,15 @@ or a
Examples
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
-iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
+iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
:GBP
@@ -796,14 +796,14 @@ or a
Example
-iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
+{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -862,9 +862,9 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings("en")
-=> {:ok,
- %{
+MyApp.Cldr.Currency.currency_strings("en")
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -874,7 +874,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
@@ -933,8 +933,8 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings!("en")
-=> %{
+MyApp.Cldr.Currency.currency_strings!("en")
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -944,7 +944,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ }
@@ -982,10 +982,10 @@ or a
Example
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
:USD
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
:AUD
@@ -1033,7 +1033,7 @@ mapping is returned for that territory.Example
-iex> Plausible.Cldr.Currency.current_territory_currencies()
+iex> Plausible.Cldr.Currency.current_territory_currencies()
@@ -1125,11 +1125,11 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code("AUD")
-{:ok, :AUD}
+iex> Plausible.Cldr.Currency.known_currency_code("AUD")
+{:ok, :AUD}
-iex> Plausible.Cldr.Currency.known_currency_code("GGG")
-{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
+iex> Plausible.Cldr.Currency.known_currency_code("GGG")
+{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
@@ -1176,13 +1176,13 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
+iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
true
-iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
+iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
false
-iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
+iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
false
@@ -1217,7 +1217,7 @@ currency codeExample
-iex> Plausible.Cldr.Currency.known_currency_codes()
+iex> Plausible.Cldr.Currency.known_currency_codes()
@@ -1276,14 +1276,14 @@ such as 0.05
. Optional.Example
-iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1293,11 +1293,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
@@ -1355,20 +1355,20 @@ default is Plaus
Examples
-iex> Plausible.Cldr.Currency.pluralize(1, :USD)
-{:ok, "US dollar"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD)
+{:ok, "US dollar"}
-iex> Plausible.Cldr.Currency.pluralize(3, :USD)
-{:ok, "US dollars"}
+iex> Plausible.Cldr.Currency.pluralize(3, :USD)
+{:ok, "US dollars"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
-{:ok, "美元"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
+{:ok, "美元"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
-{:ok, "dollars des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
+{:ok, "dollars des États-Unis"}
-iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
-{:ok, "dollar des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
+{:ok, "dollar des États-Unis"}
@@ -1410,8 +1410,8 @@ or a
Example
-iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
-["a$", "australian dollars", "aud", "australian dollar"]
+iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
+["a$", "australian dollars", "aud", "australian dollar"]
diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html
index 2e38407610..59f1636708 100644
--- a/Plausible.Cldr.Locale.html
+++ b/Plausible.Cldr.Locale.html
@@ -14,7 +14,7 @@
-
+
@@ -326,16 +326,16 @@ this specific locale..Examples
-iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
@@ -389,20 +389,20 @@ this specific locale.Examples
-Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
@@ -533,15 +533,15 @@ generic top-level domain names.Examples
iex> Plausible.Cldr.Locale.locale_from_host "a.b.com.au"
-Elixir.Plausible.Cldr.validate_locale(:"en-AU")
+Elixir.Plausible.Cldr.validate_locale(:"en-AU")
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
@@ -683,12 +683,12 @@ be a territory.Examples
-iex> Cldr.Locale.territory_from_host("a.b.com.au")
-{:ok, :AU}
+iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
diff --git a/Plausible.Cldr.Number.Cardinal.html b/Plausible.Cldr.Number.Cardinal.html
index 53f7bee1ea..0a3368d247 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -14,7 +14,7 @@
-
+
@@ -461,31 +461,31 @@ The valid substitution keys are :zero
, Examples
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Format.html b/Plausible.Cldr.Number.Format.html
index eb5cfc8bba..5d5022bb61 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -14,7 +14,7 @@
-
+
@@ -465,7 +465,7 @@ to precompile all the known formats at compile time.Example
#=> Plausible.Cldr.Number.Format.Format.decimal_format_list
-["#", "#,##,##0%",
+["#", "#,##,##0%",
"#,##,##0.###", "#,##,##0.00¤", "#,##,##0.00¤;(#,##,##0.00¤)",
"#,##,##0 %", "#,##0%", "#,##0.###", "#,##0.00 ¤",
"#,##0.00 ¤;(#,##0.00 ¤)", "#,##0.00¤", "#,##0.00¤;(#,##0.00¤)",
@@ -475,7 +475,7 @@ to precompile all the known formats at compile time."000 B ¤"
, "000 E ¤", "000 K ¤", "000 MRD ¤", "000 Md ¤", "000 Mio'.' ¤",
"000 Mio ¤", "000 Mld ¤", "000 Mln ¤", "000 Mn ¤", "000 Mrd'.' ¤",
"000 Mrd ¤", "000 Mr ¤", "000 M ¤", "000 NT ¤", "000 N ¤", "000 Tn ¤",
-"000 Tr ¤", ...]
+"000 Tr ¤", ...]
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -532,7 +532,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, Examples
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.PluralRule.Range.html b/Plausible.Cldr.Number.PluralRule.Range.html
index 0916992ada..2d13b525e5 100644
--- a/Plausible.Cldr.Number.PluralRule.Range.html
+++ b/Plausible.Cldr.Number.PluralRule.Range.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index 9de1c85228..3bca8ab2ed 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -14,7 +14,7 @@
-
+
@@ -378,9 +378,9 @@ is Plausible.Cld
Example:
-iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
- latn: %Cldr.Number.Symbol{
+iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+ latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -393,8 +393,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -407,8 +407,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- }
- }}
+ }
+ }}
diff --git a/Plausible.Cldr.Number.System.html b/Plausible.Cldr.Number.System.html
index f953b263ec..6c1f55c0bd 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -14,7 +14,7 @@
-
+
@@ -317,23 +317,23 @@ it is returned as is.Examples
iex> Plausible.Cldr.Number.System.number_system_for "th", :latn
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :default
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "he", :traditional
-{:ok, %{rules: "hebrew", type: :algorithmic}}
+{:ok, %{rules: "hebrew", type: :algorithmic}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :native
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :finance
-{
+{
:error,
- {Cldr.UnknownNumberSystemError,
- "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
-}
+ {Cldr.UnknownNumberSystemError,
+ "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
+}
@@ -424,10 +424,10 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_system_names_for "en"
-{:ok, [:latn]}
+{:ok, [:latn]}
iex> Plausible.Cldr.Number.System.number_system_names_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -509,13 +509,13 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_systems_for "en"
-{:ok, %{default: :latn, native: :latn}}
+{:ok, %{default: :latn, native: :latn}}
iex> Plausible.Cldr.Number.System.number_systems_for "th"
-{:ok, %{default: :latn, native: :thai}}
+{:ok, %{default: :latn, native: :thai}}
iex> Plausible.Cldr.Number.System.number_systems_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -614,20 +614,20 @@ actual system name.Examples
-ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
-{:ok, :latn}
+ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
+{
:error,
- {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
-}
Note that return value is not guaranteed to be a valid
+
{Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
+}
Note that return value is not guaranteed to be a valid
number system for the given locale as demonstrated in the third example.
@@ -674,16 +674,16 @@ is recommended.Examples
iex> Plausible.Cldr.Number.System.to_system 123456, :hebr
-{:ok, "קכ״ג׳תנ״ו"}
+{:ok, "קכ״ג׳תנ״ו"}
iex> Plausible.Cldr.Number.System.to_system 123, :hans
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hant
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hansfin
-{:ok, "壹佰贰拾叁"}
+{:ok, "壹佰贰拾叁"}
To configure these transliteration pairs, add the to the use Cldr
configuration
-in a backend module:
defmodule MyApp.Cldr do
+in a backend module:defmodule MyApp.Cldr do
use Cldr,
- locale: ["en", "fr", "th"],
+ locale: ["en", "fr", "th"],
default_locale: "en",
- precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
-end
Where each tuple in the list configures one transliteration map. In this example, two maps are
+
precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
+end
Where each tuple in the list configures one transliteration map. In this example, two maps are
configured: from :latn
to :thai
and from :arab
to :thai
.
A list of configurable number systems is returned by Cldr.Number.System.numeric_systems/0
.
If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.
Examples
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
"123 556,000"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
"Some number is: ๑๒๓๕๕๖"
diff --git a/Plausible.Cldr.Number.html b/Plausible.Cldr.Number.html
index 5249fdd47c..46ab250c24 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -14,7 +14,7 @@
-
+
@@ -441,19 +441,19 @@ using the Elixir standard library functions.
Examples
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
- {Cldr.Number.ParseError,
- "The string \"+1.000,34\" could not be parsed as a number"}}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
+{:error,
+ {Cldr.Number.ParseError,
+ "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -525,17 +525,17 @@ financial instruments.
Examples
-iex> Plausible.Cldr.Number.scan("100 US dollars")
+iex> Plausible.Cldr.Number.scan("100 US dollars")
...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -612,19 +612,19 @@ financial instruments.Examples
-iex> Plausible.Cldr.Number.resolve_currency("US dollars")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("US dollars")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
-iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
-{:error,
- {Cldr.UnknownCurrencyError,
- "The currency \"not a known currency\" is unknown or not supported"}}
+iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
+{:error,
+ {Cldr.UnknownCurrencyError,
+ "The currency \"not a known currency\" is unknown or not supported"}}
@@ -688,13 +688,13 @@ The default is options[:backend].get_locale()
Examples
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+[:percent, " of linguists ", :percent]
@@ -751,9 +751,9 @@ The default is options[:backend].get_locale()
Examples
-iex> Plausible.Cldr.Number.scan("100%")
-...> |> Plausible.Cldr.Number.resolve_pers()
-[100, :percent]
+iex> Plausible.Cldr.Number.scan("100%")
+...> |> Plausible.Cldr.Number.resolve_pers()
+[100, :percent]
iex> Plausible.Cldr.Number.scan("£1_000_000.34")
-["£", 1000000.34]
+iex> Plausible.Cldr.Number.scan("£1_000_000.34")
+["£", 1000000.34]
-iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
-iex> Plausible.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Plausible.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
-iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
-iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
+["The loss is ", -1000, " euros"]
iex> Plausible.Cldr.Number.to_approx_string 1234
-{:ok, "~1,234"}
+{:ok, "~1,234"}
iex> Plausible.Cldr.Number.to_at_least_string 1234
-{:ok, "1,234+"}
+{:ok, "1,234+"}
iex> Plausible.Cldr.Number.to_at_most_string 1234
-{:ok, "≤1,234"}
+{:ok, "≤1,234"}
iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
...> string, :currency_symbol -> "<span class=\"symbol\">" <> string <> "</span>"
...> string, :number -> "<span class=\"number\">" <> string <> "</span>"
...> string, :currency_space -> "<span>" <> string <> "</span>"
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
+
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
function if wrapping HTML tags since these will ensure HTML entities are
-correctly encoded. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
-...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
-...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
-...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
+correctly encoded. For example:iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
+...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
+...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include
+
...> end)
+{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include a currency symbol, a literal string, inserted text between a currency symbol and the currency amount, a percent sign, the number itself and several other elements. In some cases it is helpful to be apply specific formatting to each element. @@ -1168,80 +1168,80 @@ inserted in the final formatted number.
iex> Plausible.Cldr.Number.to_string 12345
-{:ok, "12,345"}
+{:ok, "12,345"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr"
-{:ok, "12 345"}
+{:ok, "12 345"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1
-{:ok, "1.345,32 €"}
+{:ok, "1.345,32 €"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es"
-{:ok, "1345,32 €"}
+{:ok, "1345,32 €"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr", currency: "USD"
-{:ok, "12 345,00 $US"}
+{:ok, "12 345,00 $US"}
iex> Plausible.Cldr.Number.to_string 12345, format: "#E0"
-{:ok, "1.2345E4"}
+{:ok, "1.2345E4"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB"
-{:ok, "THB 12,345.00"}
+{:ok, "THB 12,345.00"}
iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: "THB"
-{:ok, "(THB 12,345.00)"}
+{:ok, "(THB 12,345.00)"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th"
-{:ok, "฿12,345.00"}
+{:ok, "฿12,345.00"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th", number_system: :native
-{:ok, "฿๑๒,๓๔๕.๐๐"}
+{:ok, "฿๑๒,๓๔๕.๐๐"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long
-{:ok, "1 thousand"}
+{:ok, "1 thousand"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: "USD"
-{:ok, "1,244 US dollars"}
+{:ok, "1,244 US dollars"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short
-{:ok, "1K"}
+{:ok, "1K"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR"
-{:ok, "€1K"}
+{:ok, "€1K"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout
-{:ok, "one thousand two hundred thirty-four"}
+{:ok, "one thousand two hundred thirty-four"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose
-{:ok, "one thousand two hundred and thirty-four"}
+{:ok, "one thousand two hundred and thirty-four"}
iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year
-{:ok, "nineteen eighty-nine"}
+{:ok, "nineteen eighty-nine"}
iex> Plausible.Cldr.Number.to_string 123, format: :ordinal
-{:ok, "123rd"}
+{:ok, "123rd"}
iex> Plausible.Cldr.Number.to_string 123, format: :roman
-{:ok, "CXXIII"}
+{:ok, "CXXIII"}
iex> Plausible.Cldr.Number.to_string 123, locale: "th-u-nu-thai"
-{:ok, "๑๒๓"}
An error tuple {:error, reason}
will be returned if an error is detected.
-The two most likely causes of an error return are:
iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
- {:error, {Cldr.FormatCompileError,
- "Decimal format compiler: syntax error before: \"#\""}}
locale
and
+The two most likely causes of an error return are: iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
+ {:error, {Cldr.FormatCompileError,
+ "Decimal format compiler: syntax error before: \"#\""}}
locale
and
number_system
. This happens typically when the number system is
:algorithmic
rather than the more common :numeric
. In this case the error
-return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :percent"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :percent"}}
iex> Plausible.Cldr.Number.validate_number_system "en", :latn
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :default
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :unknown
-{:error,
- {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
+{:error,
+ {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
iex> Plausible.Cldr.Number.validate_number_system "zz", :default
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
Functions to implement the number system rule-based-number-format rules of CLDR.
These rules are defined only on the "und" locale and represent specialised number formatting.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+...> |> Enum.sort()
+[
:armenian_lower,
:armenian_upper,
:cyrillic_lower,
@@ -161,9 +161,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:roman_upper,
:tamil,
:zz_default
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
-"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
-{:ok, "CXXIII"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
+"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
+{:ok, "CXXIII"}
Functions to implement the ordinal rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
-[:digits_ordinal]
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
+[:digits_ordinal]
-iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
-...> |> Enum.sort()
-[
+iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
+...> |> Enum.sort()
+[
:digits_ordinal,
:digits_ordinal_feminine,
:digits_ordinal_feminine_plural,
:digits_ordinal_masculine,
:digits_ordinal_masculine_plural
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
-"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
-{:ok, "123rd"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
+"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
+{:ok, "123rd"}
Functions to implement the spellout rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
+...> |> Enum.sort()
+[
:spellout_cardinal,
:spellout_cardinal_verbose,
:spellout_numbering,
@@ -155,9 +155,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:spellout_numbering_year,
:spellout_ordinal,
:spellout_ordinal_verbose
-]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
-"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
-{:ok, "one hundred twenty-three"}
+]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
iex> Plausible.Cldr.default_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.default_locale()
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}
+ transform: %{},
+ language_variants: []
+}
iex> Plausible.Cldr.default_territory()
+iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis("And furthermore")
+iex> Plausible.Cldr.ellipsis("And furthermore")
"And furthermore…"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
"And furthermore…there is much to be done"
-iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
+iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
"And furthermore …"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
"And furthermore … there is much to be done"
@@ -715,23 +715,23 @@ take an optional locale parameter for which a locale is not supplied.
Example
-iex> Plausible.Cldr.put_locale("pl")
-iex> Plausible.Cldr.get_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.get_locale()
+%Cldr.LanguageTag{
backend: Elixir.Plausible.Cldr,
canonical_locale_name: "pl",
cldr_locale_name: :pl,
- extensions: %{},
+ extensions: %{},
language: "pl",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :pl,
territory: :PL,
requested_locale_name: "pl",
script: :Latn,
- transform: %{},
- language_variants: []
- }
+ transform: %{},
+ language_variants: []
+ }
@@ -818,10 +818,10 @@ take an optional locale parameter for which a locale is not supplied.
Examples
-iex> Plausible.Cldr.known_gettext_locale_name("en")
+iex> Plausible.Cldr.known_gettext_locale_name("en")
"en"
-iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
+iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
false
@@ -864,10 +864,10 @@ name is configured and available in Gettext.Examples
-iex> Plausible.Cldr.known_gettext_locale_name?("en")
+iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
@@ -941,10 +941,10 @@ to return the first known locale name from a list.Examples
-iex> Plausible.Cldr.known_locale_name(:"en-AU")
+iex> Plausible.Cldr.known_locale_name(:"en-AU")
:"en-AU"
-iex> Plausible.Cldr.known_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_locale_name(:"en-SA")
false
@@ -986,10 +986,10 @@ name is configured and available in Cldr.Examples
-iex> Plausible.Cldr.known_locale_name?(:en)
+iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1043,8 +1043,8 @@ in this module or in
Example
-iex> Plausible.Cldr.known_number_system_types()
-[:default, :finance, :native, :traditional]
+iex> Plausible.Cldr.known_number_system_types()
+[:default, :finance, :native, :traditional]
@@ -1109,10 +1109,10 @@ and has RBNF rules defined.
Examples
-iex> Plausible.Cldr.known_rbnf_locale_name(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name(:en)
:en
-iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
false
@@ -1155,10 +1155,10 @@ rules based number formats (RBNF).Examples
-iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
@@ -1294,18 +1294,18 @@ CLDR backend defined by the t:Cldr.LanguageTag
is se
Examples
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"en")
-{:ok, "en"}
+iex> Plausible.Cldr.put_gettext_locale(~l"en")
+{:ok, "en"}
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"de")
-{
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{
:error,
- {
+ {
Cldr.UnknownLocaleError,
"Locale TestBackend.Cldr.Locale.new!(\"de-DE\") does not map to a known gettext locale name"
- }
-}
+ }
+}
@@ -1349,29 +1349,29 @@ of a language tag.
Examples
-iex> Plausible.Cldr.put_locale("en")
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("en")
+{:ok,
+ %Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.put_locale("invalid-locale!")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
+iex> Plausible.Cldr.put_locale("invalid-locale!")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
@@ -1420,10 +1420,10 @@ The default is Examples
-iex> Plausible.Cldr.quote("Quoted String")
+iex> Plausible.Cldr.quote("Quoted String")
"“Quoted String”"
-iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
+iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
"「Quoted String」"
@@ -1554,47 +1554,47 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_locale(:en)
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+iex> Plausible.Cldr.validate_locale("zzz")
+{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
@@ -1664,23 +1664,23 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_number_system_type(:default)
-{:ok, :default}
+iex> Plausible.Cldr.validate_number_system_type(:default)
+{:ok, :default}
-iex> Plausible.Cldr.validate_number_system_type(:traditional)
-{:ok, :traditional}
+iex> Plausible.Cldr.validate_number_system_type(:traditional)
+{:ok, :traditional}
-iex> Plausible.Cldr.validate_number_system_type(:latn)
-{
+iex> Plausible.Cldr.validate_number_system_type(:latn)
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
+}
-iex> Plausible.Cldr.validate_number_system_type("bork")
-{
+iex> Plausible.Cldr.validate_number_system_type("bork")
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
+}
diff --git a/Plausible.ClickhouseEventV2.html b/Plausible.ClickhouseEventV2.html
index c7208292b2..b9c8a30aa3 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseLocationData.html b/Plausible.ClickhouseLocationData.html
index a095942340..78b11b50d0 100644
--- a/Plausible.ClickhouseLocationData.html
+++ b/Plausible.ClickhouseLocationData.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index c448cfd5f7..3dc3190d88 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -879,23 +879,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.ClickhouseSessionV2.BoolUInt8.html b/Plausible.ClickhouseSessionV2.BoolUInt8.html
index 30a9006bf8..4129949897 100644
--- a/Plausible.ClickhouseSessionV2.BoolUInt8.html
+++ b/Plausible.ClickhouseSessionV2.BoolUInt8.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseSessionV2.html b/Plausible.ClickhouseSessionV2.html
index e95d8897c5..5aa1ceb681 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index a67ff46339..55a4b3f4eb 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.CrmExtensions.html b/Plausible.CrmExtensions.html
index 0e3b8f6393..d305bc4127 100644
--- a/Plausible.CrmExtensions.html
+++ b/Plausible.CrmExtensions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index c89db8a964..4f1b796d74 100644
--- a/Plausible.DataCase.html
+++ b/Plausible.DataCase.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.AcquisitionChannel.html b/Plausible.DataMigration.AcquisitionChannel.html
index 88ee736d95..eda4d2a802 100644
--- a/Plausible.DataMigration.AcquisitionChannel.html
+++ b/Plausible.DataMigration.AcquisitionChannel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.BackfillTeams.html b/Plausible.DataMigration.BackfillTeams.html
index 7a367ad5ac..e63a83e945 100644
--- a/Plausible.DataMigration.BackfillTeams.html
+++ b/Plausible.DataMigration.BackfillTeams.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
index b4d482a217..e6ad8e7c2f 100644
--- a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
+++ b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.ClickhouseRepo.html b/Plausible.DataMigration.ClickhouseRepo.html
index 450b7150d0..a8d5b7edfc 100644
--- a/Plausible.DataMigration.ClickhouseRepo.html
+++ b/Plausible.DataMigration.ClickhouseRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1196,23 +1196,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.DataMigration.LocationsSync.html b/Plausible.DataMigration.LocationsSync.html
index 89143379e1..a2db26852f 100644
--- a/Plausible.DataMigration.LocationsSync.html
+++ b/Plausible.DataMigration.LocationsSync.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.NumericIDs.html b/Plausible.DataMigration.NumericIDs.html
index be86a7d4d2..4764aee26e 100644
--- a/Plausible.DataMigration.NumericIDs.html
+++ b/Plausible.DataMigration.NumericIDs.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.PopulateEventSessionColumns.html b/Plausible.DataMigration.PopulateEventSessionColumns.html
index 88f346eabe..3a442757d1 100644
--- a/Plausible.DataMigration.PopulateEventSessionColumns.html
+++ b/Plausible.DataMigration.PopulateEventSessionColumns.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.PostgresRepo.html b/Plausible.DataMigration.PostgresRepo.html
index 5860f84440..5ba5180a96 100644
--- a/Plausible.DataMigration.PostgresRepo.html
+++ b/Plausible.DataMigration.PostgresRepo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.SiteImports.html b/Plausible.DataMigration.SiteImports.html
index bbf1ff3394..da7c9d7908 100644
--- a/Plausible.DataMigration.SiteImports.html
+++ b/Plausible.DataMigration.SiteImports.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.TeamsConsitencyCheck.html b/Plausible.DataMigration.TeamsConsitencyCheck.html
index 492f78bc84..fab3d85575 100644
--- a/Plausible.DataMigration.TeamsConsitencyCheck.html
+++ b/Plausible.DataMigration.TeamsConsitencyCheck.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html
index 014bf8770e..2ea9e080b7 100644
--- a/Plausible.DataMigration.VersionedSessions.html
+++ b/Plausible.DataMigration.VersionedSessions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.html b/Plausible.DataMigration.html
index 72ede3a6f6..d70e4fe8e7 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ecto.EventName.html b/Plausible.Ecto.EventName.html
index 8621308053..6fa11d4a74 100644
--- a/Plausible.Ecto.EventName.html
+++ b/Plausible.Ecto.EventName.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ecto.Types.CompiledRegex.html b/Plausible.Ecto.Types.CompiledRegex.html
index f8e2197982..d9e0358efb 100644
--- a/Plausible.Ecto.Types.CompiledRegex.html
+++ b/Plausible.Ecto.Types.CompiledRegex.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index 3599acc702..e976272383 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -14,7 +14,7 @@
-
+
@@ -381,7 +381,7 @@ tables into the format of imported_*
tables for a we
-Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
"plausible_io_20241231.zip"
@@ -404,10 +404,10 @@ tables into the format of imported_*
tables for a we
-Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
+Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
"attachment; filename=\"plausible_io_20241231.zip\""
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
"attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -726,14 +726,14 @@ tables into the format of imported_*
tables for a we
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Factory.html b/Plausible.Factory.html
index 94500c23e3..ba6eba2098 100644
--- a/Plausible.Factory.html
+++ b/Plausible.Factory.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.File.html b/Plausible.File.html
index 4bc6d1ab0f..7a55352839 100644
--- a/Plausible.File.html
+++ b/Plausible.File.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html
index 7c3d427bf1..392ac69e37 100644
--- a/Plausible.Funnel.Const.html
+++ b/Plausible.Funnel.Const.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.Step.html b/Plausible.Funnel.Step.html
index 04c53f5d3d..bf07a9101e 100644
--- a/Plausible.Funnel.Step.html
+++ b/Plausible.Funnel.Step.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.html b/Plausible.Funnel.html
index 0a721efef6..b0807251b7 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index c2547fda24..702e363c4a 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index a1f7cc0df0..13cbb1e289 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -14,7 +14,7 @@
-
+
@@ -260,8 +260,8 @@ and MaxMind license key.
Examples
- In the case of a DB-IP database:
iex> database_type()
-"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
+ In the case of a DB-IP database:
iex> database_type()
+"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
"GeoLite2-City"
@@ -302,8 +302,8 @@ asynchronously.
Examples
- Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
-:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
+ Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
+:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
:ok
@@ -332,21 +332,21 @@ asynchronously.
Examples
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -355,12 +355,12 @@ asynchronously."pt-BR" => "América do Norte",
"ru" => "Северная Америка",
"zh-CN" => "北美洲"
- }
- },
- "country" => %{
+ }
+ },
+ "country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -369,20 +369,20 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "location" => %{
+ }
+ },
+ "location" => %{
"accuracy_radius" => 50,
"latitude" => 34.1211,
"longitude" => -117.4362,
"metro_code" => 803,
"time_zone" => "America/Los_Angeles"
- },
- "postal" => %{"code" => "92336"},
- "registered_country" => %{
+ },
+ "postal" => %{"code" => "92336"},
+ "registered_country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -391,13 +391,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -406,10 +406,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.Goal.Revenue.html b/Plausible.Goal.Revenue.html
index 6f7fa44299..9c0c469696 100644
--- a/Plausible.Goal.Revenue.html
+++ b/Plausible.Goal.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goal.html b/Plausible.Goal.html
index 8d1cef2696..9e012b3a78 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index 27deb88f94..11bb6c4c0c 100644
--- a/Plausible.Goals.html
+++ b/Plausible.Goals.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.API.Mock.html b/Plausible.Google.API.Mock.html
index 2004fb150f..180a6436e8 100644
--- a/Plausible.Google.API.Mock.html
+++ b/Plausible.Google.API.Mock.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.API.html b/Plausible.Google.API.html
index 11bcd4c5f3..59791c9bb9 100644
--- a/Plausible.Google.API.html
+++ b/Plausible.Google.API.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.GA4.API.html b/Plausible.Google.GA4.API.html
index dde03782c6..b5d41f2c8f 100644
--- a/Plausible.Google.GA4.API.html
+++ b/Plausible.Google.GA4.API.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.GA4.HTTP.html b/Plausible.Google.GA4.HTTP.html
index 58a27aed92..45c8deacd6 100644
--- a/Plausible.Google.GA4.HTTP.html
+++ b/Plausible.Google.GA4.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.GA4.ReportRequest.html b/Plausible.Google.GA4.ReportRequest.html
index 0110a6068e..d23c792f99 100644
--- a/Plausible.Google.GA4.ReportRequest.html
+++ b/Plausible.Google.GA4.ReportRequest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html
index 5ccdfffc50..d5e1fd17b6 100644
--- a/Plausible.Google.HTTP.html
+++ b/Plausible.Google.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html
index 2d1c7eab2f..f80a5ee055 100644
--- a/Plausible.HTTPClient.Interface.html
+++ b/Plausible.HTTPClient.Interface.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.Non200Error.html b/Plausible.HTTPClient.Non200Error.html
index 4a14b89e5b..c92b9bbcd1 100644
--- a/Plausible.HTTPClient.Non200Error.html
+++ b/Plausible.HTTPClient.Non200Error.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.html b/Plausible.HTTPClient.html
index ec1e8f5098..db93679c07 100644
--- a/Plausible.HTTPClient.html
+++ b/Plausible.HTTPClient.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HelpScout.Vault.html b/Plausible.HelpScout.Vault.html
index 218fc062a7..921c33e8ed 100644
--- a/Plausible.HelpScout.Vault.html
+++ b/Plausible.HelpScout.Vault.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HelpScout.html b/Plausible.HelpScout.html
index de0d48ae4d..52fec1ff22 100644
--- a/Plausible.HelpScout.html
+++ b/Plausible.HelpScout.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Helpers.JSON.html b/Plausible.Helpers.JSON.html
index 46cfac947f..67a2c3c7a4 100644
--- a/Plausible.Helpers.JSON.html
+++ b/Plausible.Helpers.JSON.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 953ab7507b..86b71374ce 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1187,23 +1187,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.Buffer.html b/Plausible.Imported.Buffer.html
index 63b9a72aa9..86fc3db4dc 100644
--- a/Plausible.Imported.Buffer.html
+++ b/Plausible.Imported.Buffer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index 3675c88a06..b5c86a6c33 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -14,7 +14,7 @@
-
+
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.GoogleAnalytics4.html b/Plausible.Imported.GoogleAnalytics4.html
index bd760cfb67..ad2ef74281 100644
--- a/Plausible.Imported.GoogleAnalytics4.html
+++ b/Plausible.Imported.GoogleAnalytics4.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.ImportSources.html b/Plausible.Imported.ImportSources.html
index 0f485b09cc..b9403a59dd 100644
--- a/Plausible.Imported.ImportSources.html
+++ b/Plausible.Imported.ImportSources.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 4afb61fa45..c18f31e897 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -14,7 +14,7 @@
-
+
@@ -183,30 +183,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.Imported.NoopImporter.html b/Plausible.Imported.NoopImporter.html
index 1c06d9713d..c6b0e6895e 100644
--- a/Plausible.Imported.NoopImporter.html
+++ b/Plausible.Imported.NoopImporter.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.SiteImport.html b/Plausible.Imported.SiteImport.html
index f6b4ad5d91..3390af683f 100644
--- a/Plausible.Imported.SiteImport.html
+++ b/Plausible.Imported.SiteImport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.UniversalAnalytics.html b/Plausible.Imported.UniversalAnalytics.html
index 3a43097cfa..9441edad03 100644
--- a/Plausible.Imported.UniversalAnalytics.html
+++ b/Plausible.Imported.UniversalAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.html b/Plausible.Imported.html
index 3beddd68db..66c07450f8 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 290d975405..70e3c006b0 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1225,23 +1225,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Ingestion.Acquisition.html b/Plausible.Ingestion.Acquisition.html
index 1d71521950..e4199852c8 100644
--- a/Plausible.Ingestion.Acquisition.html
+++ b/Plausible.Ingestion.Acquisition.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.Buffer.html b/Plausible.Ingestion.Counters.Buffer.html
index e0a01c58d3..1b41faf396 100644
--- a/Plausible.Ingestion.Counters.Buffer.html
+++ b/Plausible.Ingestion.Counters.Buffer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.Record.html b/Plausible.Ingestion.Counters.Record.html
index 552b36207e..1b7553d9de 100644
--- a/Plausible.Ingestion.Counters.Record.html
+++ b/Plausible.Ingestion.Counters.Record.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.TelemetryHandler.html b/Plausible.Ingestion.Counters.TelemetryHandler.html
index 42309ce2e4..435e80fa41 100644
--- a/Plausible.Ingestion.Counters.TelemetryHandler.html
+++ b/Plausible.Ingestion.Counters.TelemetryHandler.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.html b/Plausible.Ingestion.Counters.html
index 2b57d67379..5457856f40 100644
--- a/Plausible.Ingestion.Counters.html
+++ b/Plausible.Ingestion.Counters.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Event.Revenue.html b/Plausible.Ingestion.Event.Revenue.html
index 5887591b2e..e7aa08dcfb 100644
--- a/Plausible.Ingestion.Event.Revenue.html
+++ b/Plausible.Ingestion.Event.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Event.html b/Plausible.Ingestion.Event.html
index 81db22868a..f8065b4451 100644
--- a/Plausible.Ingestion.Event.html
+++ b/Plausible.Ingestion.Event.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html
index 42569b66d9..0d71395db6 100644
--- a/Plausible.Ingestion.Request.Revenue.html
+++ b/Plausible.Ingestion.Request.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.html b/Plausible.Ingestion.Request.html
index cb0e9a9d5f..56e519dcb3 100644
--- a/Plausible.Ingestion.Request.html
+++ b/Plausible.Ingestion.Request.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Source.html b/Plausible.Ingestion.Source.html
index 016a80dbc1..3caec9c888 100644
--- a/Plausible.Ingestion.Source.html
+++ b/Plausible.Ingestion.Source.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.License.html b/Plausible.License.html
index e308d8fad6..e17df865a2 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.LiveViewTest.html b/Plausible.LiveViewTest.html
index 127af0cddc..bca91cc4cd 100644
--- a/Plausible.LiveViewTest.html
+++ b/Plausible.LiveViewTest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index e7f21e3b55..75d5005f53 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index c056a0301e..af4764ee36 100644
--- a/Plausible.MigrationUtils.html
+++ b/Plausible.MigrationUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.OpenTelemetry.Sampler.html b/Plausible.OpenTelemetry.Sampler.html
index c81f82c804..448ff10ce2 100644
--- a/Plausible.OpenTelemetry.Sampler.html
+++ b/Plausible.OpenTelemetry.Sampler.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PaddleApi.Mock.html b/Plausible.PaddleApi.Mock.html
index 294b45fcc9..dce75bb85a 100644
--- a/Plausible.PaddleApi.Mock.html
+++ b/Plausible.PaddleApi.Mock.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Pagination.html b/Plausible.Pagination.html
index aefda3f230..8a4f76c1dc 100644
--- a/Plausible.Pagination.html
+++ b/Plausible.Pagination.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Capabilities.html b/Plausible.Plugins.API.Capabilities.html
index 807abd788c..32eb51a4c1 100644
--- a/Plausible.Plugins.API.Capabilities.html
+++ b/Plausible.Plugins.API.Capabilities.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.CustomProps.html b/Plausible.Plugins.API.CustomProps.html
index b6d4c5e324..d51b00e605 100644
--- a/Plausible.Plugins.API.CustomProps.html
+++ b/Plausible.Plugins.API.CustomProps.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Funnels.html b/Plausible.Plugins.API.Funnels.html
index cd0a67ceb9..26d5401ea4 100644
--- a/Plausible.Plugins.API.Funnels.html
+++ b/Plausible.Plugins.API.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Goals.html b/Plausible.Plugins.API.Goals.html
index 74ddda5776..78af240a14 100644
--- a/Plausible.Plugins.API.Goals.html
+++ b/Plausible.Plugins.API.Goals.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.SharedLinks.html b/Plausible.Plugins.API.SharedLinks.html
index 44b4c6a581..c05cb02e8c 100644
--- a/Plausible.Plugins.API.SharedLinks.html
+++ b/Plausible.Plugins.API.SharedLinks.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Token.html b/Plausible.Plugins.API.Token.html
index e15bc8969f..9ac5556eef 100644
--- a/Plausible.Plugins.API.Token.html
+++ b/Plausible.Plugins.API.Token.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Tokens.html b/Plausible.Plugins.API.Tokens.html
index 1ad968072d..4086fc6202 100644
--- a/Plausible.Plugins.API.Tokens.html
+++ b/Plausible.Plugins.API.Tokens.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PromEx.Plugins.PlausibleMetrics.html b/Plausible.PromEx.Plugins.PlausibleMetrics.html
index a8f948ceea..36b2d077e0 100644
--- a/Plausible.PromEx.Plugins.PlausibleMetrics.html
+++ b/Plausible.PromEx.Plugins.PlausibleMetrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PromEx.html b/Plausible.PromEx.html
index 2e346f7d71..5f1dc67156 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 8b1054c361..042b3486e8 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index b21e15e45a..5227922c02 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index 2a4c79dc07..2689d03eb3 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 6e19931bed..3722fc8f00 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 11472f7468..eb791c66c9 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RequestLogger.html b/Plausible.RequestLogger.html
index 1503163645..69b11c9d99 100644
--- a/Plausible.RequestLogger.html
+++ b/Plausible.RequestLogger.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.S3.html b/Plausible.S3.html
index fb378b7af3..7f81b3fa39 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -14,7 +14,7 @@
-
+
@@ -316,7 +316,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.
In
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -348,8 +348,8 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html
index fc8c5e2f94..13106f4123 100644
--- a/Plausible.Sentry.Client.html
+++ b/Plausible.Sentry.Client.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SentryFilter.html b/Plausible.SentryFilter.html
index 0bebbc90f0..9d835da805 100644
--- a/Plausible.SentryFilter.html
+++ b/Plausible.SentryFilter.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Session.CacheStore.html b/Plausible.Session.CacheStore.html
index 81a3439822..08611b8932 100644
--- a/Plausible.Session.CacheStore.html
+++ b/Plausible.Session.CacheStore.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Session.Salts.html b/Plausible.Session.Salts.html
index cb0c686d13..7061a2f9ad 100644
--- a/Plausible.Session.Salts.html
+++ b/Plausible.Session.Salts.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.CountryRule.html b/Plausible.Shield.CountryRule.html
index 52cc58f615..ed79b8762b 100644
--- a/Plausible.Shield.CountryRule.html
+++ b/Plausible.Shield.CountryRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.CountryRuleCache.html b/Plausible.Shield.CountryRuleCache.html
index 3d4fb405dc..c45aed1db6 100644
--- a/Plausible.Shield.CountryRuleCache.html
+++ b/Plausible.Shield.CountryRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.HostnameRule.html b/Plausible.Shield.HostnameRule.html
index 9c768b08c2..3ec7711128 100644
--- a/Plausible.Shield.HostnameRule.html
+++ b/Plausible.Shield.HostnameRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.HostnameRuleCache.html b/Plausible.Shield.HostnameRuleCache.html
index 56f6278c91..c179752758 100644
--- a/Plausible.Shield.HostnameRuleCache.html
+++ b/Plausible.Shield.HostnameRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html
index 1362751c8b..117bcb15d6 100644
--- a/Plausible.Shield.IPRule.html
+++ b/Plausible.Shield.IPRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRuleCache.html b/Plausible.Shield.IPRuleCache.html
index 4999d37e6c..289b71db94 100644
--- a/Plausible.Shield.IPRuleCache.html
+++ b/Plausible.Shield.IPRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.PageRule.html b/Plausible.Shield.PageRule.html
index 20d7c18cfa..b227beccf0 100644
--- a/Plausible.Shield.PageRule.html
+++ b/Plausible.Shield.PageRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.PageRuleCache.html b/Plausible.Shield.PageRuleCache.html
index cba3abeccc..91f0e30838 100644
--- a/Plausible.Shield.PageRuleCache.html
+++ b/Plausible.Shield.PageRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shields.html b/Plausible.Shields.html
index 380dd46080..8475137051 100644
--- a/Plausible.Shields.html
+++ b/Plausible.Shields.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Cache.html b/Plausible.Site.Cache.html
index 843a117aca..785061a0df 100644
--- a/Plausible.Site.Cache.html
+++ b/Plausible.Site.Cache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Domain.html b/Plausible.Site.Domain.html
index 3c7df44ece..5da937b8cb 100644
--- a/Plausible.Site.Domain.html
+++ b/Plausible.Site.Domain.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.GateKeeper.html b/Plausible.Site.GateKeeper.html
index 9f4cb43a63..96b70aee3d 100644
--- a/Plausible.Site.GateKeeper.html
+++ b/Plausible.Site.GateKeeper.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.GoogleAuth.html b/Plausible.Site.GoogleAuth.html
index 448f33cf49..81d319e5be 100644
--- a/Plausible.Site.GoogleAuth.html
+++ b/Plausible.Site.GoogleAuth.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.ImportedData.html b/Plausible.Site.ImportedData.html
index c335a1ed7a..197ddcec47 100644
--- a/Plausible.Site.ImportedData.html
+++ b/Plausible.Site.ImportedData.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.InstallationMeta.html b/Plausible.Site.InstallationMeta.html
index 50e7ad1308..77f871584f 100644
--- a/Plausible.Site.InstallationMeta.html
+++ b/Plausible.Site.InstallationMeta.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Membership.html b/Plausible.Site.Membership.html
index f6b563c57a..94fcc9e6fa 100644
--- a/Plausible.Site.Membership.html
+++ b/Plausible.Site.Membership.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.AcceptInvitation.html b/Plausible.Site.Memberships.AcceptInvitation.html
index 18d40d5db6..0776880ade 100644
--- a/Plausible.Site.Memberships.AcceptInvitation.html
+++ b/Plausible.Site.Memberships.AcceptInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.CreateInvitation.html b/Plausible.Site.Memberships.CreateInvitation.html
index da559e588b..bad866dbf6 100644
--- a/Plausible.Site.Memberships.CreateInvitation.html
+++ b/Plausible.Site.Memberships.CreateInvitation.html
@@ -14,7 +14,7 @@
-
+
@@ -224,7 +224,7 @@ this invitation.
invite_error()
-
+
View Source
@@ -272,7 +272,7 @@ this invitation.
bulk_create_invitation(sites, inviter, invitee_email, role, opts \\ [])
-
+
View Source
@@ -306,7 +306,7 @@ this invitation.
bulk_transfer_ownership_direct(sites, new_owner)
-
+
View Source
@@ -337,7 +337,7 @@ this invitation.
create_invitation(site, inviter, invitee_email, role)
-
+
View Source
diff --git a/Plausible.Site.Memberships.RejectInvitation.html b/Plausible.Site.Memberships.RejectInvitation.html
index e1588271a8..f80b363017 100644
--- a/Plausible.Site.Memberships.RejectInvitation.html
+++ b/Plausible.Site.Memberships.RejectInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.RemoveInvitation.html b/Plausible.Site.Memberships.RemoveInvitation.html
index b4a5035f84..3a4cc3d790 100644
--- a/Plausible.Site.Memberships.RemoveInvitation.html
+++ b/Plausible.Site.Memberships.RemoveInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.html b/Plausible.Site.Memberships.html
index 79b0239faf..ef7539fc1f 100644
--- a/Plausible.Site.Memberships.html
+++ b/Plausible.Site.Memberships.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.MonthlyReport.html b/Plausible.Site.MonthlyReport.html
index 6954155f62..9749744ba9 100644
--- a/Plausible.Site.MonthlyReport.html
+++ b/Plausible.Site.MonthlyReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Removal.html b/Plausible.Site.Removal.html
index 52658c1eaa..5115c37663 100644
--- a/Plausible.Site.Removal.html
+++ b/Plausible.Site.Removal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.SharedLink.html b/Plausible.Site.SharedLink.html
index e7f405a090..311f81e22f 100644
--- a/Plausible.Site.SharedLink.html
+++ b/Plausible.Site.SharedLink.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.TrafficChangeNotification.html b/Plausible.Site.TrafficChangeNotification.html
index 889e1798ce..5680a4b4c8 100644
--- a/Plausible.Site.TrafficChangeNotification.html
+++ b/Plausible.Site.TrafficChangeNotification.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.UserPreference.html b/Plausible.Site.UserPreference.html
index 8ed0e5282f..d4fab0d653 100644
--- a/Plausible.Site.UserPreference.html
+++ b/Plausible.Site.UserPreference.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.WeeklyReport.html b/Plausible.Site.WeeklyReport.html
index 3b1b9c711e..3db84eedcd 100644
--- a/Plausible.Site.WeeklyReport.html
+++ b/Plausible.Site.WeeklyReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.html b/Plausible.Site.html
index 45a30e7bb0..ddb85a8f84 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index f2b75293df..cecc8428f7 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 889ec331e1..0e0e482df3 100644
--- a/Plausible.Sites.html
+++ b/Plausible.Sites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html
index c9c47b91ca..af689e8197 100644
--- a/Plausible.Stats.Aggregate.html
+++ b/Plausible.Stats.Aggregate.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Base.html b/Plausible.Stats.Base.html
index e8115ec6ca..52b461b0b7 100644
--- a/Plausible.Stats.Base.html
+++ b/Plausible.Stats.Base.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Breakdown.html b/Plausible.Stats.Breakdown.html
index 34a22cb9a3..81c588979e 100644
--- a/Plausible.Stats.Breakdown.html
+++ b/Plausible.Stats.Breakdown.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html
index 589f8a8646..cd1d811ebc 100644
--- a/Plausible.Stats.Clickhouse.html
+++ b/Plausible.Stats.Clickhouse.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html
index 8a101ecd1c..d9fa994cac 100644
--- a/Plausible.Stats.Compare.html
+++ b/Plausible.Stats.Compare.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Comparisons.html b/Plausible.Stats.Comparisons.html
index 9831d5ddff..851926c3c9 100644
--- a/Plausible.Stats.Comparisons.html
+++ b/Plausible.Stats.Comparisons.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.CurrentVisitors.html b/Plausible.Stats.CurrentVisitors.html
index 06b1e45ac2..e04095ab2e 100644
--- a/Plausible.Stats.CurrentVisitors.html
+++ b/Plausible.Stats.CurrentVisitors.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.CustomProps.html b/Plausible.Stats.CustomProps.html
index f9de34dbe7..749baf6845 100644
--- a/Plausible.Stats.CustomProps.html
+++ b/Plausible.Stats.CustomProps.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.DateTimeRange.html b/Plausible.Stats.DateTimeRange.html
index 827b4199f5..840a3c9e5a 100644
--- a/Plausible.Stats.DateTimeRange.html
+++ b/Plausible.Stats.DateTimeRange.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.EmailReport.html b/Plausible.Stats.EmailReport.html
index 4655fd2a38..d108048981 100644
--- a/Plausible.Stats.EmailReport.html
+++ b/Plausible.Stats.EmailReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.FilterSuggestions.html b/Plausible.Stats.FilterSuggestions.html
index 09ea07ebd0..ced6a987bd 100644
--- a/Plausible.Stats.FilterSuggestions.html
+++ b/Plausible.Stats.FilterSuggestions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Filters.Utils.html b/Plausible.Stats.Filters.Utils.html
index de9a6e1453..b50c866239 100644
--- a/Plausible.Stats.Filters.Utils.html
+++ b/Plausible.Stats.Filters.Utils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 101bc3d0e6..d911f9d3b3 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -14,7 +14,7 @@
-
+
@@ -396,14 +396,14 @@ does not handle AND/OR/NOT!
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches_wildcard, "event:page", ["/blog/**"]]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches_wildcard, "event:page", ["/blog/**"]]]
-iex> Filters.parse("visit:browser!=Chrome")
-[[:is_not, "visit:browser", ["Chrome"]]]
+iex> Filters.parse("visit:browser!=Chrome")
+[[:is_not, "visit:browser", ["Chrome"]]]
-iex> Filters.parse(nil)
-[]
+iex> Filters.parse(nil)
+[]
diff --git a/Plausible.Stats.Funnel.html b/Plausible.Stats.Funnel.html
index 4d3a28d461..a859291e8c 100644
--- a/Plausible.Stats.Funnel.html
+++ b/Plausible.Stats.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Goal.Revenue.html b/Plausible.Stats.Goal.Revenue.html
index 8a6fadc8fd..77ef9c1710 100644
--- a/Plausible.Stats.Goal.Revenue.html
+++ b/Plausible.Stats.Goal.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.Base.html b/Plausible.Stats.Imported.Base.html
index 54e6ff232f..9588109e54 100644
--- a/Plausible.Stats.Imported.Base.html
+++ b/Plausible.Stats.Imported.Base.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.SQL.Expression.html b/Plausible.Stats.Imported.SQL.Expression.html
index 60900470a1..133deab26d 100644
--- a/Plausible.Stats.Imported.SQL.Expression.html
+++ b/Plausible.Stats.Imported.SQL.Expression.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.SQL.WhereBuilder.html b/Plausible.Stats.Imported.SQL.WhereBuilder.html
index d5592bfe63..69e73a6622 100644
--- a/Plausible.Stats.Imported.SQL.WhereBuilder.html
+++ b/Plausible.Stats.Imported.SQL.WhereBuilder.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html
index 61fe826dc7..2196436dd3 100644
--- a/Plausible.Stats.Imported.html
+++ b/Plausible.Stats.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html
index d00019dc63..d6b3dc7c5f 100644
--- a/Plausible.Stats.Interval.html
+++ b/Plausible.Stats.Interval.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.JSONSchema.Utils.html b/Plausible.Stats.JSONSchema.Utils.html
index 85e02fa0f1..f1601dcc9a 100644
--- a/Plausible.Stats.JSONSchema.Utils.html
+++ b/Plausible.Stats.JSONSchema.Utils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.JSONSchema.html b/Plausible.Stats.JSONSchema.html
index d52af5b9f7..450d579644 100644
--- a/Plausible.Stats.JSONSchema.html
+++ b/Plausible.Stats.JSONSchema.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Legacy.Dimensions.html b/Plausible.Stats.Legacy.Dimensions.html
index af3e9bc4db..a75f1ef42d 100644
--- a/Plausible.Stats.Legacy.Dimensions.html
+++ b/Plausible.Stats.Legacy.Dimensions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Legacy.QueryBuilder.html b/Plausible.Stats.Legacy.QueryBuilder.html
index 93e8b1a7b4..1df1660669 100644
--- a/Plausible.Stats.Legacy.QueryBuilder.html
+++ b/Plausible.Stats.Legacy.QueryBuilder.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Legacy.TimeOnPage.html b/Plausible.Stats.Legacy.TimeOnPage.html
index f1e53cfd91..2df09b478b 100644
--- a/Plausible.Stats.Legacy.TimeOnPage.html
+++ b/Plausible.Stats.Legacy.TimeOnPage.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Metrics.html b/Plausible.Stats.Metrics.html
index bdc00d1cb9..41ff645e47 100644
--- a/Plausible.Stats.Metrics.html
+++ b/Plausible.Stats.Metrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Query.html b/Plausible.Stats.Query.html
index a8e68e99b0..83d11f608d 100644
--- a/Plausible.Stats.Query.html
+++ b/Plausible.Stats.Query.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.QueryOptimizer.html b/Plausible.Stats.QueryOptimizer.html
index e286d190f0..cc78bb6217 100644
--- a/Plausible.Stats.QueryOptimizer.html
+++ b/Plausible.Stats.QueryOptimizer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.QueryResult.html b/Plausible.Stats.QueryResult.html
index a5e0bf2f93..f3f35660ff 100644
--- a/Plausible.Stats.QueryResult.html
+++ b/Plausible.Stats.QueryResult.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.QueryRunner.html b/Plausible.Stats.QueryRunner.html
index d9f55ac925..e6a6397ec0 100644
--- a/Plausible.Stats.QueryRunner.html
+++ b/Plausible.Stats.QueryRunner.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.SQL.Expression.html b/Plausible.Stats.SQL.Expression.html
index d95a7e8f5f..847b46d125 100644
--- a/Plausible.Stats.SQL.Expression.html
+++ b/Plausible.Stats.SQL.Expression.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.SQL.Fragments.html b/Plausible.Stats.SQL.Fragments.html
index 06ead1713f..8e9e8251b0 100644
--- a/Plausible.Stats.SQL.Fragments.html
+++ b/Plausible.Stats.SQL.Fragments.html
@@ -14,7 +14,7 @@
-
+
@@ -668,12 +668,12 @@ boundary, not_before
is returned.not_before
boundary is set to the past Saturday, which is before the
weekstart, therefore the cap does not apply. > this_wednesday = ~D[2022-11-09]
> past_saturday = ~D[2022-11-05]
- > weekstart_not_before(this_wednesday, past_saturday)
+ > weekstart_not_before(this_wednesday, past_saturday)
~D[2022-11-07]
In this other example, the fragment returns Tuesday and not the weekstart.
The not_before
boundary is set to Tuesday, which is past the weekstart,
therefore the cap applies.
> this_wednesday = ~D[2022-11-09]
> this_tuesday = ~D[2022-11-08]
- > weekstart_not_before(this_wednesday, this_tuesday)
+ > weekstart_not_before(this_wednesday, this_tuesday)
~D[2022-11-08]
diff --git a/Plausible.Stats.SQL.SpecialMetrics.html b/Plausible.Stats.SQL.SpecialMetrics.html
index a0833e0347..38fac36727 100644
--- a/Plausible.Stats.SQL.SpecialMetrics.html
+++ b/Plausible.Stats.SQL.SpecialMetrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.SQL.WhereBuilder.html b/Plausible.Stats.SQL.WhereBuilder.html
index b12a0f028c..ca2466f816 100644
--- a/Plausible.Stats.SQL.WhereBuilder.html
+++ b/Plausible.Stats.SQL.WhereBuilder.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html
index 3405d55417..448533f970 100644
--- a/Plausible.Stats.Sampling.html
+++ b/Plausible.Stats.Sampling.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.TableDecider.html b/Plausible.Stats.TableDecider.html
index 5b079693d8..dbfe0dab60 100644
--- a/Plausible.Stats.TableDecider.html
+++ b/Plausible.Stats.TableDecider.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Time.html b/Plausible.Stats.Time.html
index ac6c001ca4..ce02310e3c 100644
--- a/Plausible.Stats.Time.html
+++ b/Plausible.Stats.Time.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index 97cb29b273..624c254c38 100644
--- a/Plausible.Stats.Timeseries.html
+++ b/Plausible.Stats.Timeseries.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Util.html b/Plausible.Stats.Util.html
index 9402cc2c51..6ac1f934c7 100644
--- a/Plausible.Stats.Util.html
+++ b/Plausible.Stats.Util.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.html b/Plausible.Stats.html
index 48b618bd21..2a51f4ba64 100644
--- a/Plausible.Stats.html
+++ b/Plausible.Stats.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Adapter.Read.Billing.html b/Plausible.Teams.Adapter.Read.Billing.html
index beb2b8f356..72e8c70133 100644
--- a/Plausible.Teams.Adapter.Read.Billing.html
+++ b/Plausible.Teams.Adapter.Read.Billing.html
@@ -14,7 +14,7 @@
-
+
@@ -167,6 +167,14 @@ Pages
+
+
+
+
+
change_plan(user, new_plan_id)
@@ -255,6 +263,14 @@ Pages
+
+
+
+
+
site_limit(user)
@@ -317,7 +333,29 @@ Pages
active_subscription_for(user)
-
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ allow_next_upgrade_override?(user)
+
+
View Source
@@ -339,7 +377,7 @@ Pages
change_plan(user, new_plan_id)
-
+
View Source
@@ -361,7 +399,7 @@ Pages
check_feature_availability(feature, user)
-
+
View Source
@@ -383,7 +421,7 @@ Pages
check_feature_availability_for_stats_api(user)
-
+
View Source
@@ -405,7 +443,7 @@ Pages
check_needs_to_upgrade(user)
-
+
View Source
@@ -427,7 +465,7 @@ Pages
ensure_can_add_new_site(user)
-
+
View Source
@@ -449,7 +487,7 @@ Pages
enterprise_configured?(user)
-
+
View Source
@@ -471,7 +509,7 @@ Pages
get_subscription(user)
-
+
View Source
@@ -493,7 +531,7 @@ Pages
has_active_subscription?(user)
-
+
View Source
@@ -515,7 +553,7 @@ Pages
latest_enterprise_plan_with_prices(user, customer_ip)
-
+
View Source
@@ -537,7 +575,7 @@ Pages
monthly_pageview_limit(user)
-
+
View Source
@@ -561,7 +599,31 @@ Pages
monthly_pageview_usage(user, site_ids \\ nil)
-
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ quota_usage(user, opts \\ [])
+
+
View Source
@@ -583,7 +645,7 @@ Pages
site_limit(user)
-
+
View Source
@@ -605,7 +667,7 @@ Pages
site_usage(user)
-
+
View Source
@@ -627,7 +689,7 @@ Pages
suggest_by_usage(user, usage_during_cycle)
-
+
View Source
@@ -649,7 +711,7 @@ Pages
team_member_limit(user)
-
+
View Source
@@ -673,7 +735,7 @@ Pages
team_member_usage(user, opts \\ [])
-
+
View Source
diff --git a/Plausible.Teams.Adapter.Read.Invitations.html b/Plausible.Teams.Adapter.Read.Invitations.html
new file mode 100644
index 0000000000..bc2220801d
--- /dev/null
+++ b/Plausible.Teams.Adapter.Read.Invitations.html
@@ -0,0 +1,361 @@
+
+
+
+
+
+
+
+
+
+
+ Plausible.Teams.Adapter.Read.Invitations — Plausible v0.0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ View Source
+
+
+ Plausible.Teams.Adapter.Read.Invitations
+ (Plausible v0.0.1)
+
+
+
+
+
+Transition adapter for new schema reads
+
+
+
+
+
+
+
+
+ Summary
+
+
+
+ Functions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Functions
+
+
+
+
+
+
+
+ Link to this function
+
+ check_invitation_permissions(site, inviter, role, opts)
+
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ check_team_member_limit(inviter, site, role, invitee_email)
+
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ ensure_new_membership(inviter, site, invitee, role)
+
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ ensure_transfer_valid(inviter, site, invitee, role)
+
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ send_invitation_email(inviter, invitation, invitee)
+
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plausible.Teams.Adapter.Read.Ownership.html b/Plausible.Teams.Adapter.Read.Ownership.html
index a84a63fc57..d940762ec5 100644
--- a/Plausible.Teams.Adapter.Read.Ownership.html
+++ b/Plausible.Teams.Adapter.Read.Ownership.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Adapter.Read.Sites.html b/Plausible.Teams.Adapter.Read.Sites.html
index 0806e9323e..4b04427930 100644
--- a/Plausible.Teams.Adapter.Read.Sites.html
+++ b/Plausible.Teams.Adapter.Read.Sites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Adapter.Read.Teams.html b/Plausible.Teams.Adapter.Read.Teams.html
new file mode 100644
index 0000000000..c722b7d736
--- /dev/null
+++ b/Plausible.Teams.Adapter.Read.Teams.html
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+ Plausible.Teams.Adapter.Read.Teams — Plausible v0.0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ View Source
+
+
+ Plausible.Teams.Adapter.Read.Teams
+ (Plausible v0.0.1)
+
+
+
+
+
+Transition adapter for new schema reads
+
+
+
+
+
+
+
+
+ Summary
+
+
+
+ Functions
+
+
+
+
+ on_trial?(user)
+
+
+
+
+
+
+
+ trial_days_left(user)
+
+
+
+
+
+
+
+ trial_expiry_date(user)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Functions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plausible.Teams.Adapter.html b/Plausible.Teams.Adapter.html
index 3558a90aa9..79805e1cfc 100644
--- a/Plausible.Teams.Adapter.html
+++ b/Plausible.Teams.Adapter.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.GuestInvitation.html b/Plausible.Teams.GuestInvitation.html
index 438feea6d5..6bc0df0fa2 100644
--- a/Plausible.Teams.GuestInvitation.html
+++ b/Plausible.Teams.GuestInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.GuestMembership.html b/Plausible.Teams.GuestMembership.html
index d214f46d4e..1bbe23d6b0 100644
--- a/Plausible.Teams.GuestMembership.html
+++ b/Plausible.Teams.GuestMembership.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Invitation.html b/Plausible.Teams.Invitation.html
index b94d9580b8..2c318c895c 100644
--- a/Plausible.Teams.Invitation.html
+++ b/Plausible.Teams.Invitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Membership.html b/Plausible.Teams.Membership.html
index b2f038f583..f2a4b23983 100644
--- a/Plausible.Teams.Membership.html
+++ b/Plausible.Teams.Membership.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.SiteTransfer.html b/Plausible.Teams.SiteTransfer.html
index 49d02c900c..2a23ede26a 100644
--- a/Plausible.Teams.SiteTransfer.html
+++ b/Plausible.Teams.SiteTransfer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Team.html b/Plausible.Teams.Team.html
index 5f04dd9f23..07078824dd 100644
--- a/Plausible.Teams.Team.html
+++ b/Plausible.Teams.Team.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Test.html b/Plausible.Teams.Test.html
index 3c7301c454..a96aecb5c0 100644
--- a/Plausible.Teams.Test.html
+++ b/Plausible.Teams.Test.html
@@ -14,7 +14,7 @@
-
+
@@ -333,7 +333,7 @@ Pages
assert_guest_invitation(team, site, email, role)
-
+
View Source
@@ -355,7 +355,7 @@ Pages
assert_guest_membership(team, site, user, role)
-
+
View Source
@@ -379,7 +379,7 @@ Pages
assert_team_attached(site, team_id \\ nil)
-
+
View Source
@@ -403,7 +403,7 @@ Pages
assert_team_exists(user, team_id \\ nil)
-
+
View Source
@@ -427,7 +427,7 @@ Pages
assert_team_membership(user, team, role \\ :owner)
-
+
View Source
@@ -451,7 +451,7 @@ Pages
invite_guest(site, invitee_or_email, args \\ [])
-
+
View Source
@@ -475,7 +475,7 @@ Pages
invite_transfer(site, invitee, args \\ [])
-
+
View Source
@@ -567,7 +567,7 @@ Pages
revoke_membership(site, user)
-
+
View Source
@@ -589,7 +589,7 @@ Pages
subscribe_to_business_plan(user)
-
+
View Source
@@ -613,7 +613,7 @@ Pages
subscribe_to_enterprise_plan(user, attrs \\ [])
-
+
View Source
@@ -635,7 +635,7 @@ Pages
subscribe_to_growth_plan(user)
-
+
View Source
@@ -659,7 +659,7 @@ Pages
subscribe_to_plan(user, paddle_plan_id, attrs \\ [])
-
+
View Source
diff --git a/Plausible.Teams.Users.html b/Plausible.Teams.Users.html
index 267e1d5fad..d2a986d875 100644
--- a/Plausible.Teams.Users.html
+++ b/Plausible.Teams.Users.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.html b/Plausible.Teams.html
index 35079bee24..03be6fedc1 100644
--- a/Plausible.Teams.html
+++ b/Plausible.Teams.html
@@ -14,7 +14,7 @@
-
+
@@ -281,7 +281,7 @@ Pages
get_by_owner(user)
-
+
View Source
@@ -303,7 +303,7 @@ Pages
get_or_create(user)
-
+
View Source
@@ -328,7 +328,7 @@ is returned.
last_subscription_join_query()
-
+
View Source
@@ -350,7 +350,7 @@ is returned.
last_subscription_query()
-
+
View Source
@@ -372,7 +372,7 @@ is returned.
load_for_site(site)
-
+
View Source
@@ -422,7 +422,7 @@ is returned.
owned_sites(team)
-
+
View Source
@@ -444,7 +444,7 @@ is returned.
owned_sites_ids(team)
-
+
View Source
@@ -466,7 +466,7 @@ is returned.
read_team_schemas?(user)
-
+
View Source
@@ -488,7 +488,7 @@ is returned.
sync_team(user)
-
+
View Source
@@ -510,7 +510,7 @@ is returned.
trial_days_left(team)
-
+
View Source
@@ -538,7 +538,7 @@ is returned.
with_subscription(team)
-
+
View Source
diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html
index 045be72af8..cae961047b 100644
--- a/Plausible.Test.Support.HTML.html
+++ b/Plausible.Test.Support.HTML.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Test.Support.HTTPMocker.html b/Plausible.Test.Support.HTTPMocker.html
index 4b940d5a38..df860230b6 100644
--- a/Plausible.Test.Support.HTTPMocker.html
+++ b/Plausible.Test.Support.HTTPMocker.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.TestUtils.html b/Plausible.TestUtils.html
index 385a69a38a..a3cd1dbedf 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index 76ad463d24..fb13de2062 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index c4a4417e4d..45dbe34481 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index 58ed252717..da792f85f4 100644
--- a/Plausible.Users.html
+++ b/Plausible.Users.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Check.html b/Plausible.Verification.Check.html
index c15da731ec..04f46dd433 100644
--- a/Plausible.Verification.Check.html
+++ b/Plausible.Verification.Check.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.CSP.html b/Plausible.Verification.Checks.CSP.html
index d01739482c..f10cddcad3 100644
--- a/Plausible.Verification.Checks.CSP.html
+++ b/Plausible.Verification.Checks.CSP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.FetchBody.html b/Plausible.Verification.Checks.FetchBody.html
index 235f126b2d..4fe2a3915e 100644
--- a/Plausible.Verification.Checks.FetchBody.html
+++ b/Plausible.Verification.Checks.FetchBody.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.Installation.html b/Plausible.Verification.Checks.Installation.html
index 083a2bac67..7bb0aebda1 100644
--- a/Plausible.Verification.Checks.Installation.html
+++ b/Plausible.Verification.Checks.Installation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.ScanBody.html b/Plausible.Verification.Checks.ScanBody.html
index a99dda0e33..6c03f34026 100644
--- a/Plausible.Verification.Checks.ScanBody.html
+++ b/Plausible.Verification.Checks.ScanBody.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.Snippet.html b/Plausible.Verification.Checks.Snippet.html
index af5bb1b768..e19a6d7afc 100644
--- a/Plausible.Verification.Checks.Snippet.html
+++ b/Plausible.Verification.Checks.Snippet.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.SnippetCacheBust.html b/Plausible.Verification.Checks.SnippetCacheBust.html
index e64e22c74f..7b36762f3d 100644
--- a/Plausible.Verification.Checks.SnippetCacheBust.html
+++ b/Plausible.Verification.Checks.SnippetCacheBust.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.html b/Plausible.Verification.Checks.html
index 5f96fdd827..d690adac66 100644
--- a/Plausible.Verification.Checks.html
+++ b/Plausible.Verification.Checks.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Diagnostics.Result.html b/Plausible.Verification.Diagnostics.Result.html
index ce5fd65b63..3ccbc74e75 100644
--- a/Plausible.Verification.Diagnostics.Result.html
+++ b/Plausible.Verification.Diagnostics.Result.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Diagnostics.html b/Plausible.Verification.Diagnostics.html
index a80bcfc20b..d165a6ac0e 100644
--- a/Plausible.Verification.Diagnostics.html
+++ b/Plausible.Verification.Diagnostics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Errors.html b/Plausible.Verification.Errors.html
index 03e88751d5..c7ef8d0e11 100644
--- a/Plausible.Verification.Errors.html
+++ b/Plausible.Verification.Errors.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.State.html b/Plausible.Verification.State.html
index cff6f8a1d5..838bca1a1a 100644
--- a/Plausible.Verification.State.html
+++ b/Plausible.Verification.State.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.URL.html b/Plausible.Verification.URL.html
index d2bfe8715d..919386cb5e 100644
--- a/Plausible.Verification.URL.html
+++ b/Plausible.Verification.URL.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.html b/Plausible.Verification.html
index 7072b46216..71fb0def6f 100644
--- a/Plausible.Verification.html
+++ b/Plausible.Verification.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.AcceptTrafficUntil.html b/Plausible.Workers.AcceptTrafficUntil.html
index 66b3a257cf..341e6b7d91 100644
--- a/Plausible.Workers.AcceptTrafficUntil.html
+++ b/Plausible.Workers.AcceptTrafficUntil.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.CheckUsage.html b/Plausible.Workers.CheckUsage.html
index cc5775f131..21ca24fb64 100644
--- a/Plausible.Workers.CheckUsage.html
+++ b/Plausible.Workers.CheckUsage.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.CleanInvitations.html b/Plausible.Workers.CleanInvitations.html
index a8fb10989e..19187113bd 100644
--- a/Plausible.Workers.CleanInvitations.html
+++ b/Plausible.Workers.CleanInvitations.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.CleanUserSessions.html b/Plausible.Workers.CleanUserSessions.html
index 30dbc67554..61c9fa29a4 100644
--- a/Plausible.Workers.CleanUserSessions.html
+++ b/Plausible.Workers.CleanUserSessions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ClickhouseCleanSites.html b/Plausible.Workers.ClickhouseCleanSites.html
index 341da914b7..8b9880dca3 100644
--- a/Plausible.Workers.ClickhouseCleanSites.html
+++ b/Plausible.Workers.ClickhouseCleanSites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html
index a0b1a1f26d..138b5bb5b1 100644
--- a/Plausible.Workers.ExpireDomainChangeTransitions.html
+++ b/Plausible.Workers.ExpireDomainChangeTransitions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExportAnalytics.html b/Plausible.Workers.ExportAnalytics.html
index 2ddf173438..86d9dff181 100644
--- a/Plausible.Workers.ExportAnalytics.html
+++ b/Plausible.Workers.ExportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html
index 93e5e9f6fd..e242ed8e27 100644
--- a/Plausible.Workers.ImportAnalytics.html
+++ b/Plausible.Workers.ImportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LocalImportAnalyticsCleaner.html b/Plausible.Workers.LocalImportAnalyticsCleaner.html
index 1111c0b0e2..d58019e1e8 100644
--- a/Plausible.Workers.LocalImportAnalyticsCleaner.html
+++ b/Plausible.Workers.LocalImportAnalyticsCleaner.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html
index 286499787f..f97d009de0 100644
--- a/Plausible.Workers.LockSites.html
+++ b/Plausible.Workers.LockSites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.NotifyAnnualRenewal.html b/Plausible.Workers.NotifyAnnualRenewal.html
index 33c3f5de35..913131a01b 100644
--- a/Plausible.Workers.NotifyAnnualRenewal.html
+++ b/Plausible.Workers.NotifyAnnualRenewal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.NotifyExportedAnalytics.html b/Plausible.Workers.NotifyExportedAnalytics.html
index 603e90e38d..5d6dad7962 100644
--- a/Plausible.Workers.NotifyExportedAnalytics.html
+++ b/Plausible.Workers.NotifyExportedAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html
index 98cad4e859..7f2169a2ed 100644
--- a/Plausible.Workers.RotateSalts.html
+++ b/Plausible.Workers.RotateSalts.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ScheduleEmailReports.html b/Plausible.Workers.ScheduleEmailReports.html
index b9c98007f9..7cf1430185 100644
--- a/Plausible.Workers.ScheduleEmailReports.html
+++ b/Plausible.Workers.ScheduleEmailReports.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendCheckStatsEmails.html b/Plausible.Workers.SendCheckStatsEmails.html
index d228fb83e1..e16f57331b 100644
--- a/Plausible.Workers.SendCheckStatsEmails.html
+++ b/Plausible.Workers.SendCheckStatsEmails.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendEmailReport.html b/Plausible.Workers.SendEmailReport.html
index ede964d03f..6e253b7003 100644
--- a/Plausible.Workers.SendEmailReport.html
+++ b/Plausible.Workers.SendEmailReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendSiteSetupEmails.html b/Plausible.Workers.SendSiteSetupEmails.html
index 57439a9ac0..cb6d73e443 100644
--- a/Plausible.Workers.SendSiteSetupEmails.html
+++ b/Plausible.Workers.SendSiteSetupEmails.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendTrialNotifications.html b/Plausible.Workers.SendTrialNotifications.html
index 78f94b3507..d9ef82ee9f 100644
--- a/Plausible.Workers.SendTrialNotifications.html
+++ b/Plausible.Workers.SendTrialNotifications.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.TrafficChangeNotifier.html b/Plausible.Workers.TrafficChangeNotifier.html
index 829d807500..6d6b684397 100644
--- a/Plausible.Workers.TrafficChangeNotifier.html
+++ b/Plausible.Workers.TrafficChangeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index 5353ee8440211b8c865f7511b6f587372d324ae8..b9a31de47b95e83fc9cd89d2da1c9a33dc9f9a47 100644
GIT binary patch
delta 169141
zcmX`Sb6{N0_xRo2*tQ$9N#n*zW81dvq?^WOlWpACw%ORWZ5vPD`FwxR{xh#VGjj%a
z?#wwecP>U*$~RdM6{H~`F+ctHlhuktuuTQ3A8paPKfP_eG=7jkvwXNaVjjLU#
zmT*!HGvC0wuR+X=@JLWKewEQc_}dgb%!NJ)1|%C$gW?x-C}K#=Bbf^y^2i7zvEyYC63kEA9ykU4!Y1G*iUU%0&oUXO3nfpcy6*HARtGCb5
z*>pH{Yy`zU?+9Xb@=|@r5!1y(xPl(Zy}d@R(CLB|W5U1NT_oZk(GcI;t&XizIfDUt
zaJwn2hW^9j&^OBiG~T&za<*cic!c2nS5`96-(5iI9`{q}TL^9M*$);y9E#}-t6};#
z9MDVw-B%D?KH9<3e8R+_?N=0c?=M-g+vwU}{MOoQR%(s+5UZ}4;e|J)!D*~4UmwR3
zRWg5@yu=ZvRTX3FVADK<(zzD?}62lu*h15KN86HNu3?JYSK6dG-}`a^9&
z4AFH!HP3Hzy7{R21Zvvrf@y)uq0$C+&OJe(w~Zx}3ZBQ2Rppy6QHH+N`_mD_w)s1*
zzqVVxEuwH+b^aRU&pO;yRPt$OFNgfb?>%BdO3uS8cuUR827&k2u=UxJkL27%3$#2~
zIVF?A_*Q(+j_LLs#j?$XHEzlUn*w%log?N52M|uG^oD!7Cvj`KAUkTfG#<`
z6hNKwSIyA!-;hEDPB@G`58;vYv12R~Hw5-eV}~^C(}QRQ4gzMU$&t`?>}&5bcD=vD
z-P9jk%t-I2K;C&BYSM&+bDi1ex!aa!?s3n|ohsHxS0$}|gP)&jZH8;+STiniMv7zf
z8#Ji%r^WDDx@BI@jEls(%~L7p0d-gt!4@eATcxazT92}isQztCOFVrSS{+M_;TrPvwm?0l;xt}kffwinm*S(oX&UFc7EfXC~>qJQU
z=J`w+RyQfQVNj8l@udR=7B1Gii^R^(?sR?P4ZnI>xa(?uRi#qtI>@h!y7-HN*98ia
zKC#{%feQ4M_+W3>g$&AFkY+?n$N@s|{fVImiM6kI58}vgX1;vv@6ws3P&;{kVD{}T
zqT-}G3mvven6D&QvA&}qn*i7J>3!!37yXjD*J5mmhLOfLfWeTgOaYTYvu!yS#_h`%
z9xI`#;KHuuSd)>o_hF%d6O=46O~+K2IG%vvWLVvMMEf0!zB9M5B_{l)MRq{g_}WF+
z@S0z>ypzP{_XL?)ok_@5sLZ|649@WDG-_^8z=Dc%-#*uzWHJT_&llWGGstG@$wb=i
z3>VK(bx;1t|0^H%ZzfspP7#gz+DNg4)bmE=b-wD~hgwEfnV=_MfM|h$BUz&k)D{mW
z`#KL{nU~96sI80|v-w&Tc4p8ql2ojlh@;I==iDxagoaZ;6ZuvO=KXJa+l*u;>;aXx
zKB;6Zc^Rqk*U)Cr*CHaIyK)dc)VGCuj?^u$y6rp<>?y)33W%+t@_RBN*}R?Q(YPvi
z0WPI=o%kN6UjZ!4%EboqOE%%w?L92Rh|tula1)I_T5vP-G4JH2I0U6_$NYXKZ&O$jzc2hy&$;fi8D{-8R%^`2U!wJpay!=I
z+F}r2v;SxHx(ljL`viEDf$2*5tw6I=PTvm5+AUr1)Oy|1CCXDwZIon)m$Hr=eRgrT
z5g9s`KETKcy1kDO+}1Uy-Hjr8N_kV3lYF`6M#)u^@cFvleP{#ieP81OH#sF<6SGH<
zFYp`~n?QYR;1qzGfbbn@b}@_ksTZ{d|J$j3#L?Kmqu}>Z>yaBUt(XKd%`fH;5pGa
zj}cq?K&S@_A#HuL0;??yqqoTP-bjUS#C5b*?a-{ITIUM8WP?yrtfMDOdB|Pq7kC^m
zDF40BrOD??Tg;e$JDxG4Q55w3T>C_ITsuv*Tm?ezq*#MoI}GAv4yh?LC4XYk;UV+fb&&wU8wH_H(9MiQsx^L{=H+nI1?JLngn?Fl@brbHXm|lCRK-LHZ`RkEybpK1
zn}$)%nU-!Gz3xkMPunKpZ<6<6jL|o;P-@TZ&^efK4%d~SQWkO$pOpm*@ub7X~bViA^pcjrm&0v9wz$`CW50kP0zbq};qAA)!DF-OB
zyp*>>xztT@&V|ApkL5ZdGHYBAajebBWYT+}Vw1k9bioTQo~G6ZhR0K-m?%>_RtQnsu86
z^FNY8Y(m$|a|2YziMm27w$i72e{=eNekm4dvlrgB9#+_?w0~;<*Bq!af4+b1s7S-r
zg_nHyM3kJyl&r`d5VGaa!6+{R>3RRM@a$<;iOmerQdDSuUL11PU#stpz4X2^7Jg*BD6GQ6>};IaRf?ge-a!7QC_&ft)oS<>z=%vhDkwruWuPp*L8+V&_<_>_wJ-
zWRRiBoMPFMvlAex}00f!WGJ$AAx6jM7&o|%qzpERd>
zJjj>yh@NlM6u4EuJm8B9-*whQ=Y
z?B1sVZ$CKz!d3F5)Io{aQ~gu;BNQ5rHajemUeEXr^zp&HKan;bANKAcYSjvneBpUb
zXm>Q}M2SVKTE5=@64D{i5#TSSsHKn!)7PL1s{Gx$RsLP1&H`IYGbitR0-<$F0*WUt
zUxPlFJ$HK58UFXc$c;MrI(XVYPg_Vn`FUkp5meIE?oQ!NegvXLx8vw+P#(&{KKph+
z=};o8L>f17RDGKUe+QzmlHL;g)quPp>Liyr$j58ky&AYzRCjAy^d)0iiSfFy9<7_VF(>XWIH?d=%H`QMyH>;EIQu$8T8h2*yLHsw?RBD%GMzP*5$3Q68S*3Y_d5(I^0_*7+ly
ziFb$;P;!pp>o@+e+Vq#$mJk2^-UZ@XN^^n_}kQPA5_ut@o_TqN8XW{&qw!O=h+OI&(v#AAXSMs
zc>uti6e-hLfm}d+aa~ZB87p^!7p;=go>`8uZy_2*nK=+m#A+Ro6XmK$qqz7L|EJ%~
zw*wmF?ZOm`g0J70S732D<@7dgyY+BUa;WAcI75lenT8y*cK*
z?p>Bw8BpNZ8{k&~9zOH^i4F-bP~u;+(Wn?wC&h*D(L!n|d)JbTw45iJ_k_PRqkP1W
z3RO^)v{747ulry1-Wfu-|B#Gtd7$bekBz#7pg{aL6-KW_mVR)ZY?$~1)-T(g+iG2(zG;0b>(>0
zn@dW6P<`X&S6nEq$OSi((aSPfXOl8qaf3|VI8*B#evz>SUuY@S(e3-}#240&?Zj`f
ztckedXu946@(~fQsw=@x2dTn2cvOp9@Ytv#25m*Gt=JR(%T=xqYM_c1yZ)rr(9q2Y
z#SzCJnHw{D6NgacO1+Li`WP}lW3q{as!StZ;8^qndXaHHI(Rz&J7w!Gtw67u__v*!cFk3ZL!pqL>?Y{mIrpRFCj(g|3ehZB@`3i)v9e
zUummR^4$8OXsG_3ULk{6Y9)g(;r7g1$~#1Vv4{o}?LLU8{mZip=Y}>r)nN~vY&8U2
zDSM;J501gx^1hg=W5Z5r-zx&r~}%
zPZV;gh7&I|$XL66I*8vlok2RMSI)<2DpX?5sJWQnXC$?}Z}
zPojB}4v_QmB?Ebq8h?m2OR;n-RQzA(A>7@5vMMSb|K0HSto*m;1_Iv~*m{9=E}C>@
zydAF`ab{TtZ0yMt!mdj9BR5IH9(ziQYf$9ljTUb9GJg2{8`(m)!%DD7Fj3j2pke>N
ziGWA6k^i9~f-1mRmCu)B7GqeLpd*Nb3)|ba9~2;;!_?Xl@>(HDo2Nka)~?;rXrl#N
zJ#ANmeK^P$m`)nJzNWBu(quikO5{Y7_H6t5c2+hGe1kv3e4uG=2rxhUGm@hJ=V0@x
zs$94RbDBbLCpH7x#|nCVXi^#30K>$#Luzwvfu-|m{C@_g}-f=o`MV=s%QuEz^WI$?@}5ir(TfF
zc62~GGOtYN{28P!rzbK*J{_|(aG>qa9)iO~7eeOp{pUbG1_K)}I)g_$(ZpejKu|Jq
zKXl-3;sS#JJs!g;yv1{6xLnMi2r*Wuj9Jg`iC9NVf5vBoj8iy1&wN?@#PV7!N(oRN
ziWRKia2N;u+ktz3?_C(RTM|Ttx$w>aI+h)^3Kl_9)T$^30j0(Q_%>AMdFIY=2bSld
zLr`mm(N&Y3gh$pN_Fu1-+NPAkl0aC^LhE^IiIJM`ch94;6|X+Zk)raZ0dF!QyE970
zS2A}fTHujM6ND1McPcgdL?Hdw^7UcH^73)&mNbObbFAOA4?|xlk)ITjn#3`uR7)on-r~FNbQvfB>HLbH~
zL3|6o77L2H{2xQr4)KNT^tm57Mvv7WL`J9lfGNuzR?FuxJtYUW+0Gi-9PfntfT}g|+Cc1M>$*J04
zKYa#@&6tLJw2R)-8XcZa>MO`%p-u0H()=haQaR@HIY*qa$t;E`(fZF}FeHb!-%#!&
zY$RM{OGz|lJ5Y8xIj>F>$M$@>wDd}RwM8wD#ee{#9<7XB%<}nHsZI3A?Mvw0v9+9r
zI(0l8P@QARt3Xq8*GL*eA~_r52^aGcj};ons$N8~Z*ooW3m-{Z-gl5G6W&<#2@=PN5D;QaZVN~I)Z)Z)LM
zgw%?{h19t?PI4njcoJ7p497j5$V$QW7$4NpktTPF<(afb*HdL#aBPJ5x?gm)C&Z~!
zBDlOY?IB1#9EpE=4_pSRLqdi`-AwrXFih-QGk}`Dn%Y>o-hp%(UE-223NKU7NXunf
zusTNvW*05eti5aJcKHYa)*)JTtjZgz3n?FOTSGmMLIWjjFCNx#-QQH}2;!Zh_T}$e
z%%oA(h{*l(Ez#JCJ{#qy4H#axp97D6qbawwK^1l|S$=OpXuSqq=>Oj!p0rD4#)RH@
z<`?a?Wq$$==ax$^%Y+4X&*<`OvT3k$)QqOIzS`hZ#-cK(yU5uq4ZgEvvfw(j4%?Dt
zO9JrB^-tOZEqjNQE|6+;23wjR-S)}z)F>^6yJW~~CR=M`Mcvo!?5ILIDprJ9HW%5X
zAWIPS5gtHD#~xkp!Y_Zql_X>59zgR)ElYokT>BStJ8!6BsG5T3$5r|s$URh=VS&%2
zKkbXYQu+J2#tZ(gWCXjO3ymnJbv^-8I*6Z8rZ^C2T2~xOYT;^#yEVqdyJW^k^*D1h
z>1c&=4H&`88Pl_4lLydqY0=Da&RtPRZcoff*OH(rzb3nU8WV_XA2dpqyYWj=%waC~
zl9YP0`Vvs^elt%@eq!HOGH7D@QOqO;v_$Wfln4Ig{vPuxdRem9yfwkQb-r{*wi0^e
zMjCAv^yN-;m*hOfyD!3EO@>|g`ZJ3^&*Mg{LDZ}U7-l0aQ;VqQ4B@6StJ+0t0yLI}
z^Q@q@GTao#ebTS*cv?+4E&N_S`-=G6KUBjU_QdhEpGqSWOZ^0`=;cg_HotR@B|I}s
z8_0xKqxHE%k3Eouo=Pup+@$b|(MJB{=S{UfW_>hckY1QWy81DCweO^OZjgfY@FhlW
z!4tM?w*vkB`>Yh~M0&9s<`u2V4Y^f7Z11fc~U$>?p
zGi#JIOAay7#tEeO?8H@JOSc$klOSux5*~I3LY5yWo-yP>;d+!i7nLW)7
zn!qMWeg0CB@za+^zF@?qI*1~`93I4vZliAet?2VaP3ejDs!q3c{^YS82%r8G9bWJu
zKfFM(MQHqtb+`~CcmF2YK&L=Ht3llL8uIC0FNOoL+0Em#p5mPel6C~2Hq?u)AECYdC7=HPi)U<;xn6mS^t#r>F-zAk!
zP=+FPQP(-`CLYRY*%~qxk%oQ
zU_$LQvUahk10xCBU~T2zbZlYHgrJAgmWdC|sM_A{C;0VblhGm4pf%p;>;QL#7
zpd=|v*bePY*+JUs_N-N1Ni2OE?Pjy+Q2b=11)Ya?8)yRRxtdAixcXN%WD#xQancY4
zBl}L--RR%Hrnl!L#aWHHkFM4up^9v#7YI`{U75yRb(oPqZFHF^M)(82k69j9`=!NC
zTY6<*_^3qb@`fPG);=+Ch5U9d`bM0wdW82&M(9w!+ZmQSgi5k{mxX1y&biP78zSD4
zEC=$Ja1Q9!Yb|^1&q*A8f|l^pVpWA`hWh3t11Nwygbu3O_$FIVuI_=;Wrnt?;MhWH
zMoE-q6R*9xHN{jAZ$EC96GSy!mbHbOeiW>q;v3Af)pPbeIr3)c1y0ToH~OW
zgCZuV%ed|kO;$+>r;fZ+`IrC*6XuxQiI@w?O$wq#j0nAmf$)`?QV3
z59F8)Xsw^^kl2u
z8OeI}O;*k1*yvn&{Wpx*yo#PLRLxhm(TcCC+h#CF0{nc@&20le*P3cNno)$PPyHRf
z^^}7)``+XefAx(1jqqlRflo`2DZSXTn*ZWdy`;H<(E-yLkco5ggB*o$BP*w9^4E9?
z7s+4#+`#)hOebJotQY+W&C~ALg@`Co-R5HGHf2tkuYOWn*-MsULGF7uRodhr!jOo?
ztG~kBAe(LzVT|Y*Q7Fz6hQzlLWJy@hP)1TvWE_K)+@<4EXhk8i8wZsX9|GQvX(o%0HW+YwrU^~8;bY%bf8jaKg+)230L|h9!3w#aMg)IeGA-cK+{g^}&O>B~VkS9#61l1RBK*QPIZr?Cvv4EMsakxqfd*O?UrGGgqlFXQ#Q{m|mMlM25dk*MrV`CRwnIQM)5
zMcMCobOhx$
zl2=lLQ~gRLc7EqgLoyyoq%p!CvDlnUM~8pkGjy{dabrj57ecVm8|TKTQbjZ+h3nB`
zZmc-KhZP5P6G+!hvueQZ7PaWqqO0&_c-+Oph+?||K*4in`M*hCk*83}Oy=W{-B
zZ|2*xU{{a4T$
zV1!>4M3UoMf_&*g#%T<}1&b9P&^kj-SX^t=k~mw7rD3{G@Z}Q0I~fJ}1Yh3|O169)
z=8C?Psf$0M*;tfsvB)t()3`=*TEha8Zxm?;tBs8th>O{>#2bghr=TIO(lQ5`Us-hM
zB~$@7hI@$E#Kq^-l|B6++X`Ub5qnGCbweZvg&g8ag;9Iocw%$+Pm5i)x^DCxmBNlz
zCF~yZOi9Z0S#rkgOh{J6E(o)vKB1Yck+lauDBd`U+?mFWcHFx$m{0FNEEx^8z$?w(
zI2ol;uDvm%zkK?uy$VFgjn+YZL6E)(hN5aXiXCOvsWtXKi+e-wBvu-6*)gsxcVSQm
zX|h!~6D13&@>d=4aTEyr9wwL|Bz*OMPm6FIO1MXEh&iakLTUzF2S%DqickhgEylVB
zEjpM|x%T)={Tydi`AyH*OiR!?74}1)!-yq3Ob{+RM~**ol&bFFkQ1%~mlp_WW?F#mox2X*1zi>NG{qUn5F$jdS-(^WGiGMIIi6OzvC~I@>aj
zvS<%GQ>4}lzF}>n?^rzkJIMUEMN*rrYq!mX*uTDy8Nls#4{Sl$ai$7zLF=^yJ&!Cz
z%6^Y)jZb51(3iBEW;-yD`L-OAZE^ja@R>4R$z8>dI;Tc5>hGFqg3s+~Oh<>$g>s79*kUeIm-34q&jp*T5bFssa
z@)ZfG<8BoaNhV>`M&6Pm9gQs1+23q22kNB&XQIBt!)vuq>7fsTA`4bQp1H0FR#Eu!
zovXp=!Z@M~d2t%49#>8Z8Pa=MT8U-dnhS`AaFa;&kVjwB^F3a4(c>j_JW2l;-#Ojb
zlGk@sLDJ=I*U>qO>P0BJXMf9TC%D9GXcPDyH6+5-Am(lT%SdBD3@PaPXfjxr5Xy)7)XqRsez
zSG?(h7-DJ$pQzYyqLx}X12i96h(n}0a@t+5#4P0I9%&oBtUHsWEnI(R3*Db-HaHEX
zsm-Zy$Y6Z_d2Yy(1dnGeljk)i&uLLO%ipWK=gh#r`37jO`+A(307@3wM55o*lJBfK
zX*;!cEAkTW$!*aJG<*wfHeJZrs>dQKg}jQMol)U29(ohBnjDF_)=4?6X36zNMh^=G
z6T4-g&yF(08&Ib;RC5y+9e8WX36^r|CU3g>6EH6utn=7ri|86bR+mtmE4PyV=0tC;
z>>Jq+vJ|y!?c_~82f0gxO;V;UVy`Ek>|Y0WO`?5ag>7f97y3;7sO;Xg>AZRxJv`gT
z6`7ub(C!|3u{{?#I_wa{cB>dizL1?XJQ~F}a0sJ(*Ou}lxZ=;}QIEW5neC@8b3b_Q
ztG3JnCU|EoDki4s;3Anzm_&I4$vZpDq+Z$%$;}o((er#^FX$1awe$9DrKQ}4YxDC%
z#V`(=8}HQW1!e6I#wr%?8Gq*B!S=ZFHwgN{O>uw_`n(1dY+2_WKG72vm;2Xx%nMH%
z>^lZ)bx+yCA&t&uQej^bC{S1Cd>Oj*3-g#Y*9IS3?u!vS-LOX+;UDJS_X%(4GJz|b
z`giS%pt#$H5Ktz{@R@Gt^$p%&Bh%mpF8A7khwfmxeLjYTfpj?Uapa3qnd=&%(j*?!
z9Q!yA>|ZfAnB-RIh~4-bJ(|A9f)z%B^#>G(7$4nVOij&TISxvg%>?V022))&5IN8E
zdx(`yaF%FL)~{>Qn`DcjW9Bfsiu;L&kMA4G!0UGZ_W%ER`kvv%D5!dVWUhc_sY+2e
zm-+rdOQX$&WM4#6c>!u$C{^~Krw(06k3TY<-|(p}IIAfz>i4E7P!^Syej(Kx#3v@A
zi^f|)b`!p9u(=4N%Tu|ZXW~)Yu(z*V4*7yw#vwI&7FD-W2!Ay&V%E)G!P-yzi%@wwPZaca-M4z>~1>QuyJRx98JgkPldK}_65ciJ^dT1_WG)s)6
z4Eqvp7Gx(@SBK{`UO2(^Ca#bQK|xlvDj!?be4#F9xpEMNh(;qRW;Gw#bP*z|*mFl`
zV3)e?sOnlClq*4x0^Cn1p%*BVR`z_Ac|3Un%~8<0bT)4EPJVX`o&;OY{#8iQq9=mz
z&~9M~yx@Dz7r3`Uq|9z2q<~tNa$h4!^z92IXTWHUB*Q#g45_w9)$dgh77$be^3e}c
z5OA^RTx8KYm#(f%0FqA%K;^$bpVyot9(A|X)U42Hb2J<~+hA=f@8#eo`5{yolCn6E&ix|=$X{MXWckuz
zX&5ToCdRFgle|J_)kK=^(FtearIfyT+UGCl@mMmj=It@i0C1c-7H-nlQ96V!L8HMP
zRNBnXKkSFmMKAZ}bcvL3gnyDMb7tHdL{+QL^#)lrCYP}p`Rxi56
zTN50W{`el|)rj5xXRc7)VI!|)c$H?n6g5a2My3s#uuV|Y_bFkUt)}R(vG>u0<5b7A
zS${tP^#8t({Wxsycm59j-yt)S7yL(v=T`vxaoEfn6wVj{`RS7&7Fbad5-Y(V6B5if
zg@90V6`J{RES(Ug2l0`zas=OE5Bk$56H0IuB@hpsJcWQ$^Cj-$Lm%1iF^K>4U#7}@
zgaVoKu>bwXEgXjbFWjvjh5yjfACv6V@o(T47J{>`VgD-+s%EKe<>Ms0aTEdSzr=s1
z+MqrXAB(hZe}Vn3x$%an=Y*O10LmHq~Hf1?xQM`(&{Q_uRvDT!iD!~kC;`1%e@J!of
zQ%FBg|9bk{-PSA#*u1bZPvXw#J_tK6)+`*sx&%WwB_A#|K;ba$d%|EKLmHx+Ftz`X
zPk3@~A!teDw1C~QyV$GVFvNVewT_KADmt_ngeWIS#)LZ>ug1!hoJYf0$T1@4XuIFV
zB4%(8Im
zlF}T1xf5iROW4GU;*%sDeCxSXiOcIFGYDeBmG>By>jZCnD454-c=P5n=*
zGOY^L4f_h@L^hW)rqaLQtw^m)kRWxsGd}6rw}qmPKY=S>!brVrmAiMk#hszC?IE=I`P-W3|dalA7bt-1vOqwCIq+AG_pJfPBPOM^Tjc+%04f3I5u1=96
zFAQ>#f`TQ`QcExFm4upvII3)XEbf9^s%KJ8v-w$tLCJ*vV3kvhp4ZWh8ZAu#5`1(CseMg3w3r886%!U
zgD;wpL)tx<*@8AI#YDm&Q2ev|!eCAY3Fhi43D$o7W?B9-oC=*fw}KWyi4lsh3i!
z$nb1y`ix(vo*mUO;7@#UuxU)@PEO9j#m3_0q(^PS&T>W4m&BD(zXqy?%-t0C|;`uq+VTm+2?lkm%FHRZO>2{>~$+YT9;-e!3tVfNKSUWjg!X
zq1Dz^sd0Zelx$1hhWihG?
zmK?tgIEKHiH@<)RH~*u2T#)#00dUn!Gl;4MkHG;%3D5Mqsuq@z;xMUo=e_DHYb_f-
zL4C|lxIiuN7kI#DP=P>)$Mx}}w9?o3f40K(5(U
z3*gDBOBa==l}r&CF7vz5sa(1!^3ylK&y4W0+e%o%mbw-IZMJ5>XQZcP#)Y~#nKITxlM1nxuu&$*V^e7TX!@p_tjtT?*AoTfKTK~lk7cE)u}HxhjE-a^
z9HooE4CQC*tYGn5)?zG5R_F6)RG+`DE;m=FEe+=5^2Qa*z*L#*A@rP@_Muc9^Zp9Z
z%c1HEjG0v$2r|os*+EizsWhs9PCr40IY87J7~0tTo4EzhhKruz9`f+y#*H{6$%04~
zkQ1v}p4(5as)sP3DyDt?U{kv16wT46dK5b-W7&=Gz)Qw3+=*+1)%0)u>^6~OYJ?J*
z$Peq6Ow2w?1xoDB7^-GTiu5H9W!3dissSy&8DVvR*piD4(i*R4y5tm-o7=CYXHyr=LcaZ2yo7)hf*P6wy
zwa&)NoL^AlSBz)=jw#Hjdm~*>9E8fAtId*l0)G@9$dT1+MHOX$tu0Ge+HPn%8!nZ?
zA=J_US~izXiPt@^3TXGzr+@bK=a$Cq>1{j-QE%CyPa$4`(l>K?p5`rj@ZH!_kLTE3
zhTv>Q&=Hj!V~E((D5Z1Kec2gw@c6eWJ>An|Au;{sed)M2f0lnesvKV|k@>1J$KH;v
zZ&dHy7iU?W^C!_Ho4WS|@99Y)uk643EqRQnAP2n_ZT4u(r{#8|NV;()@X3#q6RqpB
z?Ou7ft$W|Ym4tCbgeTHixIx1{O84(Z_~=dAwm>z){^uF~JR!loGA#pL3buZ;pLM>h
z3CU`^w%n{+fy3dvH5MaaKDjQ1lR)74}@w(GaOMpWyZ`hG6T#l
zFryOTi#!V6P+ChXXIAv=$cRwwNWcb204z}7&S$PMwv$kY=05JATU{d59N5e_%2;rUah+hN@S^9R#j-1ZAVoS8@m3$C$+NaCgcXwd|4jgm6@>=KSJS*~Mc5>BJ
zC@XbtjEZTyP3Nvu13u)uF@&5WhovDqXLsL#22W1=M`uK_vHvK>h
z2n_nl)B)Bo+&r$tf$R{+7+yI>`0gS%Q;c-Q*8~ubw9^;u(8eN$j$;r{%1#BkLJi*t
zQDZeuM$UOn#&8;~FpKAmR*zs9QP#@UC2RCg7aL`ClVmD5pRw(#bbd>03`uCmR$kPZ
z;MI~hFg~@Nd=?C>vrD@crN%?f)?@_L2y&IxRpyegm(W>rEW@Oe%Iep}YzIQoIc*93
z2!Sh0N^fWxTdg&(pPPs&s!1iIq!6FyptyfRs}JQREw0|PK9>Tk*G_$#0kymD6KYfU
zSdTT$$Jp(vy|4BY7%2ygTZHM|>L|O=wQcb5Fxu_^P13|a!^;vh?7S89k8A)Pf1z#}
zZe~2O)A=py?wmR?|Mrv@t43(f#$+4*S6g?qO;1JXMVLDRK4YKsaxCB40f%<2=y$j)
z87>hmZRM(aN|)3hn{AhatJ6|9+sn(o8_r^sZ~eLnNNWlEE7-SeV=Boir(*HUxxIC}
z$&&fPvI*$o#-ATt$Q_#??{SzwjFR5-{==ium_0{b$NlmxJ5DatMr6L5Z(4qZ&Ac7k
zl@vGws+tvp4O7PhY+upDEW-zCPQ|~rQP1*8ze0u}hCmg)5|+E_oR=?_DxDTgfm*ZV
zQ|)h~eV2Z0zBlooI?r^>WW~IP5H)Wuf2s|5Xe)o_j8R5>FMfvk&z^_<@50-E^LfKP
z3ZUY{3@yX}oc?#~tpSV$SpUyrZ}7keDE((gH;j+~#y=$K6oB~;aH9oWet;#@|0R}U
z1+0EZXt@C6A9|j+0q&4U|1BAvs$H8H|Lj^ZaF!K-siBk~@Z}@vsxUzB1Ng)NVIMFc
z4G8!ESp|UO2Xv|cKp!Ba2{8SDLS2CP2V5Eg7(Rf+4B+|!Nmc--4}iA^xO{-0Gr;!)
z-rWJA9}wpAe+uD$0#rXFhCzUo4|oj&B!0lJXh7Bna3%nhKOhne2!#AF(%sl2{;jB=
zK4l|={TgBaxd&zdT(Cm|00!KtXcFe(Cse86!Tz~Tc`
zs{xiD&{_Ylum0<5?iK*!2Uv6f-u?%@fM5SPC=G8zfU6J5)i_}21KMW*?H}-C5zzC$
z+NC9;#VY@EM~q?rpThwKmOuGdFP}Al?#FXp-UO_DK+Ep`<@P=TtRw$dg3cp=`$Hf2
z_5Y&Ofk3|x$s#mR=mQ85fE@oT>X)?JSC@Ys5sDAa+WzM!Rh}WBfl1F1U>l-Qfd6}(
zc$mP5k6ih3g*vsfokIT<%HV>9bYZZ-v3fu_aQjyv
zGPvRr0jfcP4k-PRHJu4~`_Y15Ux9%i5`0cz9eR1g^a(QBh(K=}^|u{6-<
z1JdMy;16I|0doE4R5sY_0fRmycSb;!50EhjKEnJLC2kM=^6?IMxB<L>O@
z2T%$E_P_CMxyeuh4*Lm|0To!tq@qP?oM<OGtC|B_wAg
z!p36nIU#t1OB%tBp)s}5t!C$|S&!Ki9JS$9!cHBQGF(Te%SC`kU>AX|n$}Mzw+sDr
z$3gUZy;keB&%J80a>3GpAzMz2Olx{&eGP)O-CHY+{bTBZ!@>N&rEFSy2sL3Ul<;
zjL$f4KDM3?X4{axi|8D|kTVAnKx9Gyh0Sg46ieUdoL7cHySN8$z?#uKfVDFDC5@w#ZcurJ0don{W`oX{62~Gy
zfr5Yjn{gdf56D3CC)yvSPzAp1a-dz3=Q4a8P9eTXT)F@8-@n+olD3}6)+z)e81U|$
z*brR=ZoZREc@r@P=v!7R6VkQHVh@+Ok(2aY3Bo3LG$u7gKWV61AIR=OHh)!H;tq)A
z&m>XM(WsgGdbYa7pX!9c+(Cga=Cu9qiV|A6%!mqdWFYcqN7Mo-$fEj5fD
z7RV<}6+>$cbfnq@fq}B{{VYbX#d)}zy1-O~L|vFY+~1MP=|a{vgZm2V3?@1wX`4gn
z8=O^B2YI5}%Xtsa(uaCk@>~yHGk>gg{$f<$8Or9Ci$-{KdvS#PzO`sQ#IG<)a_mo7
zIcSy&r30z2>*%#}fi9g~;v%;O-@mcvUG^4S(W1YDa^*ks^pTXB>A&e&--iQ}QAyCp
ze=&PRT9sxcSi_~0alws7@U!`@H2M@KKC}gg*oB~kodqV+{Jw8Ky{__}Hs7*Uetd^N
z<6rMtbsva2kHs&5JXSJDzBI{?W=L|0FKdp>~fY>A}Sza2`b$=TJt9pI@wJQjeseKp_r)IXb++$Dea1LGfbT^u}|Z%zT|
zc|bK+3Ya_q-hmWf&N#jTRl3VQP^*0opULrPl5v*68@%(x0mMRvQi_+8tNtmUir_uw
zb;bp@-&VAu2JhQ{WITj7=NawD5wFYy*FPe_gcP%C6cM4oTNL%WG`lmGrd;B^5;cmpHQbxU^#A)~@N4hx0w<
zXgV|Wxp-`vAB};2F!9`vXrA$C>EY2!tbxFm#3i~i)Q(nnV0EYNQiLvH4QbMuc$#d%eZoIM`%D6#q)cc1QR8EPILi5
zB}vuVyfVT=y|A$*?Po$SujScw|GI;chO)!PrTVG`7i8HBE&rUeoS%J1fNLTJwlWR_
z5s3H_tQzETKTXC4Z7_-8cVR~yF3=tu5&{MsWm+d~M`mD;-F~8~m_Rn+a?~))_@E!6
zH~|*jh_zK$JpU%6lEH$?7M69Vo;qxd{VKQ9;TdBYFn59O>T=2BDv~O7&PII&iis^c
zhnT?*4QLfaDHEU`HH=I4g%HHyXj%13ja5%o3H49PDb2cKD^ClR2^At$5=ci>_D`GZ
zc*esBdJ5b$fW>J9yE#ch{37W)R=4!l4e%0y=9@WWHI|P+viE`ml)SPntU%KeH0v&%
zu%;W61MFyqt;|Yqt)L{jNHY>@UaJID)5UDghIzX{gdTY%ZJMii2VGK_fGkFI(LCh(
ze($e>>x$)aUyxXxwgR`_4yY)#!isHPfn&sK_NI3*9v$Jk95Pd&u!H~MX1vPqphoy>
zIE`xw>eFW7Yzpdb$|R%I;f1l8kCj=#!P?V`R&CdIQHiDQ2AU$Xhz?5`lB&cwhSZ})
z4EI`WL=+j+0Q@Rw=Cd(+)%CyK+d$)lazxupeU#7k1NHT&{g^!|5TLJcm;QCG%SGs#
z3=Z*j*}rGG`&NTdk>J{6epW(s5M7|wUD5iSjPcb>Qb{_ZtQz4ZR&J<2Cfub$stqnkIf|d=-YDgkxG49@;hjswp!90I#yi1%c*z05
z2ngIMetJ@|E%qEPWoH}rif)oq=}C
zeSH}H?GP#WWKRmblx6hvlV2v6mt@y$rze=qTWO{1qLRTxS7ZDfBRw$X@*t+~Ye)@S
z>R;{?ybDq&wtK84@38d&qjOIa1Eo#MPpUp^l=_IzIuh4wC{JX<097ZSsRz4^ijGEf
z@?|Zri{fWuhx2M7!u2M4c;;7c@a1ltN|?DnwH5BzF--)|9kzt{X{tc<)
zekNpqmO8|Pf$DO^)-ss=@`rp!5h_|fPZ);y3TH9CIuVZjYyqtQ*7ercru6n#%ZzG@ZhhgL+I}hc~A^m
zRoLcDKkf~G3la7hRaliF<{L(6xCR{T4VO*%Al-W9GMr#?<6MX|(Dkj>oV@o`6B8df
z$h7Cvt4pa?BuNM2_}r$;f-ei0ax8{5p9MqGJz?~>&f(pW=fm!QxX_?F2v>%T!oZMH
zt{kDEc4hwn^A-PCCpJE}A(k}VFhCz}GKb;QPz+3YY+cqzr{CN&QQ>)avUTn^YA@iM
zw0c_WtmUXLc{~Da51XIP#gPu3;5;ahmXhFDtLu8-Y%@-M2d8^<3$Ab1^*nsixi2A33A5e35!e||_5>&~Mp
ziLw1bS8Frv2uI56KmaC>MoEAz*Dx%vCX3YEvyz#4Tdj$$`VoKroyAgPGz9^7mciIH
zmW;6p9E8*1~M+vcM=42p-M8ha$+c=_fWbzS_
z4UP(zWwpO@)ZZ=MP)1gmf3z5TP^HK&$K2bOo2=ngotd%#xPh3SPs1x<3beTL1h0tn
z<1>k(qr}JPb|%5?LVkFckG{m8N%i7yO9Yj0Rh(t|Fc>9wT!;djFlC1on|Gw~Uw>ZevDfr!>6;o{|5qtoR`=_(J2N*I@)
z%MROAT6l4?B6&p`g?!{*{XwexA%Qj8T4|hV_^>qs=duHg{XQT60t>D^tfjxXenJw)
zrg%S!Gjd`mAs~>3e_Dj;vu&qD!r`aL`2pgt9|BC1TtVsneW`MafuH;3;#s^GRsy0D
z^p=^J$O6u3dMQZ!Dse?+Qs0m;Wq%qW-G{BVwVXJP;FB_wYf&UsJR3;J2+_tBy^|g!
z31AMGNwh!(4}#h6{Z7rQ^OMKzoNTC0tk9E7-`2!FzDwu#us5@A(4Erl8ZT`(`sBz?
zFJJ76VB=*W`94~A015Jg)j-1>8MiD8CscU(4u|q}EJleOqE92)Bg&9kmrS04Mz7m#%I
z%kwh}4jQ>9z^y@lN^hKp`4{UU*W>RT%Fx~bs)~d@bnsg&3f^}3*Xj9kC-+7bm9DuP
z-U;8zd~qY)XB@Y9cHd*-S7fSjVA4Fh9f6H`t2=Z_nBpNcaz;F>sJHZGRBk(@TqRh2
zFtn`F7j9lj$uJg582L
zPe5SzphRmcYzH*Jbnk@aME>to)i2l|&@j+(3^oY5bv+6DFGY|x2O9xhp<04{feNHv
zhpmUMEN#NZL4#1c1K3#@Xe#8Z>_>d3*Z4dy}ND7mAWrKOqxB0*_$5{yWor28)jP
z-;J2Ju$<5vKRv;+|F_fR1+a!n-2(uwF#cm%#RkAYi495s2iAWpINSgT02EY6tr4IQ@4qWFz5+_1
zYQ6XXSfK=406+!$%LIo344?vcA_11rD-;s|a8Mr26hIb~xXu9d{Rh=TItl^5pv)nq
zfWd#T^D-{R+%eXhH?r|5Y)h~3t0O!L0VJjlkPQ!8pP9na3ZMcTU^Jr3Q)cmZe;NCU
zAtsgiiE>Bn=!;=PT5hq*#@m9@iA+MCo8YUrTC5z*2PjuJW!RfRiE5K#FBqX;6FuHJ
zy%@_lgQmX-a~IFl^f(U48OXzxG4{ky%QPT{#v%=+gcR{*I`SeS4~hR;G-YDT?xhrG
zk(3@2J%~+aoCzTW3mSBjeBYdWNa@A%CF1XOfRRT{=%GR4k%Z~!6Hon}+Lwc}yIoMJ
zhU7cdCu=-s&463T9w-8z+BgOn1LFGAO9p0|5rlnNFGW({imjS;mF_QhqmK<>c{1%)
zCDsX-6hfoZ7;5M?Js!egn%jW2w=-p*m1JYP)E$&0yZ8VGcUFT!*iYXkXFaG6pqAEE
zn|r8fNQJ)dz7AG^a0L)s!j;qgJUoBry3|q}@wZiP_F7N~<9+yG8uhfyOz1?iRmCq2
z7FzoXTX!S=RomnR_0+52EBo{t#HGpU-%848Hq4u{!1BajswDoQoz^%af=;CnJvidsL
zInQaJvwe`Ugkxw%
zqLzGGf8JAatREw6o5+Ln;YizxA_9szV5;n0G}0n%j*G0RORFJSRb!mQdsR{cOTgM&
z&fOBNHZ;$#S`(Ub90fO@c1#Oj`wrGvt1%9$7QR0qYy{j|^3Re?j|pfs-TDnq1a#UT
zy&-y3&PoGcC;T*|xAJ{#@~tE#)>$%0laW9w^P8DgNB_mbT7(1fi0xE4)U>9?kkL%6
ziHzRC!TF?=VWxXA+BH&|2l%6{K`EiMwb73lWjumWF1SRpxQyQYg%{6QWL?pw6Ij%I}K-WhD7nHZyh-PEX4l0cr8-1PfIjA3Wa)
z3P&46DFpsf?0O(_M;UUk89mZpxG>|&VjNmB0UvNqlo{L)-fb-!@iC+n{H8?;VF~=b
zIQnh!$DpS9j6(Z+iygRuEK0Srg!d)W%<24trSD=sjg{`wy2r=Fy?jEJC?MloJz6+&
z>i{P{PSejOpngip($&|~^JgxaIOme{{&aKdaT_`?i-v4yD1)Sf)vj87aW1QMZMvbC
z{ufNRDMvJ%LO5We32Ca>Ko(jORCVX<`aWfiVXv$mo(}NJAZ}R~+IE4}JCppp7;EC@
zIj{YbDKDpCU<@C^$T%moYGQ-NgH79T#8s78PpW4s=c1Z-;$pvTnV}9LxS>REcUgd&
z>!M2POjzQ0Ft)-USe-97!MkVGsh1G!;04c)F*HCn(?hNHvH3lT@YRXKl{tH
z;?;DL1B^J;N(UJ2s&`rtHgX+{rF;hL1i6*0+ACp-y2wlavTbWcBKnSZk7mZ}!yX>;X|#{|
zj$ek-lQul+6u$X&XxHfJ{p*YD<>feaQem0(by~((q+zKrX&?;~_JU=$U%PaBTJbMw
zwD4dPujY>jg`E#8ji~ZgkqAXcZ7YpsTbIjw!iKgbLna3p@V+ni1Kq@WC>`&>XyA3M
zkH|P{3PQ>~Wo#cS9X*=MeS&)52WhOb@d(^$%RB_*$XMG@co+{TWX#c4%{aYBSFDHh
zBZT*Q4WZid;~0qwt8`^B9vUIj*>?GkxKs97p{yKJlLRZvF#Tm`l5HB%CkR(&M8&*BVT=-5s?fWGzFgQAkk{xujQ_jip25Y#m
z)bwb0aaK6h<(gPCm&R&z0iVi)1h}6{sw5AV30oV>8Wa>
zO$+Jfmb{8AQf4@O6k`K%$nDsZhz3OlN8qWf@~CU^>D8iuMg#pA18aV|GK+;3l5toS
zGYmhv7Kt%-RRY&iLO_gDi!=US{1N|f(8Qv|yO~MGw=>CvE4ExXA*#sJ>D8mxoN;2A
zP~`%|=efU6ImUZ(D6+sSz_dq#@vMM&DD+
zXfn58JPp~g)zTn($*7`J)9V#aG{v9pqAV?CoffCXpGryuE#<@K(LWG;l8O{^
zKXe~F2XT#ii~$oAWngM>jOD3tC3UXAI(`wno4FZNkf>_8sM#@Bu)x`!!3N~b{R_;k
zuRn>Nq3dVv?;4zexUA#7Xy_aC4L$+aZD;NyAJUkrILg9SucoCYdeRQ8S=VKBzdxq0
z!Kiex?Wi(+vM9Co^}AR%XoUBz@p?mu?srMr2uD(s?vy>GjJ&UDP5f@3WqPHg>FF?^
zKc-T$y+6&A?aEPfO|qh4Q2i$VHekJS^@VKQKlGPRjnpY>8(tq(e1+4ph#veqvhL}X^!;ZTNLUZx3F;k(_5r>@y)e9A08=R8
zGYo)M?Lp+n0Y9NDxYK~)f2DVgktA1!uMRII=D+&5R|gH4B0LR1fM72IzCxK}Rsbqc
zVrv~x3nh}a00+>!{B{5(P=am`kPjtB_W@Z@!uAkQ2m?jrVERF7?XOovpr`!E1LCHf
z?E?@Yg2#Y=Fc--=APIV)@dEG%N|as#JpcKw?HS9YN-%HUFvI?bmO)PUzIxSb2>(CV
z`=9ibRSXmi$RjH78Or>K3FLW=r(
z0jvH!09P`x7uPFfhKHKMI{Eql=WkK4A!STJaj4KUHsA*+LGuCF2^F!+3$%a|ih{s`
ze*r=~_V=0p3K(r(5yLIOKM^T0I4I~4UNN98l(|F#_^(t^LK-Ly)gV>@C;<&q<~4!*
z&?~U@fY;Dp1jP_&07cbot$=jUl@uEwIvnDEKv}bYw8ig~8Ydtv_{e_w1NQS-$%fiz
zS-+u(gw@T(rP{0dHv}5Fc%QpbWcZq2YldW0nozHdt{J`RN#c_kmt|IU4}a(?6-Inz
zUgzC=?}Ns5fB1t`bNt!+PwaN_hLeNo%lpUxWI;4%lOZGQ(Y?#($9$GqMnXLU14(3t
zw_17RCB`4nM1X}~55br>TXHCQmGP+jj0`1XQ+JDt=y8m$7zI7F@ag>uU)22aC`Zet
zJ`aeR75|Qb3D<}WAwau$tH3adh4y42f-EmKeL`O8&^CeEFLkTCQ*@0xR
zDiefe3NPU2$cQK{i*J6{$0esIALk3z{-6$%y`Ou++ohg^k1-hnpZ=0>a5H8jE%m#e
z8Paog!Rz~b*bUqcGV}7&3I7-%5n}%K2%JAnj8xuk-Ob?g%K>f0xa{M!f1@@(r3gfk
znn3>$F|_Q!ua(M43U(xIko(&{S_?n>8NA13$I3joqw1kZ(Q;iUE7@*?FiAs)P`GIo
zu0Le?yZ@4Pu^y|PiNV~Rd(|Ivdx&nGJQY9u=kgN)HZ=PcC9?lQGp;^YZSAUx)M?~M
zKP5`#)CNX?e?n0C_vV{QtuWv*vt@47PVM==1x0n{vvOVaqwJq)(_?cW*rabgPGc-fv
zioECbgZs#EU;e0R(A!~x-^Z1Wkj;<}6nx20Ur3qOjbHjRqfj(nl+$n+UEA9<2i&I0
zke~8h>78&ReZs_Ewd{?FFW?XC%Zk7H6UGZ}1IN>E*$}UO=@xS?50AZ73~E4XBnM$5
z(q=WpGyYhi2}{DEvY_MGKAKPB6n^TWycYZM@|)kZ*lX=I59=PsWr)!jHFSD>@JFuI
zPB$4%lxhBYEa(Xz_m;}9j#v1`i@K!PE&Q*Tm{EzFu3jTQW4IU+l}*Xb;4h83ydX!g
zSyZT4n}Qkk;%us)ipt;SRo|JkT8n|l@9&M*`#fD}2D;K7?7M%DvBcb5-OAZM+loK4
zINc&o-fXtN9JEWXSIL&3Q=MFA&0Z)s9nGC6NZ&u*T{vG|>hmXGe2FGqQ1_||Nasji
zY8x-|lyD)hoBS;suRiowvAJ|)sUR~EoSXU>1Xt{XdFTINwuN@Ne?2tDbiDd*cm3U&
zkoKMBdP-94;oo>&W*pm;&j4I5OV%k
z#st@X+AaU>y#6;S;v{L@ewh{JwSNRjw38G5le{j<#|;lJzjtu93$w9i)YR0&A+#)m
z%Zkp#^LMJ)bhX4$yBG_Y!V!aYpvEO{uF(H=nwNTGtw(e~h}@;afNFK%-Cw*p
znA`0IU!OUUp9*gc^I>y3F^zrl-P5q}|Q)8uWX!8kt
ziQmvCy4o`wdBL~9OMJPSWWLdzZz`w^?tBa#d$KR@uJomkU38voeTi+epRDcB)*I}8%lPbpaTNs4w~d34PgWI6
zZ0mS(zQ8O`ELAdtELZYz>@`0wk5!IlN{it%3I72`2XZa=^l06p8LsYEK1|>`2-wka
z5zs}tBDDF&uoU61Q|GvTP0;tfXJ6CzO_=vhY8MYpnfL4bQ1M3}Bg9Uc8d^jAzeUQ-}!e
zJ3vjCg#2bJ8QkL6k=i(yCoSa4@K;e`%_OekvnjPWU99Q0xg>#Qz-FQp$P*vilQ0{E
zkP?_~4OgHTg&m=Q@8aNZI`pVP7+mTby-Ty2V9(OC)=|eyLx2)U;20~8OpvSPh`Pel
zW?&G$pg?@p)|vEC^3J{R%$Y;BS7l49?2Yv2UXcTSI50hE0%u#T#|58K&C1p(^!tAN
zP%Zdr=O`tnTi(0sX@`04J?S;^o;y7CJ)2HP3dU4qD;?AMQ
zl8J-Lh-8H;pV>|CXQ$ugOAA^WI24X7Z#M1;-nNjKrUs_
zB@c{q0#?2i)LVY!eFG%MH6eO?S`}=7>WW4o#h~w9&nCq`vuI-J=3w`G9PK1W81c&m
zN&4Qv{RPB)TH7b^8oQaE`kIfQZTV9a%`W>8ShUQ^{xAg9)`9z!7zy~L1};su{Cl95
zVh{7>9|Z1o%~nIMrhv?}CYSrtLQXk!YAWW_zp7rN#gxL_c$T}oxw2V(#u#B{>D3Na6*(YMOOzvDj}+uPASO{jci5rlWVN&
zzgD+{61S1a?cn?3W0E2Jzhv13$8H>3t_%-sC#flT*ENCMMh;llPxdqS@}>!^;FqpM
zTPy$0Ig;~I>b2oWu;V@TbJb>zS1Nyzq0SS+@0#@D8lCI*o>Uk;{{}DP%_at@L`E?dk$c-;jbiI>>95yk3C(89()A=;}bhP&y
zeU=oIl33E0*GVlrpKVK|`53{p+K3aaPxmgBQa(shhYl7TYR@3-BBWDp9xm$nb%aH>
z1l&n8MvnL|I+nOjWNJ#!wpx|aeP-h9LqN7%)JchKS+irnsLS0UmapLobB#S~1n;b8
zpf+RhCzIa7?@}<3Jik4B0&^bQb96Yx{dPt*6c1gRVAwe=hTVR47)7wxQkRtA81S<=
zPJzKtJg^UrNL_2%uNLo1mg=O(f3T+TmK}qN$V!x_uSjW<$u1nC7h@74XCflE5Eg+=
zLF&S9b8|r>ej9Z3s_#kzY{ud0q5|xI-_?%g`dd0L^pk5hMGPfF6QBldSA9>q37}fl
zye}dPS^zP=_QAXBdhq%ZyeTC+-SmDJ#_T;OlG~NLo56MZ{!cDp!s04lI$vI?r%tYA
zL~A57yd_%t;~t`nx>%28X2ln&op=`8Z2sue(}{7zkGaox!{YaBQ^QH^
z@UC#zPl@P%){wY#wlfIZXV6jG&uVCv_#2TukXGX{x?}F1m%+3AclNxbqzm#+mqwTd
z2J*lg1UEunne}fLcDxD#`c9YRxq3`Av|dWMOV5QlmK8gYn8w+qJDyh8e$*8W&1tq4
z+1h|lcW;c~w1F}ujP4~X5GT)({#(Bjb!}27lD@!9tC}aoRkXIYFqcX#)0d-IBU3Y+
zTvtmRTzURyFL22CJt65x$#53>z@;ajT;^|rAebbE;=FvvMd8nxS!dms6BjaA@7Iyw
zK`9wV{-tczzm_92YNp3{Iyu~Agwn1IukNZ#;tE#j-CEvtr=R{Fi`5Ho-(G7KKIr5g
z|Jf6rd8x5JW)**4o)F4N&=phj@>6In$bpy(o#ie4vJ?gN_!uh}!TQ+qe_cTT>kUqg
zc41oZns+e8Pa)@it^HLbK*5Ai1p}-8
zy;mM1v=kPU*96OdZp42)s30{nBfBptbzuM;a19BTtxTYwogZg-xT}J~4lN
zR@2kX?R%%`Did!+%3PMFO|R2dA)zjXdibAb2J*t$Ik`hK0_(#oq&l;D`-s(1R^Je`
znNtq_kR@4*N`{7pn(i3aBJ*vkF;e3LC7l{WAID300*bTjc8tt8Zqf!G9u&iEImcc{
z5>@ymw|+9`!jFiEphq?nMcG%$(L}AP99qYMeWWjQ;?qcE4th7^4(m
zjM28Hcr&dm3G4Bl!V>ju#~YXk!ZKF+LRK=ylfgqRTr>|>nNLKXV|^B;bI}q6S_CSV
zuXBWjek@h;?jwD_f>lG>eXGZA7p6)MGX~a>quNRsMo)1td{^>rnPx87I9gN(=i{%d
z+2z27c?X4QMUCR9pj>Z%|Bx~#7f+Fyk
zRKm@j^e0F7BKxEC^1mSyr{r6FzcpA_Xb^`_DEM498~+6B2VooOYY$eNn5IhYR-I!+
zdp2*3J3*8im*+#-F!oBGSl@G^dvTl=t&8Suvum{57&HXu7OS)Bsct824n@e_eKGd2
z${fffJo-fL^ltB66XA@Bp~B1@`(Ft#>d)>D5yKzq()0Hby(`DGmy&%sEVvq|sy4cD
z{`|uvecrl1dM$3eyi7`R9B;mdjjdy{$5Q>d`f7rs+qi(ob(L;7$f}BPwcR!Q8e=RY
z%!^n3swPl8Pdh8cN{g_X!GkO+&6(g_wiFJ8EpX)I+>$~I+N&HI$2#FhA%jG_&XDZp`L%$w@~ooZO6lnveKF9EO)rwXx!#zR
zd>UEiC>-WMlhIU@!ltL0M`F+6@5Oy-wWP)7?1^06mPq;ydF)$21L}=fb2)ydACo?^
zwpjk#b^(3fxZgtIXA>UZIn_QGN)eq_K8vrguWlS7#9cI^gc{Zzo>X6Eg{)3CKl3fG
zO?rSKUw;<7?5-NEo#^g|9(!$3JjkMUY|%fj;`-jB^LbnfVPc(l)Lm%Z2yXiQ4*Y}s
zzik1;CJQJ9%>Xv#0abvQ|E2kyPC35bz5XwmUeOfJl-K48acrp&8*-+$dr
zN+;8(w>-Mp>=@V2Qr!RLVeGE&%l>xgu(09!^V2mFPVx4E_GZ^a`L>v%qmi7e=r8Bi
zsFW?Oau7jw4mc+vDdC60et>FS>Sql6;8_A|q3Cer(!<4Ml4Q-xfhkK?4++yECu^K|
zSj+4W>C%WH`IWgcfoU5{BL#-66eq>66+idM(>kyJ*IQi6vMs|eIs{4=hI2CBOsA=N
zA<}uuK>@UFM16rCsTdCVd$JQ))E+Rf*jy?`iPAe^JXCKhdYQXJLM5|-9W7ria
zQ}jm_D_vdh)*qjLX55lyR0etET^*0?M7xB`nzI`gM5)>x&B2DH)~4D9bpACC(|Y&e
zWa}kUvIeXek#}=w52rTW6sD{LY2s&q&g;Jj@Gjj=l!nM!}47m7(sQIcR&${8q}<-I{f_Mvwp2LdTpn3
zP7l}`=BsxJXeLM)a@Spuxf2RwH|!JR#~Ie~lFw;NzC|M9we!L613%1Mr{DefsW2Qj
z%{U%$P$$PQNw8>9O7liZ15y5hbEHq`-DBO1-x1MGo4kO0yXOKq#IEnJxi0nm7R_z3
z)eKfzfYprX!bE^;TLhPL+q!Vtryt;ZAo0U
zC2LsKY!KhPDU(XcWru}&74Xpad5TamkOaK2I7eM8SSjCzgHUTMkBo9eHZfJ#mqei+
z|7T}CrjR+=Zcw_G0=9mes?mda{q8mnYka$Xczu24@$MO^h|i=UA^a(Hj$q6But;YQ
z55GpE;iE2AaXnMxncgf7I|Ry;*&=<|4Wv3fN8{cg@*
zozkj0E?#+gXLq!{;m8o|Mf7MAmcB7%>E>+A+skE@&>F@~Yb>6|Re^L)$IV6HJiLE^
zFxisE8FMCXbPzeMoL1L|7*`z7?wA&a3|AM{!Pic}z!Y60%{FMk9q%ZSB}fN;n;RS(
z){9g|8ytmyC{;<#lQVnal$1+TL|-5EYxF~&w!~24IEtA8Ng-oPeQAf!a5CUJ4@G&7
zEBv6oj*;e3;zw4bm}|32!IpKIR8##p;YWw-=64FLX-O3v)q`hJkrh
zjW*VQuoA2h^XPYr$mG^0&Lg713QcC2n08l#!Q4l6-UhU>>-?ptXK)gzErQS28w77F
zVlzhH;(n!&M#<9(NaPI3X{YBg7BVH+4cbHuYURB-zkTCsGw1JZ#C7Hy!ubw`P28{t
z#1k3IINC-2WvFz`1$V;YvBUEg7Iny%RDj`3$tqu6%6W;rw7m_DfjKe`4Cteu$;b6|
zV0#GpC91?<}3fm0!hNGO<_)8>&leDyJ
z#GAI*_U$gEKNS~$!erDT_*?(M2V!R{Gz^@fD8A%^+5P2NmF
z)SaM4bA}m;d9({dFgkEya;_xlWIOiWkyb{=i_D&Y1j#s#^13k9!E@esy%5WfDAdWQ
z=Ce^_I6jJ6zz4_>YoM*YLYux6&kaaf*7;ogoaotW|{v;aW
zWTiZ_UAFas)@{lYP3`4mdUp1kZW}LcH9?*1U7XEvb+=txYJcr$Mw$BwA1mxZBE1@5
zomrsDhsxF0cbA-k?n0ID=l7EAWYB^ElAWHKLb_Pe706Zn|Hx>5U
zCEhr$4b7Oh6}BCJoo(L}$*metwOTx`ygpB@jJcsYtvJzb0~5z6Zn*DH3v>*95*8@)
z{SK$@mS+neqX+#o4;O#;a?qiNo~S}#9Y@~i}=5bK1~nP6s;>C
zz%!jX6hHLt-o04jxjXCQoBU#
zvkr<5EQ1!n-xY$ysp4iF4E>`4)zXAFBB7fJ_->l*-Cg=7$8sRbZ?prEpD)902i3_a
zA#M_th)wY}SYQbcl&<|DgfL6Hx~3S~7`#Y{PN@rWdkx&6kDZZm)<#*PNpW+|HW(~z
z!#*sI#8il^`j~NnEfz>*O(RwsNol|7Ca4yV_qb2NUctP#4d5h^vahx8INO5mBKIoSb
z6=g_tt$Z~pZmB@IwMEs`aNgt4Nbd`k^-CI8u*FU#YTXH|6
zr{~hS^6wmRGoYvvt*pTz?a=Bw{dGExFwlG~ZQSaun&|Xle0gFjeg&Mnm=4-pPq-LL8E%?wo^trEDfcH3Ry8-P)ZJ*vO-z#7*lxXu$<#1jeeHZ*(
z!B_!4q&YH#wy>Ne$~(+JKaa}5cms=7mL!86RDTERBzMZAO<$Py2r~Kf{N~S@Q@s4b
zs(tW=N?B||)d)Z7nSgTwtP8EZN9Qt|2HpKYp+Cm8o)M5eSW;>K(jmDU37mR;Tf3)8
z?n)A}&}hxBQm#A}Tx|vYZI3p`pL^pp8M(Sp7$7lP+se$0cG#fF>0BTxobl-bpFs}#9X;sE
zVZqy8?T=}@;?H+q&K-D`l?gaS?fB(Z|vA+`;`egL$_y`WdnN$_>|JjICsh?k;7
zf`SXNf&BkTo6h{bS<=_k5f;J!J-gBdK*?L%>P}+ADtqYKrp3
zYl({zDGCzg+fN`pl&@_Vi2IK(Mryc7>UAI(j>^AMm{&dm2l{+FLR%z5K
z@ymdSf>;Fu!ZhV>Rydfh%(g1(TOxJ^s}J$}@YS9r`f#huSag0>p_Ca7LdTr{CPMXh
z%B(EIZuoNdbA;qPm_FsF^xd(dF3Bs$+q7f^wKf&ChHvpgzH;%8t6`=DXoQRd`_xqG
z>IFD1{2=U$=ETeZJk4TiNzife{oaT8S4j<9Gf6dejK;R&Ni@l%Y!^X
zdPoBhYN*asGyiWWO)F43?HT4*DyI}j>^JHF@7TVgStCjxgR=Kb;j1ZEnH}BBY`rpN
ztygC^d|H>QEnr0R^7yDj^_Mg_=7{TdIJfLRv-IuvJ&Tkpnr0WY0aQ#fFvVN#qLf4a
z^@L&3&R!RKEUlhz^dV-`h(BEorbTsKbhMUOeddF#@A|s%i@sId)SnJaiS#G3@J}6A
zoMAf1cKomio&DmR@$pn{sSGx?jk{!AFBaV2yc0Zd6*O(6
zl=F8IRJ7ENP?t9>BVS!o7d^|PM?~n_zK=_#gyXPJVeXj`Jut8Xe-EzNy*}wu95Y|{
zA}B^%JAh3E2HugFL|st-ti)rKdwG7Ewqzxg=r!VOd43FXJ?FUmawRYSah-0uUEuY@
zc%JU-D%fCmY<9xYrt+a*RzE#>TD&>%qYYyU$dL}+Q$7(CKjn-L=B-|T3v^3K=O*ED
zJu*>j3(*^ncDC~tv9xDEN6d@AyI#Z1-nd@;`9tWpRi?wQ=#;!F{HKk&1)k{NpMA?l
z!qo@%EGiN#xSwkxNA~ak{N1qjaB_8y;}svw8-30N4@BKq%h~BEn%IwM3!kD@J)>dI
zsb&}NBqAxG8pI!B;#sU_Eyoj`h(H1tJ)4&spA7YD+xo`L_1emsW0;4_HgGv{N;-8=
zYv8(1HS7&uAVe<1CnupGM^mHkHvye1z{cmlM_^
zm>;XcFwkU6woD6w=CIM;qaZ_YP(bBSWqzQ8%AxAnVT0VERd>52AUSBW3?~)H5z13c3;G{>
z8Ne@=G5#tr2Iqh5;C})qC{f-*n3+I}P-a9nkj201%pgwp{gYQ_y4UH2xc_C)|6}%{
zdVR*?51^ZW8WKUUNK9U%@}v*{lZpS2$6g$S02${4rGdb*4$C|kT@RX$+PPAZv{9LM
z=`GF75;rr;Ld?rOxkYsnL9Y?IGcoqVy1SHi#OkkW9U>s|S%0Fyy2)rVo
ztTcUV(_3qDSFs9O_-w?c+(ExsHkwxdyPz)m*1GSTCAE4iKg3l^+xX|eoOLlXL)XxHp&D-TLd|JHe-Z~kC(P?e)r%f1xWlgmE~5V|x0OnvB)Pp62F
zuMB=M?oc1iWoMot?$l%>$ppLfO=*_Jb{h
z7t4$_cc{*Z;p};_;&{gypiQVuvVC>Z(sx@)?0WLXyA#{++KM{HnxXG8C^#~wxhJ(b
z8$FQwWb3|6ImdrXOl1>?NU6imiW*4?_htcXWk#NX#FZ7wUYA$HZ#~xMOhhWF#5yXl
zIF|b&vV|Veqa~B+h!y%{{8lWJni(&7gaJpukcijQ7BzM>Z8lws;Z7t$fnyYb==0yc
zNc68O`Tb%}ngkx~UGI?YD-Di$%iMKLmEVPq*qgDqS2w;N!0p+YJ*JoiF;LZ1ejhUi
z>p9(Rh+99E37UZLBBa@t7mP^UldJ5wjzEj=
zGK`nDk1WgG%XkFsg~R{EjZ`6wM83TTA6~m43Nk0G%L>50Inw+ommH8#_0XvFW74z$
z?r7^xjFJH1&^F`~;*W=@zL`R@WD&m-US)&%w#2=liYTjIN38eF>AZmRko~(2UC{0i
zWNBsXP^4J$2uBJ~*TGjMW5Icp&yy--J$ZB~Z|xAWYXFI4HI4qcAFX{pvHM}k8K2i_
zu7~`#*CEu`ar_qKMw5G!-|OI8ho^fR>SAPB7pBY3FwB=aw9jA}cSqI1Dk2Oa~X(-Qd|J(nANQ#604Nsbo0@*=Lh_D<8
z1!|Mzl|ZmiQ>3g3iv8#RJ@1Ohe|a@3xG5s~@KFB`4uY%;iiaM|F#ric`Pa=r|2qGK
ztw3Aw&_eF=nz)|+*Ml7B|BY$=XN@3oPN08<+>EZEe;}cw2WS^6OUoPd4%*%65dm6;
z)+MXQg7p412L8arL05m3C5ZN~wELVM1rKtZ3NnPAl+OhDLe(G51sy|I+6zGh(3QDT
zP&jnOs1lS0B_3-)3()?v*RNt%LD1cQ^3%ZLJ>;>V1F
zoHG6$L<@J&OxRqwdS8{+utTX7(!FRxE++n%I@z3;q(c~D-<67DbE!j|b_;ol6)in&9d$tKn
zORfhxOPQWj8Ib43j_1_f*n82s(lmw7x9oYX##_Kg_Y^0}sBRk1
zxV+?$Ry4690Sa;g4;dCLB{o0ixG*X?ID@`KG!$YIsfEnJvEK(3^EG3>-lw{&Q?*D`
z!<@?Ol@)r~nIu^+SC?Sq7nZ&XQl31c3bR~fnd5sCOeU#RrQjk4tbNvRyyOF8o-0(0
z<+vBuLQ;HhMOR$E>9=4kahY)8C})dMiq)XN)+8lIDNd>i6B+n*7?a0_#|9C!w}|nK
zAUucgQrr0MApyvAFl4Yp3YTaJslS@e^+jduvvwpWCsrUn|9Jq5eqiiHjPPg{Fa5(=
zGJ>EXgBwZ|SD#7NoH@~HEKlqcz
zFCv5V8efsn>TjWDX@ny(Y!wu?I-0gaWn)w`ms6&;Ic5@YZU(
z9&f`@%X+Xoll*bO^Zo9s#0iynnlBY;cdraEyDhrtZ@dE-082F9CTr3>7QL=tkwpWs7B7wy$)8wN%X
z=ibp)jkb|Em`>@{ui`AHkIk{-5sx#QFYplQeCv}}WJy!)H_Fp_$LkVC
z^jOcwPJY|VfJ0N$F;Yl|WdsK+6=?n!FHA3_$)^j}o|a<2
z6m7T6IFM5>^b$AMCi@VBKWg<+%|0ypxk8>rJ}ODHw1ZG_!%c^J
zje1t)TwO_HsR-73Z6ghq0df^uU{*bj@shh=sV6>Bwp6f5Ug)5l%I;p
z$vpu}#r%I%onvsNT@$X~Xvdk@wrx#p+nCrkb|%Kewv$ORv2EM7t%-H=Wlo){^KVzO
z*0c7Ls#JHczWcg?37$nvJTcGz*7>$m+#)z|*Ta4=j
z{24xnM)TBwN_CYooPf?1QV11$Triac#-{ioYH?pR9lKI$AiS$>d6jzRP^l&7uxybP
zVaq8!tEbVVmeSc&pPi{IBU>-=z5AjH@nrts@d>~GR{U*nU{JoZ>Kbp!-7E1@
zZ1_QVsNcLJvu0r<@8VZExtgLH(+{2*%kuln$Q0Q5WLsZj$sbWaH=S}zfVN_;`wW9_
zs{HnA6zgnqxi3sQyV_ZkQFFFWStr{m=SPpQwd+y9Wo+>=o~h+SK7$4|jr)zmo)-ex
zkI72E+HI3UGRZU=*&m(|;7votOv3_2GE^@i@LGvO#@NBgI^;L{QaqmL8hvhTF(NDckglX8$jx%XNEOvFh7@bs|a5!7H>Y-%x%
zGgbdFNk8%oGUZ2A)2%Q4G^`J`k6j@~|KQ%ZM@z^jzYQr@bOyG6{Qs?Wg+T~`e|fs>
zV<<81XBAR`_AfG4(ZPL7zM%h9%?^)2kblLk>nVtwe=&)yq+aCLXXqP&{(qtG(+isc
z4!Ln`4kGE_n$_EHxTK$JCSd+OaEsxS36Q=7LH`x;Mpq%szsB>~c0L2^S8RT%jHD?3
ztaP#k|0#YHXg{lf6~@mxMdS#g`m5Y|xP@r^3ddET0Oo%d+>gH$2^-7?Vfy++MU?`NqRmv;3uDf0uUQ_@Bn*XQFw^_
zQ%v=>cy^sk;P!K|8{7X#?dZv0PnV$qpnN^lkQKo8^_NNE1YCc;Rs=5~_Ui+_03iD7
zL!~gl5$tO;>D?Zb9Y2{`96$!Nk^l6>exInkVzvMcW2F$CB8I2&^{f4RJ@&MbhIHH5g&v+ySBJG|o>jE?TTT3(GVPX5rz$Q3E3UBgP#H;-km
zkZTh;wMGQLeQIO5bPLRYXy4u4H83>hC1Ev4nUv%0;Zxx|CwwuIg_8g#$z!{kXULWp
z2G~BB5Hjxv!Kau)O1%RiBK
zo;`QwX*b;Jv%Ke&8xG?j$&mOH^jCqji5wRx}r>
zWt3bBEB+gYl!%x&s)7QPETYhpNkow8;5T#@ECkxS-aVc4rZ?i1X=AI!7Nm+viMb?>
z&VGBl{l3|G`U>d>2S$N7;vLIm?ZOVeC=)S~=
z=mG(XvV{`4Aly93gobqj;r>`6Tqka=
zP?luwf9|Jwa~1tnh#k@Mp*41iv&kBOjAvz-3B)!pMOgyC-KSwiH>}9pu^;INGP7{f
zc(@g41_68YXYl^Y+M(KP%i_u-p}CoZs)ww@Pi&|mgF_zb@UOWNMeM1l9IU}BU3$O5
zW>9N_H{OWcOF_ePT0sVs3?3|=7xv}7&FiQ#1+CE`4twqwkB^)r6*jRD#Y1*Or;o6?
z^s5`AV?CB+;-t!LBxpoKu%V``xO%JojjF
z@U$*1MZtQ2APbn|z9EKQEOpENylf6Q%@@TXl)Zca%Hov;ydyb@+lVm6i)(KrX3yB7
ziT0M81+=h1EE%5+Wc<0a6YnrRx1B_kC1aTsVjI`--pO3uUckjuQSDtTwJ|TDDVe`j
z{)T`X{uVgUCB}#}nvueks76iQt12b+?9Y-?t+g&-BG3S}5veAdPzG4{g{cWRFVA9k
z`v#E=jK-Rm`#FFC1;6Tx=9pqc-U@RDU=|T{k&v&
zPyr78s~@c?n<_OwcF06!)d*e&Uh{b*WKLyATdEy$1O9P=cV5w@s-;Z0nPOq3f_<^E
zT2zd9fBv4CwilsYHqTBcNNdg6Qw}U%p7lK+6Q1a$0E36b)`o>?SK^#u^8gF}&Mm
zd`x7R2=x`xhStVTy)_paj432|oO@A2!*B3_Q?aqT1PQ0;dJGjtDEMwL&X$2vd=wp+
zw|Qv>+&NOU=n0gnL{clbClH@I&sP9P4C
zrB~&DdxG;;Hpreex&hei37}jjYr(pHHhl70iPNFB@J02g89f7RA
zPA<=j%Y|NVh~i#_aWC!%*yz}Qt$&WEGP^rZjx#4XiDI7FI30NrkwsvzytUw+SJG^s
zCqyAcd%flBJ?w9bon0uetj<}xp$qj6pJ5?*8LqHFbk`o2?X@{%*nAb(KX;|&hM0p{{
zXTon~F(TAG2VUXT*`AHxF
zC1@_zY&A2iuRgr$fqnG#tpajF83N8!K92(1F-iNxDFOOiCp
zBSX1$EimdR3t8c+YrB#6+*7Em2m0Bf8E~F&dTd6WX4;WZByOD>K;5!93b{tw<|g4Lb`?z&Bt3w2@88
zN0FUHO_{@n`)rJA@QZ-=7fAzDA%@rC$CVRD@NbNh*|bY`^GYH8v!2ZR(w~
z;$$ed5Y4&wQ>X$~+nf1CamQ-r`$4~d7xQ;vFA)_gE#XU+Oj@DE)eaDBoW;w4lY4d@
zywRFuTG2OiHuB(!%ygl<9A9)%lj7stb*X6I4p#XT&hbCIk01kmuvxm1v3Dvzr&4YM
z#3tsovfd6gzen9Sj{K(dt9g`JH@rwABmUm^TD2-5HJ#$0dSk;^uLYeHZz6Ez_9wcu=53Ak;N1ZcJvOn&j-1Tf1{(1J@
z0X_Pyvq?X&V>Td-2RNay!O+#`nrC}ouzAe5M~cn~!!i?QWtbA+LtsWQ(jZ1sZ;Vg+
z5}-qBk7r=^8@62^ge#T7M*T&W>inW4wlG26wTxbay5UoSq^WQ@Vye1$Q>$50dk!!nQsluAkb4`awdZS>mNP+x3_
zX)ztvjN3nT4%-wbQx27@mk(>cZbqBXw37^{+hh+&ETgB+>o%bs!%fs{$ui9sAZXEV
zB{H_C67vXiF8Quij&PCO9xP%z=#ijpltclR8EaeR?LP+yh4wdd;yP^LwA{el2+F&}
zl@u$oB|8#93U)&C1ua@}b@7Z_YGoIkKN|mZ2Zz-HLlwp)cWqNy3*UEsb|AZLyjx`V
ze_9!MXGzfJyL;ac?hSQ3y1UxS(@(UtzvFX%_aX0HBMY{%kWuxW9v=UmGnp!%dC8FKTJ&C9t>6C9%tPk1T^os$
za=Fn7+^eks57Zu8!i7eS3)7YzFm2<{_AaTh`Z%p_oYI7w`wP4@9Iv;5%CkUDPVBue
zIIhx=m|x*lpLD>%0QV5qri6FsWoHJ%6X6d%&CV*C4*AR@r_TRI18~G2TViE&KHdgL
zH~D?C9y?!s-%nd7Wz)JXbLz*p?(DYlzxTZGYo9y-1~cP#cQ*_JtQuAG#f;Q_5J%yC
z?%=ZKw5^V*6LUSAwG}A$SfMcnrl2AlZ@>M2mxb<10LyT8w<)i}4zfyFVOaRkY8qb#t
zko&sii!1_Uel4c01hjtr>bMs0`(K%|Aha+0@mX-BWB%)Y=;s39lEb(@X=D@40O+sn
z%N>A!+;_%aK>gPdhXa6>f8Tg$@PnZCvn;|yOD5|5?1wCKfASQbMgafl2~87#iZ7yp
z`82@i-_AKe|85q;_W%K3b;!31K+D&`qqhK^uU%9R05|xr3TAK>
z<_Fm4d99HDDwuD4pUv$Fa7ee2NBiNWHH!(Fq~Z{<&GHUI)Qbr7#
z*^^brjXqJPg|
z-|WLa-Bym00w*9N+Tw~cnfBS;cKMY>bv#X?Tz^oPq-amb@S
zv)F{aa=*TQqwdV0!kXp|5DDli6i6sj;edi#tYT$3!=YxL{s^o$uv_v6n@JicqvI?)
z!O#z4@UtB4v6z{MtMLLHe}|iK6}}XlD;g1;+L`fd0KQkP@DHN11YqDB(exG%YT{{O
ztoAW^@i#^JHM%4N18NGlK$c-#d(qnBDz*ZzVJ5usaP+%3{2(C7tOJSa+xxI<8GL@(
z(At;&e!6N2-dC84ogq=a(~LH-GWYdO#Y6IwM!f$~h0aeJyu?#6R@Lm9?GB&1i06Y7
zkx83U1|)2yEzUyb%nlI`+yx-M2rer;iBEYSu&Y`z&DKn8nAK~t?^$9DlsGaX`5U=xm#JH#lh%dU0!q8DTFI##xT?tZE
zE)Yb*;*rK@yk0`_3x&r7Lv`ywA=@8Z4fq9
zlXvf^_ydd^(DMWLA8nTc5cEREY@t?c(O8xf-V6V#39y`>ENi8AgzI+Q_R|SVx4yqV%=@1bQDgIS
zECbPZQeTioV;dyNWKii>SSXfOl8!C-?K0nYz(Ukxj`a`Q
zO&lY_rTfGB!+NZ*-_Z`JU#r5dN?z+LMJVQiCp=g15oC#Z_`IQ$Jc5lEJ|WPu5e@O2
z@v~Ie<3=XNBO~qSH?s)U^BxL($`TQ?&ND`dS4qfzY-$c68~{LikuhUUxx<@rj3!6y
zk6Smxp(FP9WJa*0~(_uFfH8
zgqwIBa}zcNo3EKBD1{zW+-ieS(wf$eTeIW%3uFehR<9lCr3i`eS)sQrz1$7RW!Mot
zAIK*w=#-C@Su`n~O19uWLVd9<#}n4?|;XRs{%&JIZ0)f|7>m1
zEv_XKDTl+=XnHCSR$idsWoUb;o7WGuZqIRMRUKhdBrmScCvqddn-Mj_8H>ILutRNK
z#5z;6Q#5NWqm2`_fbXxzBb{UWzmH{1c34{;TxSw+96CXA@omBc+|+LtuI`Un>A3`$
zT!!0ytUl@TiWYUY%m9zK1YNz(v!{9#-{RGx6raDZGt2R^%Aw!+Fs!p;2F8Yly^*1n
z=&`D?s$Av4vX5G-wnm3_CkV#yn1T*&tKLBf%Y3-EP)I;Ug_UM|V3LNPEnL;qJR7s*
zuWbmyvHkk9ZS?}l2$~XTSvBg8B)C7+l2>1z7o-~_-rT;gWIqk~!KznxXK>eFgy{~3
zy^HsD_fJ;=%Gf|?{4Hd*9H?4xByt>gVDTPE8&Ybx1lWnPijyfgch&GQX-G;2=+e)t
zY01H+q^_h*Y0ZrU@aF_`V(LQ0U(R8Ah64?pEs(5+$@;^k`MUyMojtZ+N4$Mkw2jK>VkX2Q@K*PUD+3=N}
zNT>qA8lU(e>%S6`DiKIJxc_Bxn+lMoUn!WlD&*N$Uzbf6^8YIGcE9T#H+-^L7q$Q0
zL)#fbQUcpt{aHKi&?Pe(0G^W5(hQuaLEVW>Gz-WjF$s%aq8GKBI7%~?c;o8NyJL
zFx-i@R1cPnv3JM&gZ)+D$KP8jj5_h*`(
zvQ|H|oRu8wxg&$ZH9t_9J_aK=kz8t*Vo7d2kAY;Lc5?i(E;hSd>|-$9x6PYeWr4f2
zG)>h#nFEp9avfosE56P%i9g*&dDDe@8)XJn%E-fk-OC-gJOeC;TfOvM(WG~?kL+k8BHUw0qAdndml
zc$->iutpR6Q=eC*(K&Y*Y7W!s%wsdg!mxwP61Jx>r#=u|KeO+dHtd*i>4*C3ORi&P
zoa%!sS}?)GfY*y26sYNW7Ty-2Hc#xxVF7uy%?h-(`!xB0(~`y&TUGT_vZ=K}1~sM9
zih?Y$wT0|5SATMnr$RLUOo}i|pK^)tGK}5_n5;pOSBNf5vD+^Dnd3*0ie;wvq5%3uvuS|Rs~1j7bgEZlPaZV1jwO%P?sb4FMUT#Q>+3?tBGn8VtlK*6IK+Vhx<5K;F((RNGy4!gRSmj|s%
zKab1yt9t}Ck$w}8ZE$dh#(>Gw?l51pQ#GXLNHqScL{~>D7CA03TGhV})*UDjduY&2
z`i%FZkkf-5*y|`dZieZ!C=I=M6{CZh^Yr>cu0|rQucv{EF)j_FHV7mLqJzLpT4C!`
zsrO=8(+NvkKYL}z+VO)`g^I9Sh9=ErXYOBJGF_`lPisQK0spDN_t*AM^IIi}sqYR@
zR(C)F3I}!js@)_If4cv2#>1^a&q=_>5uR96N7nuvIAs3A-h&LP^u!rcYKvRu9tlxl
z@DnCqy1E+wjz*82aS(>Y<9Hj`lUg5}Sn#_6nnxes9lWq6il$)ox6mViW1n$9@a^Gj
zF~2u|FuwPA@9MEptzBYe;&)7G_ga91gV9zx!t*p9@Qp+=E`YtfVI^>L`8b*86~}k^
z1l{*zs+l-12YHdL6#Cm;pbC3ZhLi+yFr7|4h^Fb^pDY5uV9rddjJ_;0lA55buVAPA4G^puQ(XGDK`s1PMR
zWF!nED-xlan*m4&Ns>IIzTptO5_PmVdy_)kz2kr>GthNN8cc
zl_O@ADyW5}$Pt+QL|bbhXD5w-v!lI5sP!%l6p93dC9~LRK*w3myjRlePd3Q0khKtc
zZ(?wnQOnVy({Hx1gukW_{9;4jIs3KpV8s-=hV`hO;1L4_6+dkptSkdT4Lb*~S2I>I
z0<~OJ+Ted9w1UH@ZBb%VViGrX)2vh1oM+Ve6M)rl!l*r(*ql!Sn>_cbsD<7wuW(Cj
ze@g+yAUQc*Wq%><1RyJ?4=M5HZnLhTgOummimoCgn5&>tkgx6r
zFTes^k+F!BtuGNQ0}%2M?{~KhUG%$0khMTfy{N3zI867Q^3JWW3TaOeUaf?9IHmHI
zJO#D;8`}}c^hNi8QVb0{2Q^0d=%koZOu}{HsvUK9Eo7nbt#Tw`7=i+BrXptKXF+21
zIfGNX^sG1V6DdGrmF6tv@Qs-U2|%_4MUK#%M0*+M
z8^Sa;ubSS_JxNMVs}1MMha5d=L8^gJ@KGxJB;ff4lBS&iE3WRbu5u8%NRTZjo6;N9
ztlcQNC&f9)aDV=k3r$&9CY!-W(5R>NUyT(rclMDI*(ex#3&h_=IE;=R=3lh3Bnz%1
z^8tgSah>
zu@&Vwo0T{N6s26F69!uLzWu_@JnRO9>uj3lQ2)}Qv|G#j!0KDO<>%_~n3{5XXm#4z
z#Kn>@#&Arki2g()rbfcAPs8Y`l#BM&Ch-b+uPNmVx^D8QCPl(e?ju%L>05eDW%t-0J$>
zHk|Fv)^yFi2c5`|jQO
zcTHFUzn>(IQDP)k(wTGK@agcZ=x-hoTIq5)pN{#^ct>Ey>c5s(V&GDll2E?YBrNZL
zOS{;4=XXuVXTHSJPnHd0MeZ<$H%IAq_g%nx{#Mas$3xj<5k;aNxotDp=MI*fbBcfg
zY}vKQ?&V|T`$qD}C+3N@EVJlaFjYuH!VwUwjiz?w2CyCO^>
zcm|H=)SL>}^5{4_dAV}D5l9|s7(Upr_t4+Fk2V)1XC92*I4iR3!#vZOt->@Te!U5AK;8eGl1bWPkvFZdKQ>#;Uxvl9n#{uy
z7!vZ^RRJL=Vxr2=n|8r$bqMoNo`9)gR+LkFKMUOp&wRvIex?p_k=0N3gnAyfVkY1C
znUzb*!aJ_*K7i6NPP=YdlasfZ_;)C=$|A?3gOGOe^2B}~uo;)=?$ElMPN;>*;kUU^
z_XD;=1p{5_dEphFDyG_k*jcIOwe<8HkXB}X*PgVx*WwQ=ZB1KgYoW^-m9^09wx>|@
z)#LE&@h*jY7XP~`vuJ+UR@cqC>_UUh@L=|dyD#ItFW%(xk{8+}68~I0Zc6$1>h*C~&_6A)a~Ro$*m?yztMkDT$7@slNr
zZ<873&&TIBh`4?I>CxRK0&OX
z>}3rbyB#sa_bmPDmEXl8;Y@o%PTQgLrAlRWv07A0-_gs@i8f5zPcJHjr|#ap%xtV>
z7{QxZGaR2lP4!K)JiJWDrm9#;Vhsj#W_YB2n5Mdwsb+cbb`+Ss-EL@h(gS_(yH95c
z)r2=QzXgwLqhRAA&NRfA$3O7F^VjP#2Lr%LXbEmZH7kr;_qL3anXDnvfw()1*q(9$
zmn(FI-K{`JlkYuz659N>#cWO9ZmsK?T4n_^GJZkxmW}rgWG#O$LI)X);_|xnZBF9=
zY;n5&_a4a!w(WI*=Eec7Kc)9AaY*nLzWPMfwLKV`w(5J&*b)3wTjn-@fT~0#N*1zh
z*-DOWBM_~Oqy3FNwCxw_KuJ0^77NZ3yhtnzJMda&*HxCW{xYK!Jv)?ehcIxa5*BG0
zw>|9Q3(esox99Py@t4Xtn+;A=o4$ra%;f3HNaKkH!c;itkv)vqv1RNy3vJ*@e?%nR
z(fLNZl3aiuaPHhyUz74BJ&^gJ+S~2%eJ7vHh`w18D!E{h0zga#G^(}Id6~pjk8x3a
zi46zoWRA?%v?qfmDVY&qW$cEZ;bTIQC~D>=8hUu7`N@f)vk?c4;U6gQgA4?ojTg}N
z20Mf^^^hZ3qzXQO3*`&Bm$uoPjZ02p9QWUdT?3^sF?l9wF%l_yuZD%=Bo-F8d!nXJ
zo>q=vk1?%5-@e8Zu$TpwaY-|kLbOO=Z|{dyd6FqjA6M_5#mL_THAkZ=4gUeB6$>)(
zOVW1kp?w<$5cK?g)+Q=ZxVM53qR=NFpPIERVseq8JRV_c8_|B!;#y-<(rLzyf{;5w
z>{k^&1Ru49WFEaNJH_1j0iwZYHP){r|-~hADo3fT1m%nBgb@z>h
zEx|I%k7!tp`e;QXh>EAz@Bam%_OjIYReFU^T+$2b^4iyN!
z$A3X?%DoZ&VPgvD0FK(kg=9(;^1E)XT`BnKf2eMS2nF#sm>t97v&)U$FjU|>
zL*gS;0=?EFRtj;&O{39r3pgWTRG^8=+D}a-9rGRW*iNjwOKj=?{t9VG?V}+dq4uk;ZA|i|`)DhHF`{}G@l9o-Fzg
zb@7wvk>kv=)L9;mHK9-OV9b&V?#fS5DVPO!P{%-s}sl--y>dLSZ0XT4L_E{MbnOC&oiDADh`a
z!N^y18~~wZ&0n!!Q269(rKXh?qmRcxH~GjgB=yFjwvw5MFOD#p^?!k38nU0m6^)(t
zkpCpfQqGW5U!4J5cSxdt4G(e5E`0*H|Ncw({xzSHY~TY)17xK$(zb9SSmlg~L0}T#
zCQ@k*TYXIG>vmmG!+mJnv^vZmPW$703gE^QO2g>X_ucsReHidf?t|0g;V_*Ab%@g0
z4R8XPCT>U@EJkQD(|EpYZ949WzN@^-#n0bxC^euU^oBS%n=AMOEU^r);KKsNC$3;O
z4ex{k#inHS7>K(LX6l
zg)&M*9pp`Ju8){XE@nk4KYAXuK}UdVk;XORZYW$NRT%VOoCBB#Z4xOU+3Z&NfT};s
zh)a5rD3T#Yhct(5SZ5^*5wJswi!DSiL<}lq?C|Ip4;-GlDv4LMk|RJL`U+yJ_N
zoHQy+pP~l`4O$S#Zt1D+uMd}PoNnrORK0_S0$j=WF3u?H&Oj@=Q=VY=f;0pgZopDl
zgIPfSq~3K2&M|OoUt?b})A86d>uUz~#V7QyDD=IulJejF>S6d3w8xs|e=WG<&m;nC
zg)%`b0{jhU;Iko&GB8b>qv!Wqq=XPOGjOieeb^upz&R+J7~$u6J*Ss*Pa7@TaAOp|
zgq|&ovIj*`Ep8pQO?f~X=@Qz5&ew~^S3r=zbKNy?fiT(&of;xcN_gxpg)Ouqhs!Fb
z;^4OMIoyZ2Z{@mmpp2mJczH_|FGAeD6unRVSm)@^EDQ?){#wLZeFZeV-j#+uX2n-gHZK3-K>XYG?
z#GD3_mqnJLtCaot`^s%H=O_vPDS_iZrHgYIn0leNRm1Bf0n{nlWmJ&bDf?dxe{nUV
z_!Y;Jy#U1IwTkFJ*R=(IG?(NqsqaQzk^qy2?u(jN?NMAtqr>w&refM@khK|(Oqh0;
zD%sjKk{;YjPo!~`I(c6v;g57;myo$BK(6V*^WqOS)MTJb`9S}sBoW?%rwK@QDbs2z
zmO|ECTxjcYG&a3aV^#4Sb^`Vc)n
zB+8Y#;jbX2CUimzPZV*zCpOAHt)jide^j_HTnEWY<%>JfY4tj?`+EdSkquOCB6wT3
z(O47i9aMhuuK#6gaC*vLLwh=lfAZjl4dXPwL)B%}u6i~1M-8805^oj}KuAGz`+$C?
zWU)i}vvJJ#o+pLiHw@hk_BL!BIVG%HAsZxU0_?Pf|BOZqqNS{^?^U?a0ai@|avAL4
ze1|QvUlJ&YwH%i;igM&oKrb+$c>O|g(Ln|?wiSoQ1^&S(KCVSFJ*zSUQfbu_pV1$i
zqXHgUkBY#@V#fd8>y^vo#>0Wbw6osB*7fY9XG5geS$nJ}R-V2@yzlp_LllqP;7`#-
zMOfG(V=skMxwm?DpvSQn{
zNs3K!7EVV9>~tb`+$Hoa)}v}}vFZ9=Y?k`Edc9?pzVk~lT9w|YPm|TB3zOUrBUN4#
z(;sjzrf{uUUFVEDzCa+2vpb*e`ceZ!wYAc-js^ofnX8FUJk7
znhu*3ex5U20^Uj6cCw%_bdth$Dvq+&C38Lb!fk#Je^=oCEGuy}?{3C5pNP>L
zM2XB)=0;W{SbZzP92))FG&oa!C?v;rkIN;__B!_b9qJuqS2M5?;jq=O(T(G3BP~hg
zqoRt4tmI8{XRwgu;}Z(_@o}#C|FB-V{x36!6pLc!5qSJ*E}XM$ZS7DeuRP^{g+
zc$HeF;uNT!!(a&P=w{sA6vm%iI1HHv4#bJMLPsjhe5PXprly=jFR|0G&cw=S3WE&bB4BDtK$-&pb3ujcwlB9M7mB@p9;O2cdaw#E
zr&yr?cbBzb1qv}W8