commit 56d4ae91712dcb8b3a151db2e8af3f97af6c5e10
parent 72316d7ba9f2fa83f922727971016e89323cb160
Author: Mikolai Gütschow <mikolai.guetschow@tu-dresden.de>
Date: Wed, 8 Apr 2026 10:39:03 +0200
protocol: rename Sign-Msg
Diffstat:
2 files changed, 238 insertions(+), 233 deletions(-)
diff --git a/draft-guetschow-taler-protocol.md b/draft-guetschow-taler-protocol.md
@@ -340,7 +340,7 @@ out = (data == exp)
### Clause-Schnorr
-# Datatypes
+# Datatypes and Notation
## Amount
@@ -371,7 +371,7 @@ a fixed signing context (purpose) as registered by GANA in the
registry. Taler-related purposes start at 1000.
~~~
-Sign-Msg(purpose, msg) -> out
+Gen-Msg(purpose, msg) -> out
Inputs:
purpose signature purpose as registered at GANA
@@ -394,12 +394,17 @@ out = uint32(len(msg)) | uint32(purpose) | msg
- Planchet-Hash: SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetᵢ )
- check-decrement: check reserve.balance >= total, persist reserve.balance -= total
- refresh-derivation (only for refresh/link)
+- persist-{type} (key1, key2, ...) => (val1, val2, ...)
+- lookup-{type} (key1)
+- check bool
+- knows data
+- sum ⟨dataᵢ⟩
+- ⟨dataᵢ⟩
+- for/if
~~~
# The Taler Crypto Protocol
-// todo: explain persist, check, knows, sum, indexing/list notation
-
## Withdrawal {#withdrawal}
The wallet generates `n > 0` coins `⟨coinᵢ⟩` and requests `n` signatures `⟨blind_sigᵢ⟩` from the exchange,
@@ -407,8 +412,6 @@ attributing value to the coins according to `n` chosen denominations `⟨denom
The total value and withdrawal fee (defined by the exchange per denomination)
must be smaller or equal to the amount stored in the single reserve used for withdrawal.
-// todo: explain notation: ⟨⟩ᵢ
-
// todo: document TALER_MAX_COINS = 64 per operation (due to CS-encoding)
// todo: extend with extra roundtrip for CBS
@@ -477,7 +480,7 @@ for i in 0..n:
planchetᵢ = RSA-FDH-Blind(SHA-512(coinᵢ.pub), blind_secretᵢ, denomᵢ.pub)
h_planchetᵢ = SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetᵢ )
planchets = (⟨h_denomᵢ⟩, ⟨planchetᵢ⟩)
-msg = Sign-Msg(WALLET_RESERVE_WITHDRAW,
+msg = Gen-Msg(WALLET_RESERVE_WITHDRAW,
( sum( ⟨denomᵢ.value⟩ ) | sum( ⟨denomᵢ.fee_withdraw⟩ )
| SHA-512( ⟨h_planchetᵢ⟩ ) | uint256(0x0) | uint32(0x0) | uint32(0x0) ))
sig = EdDSA-Sign(reserve.priv, msg)
@@ -491,7 +494,7 @@ for i in 0..n:
denomᵢ = Denom-Lookup(h_denomᵢ)
check denomᵢ known and not withdrawal-expired
h_planchetᵢ = SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetᵢ )
-msg = Sign-Msg(WALLET_RESERVE_WITHDRAW,
+msg = Gen-Msg(WALLET_RESERVE_WITHDRAW,
( sum( ⟨denomᵢ.value⟩ ) | sum( ⟨denomᵢ.fee_withdraw⟩ )
| SHA-512( ⟨h_planchetᵢ⟩ ) | uint256(0x0) | uint32(0x0) | uint32(0x0) ))
check EdDSA-Verify(reserve.pub, msg, sig)
@@ -599,7 +602,7 @@ contract = (order.{id,price,info,token?}, exchange, h_wire, timestamp, refund_de
contract.nonce = nonce.pub
persist contract
h_contract = SHA-512(canonicalJSON(contract))
-msg = Sign-Msg(MERCHANT_CONTRACT, h_contract)
+msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
sig = EdDSA-Sign(merchant.priv, msg)
~~~
@@ -607,7 +610,7 @@ sig = EdDSA-Sign(merchant.priv, msg)
(W2) payment preparation (wallet)
h_contract = SHA-512(canonicalJSON(contract))
-msg = Sign-Msg(MERCHANT_CONTRACT, h_contract)
+msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
check EdDSA-Verify(merchant.pub, msg, sig)
check contract.nonce == nonce
// TODO: double-check extra hash check?
@@ -615,7 +618,7 @@ check contract.nonce == nonce
⟨selectionᵢ⟩ = CoinSelection(contract.{exchange,price}) TODO: include MarkDirty here
for i in 0..n:
(coinᵢ, denomᵢ, contributionᵢ) = selectionᵢ
- msgᵢ = Sign-Msg(WALLET_COIN_DEPOSIT,
+ msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT,
( h_contract | uint256(0x0)
| uint512(0x0) | contract.h_wire | coinᵢ.h_denom
| contract.timestamp | contract.refund_deadline
@@ -630,21 +633,19 @@ persist (contract, ⟨sigᵢ⟩, ⟨depositᵢ⟩)
// TODO: maybe introduce symbol for pub/priv
-// TODO: maybe rename Sign-Msg as name is currently a bit confusing (not actually signing a message, but just generating the message to be signed)
-
~~~
(M3) deposit check (merchant)
check sum( ⟨depositᵢ.contribution⟩ ) == contract.price
check Deposit(⟨depositᵢ⟩)
-msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract)
+msg = Gen-Msg(MERCHANT_PAYMENT_OK, h_contract)
sig = EdDSA-Sign(merchant.priv, msg)
~~~
~~~
(W3) payment verification (wallet)
-msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract)
+msg = Gen-Msg(MERCHANT_PAYMENT_OK, h_contract)
check EdDSA-Verify(merchant.pub, msg, sig)
~~~
@@ -689,7 +690,7 @@ where (without age restriction, policy and wallet data hash)
info.time = contract.{timestamp, wire_deadline, refund_deadline}
info.wire = (payto, wire_salt)
h_contract = SHA-512(canonicalJSON(contract))
-msg = Sign-Msg(MERCHANT_CONTRACT, h_contract)
+msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
sig = EdDSA-Sign(merchant.priv, msg)
~~~
@@ -702,7 +703,7 @@ for i in 0..n:
denomᵢ = Denom-Lookup(coinᵢ.h_denom)
check denomᵢ known and not deposit-expired // todo: check could be included in Denom-Lookup
totalᵢ = depositᵢ.contribution + denomᵢ.fee_deposit
- msgᵢ = Sign-Msg(WALLET_COIN_DEPOSIT,
+ msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT,
( h_contract | uint256(0x0)
| uint512(0x0) | h_wire | coinᵢ.h_denom
| info.time.timestamp | info.time.refund_deadline
@@ -715,7 +716,7 @@ for i in 0..n:
persist deposit-record
schedule bank transfer to payto
timestamp = now()
-msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT,
+msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
( h_contract | h_wire | uint512(0x0)
| timestamp | info.time.wire_deadline
| info.time.refund_deadline
@@ -728,7 +729,7 @@ sig = EdDSA-Sign(exchange.priv, msg)
(M2) Deposit verification (merchant)
h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64)
-msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT,
+msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
( h_contract | h_wire | uint512(0x0)
| timestamp | contract.wire_deadline
| contract.refund_deadline
@@ -818,7 +819,7 @@ commitment = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
for i in 0..n:
h_denomᵢ = SHA-512(uint32(0) | uint32(0x1) | denomᵢ.pub)
planchets = (⟨h_denomᵢ⟩, ⟨planchetₖᵢ⟩, ⟨transferₖᵢ.pub⟩))
-msg = Sign-Msg(WALLET_COIN_MELT,
+msg = Gen-Msg(WALLET_COIN_MELT,
( commitment | coin.h_denom | uint256(0x0)
| value | denom.fee_refresh ))
sig = EdDSA-Sign(coin.priv, msg)
@@ -853,7 +854,7 @@ for k in 0..κ:
h_planchetsₖ = SHA-512( ⟨h_planchetₖᵢ⟩ )
commitment = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
| SHA-512( ⟨h_planchetsₖ⟩ ) )
-msg = Sign-Msg(WALLET_COIN_MELT,
+msg = Gen-Msg(WALLET_COIN_MELT,
( commitment | coin.h_denom | uint256(0x0)
| value | denom.fee_refresh ))
check EdDSA-Verify(coin.pub, msg, sig)
@@ -864,7 +865,7 @@ if refresh-record not found:
blind_sigᵢ = RSA-FDH-Sign(planchetᵧᵢ, denomᵧᵢ.priv)
link_info = (refresh_seed, ⟨transferₖᵢ.pub⟩, ⟨h_denomᵢ⟩, coin_sig)
persist refresh-record = (commitment, ɣ, ⟨blind_sigᵢ⟩, h_planchetsᵧ, false, link_info)
-msg = Sign-Msg(EXCHANGE_CONFIRM_MELT,
+msg = Gen-Msg(EXCHANGE_CONFIRM_MELT,
( commitment | uint32(ɣ) ))
sig = EdDSA-Sign(exchange.priv, msg)
~~~
@@ -881,7 +882,7 @@ sig = EdDSA-Sign(exchange.priv, msg)
(W2) secret revelation (wallet)
check exchange.pub known
-msg = Sign-Msg(EXCHANGE_CONFIRM_MELT,
+msg = Gen-Msg(EXCHANGE_CONFIRM_MELT,
( commitment | ɣ ))
check EdDSA-Verify(exchange.pub, msg, sig)
persist refresh-challenge // what exactly?
@@ -975,7 +976,7 @@ where (for RSA, without age-restriction)
~~~
(W1) history request (wallet)
-msg = Sign-Msg(COIN_HISTORY_REQUEST, uint64(0x0))
+msg = Gen-Msg(COIN_HISTORY_REQUEST, uint64(0x0))
sig = EdDSA-Sign(coin.priv, msg)
~~~
@@ -1020,7 +1021,7 @@ for k in 0..κ:
value = coin.denom.fee_refresh + sum( ⟨denomᵢ.value⟩ ) + sum( ⟨denomᵢ.fee_withdraw⟩ )
commitment = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
| SHA-512( ⟨h_planchetsₖ⟩ ) )
-msg = Sign-Msg(WALLET_COIN_MELT,
+msg = Gen-Msg(WALLET_COIN_MELT,
( commitment | coin.h_denom | uint256(0x0)
| value | denom.fee_refresh ))
check EdDSA-Verify(coin.pub, msg, sig)
diff --git a/draft-guetschow-taler-protocol.xml b/draft-guetschow-taler-protocol.xml
@@ -333,8 +333,8 @@ out = (data == exp)
</section>
</section>
</section>
- <section anchor="datatypes">
- <name>Datatypes</name>
+ <section anchor="datatypes-and-notation">
+ <name>Datatypes and Notation</name>
<section anchor="amount">
<name>Amount</name>
<t>Amounts are represented in Taler as positive fixed-point values
@@ -363,7 +363,7 @@ a fixed signing context (purpose) as registered by GANA in the
<eref target="https://gana.gnunet.org/gnunet-signatures/gnunet_signatures.html">GNUnet Signature Purposes</eref>
registry. Taler-related purposes start at 1000.</t>
<artwork><![CDATA[
-Sign-Msg(purpose, msg) -> out
+Gen-Msg(purpose, msg) -> out
Inputs:
purpose signature purpose as registered at GANA
@@ -384,19 +384,24 @@ out = uint32(len(msg)) | uint32(purpose) | msg
- Planchet-Hash: SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetᵢ )
- check-decrement: check reserve.balance >= total, persist reserve.balance -= total
- refresh-derivation (only for refresh/link)
+- persist-{type} (key1, key2, ...) => (val1, val2, ...)
+- lookup-{type} (key1)
+- check bool
+- knows data
+- sum ⟨dataᵢ⟩
+- ⟨dataᵢ⟩
+- for/if
]]></artwork>
</section>
</section>
<section anchor="the-taler-crypto-protocol">
<name>The Taler Crypto Protocol</name>
- <t>// todo: explain persist, check, knows, sum, indexing/list notation</t>
<section anchor="withdrawal">
<name>Withdrawal</name>
<t>The wallet generates <tt>n > 0</tt> coins <tt>⟨coinᵢ⟩</tt> and requests <tt>n</tt> signatures <tt>⟨blind_sigᵢ⟩</tt> from the exchange,
attributing value to the coins according to <tt>n</tt> chosen denominations <tt>⟨denomᵢ⟩</tt>.
The total value and withdrawal fee (defined by the exchange per denomination)
must be smaller or equal to the amount stored in the single reserve used for withdrawal.</t>
- <t>// todo: explain notation: ⟨⟩ᵢ</t>
<t>// todo: document TALER_MAX_COINS = 64 per operation (due to CS-encoding)</t>
<t>// todo: extend with extra roundtrip for CBS</t>
<artwork><![CDATA[
@@ -458,7 +463,7 @@ for i in 0..n:
planchetᵢ = RSA-FDH-Blind(SHA-512(coinᵢ.pub), blind_secretᵢ, denomᵢ.pub)
h_planchetᵢ = SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetᵢ )
planchets = (⟨h_denomᵢ⟩, ⟨planchetᵢ⟩)
-msg = Sign-Msg(WALLET_RESERVE_WITHDRAW,
+msg = Gen-Msg(WALLET_RESERVE_WITHDRAW,
( sum( ⟨denomᵢ.value⟩ ) | sum( ⟨denomᵢ.fee_withdraw⟩ )
| SHA-512( ⟨h_planchetᵢ⟩ ) | uint256(0x0) | uint32(0x0) | uint32(0x0) ))
sig = EdDSA-Sign(reserve.priv, msg)
@@ -471,7 +476,7 @@ for i in 0..n:
denomᵢ = Denom-Lookup(h_denomᵢ)
check denomᵢ known and not withdrawal-expired
h_planchetᵢ = SHA-512( SHA-512( denomᵢ.pub ) | uint32(0x1) | planchetᵢ )
-msg = Sign-Msg(WALLET_RESERVE_WITHDRAW,
+msg = Gen-Msg(WALLET_RESERVE_WITHDRAW,
( sum( ⟨denomᵢ.value⟩ ) | sum( ⟨denomᵢ.fee_withdraw⟩ )
| SHA-512( ⟨h_planchetᵢ⟩ ) | uint256(0x0) | uint32(0x0) | uint32(0x0) ))
check EdDSA-Verify(reserve.pub, msg, sig)
@@ -572,14 +577,14 @@ contract = (order.{id,price,info,token?}, exchange, h_wire, timestamp, refund_de
contract.nonce = nonce.pub
persist contract
h_contract = SHA-512(canonicalJSON(contract))
-msg = Sign-Msg(MERCHANT_CONTRACT, h_contract)
+msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
sig = EdDSA-Sign(merchant.priv, msg)
]]></artwork>
<artwork><![CDATA[
(W2) payment preparation (wallet)
h_contract = SHA-512(canonicalJSON(contract))
-msg = Sign-Msg(MERCHANT_CONTRACT, h_contract)
+msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
check EdDSA-Verify(merchant.pub, msg, sig)
check contract.nonce == nonce
// TODO: double-check extra hash check?
@@ -587,7 +592,7 @@ check contract.nonce == nonce
⟨selectionᵢ⟩ = CoinSelection(contract.{exchange,price}) TODO: include MarkDirty here
for i in 0..n:
(coinᵢ, denomᵢ, contributionᵢ) = selectionᵢ
- msgᵢ = Sign-Msg(WALLET_COIN_DEPOSIT,
+ msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT,
( h_contract | uint256(0x0)
| uint512(0x0) | contract.h_wire | coinᵢ.h_denom
| contract.timestamp | contract.refund_deadline
@@ -599,19 +604,18 @@ persist (contract, ⟨sigᵢ⟩, ⟨depositᵢ⟩)
]]></artwork>
<t>// TODO: explain CoinSelection</t>
<t>// TODO: maybe introduce symbol for pub/priv</t>
- <t>// TODO: maybe rename Sign-Msg as name is currently a bit confusing (not actually signing a message, but just generating the message to be signed)</t>
<artwork><![CDATA[
(M3) deposit check (merchant)
check sum( ⟨depositᵢ.contribution⟩ ) == contract.price
check Deposit(⟨depositᵢ⟩)
-msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract)
+msg = Gen-Msg(MERCHANT_PAYMENT_OK, h_contract)
sig = EdDSA-Sign(merchant.priv, msg)
]]></artwork>
<artwork><![CDATA[
(W3) payment verification (wallet)
-msg = Sign-Msg(MERCHANT_PAYMENT_OK, h_contract)
+msg = Gen-Msg(MERCHANT_PAYMENT_OK, h_contract)
check EdDSA-Verify(merchant.pub, msg, sig)
]]></artwork>
</section>
@@ -652,7 +656,7 @@ knows contract, ⟨depositᵢ⟩ |
info.time = contract.{timestamp, wire_deadline, refund_deadline}
info.wire = (payto, wire_salt)
h_contract = SHA-512(canonicalJSON(contract))
-msg = Sign-Msg(MERCHANT_CONTRACT, h_contract)
+msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
sig = EdDSA-Sign(merchant.priv, msg)
]]></artwork>
<artwork><![CDATA[
@@ -664,7 +668,7 @@ for i in 0..n:
denomᵢ = Denom-Lookup(coinᵢ.h_denom)
check denomᵢ known and not deposit-expired // todo: check could be included in Denom-Lookup
totalᵢ = depositᵢ.contribution + denomᵢ.fee_deposit
- msgᵢ = Sign-Msg(WALLET_COIN_DEPOSIT,
+ msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT,
( h_contract | uint256(0x0)
| uint512(0x0) | h_wire | coinᵢ.h_denom
| info.time.timestamp | info.time.refund_deadline
@@ -677,7 +681,7 @@ for i in 0..n:
persist deposit-record
schedule bank transfer to payto
timestamp = now()
-msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT,
+msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
( h_contract | h_wire | uint512(0x0)
| timestamp | info.time.wire_deadline
| info.time.refund_deadline
@@ -689,7 +693,7 @@ sig = EdDSA-Sign(exchange.priv, msg)
(M2) Deposit verification (merchant)
h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64)
-msg = Sign-Msg(EXCHANGE_CONFIRM_DEPOSIT,
+msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
( h_contract | h_wire | uint512(0x0)
| timestamp | contract.wire_deadline
| contract.refund_deadline
@@ -763,7 +767,7 @@ commitment = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
for i in 0..n:
h_denomᵢ = SHA-512(uint32(0) | uint32(0x1) | denomᵢ.pub)
planchets = (⟨h_denomᵢ⟩, ⟨planchetₖᵢ⟩, ⟨transferₖᵢ.pub⟩))
-msg = Sign-Msg(WALLET_COIN_MELT,
+msg = Gen-Msg(WALLET_COIN_MELT,
( commitment | coin.h_denom | uint256(0x0)
| value | denom.fee_refresh ))
sig = EdDSA-Sign(coin.priv, msg)
@@ -790,7 +794,7 @@ for k in 0..κ:
h_planchetsₖ = SHA-512( ⟨h_planchetₖᵢ⟩ )
commitment = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
| SHA-512( ⟨h_planchetsₖ⟩ ) )
-msg = Sign-Msg(WALLET_COIN_MELT,
+msg = Gen-Msg(WALLET_COIN_MELT,
( commitment | coin.h_denom | uint256(0x0)
| value | denom.fee_refresh ))
check EdDSA-Verify(coin.pub, msg, sig)
@@ -801,7 +805,7 @@ if refresh-record not found:
blind_sigᵢ = RSA-FDH-Sign(planchetᵧᵢ, denomᵧᵢ.priv)
link_info = (refresh_seed, ⟨transferₖᵢ.pub⟩, ⟨h_denomᵢ⟩, coin_sig)
persist refresh-record = (commitment, ɣ, ⟨blind_sigᵢ⟩, h_planchetsᵧ, false, link_info)
-msg = Sign-Msg(EXCHANGE_CONFIRM_MELT,
+msg = Gen-Msg(EXCHANGE_CONFIRM_MELT,
( commitment | uint32(ɣ) ))
sig = EdDSA-Sign(exchange.priv, msg)
]]></artwork>
@@ -809,7 +813,7 @@ sig = EdDSA-Sign(exchange.priv, msg)
(W2) secret revelation (wallet)
check exchange.pub known
-msg = Sign-Msg(EXCHANGE_CONFIRM_MELT,
+msg = Gen-Msg(EXCHANGE_CONFIRM_MELT,
( commitment | ɣ ))
check EdDSA-Verify(exchange.pub, msg, sig)
persist refresh-challenge // what exactly?
@@ -877,7 +881,7 @@ knows coin knows refresh-record for coin
<artwork><![CDATA[
(W1) history request (wallet)
-msg = Sign-Msg(COIN_HISTORY_REQUEST, uint64(0x0))
+msg = Gen-Msg(COIN_HISTORY_REQUEST, uint64(0x0))
sig = EdDSA-Sign(coin.priv, msg)
]]></artwork>
<artwork><![CDATA[
@@ -910,7 +914,7 @@ for k in 0..κ:
value = coin.denom.fee_refresh + sum( ⟨denomᵢ.value⟩ ) + sum( ⟨denomᵢ.fee_withdraw⟩ )
commitment = SHA-512( refresh_seed | uint256(0x0) | coin.pub | value
| SHA-512( ⟨h_planchetsₖ⟩ ) )
-msg = Sign-Msg(WALLET_COIN_MELT,
+msg = Gen-Msg(WALLET_COIN_MELT,
( commitment | coin.h_denom | uint256(0x0)
| value | denom.fee_refresh ))
check EdDSA-Verify(coin.pub, msg, sig)
@@ -1028,7 +1032,7 @@ if ⟨blind_sigᵢ⟩ returned:
<refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
</reference>
</references>
- <?line 1060?>
+ <?line 1061?>
<section anchor="change-log">
<name>Change log</name>
@@ -1041,190 +1045,190 @@ Education and Research (BMBF) within the project Concrete Contracts.</t>
</section>
</back>
<!-- ##markdown-source:
-H4sIAAAAAAAAA+09y3bbSHZ7fEW1vBiwmyApyXZ3K83uyJJsKbZkjyTHM3E7
-JEgUSYxAgIOHJbasWeQjsp1zMgsnHzCbnOyymk3+oedLcu+tBwog+JAl2Z6k
-eXwsELhVdeu+760q0HEc6+0W27Ss1E8DvsXWTkecPTl6yU7dgMfsRRylUT8K
-1iwv6ofuGCC82B2kzjDjadIfRedOioDORAJafTflwyiebjE/HESW5U/iLZbG
-WZJutFrftjas8yg+G8ZRNkEIj084/BemVpLG3B0X753xKUB7WxZjDqNx6Kof
-TydpNIzdyWhKN3jfTUZ0NXGnY2iZWNa9tzzM+JZ1j7GYT6ItNkrTSbLVbA79
-tDEMs5CnjSgeNoPEawFiDbjdROAA8E/SHByeV4A3LcvN0lEUA24OjMyYIM6h
-fxYFrs+e/Pd/CfLQM2i4xU5f7rLdmCcwM/Yy9N/yOPHTKYsG7JT3R2EURMMp
-Qbu9XszfYgMFT7eRQBwQ2+fBeBQF6U9wo8HWW/SwD11tFcD7kQf47Dqt9dbD
-b+WdLEyRMU94PHZDMRgfu36wxcYC74Zm69+nmeOJ7hoet6wwgjYpYI3MOH68
-s9FSF+ut+/LywTcPv5WXDzc26e7+093HgMXzg8Z6C/61vm5++/U3zqbz8P6G
-s34foJyvO5v3AfBk/0TDPWxtfNM8Ojg5bTw+eHHSWP+m5dwHQQJx0jhYluM4
-QCmggdtPLevH1+z00Sv24xvxYOx7XgBY32MHMOXIy/qpH4UFsEf83I05S0du
-Cv/5CQMBz1B2GFwnqR8EDCXV8UOU7SGQImFu6LGxOwVKhqnrh4zHcRQnDetl
-whl0M42ymEXnIYv95OwLHP0oSl0xssO6a26vv9ZlQNEIRAwG5SzwUx67AfLW
-D4esCxBdxkPkncfchG2f7BwcsNdE7zfYh8vesV6xD0AGdS6kgVCcXHbupyPW
-Q/iAh7ZbKw3KwyE8B/x7U7wHTfA2flGIuNh24nr/xOPIntZZuYsCbJ39BGAO
-gCPWaWQOAn1PxTDYY89PE/ui1m126RZeFrod+6E/BnKE2bgHxgcaY4umQDPk
-feCBG09xCFBp4Ahyi9plQepPAs7gZt9PkA5+CGYI+rjAcTP4htMoj9eddgFR
-N0lZ4g9Df+D3XegRx1REUd10L3K+AOHAGqBwCDqAhQIIu+cPAcTz3bCmxlx/
-KGaL15sb+fXD+/n1xgMD6ME6QaEI8t9n/lsweTjFSE5h/SHNQcDamxvmt4f3
-zW/Qq/kV+qWvdSBcMuF9VKJgimjGINPR2J4alHGZuBlM2ZCHIJ8pTDoBfIAA
-XHIUSCTE8UvWY/Y48tgR9NCkO4VbBfYKNgGVSVSbjF9MohBm6GvZnc9JxAv1
-r1dn0HcWROwINWwn9wV+H9yVP/ZxcugAyg/3wUmwx1lItoAA7oHZ2XaAVuzy
-XjJy4eLKsv7whz9Y8rY9ToY15nzPRuhfrINwkqVbZDbhAf4B5OAWG6NgDok2
-Uu6fse/Yxj8/XGdRP+Xojp5nqW6MvVEnspnnD8HlYOuBfwG0ln0gvs/AWbTZ
-5obqB5GzutgBCQlSNaKesbWaDBiOCUjkCRczZfcb63X2AP97iP8hFR82NrDF
-a2mq3zRycoCsCHLAhUEOFM0bkmN948Ht0OPh/ZXpgbOZpccG0mMD6bGp6HF/
-AT2IqjYEMWRpPXW7punk0LMitW5DgG6NYiUJOs3pJInXj2I0DVHoJcqED/wY
-+tQtlUmcpa/HB34oDOPlpRScqy1BjJSPJzC+KUEWYd9m+Oh1a2tz/Y1ACpyl
-6Y+jCZoetACePxigARjE0Vj11JSCboz9GmKIN3ghDDfYAXAlNBbY0YwDS9Em
-HEqSbUP4hqZHGqMdMO3SJuwfbu8AZ0djV3EU7zhITBsi0jogfpESV4EUwJcJ
-diD4si/50i8YHsJhIA2PcM6SiEU+FQQERiIBSXg/5il9zaXDTaXfUi0REtHK
-RcpzU5eigRiMNXpN0bQoR4AGk38lT0sYCf2Cx6RefTfoZwGpQIn0MhB8I4n8
-FLDd5TE4MJpyyehiUIgEPvMGV0IWcTjoaU4zZmOLGssSMZpITXyMx+Brkrqm
-B3ktA9E3FhEa/LSUH/SkBU6AQEUxCcveBYWRZAn2Lib4J0n5BCeZZENULTlN
-xOPNltXFv45s1UW8EtYlIQHpBOEEP3s+8sGLKUDssgwHAtxldn/QAKUhWbuq
-NaS4QSM7cYO0zg6eHtYpkaqzZyRyz58eSjFJBAsRjlhIYoixJN4giWe2y8Io
-dKQICa8uHtX+jhrnH38AoCm43eitD0EODCoCYU7hh6uCPSAwGF+M9yDsxXaA
-oGHHQEoRCqJ04KIbWOLJICogiNEziiqS2Z3k8QAGJhiDMR3pR2EJSxsCNNaD
-YFuEnFJYBW41gn0mIfP4U8p2CTVkp7SIpSG+a7ONBw++BLvXZt+sP2zViirz
-XE54Xr82DPlMdl2bsbbYekaRBlEQROeJtJgvjp/CyKaE5bJQE9ZjXxhQZX9t
-0zPWLBxDd4CSZ0OXhhSVuyDnZroKibZSVecw8iBfclH7ImFdSYMLZp+U+aou
-TLe2dSB2WRySoiJWZNxRqiDIRxWG7yHwcggBW7goiD8yFAOxsY/qrKQf1cpx
-pLg6v/OCEn1qLVpBjT6CHl1P3gvMPDJEHqQDnqswA/ohH+JxaDgmwVGXfoJu
-OIB8o6eEzBXVCjTzwpH7P6GupISvlAYF0WYty4sYfPEDQvc7diRwv5B6UDam
-kETL9Ez2UauLJNU+qtX0rNsEZFPSelTD/Ckvo8CwX7XZulIUSPRD51HgAydO
-IJN0QepVNLHngTVZ/5agqiGOT7adx7v74BHjxHUG3uiK7kP0mU0mUZwiuQ0P
-ikPKJhhO1dkk6wFTSAGgcVEBVJgpA0W6J+AZjovXIDcUXYA4JcgJIZ+UY2UJ
-aBCKlwRT+RrjRRmBYWmUQRYEDmgH1kbI1WJHgEH0Fuglhm0cyZgC2pRjCs19
-peci4hPGxQGMrq5mzSXxs83WBEm22ePTSfLqizWLFLit+Cy4q1Co1XIJKDzh
-kv3wWMHml9zCebY1dro7ZYyIG2SMciUALqPpweIOzVgqHoUyGGdj2O4OXQxj
-QOhBlfy+HwHdJXOgf6s3ZUA/f0B6J+NjzoYxp0ol8G08xiAZEm3QJTeFmMYe
-9r0aEl+MiRzsKmSJ6OuNghw5FHRxu3eWFMSJ4ltTnACAyNNDQUZ0UHCkYTRz
-FzPhuBuRU5FrlcghllUiVxHG3kjkHikqQFstcIW7gD55cOAJZRWAzdoyKSIm
-GFJEpkB1WmQb3RVGYCnrqizB58dOldASRsAZjNClGiznoTKkkoXKmlZwkJKj
-Nqsyo1acP6jSCyvucICIsc6lDIMod2nrYuFsAAQAvxR5WOl5zlf0BTNsxZs2
-toNBYXzF0sQfFllKXau/YEzArmAdE+MONw+eCv5Z9gcqQXwU3wQfKe3iyxkp
-4TQnvSInAQMm/wovh5whDMGOyQElLwGkIq0scgq7a4v2SHCJvicpqmZjkvRl
-2KtUFnnfhh5XUBc1DWqTT+YzVZssVAqTY7oodS/SeLnE++FbgIH/eZxQlSqu
-Fnmk2pdMwM+V+X9UzqzIH3Fb6CLx6LrWrELyBorm5A6g0R3zIY0zXscsAHHB
-AgXmCf5KXLllKwaYKn4ss1O26KeNszNSv53AhSjFOcG1yTjGWvsuwKXTiSyu
-b48xELYs8RfmGvN8WcYs1GD5NUqoLC/Kk84kAuMkUqjEKpK9S3e72AijHEy8
-Qj6kVT9t0SZunOpVKyAb62dxzMP+tG7Rqs4AXS4Ey12ZWQImWSgXdYB9bJSF
-XgwYjv0gADDQVXudO9/U5vRJ4ZP6qjHbdNbX5fpcf+TiiFii9HHdWodqeS8Q
-b70a8ZCjGKoyFj5Xy+Z1MTDEb/E0p2K+pBeyrkt0RrGx1CKSuNUQuagMaTc3
-1G1FBnyi1vJwHUg+VqjVulTsZqc+KFPqjifA3u1eEgUZlmP1zRn+Ah2MxSx2
-PuIAgOtkxVKyJRb2+pDr8j7dS3xcR+quf/t1y2mtwz/Wam21Wmxn7+S0y2yE
-f3l08BvGJ1F/VGtQGE05LWSTIiPvti4elz7dHLeErRGh1xrWd184jtVsAhpe
-tAV84v0zytE5pwVWYCwh20+tYx4IIfuQGYMma0kzp/pBuEPII7F3nO+JM2bC
-uB0EyuglBZ+f6xtgD/pBVR6XjbiLq5NyxVqKpQ9AkFAjASxXLhkkIhLRVQWI
-S2NQW5ArmHbMh6CiHJUGvPiT7aNtKcDW6ydHL0PwexpH9kK0S97YeseFG7rm
-Hgpx6WijmMg7nfxOY5SOA/A8NG48bYipOTEXxlLilsi5Qkq03mq1ZFKDqDiH
-yVDNgBKzajciIQyXoe4UJw0D4KSrXI8gGJgzm1/0g4YkeK3Am2pnAYnbJOCg
-ZKonGxRjXg9Fv4F1nSpPLgy6NAO49o8zNyyD5uk7coaqerHPA1wgKxUZHLaL
-OSUtfGzpFRzZU8vodR2vKf/8+c//1gD3ggvgLwI3BIVLS83zC7MBM3prXVB/
-E9keIBj2R8rreBhl4S4Npc2oNvFb3ui5CM/Z922gW+qCQZ3gBhvIj8sQjoSA
-PmM+gKcj6FWvOdhRGEwp7ZAPmxBYnSm3yFCfhZaJtWW9QcrKzQy40QDTUYlA
-XWBaZ2chMApim2xcp11OF6Bu0DugGOptIsCMV6C4Xuyeg8W4vHeuv8iVknMM
-5lO9MA8WKWTfsxZaXT+Eb3/947/jFVDtr3/8D5H6x7h0n6QI2s0lXcBS2Ih6
-pxpQ1IEmGKQZEoYhB/+XprHfy8hDCxsmFwjFkG4fbCiFwbhPAYboj0DEjIIE
-LbXgYIrjOJAwjcQI2Smimk+XDTgohCoxg9ExcaLlXLP/mjXOgI6oLjLbAQbC
-tKEfiatwemAvojj3vuCJhgFXEiIcM7I+R6NRwVfFrS0Gc4K5wIwMKL2N6HT7
-2d5x53D7N52d5wdHJ2LZGhHPFzZtTxBz58ShzSWi+moMCIZFEEUUElgMk/CA
-GxNCc+fRidBUs7QrBWTpR9HSIrFkRfbMbzYD3cAkDJqUKsygwSt+3llfOYs+
-Xy1o+Y7Zr8BaKAZiFC81A8k7H4WbjPnh8yzfMAZkds8NzyB/cMNkgMbfePZ9
-xZh2kvV+B3HLljZvYEVVaLclVyduF9tquMV0dL5asZt32lzbhQmp0PbjYlOB
-3xKBmS82Qkg3amQtTemkzUyqglCFyE3G/PB5lm8UR2NNZRtZ8UGVkMKnyE3l
-0xPK8Gt3gG013FI6ri6m9t66ZKWfJBkFFG6YR88fHaMKHGdafmfwz551+rUi
-K2/CjjnTmm9OdUtUkk1J2SxcqBe3Nmb5xrIWeUuKBkX+Z6MnPj7ZrpOfxgAc
-QnlIVHAxVaTfwkcvclS2cNoAqQDabM/bPdl2nvIpwNk1q2welWnMV5qk46dY
-FqI7GZyZRkaUKBOIc2jfrljFp4DPVaFQwjG74mYIlMcrdSuNhhwCp1hml3mR
-meJZjOkgOaH90zh5CKQh93XPaDSAxXRnrMsaHoeMNJDVAIrGcGwfN/pilQST
-YAi0aZXMDacsonGx9CNLMmN/OKKQT8abIl3Sg+D6str3E0zNOE6KPxGjiWSi
-EMaENva9YlZNgdzeb3b2t4+e7HUggUo7ijwdSkCbkL0DZrxDRK9DDJj1Ai4z
-FCKVYI4DkTJIzCSOem4PhqmmCIqVFppljiMXnZ6b9kcdImJb7lLAbcC56OQA
-Fsqsj3NrNRq0dQ3HoEeYbslFc5mP+bg4rpvW2Zo48JELiIONjRxqrU7bUFiB
-0KJfc5jXmxtbb+TQKo4sg2xtbhRAIFNUmvGEpy+ynm22xjFHHRWYGrsOV8tZ
-WSHnzEviYpVN9WXggoQpTrE+0+WoU+z0hnmw9qBYtwVTnk8XDHkd43IDHm27
-heWKNtM1kVfbz57tnXaO9072jv9xr/Pq4HR/93j7VZ2MoY3JqV2I7snKYEaA
-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
+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
+J5Qtjh9op3jSsP4XWH0PNJSKAAA=
-->