Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize | 4561095 | 316 days ago | IN | 0 ETH | 0.00000938 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 4561091 | 316 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SpotEngine
Compiler Version
v0.8.13+commit.abaa5c0e
ZkSolc Version
v1.5.8
Optimization Enabled:
Yes with Mode 3
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "./common/Constants.sol";
import "./common/Errors.sol";
import "./interfaces/engine/ISpotEngine.sol";
import "./interfaces/clearinghouse/IClearinghouse.sol";
import "./libraries/MathHelper.sol";
import "./libraries/MathSD21x18.sol";
import "./libraries/RiskHelper.sol";
import "./BaseEngine.sol";
import "./SpotEngineState.sol";
import "./SpotEngineLP.sol";
contract SpotEngine is SpotEngineLP {
using MathSD21x18 for int128;
function initialize(
address _clearinghouse,
address _offchainExchange,
address _quote,
address _endpoint,
address _admin
) external {
_initialize(_clearinghouse, _offchainExchange, _endpoint, _admin);
configs[QUOTE_PRODUCT_ID] = Config({
token: _quote,
interestInflectionUtilX18: 8e17, // .8
interestFloorX18: 1e16, // .01
interestSmallCapX18: 4e16, // .04
interestLargeCapX18: ONE // 1
});
_risk().value[QUOTE_PRODUCT_ID] = RiskHelper.RiskStore({
longWeightInitial: 1e9,
shortWeightInitial: 1e9,
longWeightMaintenance: 1e9,
shortWeightMaintenance: 1e9,
priceX18: ONE
});
states[QUOTE_PRODUCT_ID] = State({
cumulativeDepositsMultiplierX18: ONE,
cumulativeBorrowsMultiplierX18: ONE,
totalDepositsNormalized: 0,
totalBorrowsNormalized: 0
});
productIds.push(QUOTE_PRODUCT_ID);
emit AddProduct(QUOTE_PRODUCT_ID);
}
/**
* View
*/
function getEngineType() external pure returns (EngineType) {
return EngineType.SPOT;
}
function getConfig(uint32 productId) external view returns (Config memory) {
return configs[productId];
}
/**
* Actions
*/
/// @notice adds a new product with default parameters
function addProduct(
uint32 productId,
uint32 quoteId,
address book,
int128 sizeIncrement,
int128 minSize,
int128 lpSpreadX18,
Config calldata config,
RiskHelper.RiskStore calldata riskStore
) public onlyOwner {
require(productId != QUOTE_PRODUCT_ID);
_addProductForId(
productId,
quoteId,
book,
sizeIncrement,
minSize,
lpSpreadX18,
riskStore
);
configs[productId] = config;
states[productId] = State({
cumulativeDepositsMultiplierX18: ONE,
cumulativeBorrowsMultiplierX18: ONE,
totalDepositsNormalized: 0,
totalBorrowsNormalized: 0
});
lpStates[productId] = LpState({
supply: 0,
quote: Balance({amount: 0, lastCumulativeMultiplierX18: ONE}),
base: Balance({amount: 0, lastCumulativeMultiplierX18: ONE})
});
}
function updateProduct(bytes calldata rawTxn) external onlyEndpoint {
UpdateProductTx memory txn = abi.decode(rawTxn, (UpdateProductTx));
RiskHelper.RiskStore memory riskStore = txn.riskStore;
if (txn.productId != QUOTE_PRODUCT_ID) {
require(
riskStore.longWeightInitial <=
riskStore.longWeightMaintenance &&
riskStore.shortWeightInitial >=
riskStore.shortWeightMaintenance &&
configs[txn.productId].token == txn.config.token,
ERR_BAD_PRODUCT_CONFIG
);
RiskHelper.RiskStore memory r = _risk().value[txn.productId];
r.longWeightInitial = riskStore.longWeightInitial;
r.shortWeightInitial = riskStore.shortWeightInitial;
r.longWeightMaintenance = riskStore.longWeightMaintenance;
r.shortWeightMaintenance = riskStore.shortWeightMaintenance;
_risk().value[txn.productId] = r;
_exchange().updateMarket(
txn.productId,
type(uint32).max,
address(0),
txn.sizeIncrement,
txn.minSize,
txn.lpSpreadX18
);
}
configs[txn.productId] = txn.config;
}
function updateQuoteFromInsurance(bytes32 subaccount, int128 insurance)
external
returns (int128)
{
_assertInternal();
State memory state = states[QUOTE_PRODUCT_ID];
BalanceNormalized memory balanceNormalized = balances[QUOTE_PRODUCT_ID][
subaccount
].balance;
int128 balanceAmount = balanceNormalizedToBalance(
state,
balanceNormalized
).amount;
if (balanceAmount < 0) {
int128 topUpAmount = MathHelper.max(
MathHelper.min(insurance, -balanceAmount),
0
);
insurance -= topUpAmount;
_updateBalanceNormalized(state, balanceNormalized, topUpAmount);
}
states[QUOTE_PRODUCT_ID] = state;
balances[QUOTE_PRODUCT_ID][subaccount].balance = balanceNormalized;
return insurance;
}
function updateBalance(
uint32 productId,
bytes32 subaccount,
int128 amountDelta,
int128 quoteDelta
) external {
require(productId != QUOTE_PRODUCT_ID, ERR_INVALID_PRODUCT);
_assertInternal();
State memory state = states[productId];
State memory quoteState = states[QUOTE_PRODUCT_ID];
BalanceNormalized memory balance = balances[productId][subaccount]
.balance;
BalanceNormalized memory quoteBalance = balances[QUOTE_PRODUCT_ID][
subaccount
].balance;
_updateBalanceNormalized(state, balance, amountDelta);
_updateBalanceNormalized(quoteState, quoteBalance, quoteDelta);
balances[productId][subaccount].balance = balance;
balances[QUOTE_PRODUCT_ID][subaccount].balance = quoteBalance;
states[productId] = state;
states[QUOTE_PRODUCT_ID] = quoteState;
_balanceUpdate(productId, subaccount);
_balanceUpdate(QUOTE_PRODUCT_ID, subaccount);
}
function updateBalance(
uint32 productId,
bytes32 subaccount,
int128 amountDelta
) external {
_assertInternal();
State memory state = states[productId];
BalanceNormalized memory balance = balances[productId][subaccount]
.balance;
_updateBalanceNormalized(state, balance, amountDelta);
balances[productId][subaccount].balance = balance;
states[productId] = state;
_balanceUpdate(productId, subaccount);
}
// only check on withdraw -- ensure that users can't withdraw
// funds that are in the Vertex contract but not officially
// 'deposited' into the Vertex system and counted in balances
// (i.e. if a user transfers tokens to the clearinghouse
// without going through the standard deposit)
function assertUtilization(uint32 productId) external view {
(State memory _state, ) = getStateAndBalance(productId, X_ACCOUNT);
int128 totalDeposits = _state.totalDepositsNormalized.mul(
_state.cumulativeDepositsMultiplierX18
);
int128 totalBorrows = _state.totalBorrowsNormalized.mul(
_state.cumulativeBorrowsMultiplierX18
);
require(totalDeposits >= totalBorrows, ERR_MAX_UTILIZATION);
}
function socializeSubaccount(bytes32 subaccount) external {
require(msg.sender == address(_clearinghouse), ERR_UNAUTHORIZED);
uint32[] memory _productIds = getProductIds();
for (uint128 i = 0; i < _productIds.length; ++i) {
uint32 productId = _productIds[i];
State memory state = states[productId];
Balance memory balance = balanceNormalizedToBalance(
state,
balances[productId][subaccount].balance
);
if (balance.amount < 0) {
int128 totalDeposited = state.totalDepositsNormalized.mul(
state.cumulativeDepositsMultiplierX18
);
state.cumulativeDepositsMultiplierX18 = (totalDeposited +
balance.amount).div(state.totalDepositsNormalized);
require(state.cumulativeDepositsMultiplierX18 > 0);
state.totalBorrowsNormalized += balance.amount.div(
state.cumulativeBorrowsMultiplierX18
);
balances[productId][subaccount].balance.amountNormalized = 0;
if (productId == QUOTE_PRODUCT_ID) {
for (uint32 j = 0; j < _productIds.length; ++j) {
uint32 baseProductId = _productIds[j];
if (baseProductId == QUOTE_PRODUCT_ID) {
continue;
}
LpState memory lpState = lpStates[baseProductId];
_updateBalanceWithoutDelta(state, lpState.quote);
lpStates[baseProductId] = lpState;
_productUpdate(baseProductId);
}
} else {
LpState memory lpState = lpStates[productId];
_updateBalanceWithoutDelta(state, lpState.base);
lpStates[productId] = lpState;
}
states[productId] = state;
_balanceUpdate(productId, subaccount);
}
}
}
function manualAssert(
int128[] calldata totalDeposits,
int128[] calldata totalBorrows
) external view {
for (uint128 i = 0; i < totalDeposits.length; ++i) {
uint32 productId = productIds[i];
State memory state = states[productId];
require(
state.totalDepositsNormalized.mul(
state.cumulativeDepositsMultiplierX18
) == totalDeposits[i],
ERR_DSYNC
);
require(
state.totalBorrowsNormalized.mul(
state.cumulativeBorrowsMultiplierX18
) == totalBorrows[i],
ERR_DSYNC
);
}
}
function getToken(uint32 productId) external view returns (address) {
return address(configs[productId].token);
}
}// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; /// @dev Each clearinghouse has a unique quote product uint32 constant QUOTE_PRODUCT_ID = 0; /// @dev Fees account bytes32 constant FEES_ACCOUNT = bytes32(0); bytes32 constant X_ACCOUNT = 0x0000000000000000000000000000000000000000000000000000000000000001; bytes32 constant V_ACCOUNT = 0x0000000000000000000000000000000000000000000000000000000000000002; string constant DEFAULT_REFERRAL_CODE = "-1"; uint128 constant MINIMUM_LIQUIDITY = 10**3; int128 constant ONE = 10**18; uint8 constant MAX_DECIMALS = 18; int128 constant TAKER_SEQUENCER_FEE = 0; // $0.00 int128 constant SLOW_MODE_FEE = 1000000; // $1 int128 constant FAST_WITHDRAWAL_FEE_RATE = 1_000_000_000_000_000; // 0.1% int128 constant LIQUIDATION_FEE = 1e18; // $1 int128 constant HEALTHCHECK_FEE = 1e18; // $1 uint128 constant INT128_MAX = uint128(type(int128).max); uint64 constant SECONDS_PER_DAY = 3600 * 24; uint32 constant VRTX_PRODUCT_ID = 41; int128 constant LIQUIDATION_FEE_FRACTION = 500_000_000_000_000_000; // 50% int128 constant INTEREST_FEE_FRACTION = 200_000_000_000_000_000; // 20% int256 constant MIN_DEPOSIT_AMOUNT = 5 * ONE; uint32 constant MAX_ISOLATED_SUBACCOUNTS_PER_ADDRESS = 10; uint32 constant VLP_PRODUCT_ID = 153;
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "./interfaces/engine/ISpotEngine.sol";
import "./libraries/Logger.sol";
import "./BaseEngine.sol";
abstract contract SpotEngineState is ISpotEngine, BaseEngine {
using MathSD21x18 for int128;
mapping(uint32 => Config) internal configs;
mapping(uint32 => State) internal states;
mapping(uint32 => mapping(bytes32 => Balances)) internal balances;
mapping(uint32 => LpState) internal lpStates;
mapping(uint32 => int128) internal withdrawFees;
uint64 public migrationFlag; // deprecated
mapping(uint32 => int128) internal minDepositRatesX18;
function _updateBalanceWithoutDelta(
State memory state,
Balance memory balance
) internal pure {
if (balance.amount == 0) {
balance.lastCumulativeMultiplierX18 = state
.cumulativeDepositsMultiplierX18;
return;
}
// Current cumulative multiplier associated with product
int128 cumulativeMultiplierX18;
if (balance.amount > 0) {
cumulativeMultiplierX18 = state.cumulativeDepositsMultiplierX18;
} else {
cumulativeMultiplierX18 = state.cumulativeBorrowsMultiplierX18;
}
if (balance.lastCumulativeMultiplierX18 == cumulativeMultiplierX18) {
return;
}
balance.amount = balance.amount.mul(cumulativeMultiplierX18).div(
balance.lastCumulativeMultiplierX18
);
balance.lastCumulativeMultiplierX18 = cumulativeMultiplierX18;
}
function _updateBalance(
State memory state,
Balance memory balance,
int128 balanceDelta
) internal pure {
if (balance.amount == 0 && balance.lastCumulativeMultiplierX18 == 0) {
balance.lastCumulativeMultiplierX18 = ONE;
}
if (balance.amount > 0) {
state.totalDepositsNormalized -= balance.amount.div(
balance.lastCumulativeMultiplierX18
);
} else {
state.totalBorrowsNormalized += balance.amount.div(
balance.lastCumulativeMultiplierX18
);
}
// Current cumulative multiplier associated with product
int128 cumulativeMultiplierX18;
if (balance.amount > 0) {
cumulativeMultiplierX18 = state.cumulativeDepositsMultiplierX18;
} else {
cumulativeMultiplierX18 = state.cumulativeBorrowsMultiplierX18;
}
// Apply balance delta and interest rate
balance.amount =
balance.amount.mul(
cumulativeMultiplierX18.div(balance.lastCumulativeMultiplierX18)
) +
balanceDelta;
if (balance.amount > 0) {
cumulativeMultiplierX18 = state.cumulativeDepositsMultiplierX18;
} else {
cumulativeMultiplierX18 = state.cumulativeBorrowsMultiplierX18;
}
balance.lastCumulativeMultiplierX18 = cumulativeMultiplierX18;
// Update the product given balanceDelta
if (balance.amount > 0) {
state.totalDepositsNormalized += balance.amount.div(
balance.lastCumulativeMultiplierX18
);
} else {
state.totalBorrowsNormalized -= balance.amount.div(
balance.lastCumulativeMultiplierX18
);
}
}
function _updateBalanceNormalizedNoTotals(
State memory state,
BalanceNormalized memory balance,
int128 balanceDelta
) internal pure {
// dont count X balances in total deposits / borrows
// Current cumulative multiplier associated with product
int128 cumulativeMultiplierX18;
if (balance.amountNormalized > 0) {
cumulativeMultiplierX18 = state.cumulativeDepositsMultiplierX18;
} else {
cumulativeMultiplierX18 = state.cumulativeBorrowsMultiplierX18;
}
int128 newAmount = balance.amountNormalized.mul(
cumulativeMultiplierX18
) + balanceDelta;
if (newAmount > 0) {
cumulativeMultiplierX18 = state.cumulativeDepositsMultiplierX18;
} else {
cumulativeMultiplierX18 = state.cumulativeBorrowsMultiplierX18;
}
balance.amountNormalized = newAmount.div(cumulativeMultiplierX18);
}
function _updateBalanceNormalized(
State memory state,
BalanceNormalized memory balance,
int128 balanceDelta
) internal pure {
if (balance.amountNormalized > 0) {
state.totalDepositsNormalized -= balance.amountNormalized;
} else {
state.totalBorrowsNormalized += balance.amountNormalized;
}
_updateBalanceNormalizedNoTotals(state, balance, balanceDelta);
// Update the product given balanceDelta
if (balance.amountNormalized > 0) {
state.totalDepositsNormalized += balance.amountNormalized;
} else {
state.totalBorrowsNormalized -= balance.amountNormalized;
}
}
function _updateState(
uint32 productId,
State memory state,
uint128 dt
) internal {
int128 borrowRateMultiplierX18;
int128 totalDeposits = state.totalDepositsNormalized.mul(
state.cumulativeDepositsMultiplierX18
);
int128 totalBorrows = state.totalBorrowsNormalized.mul(
state.cumulativeBorrowsMultiplierX18
);
int128 utilizationRatioX18 = totalBorrows.div(totalDeposits);
{
Config memory config = configs[productId];
// annualized borrower rate
int128 borrowerRateX18 = config.interestFloorX18;
if (utilizationRatioX18 == 0) {
// setting borrowerRateX18 to 0 here has the property that
// adding a product at the beginning of time and not using it until time T
// results in the same state as adding the product at time T
borrowerRateX18 = 0;
} else if (utilizationRatioX18 < config.interestInflectionUtilX18) {
borrowerRateX18 += config
.interestSmallCapX18
.mul(utilizationRatioX18)
.div(config.interestInflectionUtilX18);
} else {
borrowerRateX18 +=
config.interestSmallCapX18 +
config.interestLargeCapX18.mul(
(
(utilizationRatioX18 -
config.interestInflectionUtilX18).div(
ONE - config.interestInflectionUtilX18
)
)
);
}
// convert to per second
borrowerRateX18 = borrowerRateX18.div(
MathSD21x18.fromInt(31536000)
);
borrowRateMultiplierX18 = (ONE + borrowerRateX18).pow(int128(dt));
}
// if we don't take fees into account, the liquidity, which is
// (deposits - borrows) should remain the same after updating state.
// For simplicity, we use `tb`, `cbm`, `td`, and `cdm` for
// `totalBorrowsNormalized`, `cumulativeBorrowsMultiplier`,
// `totalDepositsNormalized`, and `cumulativeDepositsMultiplier`
// before the updating, the liquidity is (td * cdm - tb * cbm)
// after the updating, the liquidity is
// (td * cdm * depositRateMultiplier - tb * cbm * borrowRateMultiplier)
// so we can get
// depositRateMultiplier = utilization * (borrowRateMultiplier - 1) + 1
int128 totalDepositRateX18 = utilizationRatioX18.mul(
borrowRateMultiplierX18 - ONE
);
// deduct protocol fees
int128 realizedDepositRateX18 = totalDepositRateX18.mul(
ONE - INTEREST_FEE_FRACTION
);
// pass fees balance change
int128 feesAmt = totalDeposits.mul(
totalDepositRateX18 - realizedDepositRateX18
);
state.cumulativeBorrowsMultiplierX18 = state
.cumulativeBorrowsMultiplierX18
.mul(borrowRateMultiplierX18);
int128 depositRateMultiplierX18 = ONE + realizedDepositRateX18;
state.cumulativeDepositsMultiplierX18 = state
.cumulativeDepositsMultiplierX18
.mul(depositRateMultiplierX18);
if (feesAmt != 0) {
BalanceNormalized memory feesAccBalance = balances[productId][
FEES_ACCOUNT
].balance;
_updateBalanceNormalized(state, feesAccBalance, feesAmt);
balances[productId][FEES_ACCOUNT].balance = feesAccBalance;
_balanceUpdate(productId, FEES_ACCOUNT);
}
// apply the min deposit rate
if (minDepositRatesX18[productId] != 0) {
int128 minDepositRatePerSecondX18 = minDepositRatesX18[productId]
.div(MathSD21x18.fromInt(31536000));
int128 minDepositRateMultiplierX18 = (ONE +
minDepositRatePerSecondX18).pow(int128(dt));
state.cumulativeBorrowsMultiplierX18 = state
.cumulativeBorrowsMultiplierX18
.mul(minDepositRateMultiplierX18);
state.cumulativeDepositsMultiplierX18 = state
.cumulativeDepositsMultiplierX18
.mul(minDepositRateMultiplierX18);
depositRateMultiplierX18 = depositRateMultiplierX18.mul(
minDepositRateMultiplierX18
);
borrowRateMultiplierX18 = borrowRateMultiplierX18.mul(
minDepositRateMultiplierX18
);
}
emit InterestPayment(
productId,
dt,
depositRateMultiplierX18,
borrowRateMultiplierX18,
feesAmt
);
}
function balanceNormalizedToBalance(
State memory state,
BalanceNormalized memory balance
) internal pure returns (Balance memory) {
int128 cumulativeMultiplierX18;
if (balance.amountNormalized > 0) {
cumulativeMultiplierX18 = state.cumulativeDepositsMultiplierX18;
} else {
cumulativeMultiplierX18 = state.cumulativeBorrowsMultiplierX18;
}
return
Balance(
balance.amountNormalized.mul(cumulativeMultiplierX18),
cumulativeMultiplierX18
);
}
function _balanceUpdate(uint32 productId, bytes32 subaccount)
internal
virtual
override
{
Balance memory balance = getBalance(productId, subaccount);
emit SpotBalance(
subaccount,
productId,
balance.amount,
balance.lastCumulativeMultiplierX18
);
}
// TODO: maybe combine the next two functions
// probably also need some protection where quote state must
// be fetched through getQuoteState
function getStateAndBalance(uint32 productId, bytes32 subaccount)
public
view
returns (State memory, Balance memory)
{
State memory state = states[productId];
BalanceNormalized memory balance = balances[productId][subaccount]
.balance;
return (state, balanceNormalizedToBalance(state, balance));
}
function getBalance(uint32 productId, bytes32 subaccount)
public
view
returns (Balance memory)
{
State memory state = states[productId];
BalanceNormalized memory balance = balances[productId][subaccount]
.balance;
return balanceNormalizedToBalance(state, balance);
}
function _getBalance(uint32 productId, bytes32 subaccount)
internal
view
override
returns (int128, int128)
{
return (getBalance(productId, subaccount).amount, 0);
}
function _getInLpBalance(uint32 productId, bytes32 subaccount)
internal
view
virtual
override
returns (
// baseAmount, quoteAmount, deltaQuoteAmount (funding)
int128,
int128,
int128
)
{
LpBalance memory lpBalance = balances[productId][subaccount].lpBalance;
if (lpBalance.amount == 0) {
return (0, 0, 0);
}
LpState memory lpState = lpStates[productId];
int128 ratio = lpBalance.amount.div(lpState.supply);
int128 baseAmount = lpState.base.amount.mul(ratio);
int128 quoteAmount = lpState.quote.amount.mul(ratio);
return (baseAmount, quoteAmount, 0);
}
function getStatesAndBalances(uint32 productId, bytes32 subaccount)
external
view
returns (
LpState memory,
LpBalance memory,
State memory,
Balance memory
)
{
LpState memory lpState = lpStates[productId];
State memory state = states[productId];
Balances memory bal = balances[productId][subaccount];
LpBalance memory lpBalance = bal.lpBalance;
BalanceNormalized memory balance = bal.balance;
return (
lpState,
lpBalance,
state,
balanceNormalizedToBalance(state, balance)
);
}
function updateStates(uint128 dt) external onlyEndpoint {
State memory quoteState;
require(dt < 7 * SECONDS_PER_DAY, ERR_INVALID_TIME);
for (uint32 i = 0; i < productIds.length; i++) {
uint32 productId = productIds[i];
if (productId == VLP_PRODUCT_ID) {
continue;
}
State memory state = states[productId];
if (productId == QUOTE_PRODUCT_ID) {
quoteState = state;
}
if (state.totalDepositsNormalized == 0) {
continue;
}
LpState memory lpState = lpStates[productId];
_updateState(productId, state, dt);
_updateBalanceWithoutDelta(state, lpState.base);
_updateBalanceWithoutDelta(quoteState, lpState.quote);
lpStates[productId] = lpState;
states[productId] = state;
_productUpdate(productId);
}
}
function updateMinDepositRate(uint32 productId, int128 minDepositRateX18)
external
{
require(msg.sender == address(_clearinghouse), ERR_UNAUTHORIZED);
// deposit rate can't be larger than 100% so that when the rate is incorrectly
// set, we still can rescue it without having too much damage.
require(
minDepositRateX18 >= 0 && minDepositRateX18 <= ONE,
ERR_BAD_PRODUCT_CONFIG
);
minDepositRatesX18[productId] = minDepositRateX18;
}
function getMinDepositRate(uint32 productId)
external
view
returns (int128)
{
return minDepositRatesX18[productId];
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "prb-math/contracts/PRBMathSD59x18.sol";
library MathSD21x18 {
using PRBMathSD59x18 for int256;
int128 private constant ONE_X18 = 1000000000000000000;
int128 private constant MIN_X18 = -0x80000000000000000000000000000000;
int128 private constant MAX_X18 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
string private constant ERR_OVERFLOW = "OF";
string private constant ERR_DIV_BY_ZERO = "DBZ";
function fromInt(int128 x) internal pure returns (int128) {
unchecked {
int256 result = int256(x) * ONE_X18;
require(result >= MIN_X18 && result <= MAX_X18, ERR_OVERFLOW);
return int128(result);
}
}
function mulDiv(
int128 x,
int128 y,
int128 z
) internal pure returns (int128) {
unchecked {
require(z != 0, ERR_DIV_BY_ZERO);
int256 result = (int256(x) * y) / z;
require(result >= MIN_X18 && result <= MAX_X18, ERR_OVERFLOW);
return int128(result);
}
}
function toInt(int128 x) internal pure returns (int128) {
unchecked {
return int128(x / ONE_X18);
}
}
function add(int128 x, int128 y) internal pure returns (int128) {
unchecked {
int256 result = int256(x) + y;
require(result >= MIN_X18 && result <= MAX_X18, ERR_OVERFLOW);
return int128(result);
}
}
function sub(int128 x, int128 y) internal pure returns (int128) {
unchecked {
int256 result = int256(x) - y;
require(result >= MIN_X18 && result <= MAX_X18, ERR_OVERFLOW);
return int128(result);
}
}
function mul(int128 x, int128 y) internal pure returns (int128) {
unchecked {
int256 result = (int256(x) * y) / ONE_X18;
require(result >= MIN_X18 && result <= MAX_X18, ERR_OVERFLOW);
return int128(result);
}
}
function div(int128 x, int128 y) internal pure returns (int128) {
unchecked {
require(y != 0, ERR_DIV_BY_ZERO);
int256 result = (int256(x) * ONE_X18) / y;
require(result >= MIN_X18 && result <= MAX_X18, ERR_OVERFLOW);
return int128(result);
}
}
function abs(int128 x) internal pure returns (int128) {
unchecked {
require(x != MIN_X18, ERR_OVERFLOW);
return x < 0 ? -x : x;
}
}
function sqrt(int128 x) internal pure returns (int128) {
unchecked {
int256 result = int256(x).sqrt();
require(result >= MIN_X18 && result <= MAX_X18, ERR_OVERFLOW);
return int128(result);
}
}
// note that y is not X18
function pow(int128 x, int128 y) internal pure returns (int128) {
unchecked {
require(y >= 0, ERR_OVERFLOW);
int128 result = ONE_X18;
for (int128 i = 1; i <= y; i *= 2) {
if (i & y != 0) {
result = mul(result, x);
}
x = mul(x, x);
}
return result;
}
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "./MathSD21x18.sol";
import "../interfaces/engine/IProductEngine.sol";
import "../common/Constants.sol";
import "../common/Errors.sol";
import "./MathHelper.sol";
/// @title RiskHelper
/// @dev Provides basic math functions
library RiskHelper {
using MathSD21x18 for int128;
struct RiskStore {
// these weights are all
// between 0 and 2
// these integers are the real
// weights times 1e9
int32 longWeightInitial;
int32 shortWeightInitial;
int32 longWeightMaintenance;
int32 shortWeightMaintenance;
int128 priceX18;
}
struct Risk {
int128 longWeightInitialX18;
int128 shortWeightInitialX18;
int128 longWeightMaintenanceX18;
int128 shortWeightMaintenanceX18;
int128 priceX18;
}
function _getSpreadHealthRebateAmount(
Risk memory perpRisk,
int128 basisAmount,
int128 priceSumX18,
IProductEngine.HealthType healthType
) internal pure returns (int128) {
// 5x more leverage than the standard perp
// by refunding 4/5 of the health penalty
int128 rebateRateX18 = ((ONE - _getWeightX18(perpRisk, 1, healthType)) *
4) / 5;
return rebateRateX18.mul(priceSumX18).mul(basisAmount);
}
function _getLpRawValue(
int128 baseAmount,
int128 quoteAmount,
int128 priceX18
) internal pure returns (int128) {
// naive way: value an LP token by value of the raw components 2 * arithmetic mean of base value and quote value
// price manipulation proof way: use the geometric mean
return
2 *
int128(
MathHelper.sqrt256(
int256(baseAmount.mul(priceX18)) * quoteAmount
)
);
}
function _getWeightX18(
Risk memory risk,
int128 amount,
IProductEngine.HealthType healthType
) internal pure returns (int128) {
// (1 + imf * sqrt(amount))
if (healthType == IProductEngine.HealthType.PNL) {
return ONE;
}
int128 weight;
if (amount >= 0) {
weight = healthType == IProductEngine.HealthType.INITIAL
? risk.longWeightInitialX18
: risk.longWeightMaintenanceX18;
} else {
weight = healthType == IProductEngine.HealthType.INITIAL
? risk.shortWeightInitialX18
: risk.shortWeightMaintenanceX18;
}
return weight;
}
function isIsolatedSubaccount(bytes32 subaccount)
internal
pure
returns (bool)
{
return uint256(subaccount) & 0xFFFFFF == 6910831;
}
function getIsolatedProductId(bytes32 subaccount)
internal
pure
returns (uint32)
{
if (!isIsolatedSubaccount(subaccount)) {
return 0;
}
return uint32((uint256(subaccount) >> 32) & 0xFFFF);
}
function getIsolatedId(bytes32 subaccount) internal pure returns (uint8) {
if (!isIsolatedSubaccount(subaccount)) {
return 0;
}
return uint8((uint256(subaccount) >> 24) & 0xFF);
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "hardhat/console.sol";
import "./common/Constants.sol";
import "./common/Errors.sol";
import "./libraries/MathHelper.sol";
import "./libraries/MathSD21x18.sol";
import "./interfaces/clearinghouse/IClearinghouse.sol";
import "./interfaces/engine/IProductEngine.sol";
import "./interfaces/IOffchainExchange.sol";
import "./interfaces/IEndpoint.sol";
import "./EndpointGated.sol";
import "./libraries/Logger.sol";
abstract contract BaseEngine is IProductEngine, EndpointGated {
using MathSD21x18 for int128;
IClearinghouse internal _clearinghouse;
address internal _fees; // deprecated
uint32[] internal productIds;
mapping(uint32 => address) internal markets; // deprecated
// Whether an address can apply deltas - all orderbooks and clearinghouse is whitelisted
mapping(address => bool) internal canApplyDeltas;
bytes32 internal constant RISK_STORAGE = keccak256("vertex.protocol.risk");
event BalanceUpdate(uint32 productId, bytes32 subaccount);
event ProductUpdate(uint32 productId);
function _productUpdate(uint32 productId) internal virtual {}
struct Uint256Slot {
uint256 value;
}
struct RiskStoreMappingSlot {
mapping(uint32 => RiskHelper.RiskStore) value;
}
function _risk() internal pure returns (RiskStoreMappingSlot storage r) {
bytes32 slot = RISK_STORAGE;
assembly {
r.slot := slot
}
}
function _risk(uint32 productId, RiskStoreMappingSlot storage rmap)
internal
view
returns (RiskHelper.Risk memory r)
{
RiskHelper.RiskStore memory s = rmap.value[productId];
r.longWeightInitialX18 = int128(s.longWeightInitial) * 1e9;
r.shortWeightInitialX18 = int128(s.shortWeightInitial) * 1e9;
r.longWeightMaintenanceX18 = int128(s.longWeightMaintenance) * 1e9;
r.shortWeightMaintenanceX18 = int128(s.shortWeightMaintenance) * 1e9;
r.priceX18 = s.priceX18;
}
function _risk(uint32 productId)
internal
view
returns (RiskHelper.Risk memory)
{
return _risk(productId, _risk());
}
function getRisk(uint32 productId)
external
view
returns (RiskHelper.Risk memory)
{
return _risk(productId);
}
function _getInLpBalance(uint32 productId, bytes32 subaccount)
internal
view
virtual
returns (
// baseAmount, quoteAmount, quoteDeltaAmount (funding)
int128,
int128,
int128
);
function _getBalance(uint32 productId, bytes32 subaccount)
internal
view
virtual
returns (int128, int128);
function getHealthContribution(
bytes32 subaccount,
IProductEngine.HealthType healthType
) public view returns (int128 health) {
uint32[] memory _productIds = getProductIds();
RiskStoreMappingSlot storage r = _risk();
for (uint32 i = 0; i < _productIds.length; i++) {
uint32 productId = _productIds[i];
RiskHelper.Risk memory risk = _risk(productId, r);
{
(int128 amount, int128 quoteAmount) = _getBalance(
productId,
subaccount
);
int128 weight = RiskHelper._getWeightX18(
risk,
amount,
healthType
);
health += quoteAmount;
if (amount != 0) {
// anything with a short weight of 2 is a spot that
// should not count towards health and exists out of the risk system
// if we're getting a weight of 2 it means this is attempting to short
// the spot, so we should error out
if (weight == 2 * ONE) {
return type(int128).min;
}
health += amount.mul(weight).mul(risk.priceX18);
}
}
{
(
int128 baseAmount,
int128 quoteAmount,
int128 quoteDeltaAmount
) = _getInLpBalance(productId, subaccount);
if (baseAmount != 0) {
int128 lpValue = RiskHelper._getLpRawValue(
baseAmount,
quoteAmount,
risk.priceX18
);
health +=
lpValue.mul(
RiskHelper._getWeightX18(risk, 1, healthType)
) +
quoteDeltaAmount;
}
}
}
}
function getCoreRisk(
bytes32 subaccount,
uint32 productId,
IProductEngine.HealthType healthType
) external view returns (IProductEngine.CoreRisk memory) {
RiskHelper.Risk memory risk = _risk(productId);
(int128 amount, ) = _getBalance(productId, subaccount);
return
IProductEngine.CoreRisk(
amount,
risk.priceX18,
RiskHelper._getWeightX18(risk, 1, healthType)
);
}
function _balanceUpdate(uint32 productId, bytes32 subaccount)
internal
virtual
{}
function _assertInternal() internal view virtual {
require(canApplyDeltas[msg.sender], ERR_UNAUTHORIZED);
}
function _initialize(
address _clearinghouseAddr,
address _offchainExchangeAddr,
address _endpointAddr,
address _admin
) internal initializer {
__Ownable_init();
setEndpoint(_endpointAddr);
transferOwnership(_admin);
_clearinghouse = IClearinghouse(_clearinghouseAddr);
canApplyDeltas[_endpointAddr] = true;
canApplyDeltas[_clearinghouseAddr] = true;
canApplyDeltas[_offchainExchangeAddr] = true;
}
function getClearinghouse() external view returns (address) {
return address(_clearinghouse);
}
function getProductIds() public view returns (uint32[] memory) {
return productIds;
}
function _addProductForId(
uint32 productId,
uint32 quoteId,
address virtualBook,
int128 sizeIncrement,
int128 minSize,
int128 lpSpreadX18,
RiskHelper.RiskStore memory riskStore
) internal {
require(virtualBook != address(0));
require(
riskStore.longWeightInitial <= riskStore.longWeightMaintenance &&
riskStore.longWeightMaintenance <= 10**9 &&
riskStore.shortWeightInitial >=
riskStore.shortWeightMaintenance &&
riskStore.shortWeightMaintenance >= 10**9,
ERR_BAD_PRODUCT_CONFIG
);
_risk().value[productId] = riskStore;
// register product with clearinghouse
_clearinghouse.registerProduct(productId);
productIds.push(productId);
// product ids are in ascending order
for (uint256 i = productIds.length - 1; i > 0; i--) {
if (productIds[i] < productIds[i - 1]) {
uint32 t = productIds[i];
productIds[i] = productIds[i - 1];
productIds[i - 1] = t;
} else {
break;
}
}
_exchange().updateMarket(
productId,
quoteId,
virtualBook,
sizeIncrement,
minSize,
lpSpreadX18
);
emit AddProduct(productId);
}
function _exchange() internal view returns (IOffchainExchange) {
return
IOffchainExchange(IEndpoint(getEndpoint()).getOffchainExchange());
}
function updatePrice(uint32 productId, int128 priceX18) external {
require(msg.sender == address(_clearinghouse), ERR_UNAUTHORIZED);
_risk().value[productId].priceX18 = priceX18;
}
function updateRisk(uint32 productId, RiskHelper.RiskStore memory riskStore)
external
onlyOwner
{
require(
riskStore.longWeightInitial <= riskStore.longWeightMaintenance &&
riskStore.shortWeightInitial >=
riskStore.shortWeightMaintenance,
ERR_BAD_PRODUCT_CONFIG
);
_risk().value[productId] = riskStore;
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "./MathSD21x18.sol";
/// @title MathHelper
/// @dev Provides basic math functions
library MathHelper {
using MathSD21x18 for int128;
/// @notice Returns market id for two given product ids
function max(int128 a, int128 b) internal pure returns (int128) {
return a > b ? a : b;
}
function min(int128 a, int128 b) internal pure returns (int128) {
return a < b ? a : b;
}
function abs(int128 val) internal pure returns (int128) {
return val < 0 ? -val : val;
}
// babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(int128 y) internal pure returns (int128 z) {
require(y >= 0, "ds-math-sqrt-non-positive");
if (y > 3) {
z = y;
int128 x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
function sqrt256(int256 y) internal pure returns (int256 z) {
require(y >= 0, "ds-math-sqrt-non-positive");
if (y > 3) {
z = y;
int256 x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
function int2str(int128 value) internal pure returns (string memory) {
if (value == 0) {
return "0";
}
bool negative = value < 0;
uint128 absval = uint128(negative ? -value : value);
string memory out = uint2str(absval);
if (negative) {
out = string.concat("-", out);
}
return out;
}
function uint2str(uint128 value) internal pure returns (string memory) {
if (value == 0) {
return "0";
}
uint128 temp = value;
uint128 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint128(value % 10)));
value /= 10;
}
return string(buffer);
}
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.1.0/contracts/math/SignedSafeMath.sol#L86
function add(int128 x, int128 y) internal pure returns (int128) {
int128 z = x + y;
require((y >= 0 && z >= x) || (y < 0 && z < x), "ds-math-add-overflow");
return z;
}
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.1.0/contracts/math/SignedSafeMath.sol#L69
function sub(int128 x, int128 y) internal pure returns (int128) {
int128 z = x - y;
require(
(y >= 0 && z <= x) || (y < 0 && z > x),
"ds-math-sub-underflow"
);
return z;
}
function mul(int128 x, int128 y) internal pure returns (int128 z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
function floor(int128 x, int128 y) internal pure returns (int128 z) {
require(y > 0, "ds-math-floor-neg-mod");
int128 r = x % y;
if (r == 0) {
z = x;
} else {
z = (x >= 0 ? x - r : x - r - y);
}
}
function ceil(int128 x, int128 y) internal pure returns (int128 z) {
require(y > 0, "ds-math-ceil-neg-mod");
int128 r = x % y;
if (r == 0) {
z = x;
} else {
z = (x >= 0 ? x + y - r : x - r);
}
}
// we don't need to floor base with sizeIncrement in this function
// because this function is only used by `view` functions, which means
// the returned values will not be written into storage.
function ammEquilibrium(
int128 base,
int128 quote,
int128 priceX18
) internal pure returns (int128, int128) {
if (base == 0 || quote == 0) {
return (0, 0);
}
int256 k = int256(base) * quote;
// base * price * base == k
// base = sqrt(k / price);
base = int128(MathHelper.sqrt256((k * 1e18) / priceX18));
quote = (base == 0) ? int128(0) : int128(k / base);
return (base, quote);
}
function isSwapValid(
int128 baseDelta,
int128 quoteDelta,
int128 base,
int128 quote
) internal pure returns (bool) {
if (
base == 0 ||
quote == 0 ||
base + baseDelta <= 0 ||
quote + quoteDelta <= 0
) {
return false;
}
int256 kPrev = int256(base) * quote;
int256 kNew = int256(base + baseDelta) * (quote + quoteDelta);
return kNew > kPrev;
}
function swap(
int128 amountSwap,
int128 base,
int128 quote,
int128 priceX18,
int128 sizeIncrement,
int128 lpSpreadX18
) internal pure returns (int128, int128) {
// (amountSwap % sizeIncrement) is guaranteed to be 0
if (base == 0 || quote == 0) {
return (0, 0);
}
int128 currentPriceX18 = quote.div(base);
int128 keepRateX18 = 1e18 - lpSpreadX18;
// selling
if (amountSwap > 0) {
priceX18 = priceX18.div(keepRateX18);
if (priceX18 >= currentPriceX18) {
return (0, 0);
}
} else {
priceX18 = priceX18.mul(keepRateX18);
if (priceX18 <= currentPriceX18) {
return (0, 0);
}
}
int256 k = int256(base) * quote;
int128 baseAtPrice = int128(
(MathHelper.sqrt256(k) * 1e9) / MathHelper.sqrt(priceX18)
);
// base -> base + amountSwap
int128 baseSwapped;
if (
(amountSwap > 0 && base + amountSwap > baseAtPrice) ||
(amountSwap < 0 && base + amountSwap < baseAtPrice)
) {
// we hit price limits before we exhaust amountSwap
if (baseAtPrice >= base) {
baseSwapped = MathHelper.floor(
baseAtPrice - base,
sizeIncrement
);
} else {
baseSwapped = MathHelper.ceil(
baseAtPrice - base,
sizeIncrement
);
}
} else {
// just swap it all
// amountSwap is already guaranteed to adhere to sizeIncrement
baseSwapped = amountSwap;
}
int128 quoteSwapped = int128(k / (base + baseSwapped) - quote);
if (amountSwap > 0) {
quoteSwapped = quoteSwapped.mul(keepRateX18);
} else {
quoteSwapped = quoteSwapped.div(keepRateX18);
}
return (baseSwapped, quoteSwapped);
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "./SpotEngineState.sol";
import "./libraries/Logger.sol";
abstract contract SpotEngineLP is SpotEngineState {
using MathSD21x18 for int128;
function mintLp(
uint32 productId,
bytes32 subaccount,
int128 amountBase,
int128 quoteAmountLow,
int128 quoteAmountHigh
) external {
_assertInternal();
require(
amountBase > 0 && quoteAmountLow > 0 && quoteAmountHigh > 0,
ERR_INVALID_LP_AMOUNT
);
require(
_exchange().getMarketInfo(productId).quoteId == QUOTE_PRODUCT_ID,
ERR_INVALID_PRODUCT
);
LpState memory lpState = lpStates[productId];
State memory base = states[productId];
State memory quote = states[QUOTE_PRODUCT_ID];
int128 amountQuote = (lpState.base.amount == 0)
? amountBase.mul(_risk(productId).priceX18)
: amountBase.mul(lpState.quote.amount.div(lpState.base.amount));
require(amountQuote >= quoteAmountLow, ERR_SLIPPAGE_TOO_HIGH);
require(amountQuote <= quoteAmountHigh, ERR_SLIPPAGE_TOO_HIGH);
int128 toMint;
if (lpState.supply == 0) {
toMint = amountBase + amountQuote;
} else {
toMint = amountBase.div(lpState.base.amount).mul(lpState.supply);
}
_updateBalance(base, lpState.base, amountBase);
_updateBalance(quote, lpState.quote, amountQuote);
lpState.supply += toMint;
balances[productId][subaccount].lpBalance.amount += toMint;
lpStates[productId] = lpState;
BalanceNormalized memory baseBalance = balances[productId][subaccount]
.balance;
BalanceNormalized memory quoteBalance = balances[QUOTE_PRODUCT_ID][
subaccount
].balance;
_updateBalanceNormalized(base, baseBalance, -amountBase);
_updateBalanceNormalized(quote, quoteBalance, -amountQuote);
balances[productId][subaccount].balance = baseBalance;
balances[QUOTE_PRODUCT_ID][subaccount].balance = quoteBalance;
states[productId] = base;
states[QUOTE_PRODUCT_ID] = quote;
_balanceUpdate(productId, subaccount);
_balanceUpdate(QUOTE_PRODUCT_ID, subaccount);
}
function burnLp(
uint32 productId,
bytes32 subaccount,
int128 amountLp
) public returns (int128 amountBase, int128 amountQuote) {
_assertInternal();
require(amountLp > 0, ERR_INVALID_LP_AMOUNT);
LpState memory lpState = lpStates[productId];
LpBalance memory lpBalance = balances[productId][subaccount].lpBalance;
State memory base = states[productId];
State memory quote = states[QUOTE_PRODUCT_ID];
if (amountLp == type(int128).max) {
amountLp = lpBalance.amount;
}
if (amountLp == 0) {
return (0, 0);
}
require(lpBalance.amount >= amountLp, ERR_INSUFFICIENT_LP);
lpBalance.amount -= amountLp;
amountBase = int128(
(int256(amountLp) * lpState.base.amount) / lpState.supply
);
amountQuote = int128(
(int256(amountLp) * lpState.quote.amount) / lpState.supply
);
_updateBalance(base, lpState.base, -amountBase);
_updateBalance(quote, lpState.quote, -amountQuote);
lpState.supply -= amountLp;
lpStates[productId] = lpState;
balances[productId][subaccount].lpBalance = lpBalance;
BalanceNormalized memory baseBalance = balances[productId][subaccount]
.balance;
BalanceNormalized memory quoteBalance = balances[QUOTE_PRODUCT_ID][
subaccount
].balance;
_updateBalanceNormalized(base, baseBalance, amountBase);
_updateBalanceNormalized(quote, quoteBalance, amountQuote);
balances[productId][subaccount].balance = baseBalance;
balances[QUOTE_PRODUCT_ID][subaccount].balance = quoteBalance;
states[productId] = base;
states[QUOTE_PRODUCT_ID] = quote;
_balanceUpdate(productId, subaccount);
_balanceUpdate(QUOTE_PRODUCT_ID, subaccount);
}
function swapLp(
uint32 productId,
int128 baseDelta,
int128 quoteDelta
) external returns (int128, int128) {
_assertInternal();
LpState memory lpState = lpStates[productId];
require(
MathHelper.isSwapValid(
baseDelta,
quoteDelta,
lpState.base.amount,
lpState.quote.amount
),
ERR_INVALID_MAKER
);
int128 baseDepositsMultiplierX18 = states[productId]
.cumulativeDepositsMultiplierX18;
int128 quoteDepositsMultiplierX18 = states[QUOTE_PRODUCT_ID]
.cumulativeDepositsMultiplierX18;
lpState.base.amount += baseDelta;
lpState.quote.amount += quoteDelta;
lpStates[productId] = lpState;
states[productId].totalDepositsNormalized += baseDelta.div(
baseDepositsMultiplierX18
);
states[QUOTE_PRODUCT_ID].totalDepositsNormalized += quoteDelta.div(
quoteDepositsMultiplierX18
);
_productUpdate(productId);
return (baseDelta, quoteDelta);
}
function decomposeLps(bytes32 liquidatee, bytes32 liquidator)
external
returns (int128 liquidationFees)
{
uint32[] memory _productIds = getProductIds();
for (uint128 i = 0; i < _productIds.length; ++i) {
uint32 productId = _productIds[i];
(, int128 amountQuote) = burnLp(
productId,
liquidatee,
type(int128).max
);
if (amountQuote != 0) {
int128 rewards = amountQuote.mul(
(ONE -
RiskHelper._getWeightX18(
_risk(productId),
amountQuote,
IProductEngine.HealthType.MAINTENANCE
)) / 50
);
int128 fees = rewards.mul(LIQUIDATION_FEE_FRACTION);
rewards -= fees;
liquidationFees += fees;
State memory quote = states[QUOTE_PRODUCT_ID];
BalanceNormalized memory liquidateeQuote = balances[
QUOTE_PRODUCT_ID
][liquidatee].balance;
BalanceNormalized memory liquidatorQuote = balances[
QUOTE_PRODUCT_ID
][liquidator].balance;
_updateBalanceNormalized(
quote,
liquidateeQuote,
-rewards - fees
);
_updateBalanceNormalized(quote, liquidatorQuote, rewards);
balances[QUOTE_PRODUCT_ID][liquidatee]
.balance = liquidateeQuote;
balances[QUOTE_PRODUCT_ID][liquidator]
.balance = liquidatorQuote;
states[QUOTE_PRODUCT_ID] = quote;
_balanceUpdate(QUOTE_PRODUCT_ID, liquidator);
_balanceUpdate(QUOTE_PRODUCT_ID, liquidatee);
}
}
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "./IProductEngine.sol";
import "../../libraries/RiskHelper.sol";
interface ISpotEngine is IProductEngine {
event SpotBalance(
bytes32 indexed subaccount,
uint32 indexed productId,
int128 amount,
int128 lastCumulativeMultiplierX18
);
event InterestPayment(
uint32 productId,
uint128 dt,
int128 depositRateMultiplierX18,
int128 borrowRateMultiplierX18,
int128 feeAmount
);
struct Config {
address token;
int128 interestInflectionUtilX18;
int128 interestFloorX18;
int128 interestSmallCapX18;
int128 interestLargeCapX18;
}
struct State {
int128 cumulativeDepositsMultiplierX18;
int128 cumulativeBorrowsMultiplierX18;
int128 totalDepositsNormalized;
int128 totalBorrowsNormalized;
}
struct Balance {
int128 amount;
int128 lastCumulativeMultiplierX18;
}
struct BalanceNormalized {
int128 amountNormalized;
}
struct LpState {
int128 supply;
Balance quote;
Balance base;
}
struct LpBalance {
int128 amount;
}
struct Balances {
BalanceNormalized balance;
LpBalance lpBalance;
}
struct UpdateProductTx {
uint32 productId;
int128 sizeIncrement;
int128 minSize;
int128 lpSpreadX18;
Config config;
RiskHelper.RiskStore riskStore;
}
function getStateAndBalance(uint32 productId, bytes32 subaccount)
external
view
returns (State memory, Balance memory);
function getBalance(uint32 productId, bytes32 subaccount)
external
view
returns (Balance memory);
function getStatesAndBalances(uint32 productId, bytes32 subaccount)
external
view
returns (
LpState memory,
LpBalance memory,
State memory,
Balance memory
);
function getConfig(uint32 productId) external view returns (Config memory);
function getToken(uint32 productId) external view returns (address);
function updateBalance(
uint32 productId,
bytes32 subaccount,
int128 amountDelta
) external;
function updateBalance(
uint32 productId,
bytes32 subaccount,
int128 amountDelta,
int128 quoteDelta
) external;
function updateQuoteFromInsurance(bytes32 subaccount, int128 insurance)
external
returns (int128);
function updateStates(uint128 dt) external;
function updateMinDepositRate(uint32 productId, int128 minDepositRateX18)
external;
function manualAssert(
int128[] calldata totalDeposits,
int128[] calldata totalBorrows
) external view;
function socializeSubaccount(bytes32 subaccount) external;
function assertUtilization(uint32 productId) external view;
}// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; // Trying to take an action on vertex when string constant ERR_REQUIRES_DEPOSIT = "RS"; // ERC20 Transfer failed string constant ERR_TRANSFER_FAILED = "TF"; // Unauthorized string constant ERR_UNAUTHORIZED = "U"; // Invalid product string constant ERR_INVALID_PRODUCT = "IP"; // Subaccount health too low string constant ERR_SUBACCT_HEALTH = "SH"; // Not liquidatable string constant ERR_NOT_LIQUIDATABLE = "NL"; // Liquidator health too low string constant ERR_NOT_LIQUIDATABLE_INITIAL = "NLI"; // Liquidatee has positive initial health string constant ERR_LIQUIDATED_TOO_MUCH = "LTM"; // Trying to liquidate quote, or string constant ERR_INVALID_LIQUIDATION_PARAMS = "NILP"; // Trying to liquidate perp but the amount is not divisible by sizeIncrement string constant ERR_INVALID_LIQUIDATION_AMOUNT = "NILA"; // Tried to liquidate too little, too much or signs are different string constant ERR_NOT_LIQUIDATABLE_AMT = "NLA"; // Tried to liquidate liabilities before perps string constant ERR_NOT_LIQUIDATABLE_LIABILITIES = "NLL"; // Tried to finalize subaccount that cannot be finalized string constant ERR_NOT_FINALIZABLE_SUBACCOUNT = "NFS"; // Not enough quote to settle string constant ERR_CANNOT_SETTLE = "CS"; // Not enough insurance to settle string constant ERR_NO_INSURANCE = "NI"; // Above reserve ratio string constant ERR_RESERVE_RATIO = "RR"; // Invalid socialize amount string constant ERR_INVALID_SOCIALIZE_AMT = "ISA"; // Socializing product with no open interest string constant ERR_NO_OPEN_INTEREST = "NOI"; // FOK not filled, this isn't rly an error so this is jank string constant ERR_FOK_NOT_FILLED = "ENF"; // bad product config via weights string constant ERR_BAD_PRODUCT_CONFIG = "BPC"; // subacct name too long string constant ERR_LONG_NAME = "LN"; // already registered in health group string constant ERR_ALREADY_REGISTERED = "AR"; // invalid health group provided string constant ERR_INVALID_HEALTH_GROUP = "IHG"; string constant ERR_GETTING_ZERO_HEALTH_GROUP = "GZHG"; // trying to burn more LP than owned string constant ERR_INSUFFICIENT_LP = "ILP"; // taker order subaccount fails risk or is invalid string constant ERR_INVALID_TAKER = "IT"; // maker order subaccount fails risk or is invalid string constant ERR_INVALID_MAKER = "IM"; string constant ERR_INVALID_SIGNATURE = "IS"; string constant ERR_ORDERS_CANNOT_BE_MATCHED = "OCBM"; string constant ERR_INVALID_LP_AMOUNT = "ILA"; string constant ERR_SLIPPAGE_TOO_HIGH = "STH"; string constant ERR_SUBACCOUNT_NOT_FOUND = "SNF"; string constant ERR_INVALID_PRICE = "IPR"; string constant ERR_INVALID_TIME = "ITI"; // states on node and engine are not same string constant ERR_DSYNC = "DSYNC"; string constant ERR_INVALID_SWAP_PARAMS = "ISP"; string constant ERR_CONVERSION_OVERFLOW = "CO"; string constant ERR_ONLY_CLEARINGHOUSE_CAN_SET_BOOK = "OCCSB"; // we match on containing these strings in sequencer string constant ERR_INVALID_SUBMISSION_INDEX = "IX"; string constant ERR_NO_SLOW_MODE_TXS_REMAINING = "no slow mode transactions remaining"; string constant ERR_INVALID_COUNT = "IC"; string constant ERR_SLOW_TX_TOO_RECENT = "STTR"; string constant ERR_WALLET_NOT_TRANSFERABLE = "WNT"; string constant ERR_WALLET_SANCTIONED = "WS"; string constant ERR_SLOW_MODE_WRONG_SENDER = "SMWS"; string constant ERR_WRONG_NONCE = "WN"; // initially wanted to call this // ERR_FULL_UTILIZATION but the shortened // error string may make people mad on the frontend string constant ERR_MAX_UTILIZATION = "MU"; string constant ERR_INVALID_RISK_GROUP = "IRG"; string constant ERR_VERIFY_SCHNORR = "VSR"; string constant ERR_DEPOSIT_TOO_SMALL = "DTS"; string constant ERR_CODE_NOT_MATCH = "CNM"; string constant ERR_INVALID_HOLDER_LIST = "IHL";
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "./IClearinghouseEventEmitter.sol";
import "../engine/IProductEngine.sol";
import "../IEndpoint.sol";
import "../IEndpointGated.sol";
import "../../libraries/RiskHelper.sol";
interface IClearinghouse is IClearinghouseEventEmitter, IEndpointGated {
function addEngine(
address engine,
address offchainExchange,
IProductEngine.EngineType engineType
) external;
function registerProduct(uint32 productId) external;
function transferQuote(IEndpoint.TransferQuote calldata tx) external;
function depositCollateral(IEndpoint.DepositCollateral calldata tx)
external;
function withdrawCollateral(
bytes32 sender,
uint32 productId,
uint128 amount,
address sendTo,
uint64 idx
) external;
function mintLp(IEndpoint.MintLp calldata tx) external;
function burnLp(IEndpoint.BurnLp calldata tx) external;
function mintVlp(IEndpoint.MintVlp calldata txn, int128 oraclePriceX18)
external;
function burnVlp(IEndpoint.BurnVlp calldata txn, int128 oraclePriceX18)
external;
function liquidateSubaccount(IEndpoint.LiquidateSubaccount calldata tx)
external;
function depositInsurance(bytes calldata transaction) external;
function withdrawInsurance(bytes calldata transaction, uint64 idx) external;
function delistProduct(bytes calldata transaction) external;
function settlePnl(bytes calldata transaction) external;
function rebalanceXWithdraw(bytes calldata transaction, uint64 nSubmissions)
external;
function updateMinDepositRate(bytes calldata transaction) external;
function updateFeeRates(bytes calldata transaction) external;
function updatePrice(bytes calldata transaction)
external
returns (uint32, int128);
function rebalanceVlp(bytes calldata transaction) external;
function claimSequencerFees(int128[] calldata fees) external;
/// @notice Retrieve quote ERC20 address
function getQuote() external view returns (address);
/// @notice Returns the registered engine address by type
function getEngineByType(IProductEngine.EngineType engineType)
external
view
returns (address);
/// @notice Returns the engine associated with a product ID
function getEngineByProduct(uint32 productId)
external
view
returns (address);
/// @notice Returns health for the subaccount across all engines
function getHealth(bytes32 subaccount, IProductEngine.HealthType healthType)
external
view
returns (int128);
/// @notice Returns the amount of insurance remaining in this clearinghouse
function getInsurance() external view returns (int128);
function getSpreads() external view returns (uint256);
function upgradeClearinghouseLiq(address _clearinghouseLiq) external;
function getClearinghouseLiq() external view returns (address);
function burnLpAndTransfer(IEndpoint.BurnLpAndTransfer calldata txn)
external;
function requireMinDeposit(uint32 productId, uint128 amount) external;
function assertCode(bytes calldata tx) external;
function manualAssert(bytes calldata tx) external;
function getWithdrawPool() external view returns (address);
function getSlowModeFee() external view returns (uint256);
function getWithdrawFee(uint32 productId) external view returns (int128);
function setWithdrawPool(address _withdrawPool) external;
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../clearinghouse/IClearinghouse.sol";
import "../../libraries/RiskHelper.sol";
interface IProductEngine {
event AddProduct(uint32 productId);
enum EngineType {
SPOT,
PERP
}
enum HealthType {
INITIAL,
MAINTENANCE,
PNL
}
struct ProductDelta {
uint32 productId;
bytes32 subaccount;
int128 amountDelta;
int128 vQuoteDelta;
}
struct CoreRisk {
int128 amount;
int128 price;
int128 longWeight;
}
/// @notice Initializes the engine
function initialize(
address _clearinghouse,
address _offchainExchange,
address _quote,
address _endpoint,
address _admin
) external;
function getHealthContribution(
bytes32 subaccount,
IProductEngine.HealthType healthType
) external view returns (int128);
function getCoreRisk(
bytes32 subaccount,
uint32 productId,
IProductEngine.HealthType healthType
) external view returns (IProductEngine.CoreRisk memory);
function updateProduct(bytes calldata txn) external;
function swapLp(
uint32 productId,
int128 baseDelta,
int128 quoteDelta
) external returns (int128, int128);
function mintLp(
uint32 productId,
bytes32 subaccount,
int128 amountBase,
int128 quoteAmountLow,
int128 quoteAmountHigh
) external;
function burnLp(
uint32 productId,
bytes32 subaccount,
// passing 0 here means to burn all
int128 amountLp
) external returns (int128, int128);
function decomposeLps(bytes32 liquidatee, bytes32 liquidator)
external
returns (int128);
/// @notice return clearinghouse addr
function getClearinghouse() external view returns (address);
/// @notice return productIds associated with engine
function getProductIds() external view returns (uint32[] memory);
function getRisk(uint32 productId)
external
view
returns (RiskHelper.Risk memory);
/// @notice return the type of engine
function getEngineType() external pure returns (IProductEngine.EngineType);
function updatePrice(uint32 productId, int128 priceX18) external;
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "./interfaces/IEndpoint.sol";
import "./interfaces/IEndpointGated.sol";
import "./libraries/MathSD21x18.sol";
import "./common/Constants.sol";
import "hardhat/console.sol";
abstract contract EndpointGated is OwnableUpgradeable, IEndpointGated {
address private endpoint;
function setEndpoint(address _endpoint) internal onlyOwner {
endpoint = _endpoint;
}
function getEndpoint() public view returns (address) {
return endpoint;
}
function getOracleTime() internal view returns (uint128) {
return IEndpoint(endpoint).getTime();
}
modifier onlyEndpoint() {
require(
msg.sender == endpoint,
"SequencerGated: caller is not the endpoint"
);
_;
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "./clearinghouse/IClearinghouse.sol";
interface IEndpoint {
event SubmitTransactions();
// events that we parse transactions into
enum TransactionType {
LiquidateSubaccount,
DepositCollateral,
WithdrawCollateral,
SpotTick,
UpdatePrice,
SettlePnl,
MatchOrders,
DepositInsurance,
ExecuteSlowMode,
MintLp,
BurnLp,
SwapAMM,
MatchOrderAMM,
DumpFees,
ClaimSequencerFees, // deprecated
PerpTick,
ManualAssert,
Rebate, // deprecated
UpdateProduct,
LinkSigner,
UpdateFeeRates,
BurnLpAndTransfer,
MatchOrdersRFQ,
TransferQuote,
RebalanceXWithdraw,
UpdateMinDepositRate,
AssertCode,
WithdrawInsurance,
CreateIsolatedSubaccount,
DelistProduct,
MintVlp,
BurnVlp,
RebalanceVlp
}
struct UpdateProduct {
address engine;
bytes tx;
}
/// requires signature from sender
enum LiquidationMode {
SPREAD,
SPOT,
PERP
}
struct LegacyLiquidateSubaccount {
bytes32 sender;
bytes32 liquidatee;
uint8 mode;
uint32 healthGroup;
int128 amount;
uint64 nonce;
}
struct LiquidateSubaccount {
bytes32 sender;
bytes32 liquidatee;
uint32 productId;
bool isEncodedSpread;
int128 amount;
uint64 nonce;
}
struct LegacySignedLiquidateSubaccount {
LegacyLiquidateSubaccount tx;
bytes signature;
}
struct SignedLiquidateSubaccount {
LiquidateSubaccount tx;
bytes signature;
}
struct DepositCollateral {
bytes32 sender;
uint32 productId;
uint128 amount;
}
struct SignedDepositCollateral {
DepositCollateral tx;
bytes signature;
}
struct WithdrawCollateral {
bytes32 sender;
uint32 productId;
uint128 amount;
uint64 nonce;
}
struct SignedWithdrawCollateral {
WithdrawCollateral tx;
bytes signature;
}
struct MintLp {
bytes32 sender;
uint32 productId;
uint128 amountBase;
uint128 quoteAmountLow;
uint128 quoteAmountHigh;
uint64 nonce;
}
struct SignedMintLp {
MintLp tx;
bytes signature;
}
struct BurnLp {
bytes32 sender;
uint32 productId;
uint128 amount;
uint64 nonce;
}
struct SignedBurnLp {
BurnLp tx;
bytes signature;
}
struct MintVlp {
bytes32 sender;
uint128 quoteAmount;
uint64 nonce;
}
struct SignedMintVlp {
MintVlp tx;
bytes signature;
int128 oraclePriceX18;
}
struct BurnVlp {
bytes32 sender;
uint128 vlpAmount;
uint64 nonce;
}
struct SignedBurnVlp {
BurnVlp tx;
bytes signature;
int128 oraclePriceX18;
}
struct RebalanceVlp {
int128 quoteAmount;
int128 vlpAmount;
}
struct LinkSigner {
bytes32 sender;
bytes32 signer;
uint64 nonce;
}
struct SignedLinkSigner {
LinkSigner tx;
bytes signature;
}
/// callable by endpoint; no signature verifications needed
struct PerpTick {
uint128 time;
int128[] avgPriceDiffs;
}
struct LegacySpotTick {
uint128 time;
}
struct SpotTick {
uint128 time;
// utilization ratio across all chains
int128[] utilizationRatiosX18;
}
struct ManualAssert {
int128[] openInterests;
int128[] totalDeposits;
int128[] totalBorrows;
}
struct AssertCode {
string[] contractNames;
bytes32[] codeHashes;
}
struct WithdrawInsurance {
uint128 amount;
address sendTo;
}
struct DelistProduct {
uint32 productId;
int128 priceX18;
bytes32[] subaccounts;
}
struct Rebate {
bytes32[] subaccounts;
int128[] amounts;
}
struct UpdateFeeRates {
address user;
uint32 productId;
// the absolute value of fee rates can't be larger than 100%,
// so their X18 values are in the range [-1e18, 1e18], which
// can be stored by using int64.
int64 makerRateX18;
int64 takerRateX18;
}
struct ClaimSequencerFees {
bytes32 subaccount;
}
struct RebalanceXWithdraw {
uint32 productId;
uint128 amount;
address sendTo;
}
struct UpdateMinDepositRate {
uint32 productId;
int128 minDepositRateX18;
}
struct UpdatePrice {
uint32 productId;
int128 priceX18;
}
struct SettlePnl {
bytes32[] subaccounts;
uint256[] productIds;
}
/// matching
struct Order {
bytes32 sender;
int128 priceX18;
int128 amount;
uint64 expiration;
uint64 nonce;
}
struct SignedOrder {
Order order;
bytes signature;
}
struct LegacyMatchOrders {
uint32 productId;
bool amm;
SignedOrder taker;
SignedOrder maker;
}
struct MatchOrders {
uint32 productId;
SignedOrder taker;
SignedOrder maker;
}
struct MatchOrdersWithSigner {
MatchOrders matchOrders;
address takerLinkedSigner;
address makerLinkedSigner;
}
// just swap against AMM -- theres no maker order
struct MatchOrderAMM {
uint32 productId;
int128 baseDelta;
int128 quoteDelta;
SignedOrder taker;
}
struct SwapAMM {
bytes32 sender;
uint32 productId;
int128 amount;
int128 priceX18;
}
struct DepositInsurance {
uint128 amount;
}
struct SlowModeTx {
uint64 executableAt;
address sender;
bytes tx;
}
struct SlowModeConfig {
uint64 timeout;
uint64 txCount;
uint64 txUpTo;
}
// legacy :(
struct Prices {
int128 spotPriceX18;
int128 perpPriceX18;
}
struct BurnLpAndTransfer {
bytes32 sender;
uint32 productId;
uint128 amount;
bytes32 recipient;
}
struct TransferQuote {
bytes32 sender;
bytes32 recipient;
uint128 amount;
uint64 nonce;
}
struct SignedTransferQuote {
TransferQuote tx;
bytes signature;
}
struct IsolatedOrder {
bytes32 sender;
int128 priceX18;
int128 amount;
uint64 expiration;
uint64 nonce;
int128 margin;
}
struct CreateIsolatedSubaccount {
IsolatedOrder order;
uint32 productId;
bytes signature;
}
function depositCollateral(
bytes12 subaccountName,
uint32 productId,
uint128 amount
) external;
function depositCollateralWithReferral(
bytes12 subaccountName,
uint32 productId,
uint128 amount,
string calldata referralCode
) external;
function depositCollateralWithReferral(
bytes32 subaccount,
uint32 productId,
uint128 amount,
string calldata referralCode
) external;
function submitSlowModeTransaction(bytes calldata transaction) external;
function getTime() external view returns (uint128);
function getSequencer() external view returns (address);
function getNonce(address sender) external view returns (uint64);
function getOffchainExchange() external view returns (address);
function getPriceX18(uint32 productId) external view returns (int128);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.13;
import "./IEndpoint.sol";
interface IEndpointGated {
function getEndpoint() external view returns (address endpoint);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Strings.sol";
import "./MathHelper.sol";
library Logger {
event VertexEVMLog(string message);
function log(string memory message) internal {
emit VertexEVMLog(message);
}
function log(int128 value) internal {
log(MathHelper.int2str(value));
}
function log(string memory message, int128 value) internal {
log(string.concat(message, " ", MathHelper.int2str(value)));
}
function log(string memory message, uint128 value) internal {
log(string.concat(message, " ", MathHelper.uint2str(value)));
}
// function log(string memory message, uint32 value) internal {
// log(message, uint128(value));
// }
function log(string memory message, address value) internal {
log(
string.concat(message, " ", Strings.toHexString(uint160(value), 20))
);
}
function log(string memory messages, bytes32 value) internal {
log(string.concat(messages, " ", string(abi.encodePacked(value))));
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import "./clearinghouse/IClearinghouse.sol";
interface IOffchainExchange {
event FillOrder(
uint32 indexed productId,
// original order information
bytes32 indexed digest,
bytes32 indexed subaccount,
int128 priceX18,
int128 amount,
uint64 expiration,
uint64 nonce,
// whether this order is taking or making
bool isTaker,
// amount paid in fees (in quote)
int128 feeAmount,
// change in this subaccount's base balance from this fill
int128 baseDelta,
// change in this subaccount's quote balance from this fill
int128 quoteDelta
);
event CloseIsolatedSubaccount(
bytes32 indexed isolatedSubaccount,
bytes32 indexed parentSubaccount
);
struct FeeRates {
int64 makerRateX18;
int64 takerRateX18;
uint8 isNonDefault; // 1: non-default, 0: default
}
struct LpParams {
int128 lpSpreadX18;
}
struct MarketInfoStore {
int64 minSize;
int64 sizeIncrement;
int128 collectedFees;
}
struct MarketInfo {
uint32 quoteId;
int128 minSize;
int128 sizeIncrement;
int128 collectedFees;
}
function initialize(address _clearinghouse, address _endpoint) external;
function updateFeeRates(
address user,
uint32 productId,
int64 makerRateX18,
int64 takerRateX18
) external;
function updateMarket(
uint32 productId,
uint32 quoteId,
address virtualBook,
int128 sizeIncrement,
int128 minSize,
int128 lpSpreadX18
) external;
function getMinSize(uint32 productId) external view returns (int128);
function getDigest(uint32 productId, IEndpoint.Order memory order)
external
view
returns (bytes32);
function getSizeIncrement(uint32 productId) external view returns (int128);
function getMarketInfo(uint32 productId)
external
view
returns (MarketInfo memory);
function getLpParams(uint32 productId)
external
view
returns (LpParams memory);
function swapAMM(IEndpoint.SwapAMM calldata tx) external;
function matchOrderAMM(
IEndpoint.MatchOrderAMM calldata tx,
address takerLinkedSigner
) external;
function matchOrders(IEndpoint.MatchOrdersWithSigner calldata tx) external;
function dumpFees() external;
function createIsolatedSubaccount(
IEndpoint.CreateIsolatedSubaccount memory tx,
address linkedSigner
) external returns (bytes32);
function isIsolatedSubaccountActive(bytes32 parent, bytes32 subaccount)
external
view
returns (bool);
function getParentSubaccount(bytes32 subaccount)
external
view
returns (bytes32);
function tryCloseIsolatedSubaccount(bytes32 subaccount) external;
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
interface IClearinghouseEventEmitter {
/// @notice Emitted during initialization
event ClearinghouseInitialized(address endpoint, address quote);
/// @notice Emitted when collateral is modified for a subaccount
event ModifyCollateral(
int128 amount,
bytes32 indexed subaccount,
uint32 productId
);
event Liquidation(
bytes32 indexed liquidatorSubaccount,
bytes32 indexed liquidateeSubaccount,
uint32 productId,
bool isEncodedSpread,
int128 amount,
int128 amountQuote
);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function log(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint256 p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
}
function log(uint256 p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
}
function log(uint256 p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
}
function log(uint256 p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
}
function log(string memory p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
}
function log(string memory p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
}
function log(bool p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
}
function log(address p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
}
function log(uint256 p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
}
function log(uint256 p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
}
function log(uint256 p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
}
function log(uint256 p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
}
function log(uint256 p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
}
function log(uint256 p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
}
function log(uint256 p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
}
function log(uint256 p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
}
function log(bool p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
}
function log(bool p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
}
function log(bool p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
}
function log(address p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
}
function log(address p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
}
function log(address p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}// SPDX-License-Identifier: Unlicense
pragma solidity >=0.8.4;
import "./PRBMath.sol";
/// @title PRBMathSD59x18
/// @author Paul Razvan Berg
/// @notice Smart contract library for advanced fixed-point math that works with int256 numbers considered to have 18
/// trailing decimals. We call this number representation signed 59.18-decimal fixed-point, since the numbers can have
/// a sign and there can be up to 59 digits in the integer part and up to 18 decimals in the fractional part. The numbers
/// are bound by the minimum and the maximum values permitted by the Solidity type int256.
library PRBMathSD59x18 {
/// @dev log2(e) as a signed 59.18-decimal fixed-point number.
int256 internal constant LOG2_E = 1_442695040888963407;
/// @dev Half the SCALE number.
int256 internal constant HALF_SCALE = 5e17;
/// @dev The maximum value a signed 59.18-decimal fixed-point number can have.
int256 internal constant MAX_SD59x18 =
57896044618658097711785492504343953926634992332820282019728_792003956564819967;
/// @dev The maximum whole value a signed 59.18-decimal fixed-point number can have.
int256 internal constant MAX_WHOLE_SD59x18 =
57896044618658097711785492504343953926634992332820282019728_000000000000000000;
/// @dev The minimum value a signed 59.18-decimal fixed-point number can have.
int256 internal constant MIN_SD59x18 =
-57896044618658097711785492504343953926634992332820282019728_792003956564819968;
/// @dev The minimum whole value a signed 59.18-decimal fixed-point number can have.
int256 internal constant MIN_WHOLE_SD59x18 =
-57896044618658097711785492504343953926634992332820282019728_000000000000000000;
/// @dev How many trailing decimals can be represented.
int256 internal constant SCALE = 1e18;
/// INTERNAL FUNCTIONS ///
/// @notice Calculate the absolute value of x.
///
/// @dev Requirements:
/// - x must be greater than MIN_SD59x18.
///
/// @param x The number to calculate the absolute value for.
/// @param result The absolute value of x.
function abs(int256 x) internal pure returns (int256 result) {
unchecked {
if (x == MIN_SD59x18) {
revert PRBMathSD59x18__AbsInputTooSmall();
}
result = x < 0 ? -x : x;
}
}
/// @notice Calculates the arithmetic average of x and y, rounding down.
/// @param x The first operand as a signed 59.18-decimal fixed-point number.
/// @param y The second operand as a signed 59.18-decimal fixed-point number.
/// @return result The arithmetic average as a signed 59.18-decimal fixed-point number.
function avg(int256 x, int256 y) internal pure returns (int256 result) {
// The operations can never overflow.
unchecked {
int256 sum = (x >> 1) + (y >> 1);
if (sum < 0) {
// If at least one of x and y is odd, we add 1 to the result. This is because shifting negative numbers to the
// right rounds down to infinity.
assembly {
result := add(sum, and(or(x, y), 1))
}
} else {
// If both x and y are odd, we add 1 to the result. This is because if both numbers are odd, the 0.5
// remainder gets truncated twice.
result = sum + (x & y & 1);
}
}
}
/// @notice Yields the least greatest signed 59.18 decimal fixed-point number greater than or equal to x.
///
/// @dev Optimized for fractional value inputs, because for every whole value there are (1e18 - 1) fractional counterparts.
/// See https://en.wikipedia.org/wiki/Floor_and_ceiling_functions.
///
/// Requirements:
/// - x must be less than or equal to MAX_WHOLE_SD59x18.
///
/// @param x The signed 59.18-decimal fixed-point number to ceil.
/// @param result The least integer greater than or equal to x, as a signed 58.18-decimal fixed-point number.
function ceil(int256 x) internal pure returns (int256 result) {
if (x > MAX_WHOLE_SD59x18) {
revert PRBMathSD59x18__CeilOverflow(x);
}
unchecked {
int256 remainder = x % SCALE;
if (remainder == 0) {
result = x;
} else {
// Solidity uses C fmod style, which returns a modulus with the same sign as x.
result = x - remainder;
if (x > 0) {
result += SCALE;
}
}
}
}
/// @notice Divides two signed 59.18-decimal fixed-point numbers, returning a new signed 59.18-decimal fixed-point number.
///
/// @dev Variant of "mulDiv" that works with signed numbers. Works by computing the signs and the absolute values separately.
///
/// Requirements:
/// - All from "PRBMath.mulDiv".
/// - None of the inputs can be MIN_SD59x18.
/// - The denominator cannot be zero.
/// - The result must fit within int256.
///
/// Caveats:
/// - All from "PRBMath.mulDiv".
///
/// @param x The numerator as a signed 59.18-decimal fixed-point number.
/// @param y The denominator as a signed 59.18-decimal fixed-point number.
/// @param result The quotient as a signed 59.18-decimal fixed-point number.
function div(int256 x, int256 y) internal pure returns (int256 result) {
if (x == MIN_SD59x18 || y == MIN_SD59x18) {
revert PRBMathSD59x18__DivInputTooSmall();
}
// Get hold of the absolute values of x and y.
uint256 ax;
uint256 ay;
unchecked {
ax = x < 0 ? uint256(-x) : uint256(x);
ay = y < 0 ? uint256(-y) : uint256(y);
}
// Compute the absolute value of (x*SCALE)÷y. The result must fit within int256.
uint256 rAbs = PRBMath.mulDiv(ax, uint256(SCALE), ay);
if (rAbs > uint256(MAX_SD59x18)) {
revert PRBMathSD59x18__DivOverflow(rAbs);
}
// Get the signs of x and y.
uint256 sx;
uint256 sy;
assembly {
sx := sgt(x, sub(0, 1))
sy := sgt(y, sub(0, 1))
}
// XOR over sx and sy. This is basically checking whether the inputs have the same sign. If yes, the result
// should be positive. Otherwise, it should be negative.
result = sx ^ sy == 1 ? -int256(rAbs) : int256(rAbs);
}
/// @notice Returns Euler's number as a signed 59.18-decimal fixed-point number.
/// @dev See https://en.wikipedia.org/wiki/E_(mathematical_constant).
function e() internal pure returns (int256 result) {
result = 2_718281828459045235;
}
/// @notice Calculates the natural exponent of x.
///
/// @dev Based on the insight that e^x = 2^(x * log2(e)).
///
/// Requirements:
/// - All from "log2".
/// - x must be less than 133.084258667509499441.
///
/// Caveats:
/// - All from "exp2".
/// - For any x less than -41.446531673892822322, the result is zero.
///
/// @param x The exponent as a signed 59.18-decimal fixed-point number.
/// @return result The result as a signed 59.18-decimal fixed-point number.
function exp(int256 x) internal pure returns (int256 result) {
// Without this check, the value passed to "exp2" would be less than -59.794705707972522261.
if (x < -41_446531673892822322) {
return 0;
}
// Without this check, the value passed to "exp2" would be greater than 192.
if (x >= 133_084258667509499441) {
revert PRBMathSD59x18__ExpInputTooBig(x);
}
// Do the fixed-point multiplication inline to save gas.
unchecked {
int256 doubleScaleProduct = x * LOG2_E;
result = exp2((doubleScaleProduct + HALF_SCALE) / SCALE);
}
}
/// @notice Calculates the binary exponent of x using the binary fraction method.
///
/// @dev See https://ethereum.stackexchange.com/q/79903/24693.
///
/// Requirements:
/// - x must be 192 or less.
/// - The result must fit within MAX_SD59x18.
///
/// Caveats:
/// - For any x less than -59.794705707972522261, the result is zero.
///
/// @param x The exponent as a signed 59.18-decimal fixed-point number.
/// @return result The result as a signed 59.18-decimal fixed-point number.
function exp2(int256 x) internal pure returns (int256 result) {
// This works because 2^(-x) = 1/2^x.
if (x < 0) {
// 2^59.794705707972522262 is the maximum number whose inverse does not truncate down to zero.
if (x < -59_794705707972522261) {
return 0;
}
// Do the fixed-point inversion inline to save gas. The numerator is SCALE * SCALE.
unchecked {
result = 1e36 / exp2(-x);
}
} else {
// 2^192 doesn't fit within the 192.64-bit format used internally in this function.
if (x >= 192e18) {
revert PRBMathSD59x18__Exp2InputTooBig(x);
}
unchecked {
// Convert x to the 192.64-bit fixed-point format.
uint256 x192x64 = (uint256(x) << 64) / uint256(SCALE);
// Safe to convert the result to int256 directly because the maximum input allowed is 192.
result = int256(PRBMath.exp2(x192x64));
}
}
}
/// @notice Yields the greatest signed 59.18 decimal fixed-point number less than or equal to x.
///
/// @dev Optimized for fractional value inputs, because for every whole value there are (1e18 - 1) fractional counterparts.
/// See https://en.wikipedia.org/wiki/Floor_and_ceiling_functions.
///
/// Requirements:
/// - x must be greater than or equal to MIN_WHOLE_SD59x18.
///
/// @param x The signed 59.18-decimal fixed-point number to floor.
/// @param result The greatest integer less than or equal to x, as a signed 58.18-decimal fixed-point number.
function floor(int256 x) internal pure returns (int256 result) {
if (x < MIN_WHOLE_SD59x18) {
revert PRBMathSD59x18__FloorUnderflow(x);
}
unchecked {
int256 remainder = x % SCALE;
if (remainder == 0) {
result = x;
} else {
// Solidity uses C fmod style, which returns a modulus with the same sign as x.
result = x - remainder;
if (x < 0) {
result -= SCALE;
}
}
}
}
/// @notice Yields the excess beyond the floor of x for positive numbers and the part of the number to the right
/// of the radix point for negative numbers.
/// @dev Based on the odd function definition. https://en.wikipedia.org/wiki/Fractional_part
/// @param x The signed 59.18-decimal fixed-point number to get the fractional part of.
/// @param result The fractional part of x as a signed 59.18-decimal fixed-point number.
function frac(int256 x) internal pure returns (int256 result) {
unchecked {
result = x % SCALE;
}
}
/// @notice Converts a number from basic integer form to signed 59.18-decimal fixed-point representation.
///
/// @dev Requirements:
/// - x must be greater than or equal to MIN_SD59x18 divided by SCALE.
/// - x must be less than or equal to MAX_SD59x18 divided by SCALE.
///
/// @param x The basic integer to convert.
/// @param result The same number in signed 59.18-decimal fixed-point representation.
function fromInt(int256 x) internal pure returns (int256 result) {
unchecked {
if (x < MIN_SD59x18 / SCALE) {
revert PRBMathSD59x18__FromIntUnderflow(x);
}
if (x > MAX_SD59x18 / SCALE) {
revert PRBMathSD59x18__FromIntOverflow(x);
}
result = x * SCALE;
}
}
/// @notice Calculates geometric mean of x and y, i.e. sqrt(x * y), rounding down.
///
/// @dev Requirements:
/// - x * y must fit within MAX_SD59x18, lest it overflows.
/// - x * y cannot be negative.
///
/// @param x The first operand as a signed 59.18-decimal fixed-point number.
/// @param y The second operand as a signed 59.18-decimal fixed-point number.
/// @return result The result as a signed 59.18-decimal fixed-point number.
function gm(int256 x, int256 y) internal pure returns (int256 result) {
if (x == 0) {
return 0;
}
unchecked {
// Checking for overflow this way is faster than letting Solidity do it.
int256 xy = x * y;
if (xy / x != y) {
revert PRBMathSD59x18__GmOverflow(x, y);
}
// The product cannot be negative.
if (xy < 0) {
revert PRBMathSD59x18__GmNegativeProduct(x, y);
}
// We don't need to multiply by the SCALE here because the x*y product had already picked up a factor of SCALE
// during multiplication. See the comments within the "sqrt" function.
result = int256(PRBMath.sqrt(uint256(xy)));
}
}
/// @notice Calculates 1 / x, rounding toward zero.
///
/// @dev Requirements:
/// - x cannot be zero.
///
/// @param x The signed 59.18-decimal fixed-point number for which to calculate the inverse.
/// @return result The inverse as a signed 59.18-decimal fixed-point number.
function inv(int256 x) internal pure returns (int256 result) {
unchecked {
// 1e36 is SCALE * SCALE.
result = 1e36 / x;
}
}
/// @notice Calculates the natural logarithm of x.
///
/// @dev Based on the insight that ln(x) = log2(x) / log2(e).
///
/// Requirements:
/// - All from "log2".
///
/// Caveats:
/// - All from "log2".
/// - This doesn't return exactly 1 for 2718281828459045235, for that we would need more fine-grained precision.
///
/// @param x The signed 59.18-decimal fixed-point number for which to calculate the natural logarithm.
/// @return result The natural logarithm as a signed 59.18-decimal fixed-point number.
function ln(int256 x) internal pure returns (int256 result) {
// Do the fixed-point multiplication inline to save gas. This is overflow-safe because the maximum value that log2(x)
// can return is 195205294292027477728.
unchecked {
result = (log2(x) * SCALE) / LOG2_E;
}
}
/// @notice Calculates the common logarithm of x.
///
/// @dev First checks if x is an exact power of ten and it stops if yes. If it's not, calculates the common
/// logarithm based on the insight that log10(x) = log2(x) / log2(10).
///
/// Requirements:
/// - All from "log2".
///
/// Caveats:
/// - All from "log2".
///
/// @param x The signed 59.18-decimal fixed-point number for which to calculate the common logarithm.
/// @return result The common logarithm as a signed 59.18-decimal fixed-point number.
function log10(int256 x) internal pure returns (int256 result) {
if (x <= 0) {
revert PRBMathSD59x18__LogInputTooSmall(x);
}
// Note that the "mul" in this block is the assembly mul operation, not the "mul" function defined in this contract.
// prettier-ignore
assembly {
switch x
case 1 { result := mul(SCALE, sub(0, 18)) }
case 10 { result := mul(SCALE, sub(1, 18)) }
case 100 { result := mul(SCALE, sub(2, 18)) }
case 1000 { result := mul(SCALE, sub(3, 18)) }
case 10000 { result := mul(SCALE, sub(4, 18)) }
case 100000 { result := mul(SCALE, sub(5, 18)) }
case 1000000 { result := mul(SCALE, sub(6, 18)) }
case 10000000 { result := mul(SCALE, sub(7, 18)) }
case 100000000 { result := mul(SCALE, sub(8, 18)) }
case 1000000000 { result := mul(SCALE, sub(9, 18)) }
case 10000000000 { result := mul(SCALE, sub(10, 18)) }
case 100000000000 { result := mul(SCALE, sub(11, 18)) }
case 1000000000000 { result := mul(SCALE, sub(12, 18)) }
case 10000000000000 { result := mul(SCALE, sub(13, 18)) }
case 100000000000000 { result := mul(SCALE, sub(14, 18)) }
case 1000000000000000 { result := mul(SCALE, sub(15, 18)) }
case 10000000000000000 { result := mul(SCALE, sub(16, 18)) }
case 100000000000000000 { result := mul(SCALE, sub(17, 18)) }
case 1000000000000000000 { result := 0 }
case 10000000000000000000 { result := SCALE }
case 100000000000000000000 { result := mul(SCALE, 2) }
case 1000000000000000000000 { result := mul(SCALE, 3) }
case 10000000000000000000000 { result := mul(SCALE, 4) }
case 100000000000000000000000 { result := mul(SCALE, 5) }
case 1000000000000000000000000 { result := mul(SCALE, 6) }
case 10000000000000000000000000 { result := mul(SCALE, 7) }
case 100000000000000000000000000 { result := mul(SCALE, 8) }
case 1000000000000000000000000000 { result := mul(SCALE, 9) }
case 10000000000000000000000000000 { result := mul(SCALE, 10) }
case 100000000000000000000000000000 { result := mul(SCALE, 11) }
case 1000000000000000000000000000000 { result := mul(SCALE, 12) }
case 10000000000000000000000000000000 { result := mul(SCALE, 13) }
case 100000000000000000000000000000000 { result := mul(SCALE, 14) }
case 1000000000000000000000000000000000 { result := mul(SCALE, 15) }
case 10000000000000000000000000000000000 { result := mul(SCALE, 16) }
case 100000000000000000000000000000000000 { result := mul(SCALE, 17) }
case 1000000000000000000000000000000000000 { result := mul(SCALE, 18) }
case 10000000000000000000000000000000000000 { result := mul(SCALE, 19) }
case 100000000000000000000000000000000000000 { result := mul(SCALE, 20) }
case 1000000000000000000000000000000000000000 { result := mul(SCALE, 21) }
case 10000000000000000000000000000000000000000 { result := mul(SCALE, 22) }
case 100000000000000000000000000000000000000000 { result := mul(SCALE, 23) }
case 1000000000000000000000000000000000000000000 { result := mul(SCALE, 24) }
case 10000000000000000000000000000000000000000000 { result := mul(SCALE, 25) }
case 100000000000000000000000000000000000000000000 { result := mul(SCALE, 26) }
case 1000000000000000000000000000000000000000000000 { result := mul(SCALE, 27) }
case 10000000000000000000000000000000000000000000000 { result := mul(SCALE, 28) }
case 100000000000000000000000000000000000000000000000 { result := mul(SCALE, 29) }
case 1000000000000000000000000000000000000000000000000 { result := mul(SCALE, 30) }
case 10000000000000000000000000000000000000000000000000 { result := mul(SCALE, 31) }
case 100000000000000000000000000000000000000000000000000 { result := mul(SCALE, 32) }
case 1000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 33) }
case 10000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 34) }
case 100000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 35) }
case 1000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 36) }
case 10000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 37) }
case 100000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 38) }
case 1000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 39) }
case 10000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 40) }
case 100000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 41) }
case 1000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 42) }
case 10000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 43) }
case 100000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 44) }
case 1000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 45) }
case 10000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 46) }
case 100000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 47) }
case 1000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 48) }
case 10000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 49) }
case 100000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 50) }
case 1000000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 51) }
case 10000000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 52) }
case 100000000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 53) }
case 1000000000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 54) }
case 10000000000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 55) }
case 100000000000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 56) }
case 1000000000000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 57) }
case 10000000000000000000000000000000000000000000000000000000000000000000000000000 { result := mul(SCALE, 58) }
default {
result := MAX_SD59x18
}
}
if (result == MAX_SD59x18) {
// Do the fixed-point division inline to save gas. The denominator is log2(10).
unchecked {
result = (log2(x) * SCALE) / 3_321928094887362347;
}
}
}
/// @notice Calculates the binary logarithm of x.
///
/// @dev Based on the iterative approximation algorithm.
/// https://en.wikipedia.org/wiki/Binary_logarithm#Iterative_approximation
///
/// Requirements:
/// - x must be greater than zero.
///
/// Caveats:
/// - The results are not perfectly accurate to the last decimal, due to the lossy precision of the iterative approximation.
///
/// @param x The signed 59.18-decimal fixed-point number for which to calculate the binary logarithm.
/// @return result The binary logarithm as a signed 59.18-decimal fixed-point number.
function log2(int256 x) internal pure returns (int256 result) {
if (x <= 0) {
revert PRBMathSD59x18__LogInputTooSmall(x);
}
unchecked {
// This works because log2(x) = -log2(1/x).
int256 sign;
if (x >= SCALE) {
sign = 1;
} else {
sign = -1;
// Do the fixed-point inversion inline to save gas. The numerator is SCALE * SCALE.
assembly {
x := div(1000000000000000000000000000000000000, x)
}
}
// Calculate the integer part of the logarithm and add it to the result and finally calculate y = x * 2^(-n).
uint256 n = PRBMath.mostSignificantBit(uint256(x / SCALE));
// The integer part of the logarithm as a signed 59.18-decimal fixed-point number. The operation can't overflow
// because n is maximum 255, SCALE is 1e18 and sign is either 1 or -1.
result = int256(n) * SCALE;
// This is y = x * 2^(-n).
int256 y = x >> n;
// If y = 1, the fractional part is zero.
if (y == SCALE) {
return result * sign;
}
// Calculate the fractional part via the iterative approximation.
// The "delta >>= 1" part is equivalent to "delta /= 2", but shifting bits is faster.
for (int256 delta = int256(HALF_SCALE); delta > 0; delta >>= 1) {
y = (y * y) / SCALE;
// Is y^2 > 2 and so in the range [2,4)?
if (y >= 2 * SCALE) {
// Add the 2^(-m) factor to the logarithm.
result += delta;
// Corresponds to z/2 on Wikipedia.
y >>= 1;
}
}
result *= sign;
}
}
/// @notice Multiplies two signed 59.18-decimal fixed-point numbers together, returning a new signed 59.18-decimal
/// fixed-point number.
///
/// @dev Variant of "mulDiv" that works with signed numbers and employs constant folding, i.e. the denominator is
/// always 1e18.
///
/// Requirements:
/// - All from "PRBMath.mulDivFixedPoint".
/// - None of the inputs can be MIN_SD59x18
/// - The result must fit within MAX_SD59x18.
///
/// Caveats:
/// - The body is purposely left uncommented; see the NatSpec comments in "PRBMath.mulDiv" to understand how this works.
///
/// @param x The multiplicand as a signed 59.18-decimal fixed-point number.
/// @param y The multiplier as a signed 59.18-decimal fixed-point number.
/// @return result The product as a signed 59.18-decimal fixed-point number.
function mul(int256 x, int256 y) internal pure returns (int256 result) {
if (x == MIN_SD59x18 || y == MIN_SD59x18) {
revert PRBMathSD59x18__MulInputTooSmall();
}
unchecked {
uint256 ax;
uint256 ay;
ax = x < 0 ? uint256(-x) : uint256(x);
ay = y < 0 ? uint256(-y) : uint256(y);
uint256 rAbs = PRBMath.mulDivFixedPoint(ax, ay);
if (rAbs > uint256(MAX_SD59x18)) {
revert PRBMathSD59x18__MulOverflow(rAbs);
}
uint256 sx;
uint256 sy;
assembly {
sx := sgt(x, sub(0, 1))
sy := sgt(y, sub(0, 1))
}
result = sx ^ sy == 1 ? -int256(rAbs) : int256(rAbs);
}
}
/// @notice Returns PI as a signed 59.18-decimal fixed-point number.
function pi() internal pure returns (int256 result) {
result = 3_141592653589793238;
}
/// @notice Raises x to the power of y.
///
/// @dev Based on the insight that x^y = 2^(log2(x) * y).
///
/// Requirements:
/// - All from "exp2", "log2" and "mul".
/// - z cannot be zero.
///
/// Caveats:
/// - All from "exp2", "log2" and "mul".
/// - Assumes 0^0 is 1.
///
/// @param x Number to raise to given power y, as a signed 59.18-decimal fixed-point number.
/// @param y Exponent to raise x to, as a signed 59.18-decimal fixed-point number.
/// @return result x raised to power y, as a signed 59.18-decimal fixed-point number.
function pow(int256 x, int256 y) internal pure returns (int256 result) {
if (x == 0) {
result = y == 0 ? SCALE : int256(0);
} else {
result = exp2(mul(log2(x), y));
}
}
/// @notice Raises x (signed 59.18-decimal fixed-point number) to the power of y (basic unsigned integer) using the
/// famous algorithm "exponentiation by squaring".
///
/// @dev See https://en.wikipedia.org/wiki/Exponentiation_by_squaring
///
/// Requirements:
/// - All from "abs" and "PRBMath.mulDivFixedPoint".
/// - The result must fit within MAX_SD59x18.
///
/// Caveats:
/// - All from "PRBMath.mulDivFixedPoint".
/// - Assumes 0^0 is 1.
///
/// @param x The base as a signed 59.18-decimal fixed-point number.
/// @param y The exponent as an uint256.
/// @return result The result as a signed 59.18-decimal fixed-point number.
function powu(int256 x, uint256 y) internal pure returns (int256 result) {
uint256 xAbs = uint256(abs(x));
// Calculate the first iteration of the loop in advance.
uint256 rAbs = y & 1 > 0 ? xAbs : uint256(SCALE);
// Equivalent to "for(y /= 2; y > 0; y /= 2)" but faster.
uint256 yAux = y;
for (yAux >>= 1; yAux > 0; yAux >>= 1) {
xAbs = PRBMath.mulDivFixedPoint(xAbs, xAbs);
// Equivalent to "y % 2 == 1" but faster.
if (yAux & 1 > 0) {
rAbs = PRBMath.mulDivFixedPoint(rAbs, xAbs);
}
}
// The result must fit within the 59.18-decimal fixed-point representation.
if (rAbs > uint256(MAX_SD59x18)) {
revert PRBMathSD59x18__PowuOverflow(rAbs);
}
// Is the base negative and the exponent an odd number?
bool isNegative = x < 0 && y & 1 == 1;
result = isNegative ? -int256(rAbs) : int256(rAbs);
}
/// @notice Returns 1 as a signed 59.18-decimal fixed-point number.
function scale() internal pure returns (int256 result) {
result = SCALE;
}
/// @notice Calculates the square root of x, rounding down.
/// @dev Uses the Babylonian method https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method.
///
/// Requirements:
/// - x cannot be negative.
/// - x must be less than MAX_SD59x18 / SCALE.
///
/// @param x The signed 59.18-decimal fixed-point number for which to calculate the square root.
/// @return result The result as a signed 59.18-decimal fixed-point .
function sqrt(int256 x) internal pure returns (int256 result) {
unchecked {
if (x < 0) {
revert PRBMathSD59x18__SqrtNegativeInput(x);
}
if (x > MAX_SD59x18 / SCALE) {
revert PRBMathSD59x18__SqrtOverflow(x);
}
// Multiply x by the SCALE to account for the factor of SCALE that is picked up when multiplying two signed
// 59.18-decimal fixed-point numbers together (in this case, those two numbers are both the square root).
result = int256(PRBMath.sqrt(uint256(x * SCALE)));
}
}
/// @notice Converts a signed 59.18-decimal fixed-point number to basic integer form, rounding down in the process.
/// @param x The signed 59.18-decimal fixed-point number to convert.
/// @return result The same number in basic integer form.
function toInt(int256 x) internal pure returns (int256 result) {
unchecked {
result = x / SCALE;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: Unlicense
pragma solidity >=0.8.4;
/// @notice Emitted when the result overflows uint256.
error PRBMath__MulDivFixedPointOverflow(uint256 prod1);
/// @notice Emitted when the result overflows uint256.
error PRBMath__MulDivOverflow(uint256 prod1, uint256 denominator);
/// @notice Emitted when one of the inputs is type(int256).min.
error PRBMath__MulDivSignedInputTooSmall();
/// @notice Emitted when the intermediary absolute result overflows int256.
error PRBMath__MulDivSignedOverflow(uint256 rAbs);
/// @notice Emitted when the input is MIN_SD59x18.
error PRBMathSD59x18__AbsInputTooSmall();
/// @notice Emitted when ceiling a number overflows SD59x18.
error PRBMathSD59x18__CeilOverflow(int256 x);
/// @notice Emitted when one of the inputs is MIN_SD59x18.
error PRBMathSD59x18__DivInputTooSmall();
/// @notice Emitted when one of the intermediary unsigned results overflows SD59x18.
error PRBMathSD59x18__DivOverflow(uint256 rAbs);
/// @notice Emitted when the input is greater than 133.084258667509499441.
error PRBMathSD59x18__ExpInputTooBig(int256 x);
/// @notice Emitted when the input is greater than 192.
error PRBMathSD59x18__Exp2InputTooBig(int256 x);
/// @notice Emitted when flooring a number underflows SD59x18.
error PRBMathSD59x18__FloorUnderflow(int256 x);
/// @notice Emitted when converting a basic integer to the fixed-point format overflows SD59x18.
error PRBMathSD59x18__FromIntOverflow(int256 x);
/// @notice Emitted when converting a basic integer to the fixed-point format underflows SD59x18.
error PRBMathSD59x18__FromIntUnderflow(int256 x);
/// @notice Emitted when the product of the inputs is negative.
error PRBMathSD59x18__GmNegativeProduct(int256 x, int256 y);
/// @notice Emitted when multiplying the inputs overflows SD59x18.
error PRBMathSD59x18__GmOverflow(int256 x, int256 y);
/// @notice Emitted when the input is less than or equal to zero.
error PRBMathSD59x18__LogInputTooSmall(int256 x);
/// @notice Emitted when one of the inputs is MIN_SD59x18.
error PRBMathSD59x18__MulInputTooSmall();
/// @notice Emitted when the intermediary absolute result overflows SD59x18.
error PRBMathSD59x18__MulOverflow(uint256 rAbs);
/// @notice Emitted when the intermediary absolute result overflows SD59x18.
error PRBMathSD59x18__PowuOverflow(uint256 rAbs);
/// @notice Emitted when the input is negative.
error PRBMathSD59x18__SqrtNegativeInput(int256 x);
/// @notice Emitted when the calculating the square root overflows SD59x18.
error PRBMathSD59x18__SqrtOverflow(int256 x);
/// @notice Emitted when addition overflows UD60x18.
error PRBMathUD60x18__AddOverflow(uint256 x, uint256 y);
/// @notice Emitted when ceiling a number overflows UD60x18.
error PRBMathUD60x18__CeilOverflow(uint256 x);
/// @notice Emitted when the input is greater than 133.084258667509499441.
error PRBMathUD60x18__ExpInputTooBig(uint256 x);
/// @notice Emitted when the input is greater than 192.
error PRBMathUD60x18__Exp2InputTooBig(uint256 x);
/// @notice Emitted when converting a basic integer to the fixed-point format format overflows UD60x18.
error PRBMathUD60x18__FromUintOverflow(uint256 x);
/// @notice Emitted when multiplying the inputs overflows UD60x18.
error PRBMathUD60x18__GmOverflow(uint256 x, uint256 y);
/// @notice Emitted when the input is less than 1.
error PRBMathUD60x18__LogInputTooSmall(uint256 x);
/// @notice Emitted when the calculating the square root overflows UD60x18.
error PRBMathUD60x18__SqrtOverflow(uint256 x);
/// @notice Emitted when subtraction underflows UD60x18.
error PRBMathUD60x18__SubUnderflow(uint256 x, uint256 y);
/// @dev Common mathematical functions used in both PRBMathSD59x18 and PRBMathUD60x18. Note that this shared library
/// does not always assume the signed 59.18-decimal fixed-point or the unsigned 60.18-decimal fixed-point
/// representation. When it does not, it is explicitly mentioned in the NatSpec documentation.
library PRBMath {
/// STRUCTS ///
struct SD59x18 {
int256 value;
}
struct UD60x18 {
uint256 value;
}
/// STORAGE ///
/// @dev How many trailing decimals can be represented.
uint256 internal constant SCALE = 1e18;
/// @dev Largest power of two divisor of SCALE.
uint256 internal constant SCALE_LPOTD = 262144;
/// @dev SCALE inverted mod 2^256.
uint256 internal constant SCALE_INVERSE =
78156646155174841979727994598816262306175212592076161876661_508869554232690281;
/// FUNCTIONS ///
/// @notice Calculates the binary exponent of x using the binary fraction method.
/// @dev Has to use 192.64-bit fixed-point numbers.
/// See https://ethereum.stackexchange.com/a/96594/24693.
/// @param x The exponent as an unsigned 192.64-bit fixed-point number.
/// @return result The result as an unsigned 60.18-decimal fixed-point number.
function exp2(uint256 x) internal pure returns (uint256 result) {
unchecked {
// Start from 0.5 in the 192.64-bit fixed-point format.
result = 0x800000000000000000000000000000000000000000000000;
// Multiply the result by root(2, 2^-i) when the bit at position i is 1. None of the intermediary results overflows
// because the initial result is 2^191 and all magic factors are less than 2^65.
if (x & 0x8000000000000000 > 0) {
result = (result * 0x16A09E667F3BCC909) >> 64;
}
if (x & 0x4000000000000000 > 0) {
result = (result * 0x1306FE0A31B7152DF) >> 64;
}
if (x & 0x2000000000000000 > 0) {
result = (result * 0x1172B83C7D517ADCE) >> 64;
}
if (x & 0x1000000000000000 > 0) {
result = (result * 0x10B5586CF9890F62A) >> 64;
}
if (x & 0x800000000000000 > 0) {
result = (result * 0x1059B0D31585743AE) >> 64;
}
if (x & 0x400000000000000 > 0) {
result = (result * 0x102C9A3E778060EE7) >> 64;
}
if (x & 0x200000000000000 > 0) {
result = (result * 0x10163DA9FB33356D8) >> 64;
}
if (x & 0x100000000000000 > 0) {
result = (result * 0x100B1AFA5ABCBED61) >> 64;
}
if (x & 0x80000000000000 > 0) {
result = (result * 0x10058C86DA1C09EA2) >> 64;
}
if (x & 0x40000000000000 > 0) {
result = (result * 0x1002C605E2E8CEC50) >> 64;
}
if (x & 0x20000000000000 > 0) {
result = (result * 0x100162F3904051FA1) >> 64;
}
if (x & 0x10000000000000 > 0) {
result = (result * 0x1000B175EFFDC76BA) >> 64;
}
if (x & 0x8000000000000 > 0) {
result = (result * 0x100058BA01FB9F96D) >> 64;
}
if (x & 0x4000000000000 > 0) {
result = (result * 0x10002C5CC37DA9492) >> 64;
}
if (x & 0x2000000000000 > 0) {
result = (result * 0x1000162E525EE0547) >> 64;
}
if (x & 0x1000000000000 > 0) {
result = (result * 0x10000B17255775C04) >> 64;
}
if (x & 0x800000000000 > 0) {
result = (result * 0x1000058B91B5BC9AE) >> 64;
}
if (x & 0x400000000000 > 0) {
result = (result * 0x100002C5C89D5EC6D) >> 64;
}
if (x & 0x200000000000 > 0) {
result = (result * 0x10000162E43F4F831) >> 64;
}
if (x & 0x100000000000 > 0) {
result = (result * 0x100000B1721BCFC9A) >> 64;
}
if (x & 0x80000000000 > 0) {
result = (result * 0x10000058B90CF1E6E) >> 64;
}
if (x & 0x40000000000 > 0) {
result = (result * 0x1000002C5C863B73F) >> 64;
}
if (x & 0x20000000000 > 0) {
result = (result * 0x100000162E430E5A2) >> 64;
}
if (x & 0x10000000000 > 0) {
result = (result * 0x1000000B172183551) >> 64;
}
if (x & 0x8000000000 > 0) {
result = (result * 0x100000058B90C0B49) >> 64;
}
if (x & 0x4000000000 > 0) {
result = (result * 0x10000002C5C8601CC) >> 64;
}
if (x & 0x2000000000 > 0) {
result = (result * 0x1000000162E42FFF0) >> 64;
}
if (x & 0x1000000000 > 0) {
result = (result * 0x10000000B17217FBB) >> 64;
}
if (x & 0x800000000 > 0) {
result = (result * 0x1000000058B90BFCE) >> 64;
}
if (x & 0x400000000 > 0) {
result = (result * 0x100000002C5C85FE3) >> 64;
}
if (x & 0x200000000 > 0) {
result = (result * 0x10000000162E42FF1) >> 64;
}
if (x & 0x100000000 > 0) {
result = (result * 0x100000000B17217F8) >> 64;
}
if (x & 0x80000000 > 0) {
result = (result * 0x10000000058B90BFC) >> 64;
}
if (x & 0x40000000 > 0) {
result = (result * 0x1000000002C5C85FE) >> 64;
}
if (x & 0x20000000 > 0) {
result = (result * 0x100000000162E42FF) >> 64;
}
if (x & 0x10000000 > 0) {
result = (result * 0x1000000000B17217F) >> 64;
}
if (x & 0x8000000 > 0) {
result = (result * 0x100000000058B90C0) >> 64;
}
if (x & 0x4000000 > 0) {
result = (result * 0x10000000002C5C860) >> 64;
}
if (x & 0x2000000 > 0) {
result = (result * 0x1000000000162E430) >> 64;
}
if (x & 0x1000000 > 0) {
result = (result * 0x10000000000B17218) >> 64;
}
if (x & 0x800000 > 0) {
result = (result * 0x1000000000058B90C) >> 64;
}
if (x & 0x400000 > 0) {
result = (result * 0x100000000002C5C86) >> 64;
}
if (x & 0x200000 > 0) {
result = (result * 0x10000000000162E43) >> 64;
}
if (x & 0x100000 > 0) {
result = (result * 0x100000000000B1721) >> 64;
}
if (x & 0x80000 > 0) {
result = (result * 0x10000000000058B91) >> 64;
}
if (x & 0x40000 > 0) {
result = (result * 0x1000000000002C5C8) >> 64;
}
if (x & 0x20000 > 0) {
result = (result * 0x100000000000162E4) >> 64;
}
if (x & 0x10000 > 0) {
result = (result * 0x1000000000000B172) >> 64;
}
if (x & 0x8000 > 0) {
result = (result * 0x100000000000058B9) >> 64;
}
if (x & 0x4000 > 0) {
result = (result * 0x10000000000002C5D) >> 64;
}
if (x & 0x2000 > 0) {
result = (result * 0x1000000000000162E) >> 64;
}
if (x & 0x1000 > 0) {
result = (result * 0x10000000000000B17) >> 64;
}
if (x & 0x800 > 0) {
result = (result * 0x1000000000000058C) >> 64;
}
if (x & 0x400 > 0) {
result = (result * 0x100000000000002C6) >> 64;
}
if (x & 0x200 > 0) {
result = (result * 0x10000000000000163) >> 64;
}
if (x & 0x100 > 0) {
result = (result * 0x100000000000000B1) >> 64;
}
if (x & 0x80 > 0) {
result = (result * 0x10000000000000059) >> 64;
}
if (x & 0x40 > 0) {
result = (result * 0x1000000000000002C) >> 64;
}
if (x & 0x20 > 0) {
result = (result * 0x10000000000000016) >> 64;
}
if (x & 0x10 > 0) {
result = (result * 0x1000000000000000B) >> 64;
}
if (x & 0x8 > 0) {
result = (result * 0x10000000000000006) >> 64;
}
if (x & 0x4 > 0) {
result = (result * 0x10000000000000003) >> 64;
}
if (x & 0x2 > 0) {
result = (result * 0x10000000000000001) >> 64;
}
if (x & 0x1 > 0) {
result = (result * 0x10000000000000001) >> 64;
}
// We're doing two things at the same time:
//
// 1. Multiply the result by 2^n + 1, where "2^n" is the integer part and the one is added to account for
// the fact that we initially set the result to 0.5. This is accomplished by subtracting from 191
// rather than 192.
// 2. Convert the result to the unsigned 60.18-decimal fixed-point format.
//
// This works because 2^(191-ip) = 2^ip / 2^191, where "ip" is the integer part "2^n".
result *= SCALE;
result >>= (191 - (x >> 64));
}
}
/// @notice Finds the zero-based index of the first one in the binary representation of x.
/// @dev See the note on msb in the "Find First Set" Wikipedia article https://en.wikipedia.org/wiki/Find_first_set
/// @param x The uint256 number for which to find the index of the most significant bit.
/// @return msb The index of the most significant bit as an uint256.
function mostSignificantBit(uint256 x) internal pure returns (uint256 msb) {
if (x >= 2**128) {
x >>= 128;
msb += 128;
}
if (x >= 2**64) {
x >>= 64;
msb += 64;
}
if (x >= 2**32) {
x >>= 32;
msb += 32;
}
if (x >= 2**16) {
x >>= 16;
msb += 16;
}
if (x >= 2**8) {
x >>= 8;
msb += 8;
}
if (x >= 2**4) {
x >>= 4;
msb += 4;
}
if (x >= 2**2) {
x >>= 2;
msb += 2;
}
if (x >= 2**1) {
// No need to shift x any more.
msb += 1;
}
}
/// @notice Calculates floor(x*y÷denominator) with full precision.
///
/// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv.
///
/// Requirements:
/// - The denominator cannot be zero.
/// - The result must fit within uint256.
///
/// Caveats:
/// - This function does not work with fixed-point numbers.
///
/// @param x The multiplicand as an uint256.
/// @param y The multiplier as an uint256.
/// @param denominator The divisor as an uint256.
/// @return result The result as an uint256.
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
unchecked {
result = prod0 / denominator;
}
return result;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
if (prod1 >= denominator) {
revert PRBMath__MulDivOverflow(prod1, denominator);
}
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
unchecked {
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 lpotdod = denominator & (~denominator + 1);
assembly {
// Divide denominator by lpotdod.
denominator := div(denominator, lpotdod)
// Divide [prod1 prod0] by lpotdod.
prod0 := div(prod0, lpotdod)
// Flip lpotdod such that it is 2^256 / lpotdod. If lpotdod is zero, then it becomes one.
lpotdod := add(div(sub(0, lpotdod), lpotdod), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * lpotdod;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/// @notice Calculates floor(x*y÷1e18) with full precision.
///
/// @dev Variant of "mulDiv" with constant folding, i.e. in which the denominator is always 1e18. Before returning the
/// final result, we add 1 if (x * y) % SCALE >= HALF_SCALE. Without this, 6.6e-19 would be truncated to 0 instead of
/// being rounded to 1e-18. See "Listing 6" and text above it at https://accu.org/index.php/journals/1717.
///
/// Requirements:
/// - The result must fit within uint256.
///
/// Caveats:
/// - The body is purposely left uncommented; see the NatSpec comments in "PRBMath.mulDiv" to understand how this works.
/// - It is assumed that the result can never be type(uint256).max when x and y solve the following two equations:
/// 1. x * y = type(uint256).max * SCALE
/// 2. (x * y) % SCALE >= SCALE / 2
///
/// @param x The multiplicand as an unsigned 60.18-decimal fixed-point number.
/// @param y The multiplier as an unsigned 60.18-decimal fixed-point number.
/// @return result The result as an unsigned 60.18-decimal fixed-point number.
function mulDivFixedPoint(uint256 x, uint256 y) internal pure returns (uint256 result) {
uint256 prod0;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 >= SCALE) {
revert PRBMath__MulDivFixedPointOverflow(prod1);
}
uint256 remainder;
uint256 roundUpUnit;
assembly {
remainder := mulmod(x, y, SCALE)
roundUpUnit := gt(remainder, 499999999999999999)
}
if (prod1 == 0) {
unchecked {
result = (prod0 / SCALE) + roundUpUnit;
return result;
}
}
assembly {
result := add(
mul(
or(
div(sub(prod0, remainder), SCALE_LPOTD),
mul(sub(prod1, gt(remainder, prod0)), add(div(sub(0, SCALE_LPOTD), SCALE_LPOTD), 1))
),
SCALE_INVERSE
),
roundUpUnit
)
}
}
/// @notice Calculates floor(x*y÷denominator) with full precision.
///
/// @dev An extension of "mulDiv" for signed numbers. Works by computing the signs and the absolute values separately.
///
/// Requirements:
/// - None of the inputs can be type(int256).min.
/// - The result must fit within int256.
///
/// @param x The multiplicand as an int256.
/// @param y The multiplier as an int256.
/// @param denominator The divisor as an int256.
/// @return result The result as an int256.
function mulDivSigned(
int256 x,
int256 y,
int256 denominator
) internal pure returns (int256 result) {
if (x == type(int256).min || y == type(int256).min || denominator == type(int256).min) {
revert PRBMath__MulDivSignedInputTooSmall();
}
// Get hold of the absolute values of x, y and the denominator.
uint256 ax;
uint256 ay;
uint256 ad;
unchecked {
ax = x < 0 ? uint256(-x) : uint256(x);
ay = y < 0 ? uint256(-y) : uint256(y);
ad = denominator < 0 ? uint256(-denominator) : uint256(denominator);
}
// Compute the absolute value of (x*y)÷denominator. The result must fit within int256.
uint256 rAbs = mulDiv(ax, ay, ad);
if (rAbs > uint256(type(int256).max)) {
revert PRBMath__MulDivSignedOverflow(rAbs);
}
// Get the signs of x, y and the denominator.
uint256 sx;
uint256 sy;
uint256 sd;
assembly {
sx := sgt(x, sub(0, 1))
sy := sgt(y, sub(0, 1))
sd := sgt(denominator, sub(0, 1))
}
// XOR over sx, sy and sd. This is checking whether there are one or three negative signs in the inputs.
// If yes, the result should be negative.
result = sx ^ sy ^ sd == 0 ? -int256(rAbs) : int256(rAbs);
}
/// @notice Calculates the square root of x, rounding down.
/// @dev Uses the Babylonian method https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method.
///
/// Caveats:
/// - This function does not work with fixed-point numbers.
///
/// @param x The uint256 number for which to calculate the square root.
/// @return result The result as an uint256.
function sqrt(uint256 x) internal pure returns (uint256 result) {
if (x == 0) {
return 0;
}
// Set the initial guess to the least power of two that is greater than or equal to sqrt(x).
uint256 xAux = uint256(x);
result = 1;
if (xAux >= 0x100000000000000000000000000000000) {
xAux >>= 128;
result <<= 64;
}
if (xAux >= 0x10000000000000000) {
xAux >>= 64;
result <<= 32;
}
if (xAux >= 0x100000000) {
xAux >>= 32;
result <<= 16;
}
if (xAux >= 0x10000) {
xAux >>= 16;
result <<= 8;
}
if (xAux >= 0x100) {
xAux >>= 8;
result <<= 4;
}
if (xAux >= 0x10) {
xAux >>= 4;
result <<= 2;
}
if (xAux >= 0x8) {
result <<= 1;
}
// The operations can never overflow because the result is max 2^127 when it enters this block.
unchecked {
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1; // Seven iterations should be enough
uint256 roundedDownResult = x / result;
return result >= roundedDownResult ? roundedDownResult : result;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized < type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Internal function that returns the initialized version. Returns `_initialized`
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Internal function that returns the initialized version. Returns `_initializing`
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}{
"optimizer": {
"enabled": true,
"mode": "3",
"fallback_to_optimizing_for_size": true
},
"outputSelection": {
"*": {
"*": [
"abi"
]
}
},
"detectMissingLibraries": false,
"forceEVMLA": false,
"enableEraVMExtensions": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"productId","type":"uint32"}],"name":"AddProduct","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"productId","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"subaccount","type":"bytes32"}],"name":"BalanceUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"productId","type":"uint32"},{"indexed":false,"internalType":"uint128","name":"dt","type":"uint128"},{"indexed":false,"internalType":"int128","name":"depositRateMultiplierX18","type":"int128"},{"indexed":false,"internalType":"int128","name":"borrowRateMultiplierX18","type":"int128"},{"indexed":false,"internalType":"int128","name":"feeAmount","type":"int128"}],"name":"InterestPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"productId","type":"uint32"}],"name":"ProductUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"indexed":true,"internalType":"uint32","name":"productId","type":"uint32"},{"indexed":false,"internalType":"int128","name":"amount","type":"int128"},{"indexed":false,"internalType":"int128","name":"lastCumulativeMultiplierX18","type":"int128"}],"name":"SpotBalance","type":"event"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"uint32","name":"quoteId","type":"uint32"},{"internalType":"address","name":"book","type":"address"},{"internalType":"int128","name":"sizeIncrement","type":"int128"},{"internalType":"int128","name":"minSize","type":"int128"},{"internalType":"int128","name":"lpSpreadX18","type":"int128"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"int128","name":"interestInflectionUtilX18","type":"int128"},{"internalType":"int128","name":"interestFloorX18","type":"int128"},{"internalType":"int128","name":"interestSmallCapX18","type":"int128"},{"internalType":"int128","name":"interestLargeCapX18","type":"int128"}],"internalType":"struct ISpotEngine.Config","name":"config","type":"tuple"},{"components":[{"internalType":"int32","name":"longWeightInitial","type":"int32"},{"internalType":"int32","name":"shortWeightInitial","type":"int32"},{"internalType":"int32","name":"longWeightMaintenance","type":"int32"},{"internalType":"int32","name":"shortWeightMaintenance","type":"int32"},{"internalType":"int128","name":"priceX18","type":"int128"}],"internalType":"struct RiskHelper.RiskStore","name":"riskStore","type":"tuple"}],"name":"addProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"assertUtilization","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"internalType":"int128","name":"amountLp","type":"int128"}],"name":"burnLp","outputs":[{"internalType":"int128","name":"amountBase","type":"int128"},{"internalType":"int128","name":"amountQuote","type":"int128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"liquidatee","type":"bytes32"},{"internalType":"bytes32","name":"liquidator","type":"bytes32"}],"name":"decomposeLps","outputs":[{"internalType":"int128","name":"liquidationFees","type":"int128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"bytes32","name":"subaccount","type":"bytes32"}],"name":"getBalance","outputs":[{"components":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"int128","name":"lastCumulativeMultiplierX18","type":"int128"}],"internalType":"struct ISpotEngine.Balance","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClearinghouse","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getConfig","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"int128","name":"interestInflectionUtilX18","type":"int128"},{"internalType":"int128","name":"interestFloorX18","type":"int128"},{"internalType":"int128","name":"interestSmallCapX18","type":"int128"},{"internalType":"int128","name":"interestLargeCapX18","type":"int128"}],"internalType":"struct ISpotEngine.Config","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"enum IProductEngine.HealthType","name":"healthType","type":"uint8"}],"name":"getCoreRisk","outputs":[{"components":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"int128","name":"price","type":"int128"},{"internalType":"int128","name":"longWeight","type":"int128"}],"internalType":"struct IProductEngine.CoreRisk","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEndpoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEngineType","outputs":[{"internalType":"enum IProductEngine.EngineType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"internalType":"enum IProductEngine.HealthType","name":"healthType","type":"uint8"}],"name":"getHealthContribution","outputs":[{"internalType":"int128","name":"health","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getMinDepositRate","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProductIds","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getRisk","outputs":[{"components":[{"internalType":"int128","name":"longWeightInitialX18","type":"int128"},{"internalType":"int128","name":"shortWeightInitialX18","type":"int128"},{"internalType":"int128","name":"longWeightMaintenanceX18","type":"int128"},{"internalType":"int128","name":"shortWeightMaintenanceX18","type":"int128"},{"internalType":"int128","name":"priceX18","type":"int128"}],"internalType":"struct RiskHelper.Risk","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"bytes32","name":"subaccount","type":"bytes32"}],"name":"getStateAndBalance","outputs":[{"components":[{"internalType":"int128","name":"cumulativeDepositsMultiplierX18","type":"int128"},{"internalType":"int128","name":"cumulativeBorrowsMultiplierX18","type":"int128"},{"internalType":"int128","name":"totalDepositsNormalized","type":"int128"},{"internalType":"int128","name":"totalBorrowsNormalized","type":"int128"}],"internalType":"struct ISpotEngine.State","name":"","type":"tuple"},{"components":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"int128","name":"lastCumulativeMultiplierX18","type":"int128"}],"internalType":"struct ISpotEngine.Balance","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"bytes32","name":"subaccount","type":"bytes32"}],"name":"getStatesAndBalances","outputs":[{"components":[{"internalType":"int128","name":"supply","type":"int128"},{"components":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"int128","name":"lastCumulativeMultiplierX18","type":"int128"}],"internalType":"struct ISpotEngine.Balance","name":"quote","type":"tuple"},{"components":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"int128","name":"lastCumulativeMultiplierX18","type":"int128"}],"internalType":"struct ISpotEngine.Balance","name":"base","type":"tuple"}],"internalType":"struct ISpotEngine.LpState","name":"","type":"tuple"},{"components":[{"internalType":"int128","name":"amount","type":"int128"}],"internalType":"struct ISpotEngine.LpBalance","name":"","type":"tuple"},{"components":[{"internalType":"int128","name":"cumulativeDepositsMultiplierX18","type":"int128"},{"internalType":"int128","name":"cumulativeBorrowsMultiplierX18","type":"int128"},{"internalType":"int128","name":"totalDepositsNormalized","type":"int128"},{"internalType":"int128","name":"totalBorrowsNormalized","type":"int128"}],"internalType":"struct ISpotEngine.State","name":"","type":"tuple"},{"components":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"int128","name":"lastCumulativeMultiplierX18","type":"int128"}],"internalType":"struct ISpotEngine.Balance","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"}],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clearinghouse","type":"address"},{"internalType":"address","name":"_offchainExchange","type":"address"},{"internalType":"address","name":"_quote","type":"address"},{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"address","name":"_admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int128[]","name":"totalDeposits","type":"int128[]"},{"internalType":"int128[]","name":"totalBorrows","type":"int128[]"}],"name":"manualAssert","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrationFlag","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"internalType":"int128","name":"amountBase","type":"int128"},{"internalType":"int128","name":"quoteAmountLow","type":"int128"},{"internalType":"int128","name":"quoteAmountHigh","type":"int128"}],"name":"mintLp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"subaccount","type":"bytes32"}],"name":"socializeSubaccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"int128","name":"baseDelta","type":"int128"},{"internalType":"int128","name":"quoteDelta","type":"int128"}],"name":"swapLp","outputs":[{"internalType":"int128","name":"","type":"int128"},{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"internalType":"int128","name":"amountDelta","type":"int128"}],"name":"updateBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"internalType":"int128","name":"amountDelta","type":"int128"},{"internalType":"int128","name":"quoteDelta","type":"int128"}],"name":"updateBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"int128","name":"minDepositRateX18","type":"int128"}],"name":"updateMinDepositRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"internalType":"int128","name":"priceX18","type":"int128"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"rawTxn","type":"bytes"}],"name":"updateProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"subaccount","type":"bytes32"},{"internalType":"int128","name":"insurance","type":"int128"}],"name":"updateQuoteFromInsurance","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"productId","type":"uint32"},{"components":[{"internalType":"int32","name":"longWeightInitial","type":"int32"},{"internalType":"int32","name":"shortWeightInitial","type":"int32"},{"internalType":"int32","name":"longWeightMaintenance","type":"int32"},{"internalType":"int32","name":"shortWeightMaintenance","type":"int32"},{"internalType":"int128","name":"priceX18","type":"int128"}],"internalType":"struct RiskHelper.RiskStore","name":"riskStore","type":"tuple"}],"name":"updateRisk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"dt","type":"uint128"}],"name":"updateStates","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010019370f4379574a9f4c81bc274bbaebdae34ca449c22968340a3966c3fe3000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0001000000000002002200000000000200000000000103550000008003000039000000400030043f0000000100200190000000420000c13d00000060021002700000187d02200197000000040020008c00000c960000413d000000000301043b000000e0033002700000187f0030009c0000004a0000213d000018980030009c000000e90000a13d000018990030009c000001b30000a13d0000189a0030009c000003520000a13d0000189b0030009c00000c840000613d0000189c0030009c000008b90000613d0000189d0030009c00000c960000c13d000000240020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b000100000001001d000018cb0010009c00000c960000213d0000006501000039000000000101041a000018c5011001970000000002000411000000000012004b00000d770000c13d0000000101000029000018fa03100197000000800000043f000000a00000043f000000c00000043f000000e00000043f0000014001000039000000400010043f0000000304000039000001000040043f000018fd02000041000001200020043f000018fe0030009c00002a740000413d000018c401000041000001400010043f0000002001000039000001440010043f000001640040043f000001840020043f000001870000043f0000190a01000041000061f0000104300000000001000416000000000001004b00000c960000c13d0000002001000039000001000010044300000120000004430000187e01000041000061ef0001042e000018800030009c000001a60000a13d000018810030009c000001d20000a13d000018820030009c000003b10000a13d000018830030009c00000c8d0000613d000018840030009c0000090c0000613d000018850030009c00000c960000c13d000000840020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000202043b001d00000002001d0000187d0020009c00000c960000213d0000002402100370000000000202043b001c00000002001d0000004401100370000000000101043b001700000001001d61ee548a0000040f00000064010000390000000001100367000000000101043b001600000001001d61ee548a0000040f61ee57e70000040f00000000020100190000001d0000006b0000000001000039000000010100c03961ee56990000040f61ee57a20000040f0000001d01000029000000000010043f0000006c01000039000000200010043f000000400100003961ee61d30000040f001a00000001001d000000400100043d001b00000001001d61ee54e40000040f000000010100008a0000001a07000029000000000207041a000018b003200197000018b00030009c0000000003000019000000000301601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000001b0600002900000020046000390000000000340435000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000000002604350000000102700039000000000202041a000018b200200198000018b3030000410000000003006019000018b104200197000000000343019f00000040046000390000000000340435000018b003200197000018b00030009c000000000100c01900000080011002100000008003200270000000000113019f000000800000008b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f00000060026000390000000000120435000000000000043f0000006c01000039000000200010043f000018b40100004161ee572c0000040f001a00000001001d0000001d0100002961ee55600000040f0000001c0200002961ee57690000040f61ee57780000040f000000000000043f0000006d02000039000000200020043f001800000001001d000018b5010000410000001c0200002961ee57690000040f61ee57780000040f001900000001001d0000001b010000290000001802000029000000170300002961ee5b400000040f0000001a010000290000001902000029000000160300002961ee5b400000040f0000001d0100002961ee55600000040f0000001c0200002961ee57690000040f000000180200002961ee579b0000040f000000000000043f0000006d01000039000000200010043f000018b5010000410000001c0200002961ee57690000040f000000190200002961ee579b0000040f0000001d0100002961ee554f0000040f0000001b0200002961ee56fd0000040f000000000000043f0000006c01000039000000200010043f000018b4010000410000001a0200002961ee56fd0000040f0000001d010000290000001c0200002961ee5e540000040f0000001c0100002961ee5d680000040f00000b760000013d000018a50030009c000002360000213d000018ab0030009c000003f20000213d000018ae0030009c0000095a0000613d000018af0030009c00000c960000c13d000000a40020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000202043b001d00000002001d000018c50020009c00000c960000213d0000002402100370000000000202043b001c00000002001d000018c50020009c00000c960000213d0000004402100370000000000202043b001b00000002001d000018c50020009c00000c960000213d0000006402100370000000000202043b001a00000002001d000018c50020009c00000c960000213d0000008401100370000000000101043b001900000001001d000018c50010009c00000c960000213d000000000100041a0000ffff001001900000000002010019000035e20000c13d0000ff00001001900000192c0120019700000001031001bf000000000030041b000000400100043d0000370b0000c13d0000192d0230019700000100022001bf000000000020041b0000000002000411000018c5062001970000003304000039000000000204041a000018e903200197000000000363019f000000000034041b0000187d0010009c0000187d01008041000000400110021000000000030004140000187d0030009c0000187d03008041000000c003300210000000000113019f000018c50520019700001921011001c70000800d020000390000000303000039000019190400004161ee61e40000040f000000010020019000000c960000613d0000003301000039000000000101041a000018c5021001970000000003000411000000000032004b000038c00000c13d0000006502000039000000000302041a000018e9033001970000001a033001af000000000032041b000000190000006b000038780000613d000018e9011001970000001906000029000000000161019f0000003302000039000000000012041b000000400100043d0000187d0010009c0000187d01008041000000400110021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f00001921011001c70000800d0200003900000003030000390000191904000041000000000500041161ee61e40000040f000000010020019000000c960000613d0000006601000039000000000201041a000018e9022001970000001d022001af000000000021041b0000001a01000029000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000201041a0000192c0220019700000001022001bf000000000021041b0000001d01000029000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000201041a0000192c0220019700000001022001bf000000000021041b0000001c01000029000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000201041a0000192c0220019700000001022001bf000000000021041b000000000200041a0000192e01200197000000000010041b0000000103000039000000400100043d00000000003104350000187d0010009c0000187d01008041000000400110021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018e7011001c70000800d02000039000019240400004161ee61e40000040f000000010020019000000c960000613d000041940000013d0000188d0030009c0000024b0000213d000018930030009c000004250000213d000018960030009c000009710000613d000018970030009c00000c960000c13d0000000001000416000000000001004b00000c960000c13d000000660100003900000c880000013d000018a00030009c0000029e0000213d000018a30030009c000006bd0000613d000018a40030009c00000c960000c13d0000000001000416000000000001004b00000c960000c13d0000003301000039000000000201041a000018c5032001970000000005000411000000000053004b00000d6e0000c13d000018e902200197000000000021041b00000000010004140000187d0010009c0000187d01008041000000c00110021000001918011001c70000800d0200003900000003030000390000191904000041000000000600001961ee61e40000040f000000010020019000000c960000613d0000191a01000041000061ef0001042e000018880030009c000002dd0000213d0000188b0030009c000007800000613d0000188c0030009c00000c960000c13d0000000001000416000000000001004b00000c960000c13d000000000102001961ee55090000040f001d00000001001d001c00000002001d001a00000003001d61ee57a20000040f0000001d010000290000187d01100197000000000010043f0000006c01000039000000200010043f000000400100003961ee61d30000040f001900000001001d000000400100043d001b00000001001d61ee54e40000040f000000010100008a0000001907000029000000000207041a000018b003200197000018b00030009c0000000003000019000000000301601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000001b0600002900000020046000390000000000340435000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000000002604350000000102700039000000000202041a000018b200200198000018b3030000410000000003006019000018b104200197000000000343019f00000040046000390000000000340435000018b003200197000018b00030009c000000000100c01900000080011002100000008003200270000000000113019f000000800000008b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000000600260003900000000001204350000001d0100002961ee55600000040f0000001c0200002961ee57690000040f61ee57780000040f0000000002010019001900000001001d0000001b010000290000001a0300002961ee5b400000040f0000001d0100002961ee55600000040f0000001c0200002961ee57690000040f000000190200002961ee579b0000040f0000001d0100002961ee554f0000040f0000001b0200002961ee56fd0000040f0000001d010000290000001c0200002961ee5e540000040f00000b760000013d000018a60030009c000004320000213d000018a90030009c000009760000613d000018aa0030009c00000c960000c13d000000240020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b0000187d0010009c00000c960000213d000000000010043f0000006b01000039000000200010043f000000400100003961ee61d30000040f00000c880000013d0000188e0030009c000004670000213d000018910030009c00000ae80000613d000018920030009c00000c960000c13d000000640020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000202043b001d00000002001d0000187d0020009c00000c960000213d0000002402100370000000000402043b000018b200400198000018b3020000410000000002006019000018b103400197000000000232019f001c00000004001d000000000042004b00000c960000c13d0000004401100370000000000301043b000018b200300198000018b3010000410000000001006019000018b102300197000000000121019f001b00000003001d000000000031004b00000c960000c13d0000000001000411000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400300043d000018b70030009c00000e1c0000213d000000000101043b000000000101041a0000004002300039000000400020043f00000001020000390000000002230436000018b8040000410000000000420435000000ff00100190000035fa0000c13d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000002960000413d000007c60000013d000018a10030009c000007cb0000613d000018a20030009c00000c960000c13d000000440020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000002402100370000000000202043b001100000002001d000000020020008c00000c960000213d0000000401100370000000000101043b001200000001001d0000006801000039000000000201041a000000800020043f000000000010043f000000080020008c00000d830000413d000000a001000039000018f2040000410000000003000019000000e005100039000000000604041a000000e0076002700000000000750435000000c0056002700000187d05500197000000c0071000390000000000570435000000a0056002700000187d05500197000000a007100039000000000057043500000080056002700000187d055001970000008007100039000000000057043500000060056002700000187d055001970000006007100039000000000057043500000040056002700000187d055001970000004007100039000000000057043500000020056002700000187d05500197000000200710003900000000005704350000187d05600197000000000051043500000001044000390000010001100039000000080330003900000007053001bf000000000025004b000002b80000413d00000d860000013d000018890030009c000007e10000613d0000188a0030009c00000c960000c13d000000240020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b001d00000001001d0000187d0010009c00000c960000213d61ee553a0000040f0000001d01000029000000000010043f0000006b01000039000000200010043f000000400100003961ee61d30000040f001d00000001001d000000400100043d001c00000001001d61ee54ef0000040f0000001d09000029000000000109041a000018c5011001970000001c0800002900000000021804360000000103900039000000000303041a000000010400008a000018b005300197000018b00050009c0000000005000019000000000504601900000080055002100000008006300270000000000556019f000000800000008b0000000005036019000018b106300197000018b200300198000018b3030000410000000003006019000000000363019f0000000000320435000018b103500197000018b200500198000018b3050000410000000005006019000000000535019f000000400380003900000000005304350000000205900039000000000505041a000018b006500197000018b00060009c000000000400c01900000080044002100000008006500270000000000446019f000000800000008b0000000004056019000018b106500197000018b200500198000018b3050000410000000005006019000000000565019f00000060068000390000000000560435000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000080058000390000000000450435000000400400043d00000000011404360000000002020433000018b107200197000018b200200198000018b3020000410000000002006019000000000272019f00000000002104350000000001030433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000400240003900000000001204350000000001060433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000600240003900000000001204350000000001050433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000800240003900000000001204350000187d0040009c0000187d040080410000004001400210000018c9011001c7000061ef0001042e0000189e0030009c000008450000613d0000189f0030009c00000c960000c13d000000640020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000002402100370000000000202043b001d00000002001d0000187d0020009c00000c960000213d0000004401100370000000000101043b001c00000001001d000000020010008c00000c960000213d000000e001000039000000400010043f000000800000043f000000a00000043f000000c00000043f61ee553a0000040f0000001d0100002961ee55930000040f00000004020000390000000002200367000000000202043b001a00000001001d0000001d0100002961ee60540000040f0000001a0300002900000080023000390000000002020433001b00000002001d001d00000001001d00000000010300190000001c0200002961ee61bc0000040f001c00000001001d000000400100043d001a00000001001d61ee54d90000040f0000001b02000029000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f0000001a06000029000000200260003900000000001204350000001d03000029000018b101300197000018b200300198000018b3030000410000000003006019000000000413019f00000000004604350000001c05000029000018b104500197000018b200500198000018b3050000410000000005006019000000000445019f00000040056000390000000000450435000018b200300198000018b3030000410000000003006019000000000113019f000000400300043d00000000011304360000000002020433000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f00000000002104350000000001050433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000400230003900000000001204350000187d0030009c0000187d0300804100000040013002100000190e011001c7000061ef0001042e000018860030009c000008870000613d000018870030009c00000c960000c13d000000240020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b001d00000001001d0000187d0010009c00000c960000213d61ee553a0000040f61ee553a0000040f0000001d0100002961ee55930000040f0000000032010434000018b104200197000018b200200198000018b3020000410000000002006019000000000442019f000000400200043d00000000044204360000000003030433000018b105300197000018b200300198000018b3030000410000000003006019000000000353019f000000000034043500000040031000390000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000004004200039000000000034043500000060031000390000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000006004200039000000000034043500000080011000390000000001010433000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000000800320003900000000001304350000187d0020009c0000187d020080410000004001200210000018c9011001c7000061ef0001042e000018ac0030009c00000b560000613d000018ad0030009c00000c960000c13d000000440020008c00000c960000413d0000000003000416000000000003004b00000c960000c13d0000000403100370000000000303043b000018e10030009c00000c960000213d0000002304300039000000000024004b00000c960000813d0000000404300039000000000441034f000000000404043b001c00000004001d000018e10040009c00000c960000213d001b00240030003d0000001c0300002900000005033002100000001b03300029000000000023004b00000c960000213d0000002403100370000000000303043b000018e10030009c00000c960000213d0000002304300039000000000024004b00000c960000813d0000000404300039000000000141034f000000000101043b001a00000001001d000018e10010009c00000c960000213d001900240030003d0000001a0100002900000005011002100000001901100029000000000021004b00000c960000213d0000001c0000006b000037680000c13d000000800100003900000b770000013d000018940030009c00000b7b0000613d000018950030009c00000c960000c13d0000000001000416000000000001004b00000c960000c13d0000007001000039000000000101041a000018e101100197000000800010043f000018f101000041000061ef0001042e000018a70030009c00000bb50000613d000018a80030009c00000c960000c13d0000000001000416000000000001004b00000c960000c13d0000006801000039000000000201041a000000800020043f000000000010043f000000080020008c00000ca30000413d000000a001000039000018f2040000410000000003000019000000e005100039000000000604041a000000e0076002700000000000750435000000c0056002700000187d05500197000000c0071000390000000000570435000000a0056002700000187d05500197000000a007100039000000000057043500000080056002700000187d055001970000008007100039000000000057043500000060056002700000187d055001970000006007100039000000000057043500000040056002700000187d055001970000004007100039000000000057043500000020056002700000187d05500197000000200710003900000000005704350000187d05600197000000000051043500000001044000390000010001100039000000080330003900000007053001bf000000000025004b000004420000413d00000ca60000013d0000188f0030009c00000bbb0000613d000018900030009c00000c960000c13d000002040020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000202043b001d00000002001d0000187d0020009c00000c960000213d0000002402100370000000000202043b001c00000002001d0000187d0020009c00000c960000213d0000004402100370000000000202043b001b00000002001d000018c50020009c00000c960000213d0000006402100370000000000402043b000018b200400198000018b3020000410000000002006019000018b103400197000000000232019f001a00000004001d000000000042004b00000c960000c13d0000008402100370000000000402043b000018b200400198000018b3020000410000000002006019000018b103400197000000000232019f001900000004001d000000000042004b00000c960000c13d000000a402100370000000000402043b000018b200400198000018b3020000410000000002006019000018b103400197000000000232019f001800000004001d000000000042004b00000c960000c13d0000003302000039000000000202041a000018c5022001970000000003000411000000000032004b00000d6e0000c13d0000001d0000006b00000c960000613d0000012002000039000000400020043f0000016402100370000000000202043b000018d200200198000018d3050000410000000005006019000018d404200197000000000345019f000000000032004b00000c960000c13d000000800020043f0000018402100370000000000202043b000018d200200198000018d3030000410000000003006019000018d406200197000000000363019f000000000032004b00000c960000c13d000000a00020043f000001a403100370000000000303043b000018d200300198000018d3070000410000000007006019000018d406300197000000000867019f000000000083004b00000c960000c13d000000c00030043f000001c403100370000000000303043b000018d200300198000018d3080000410000000008006019000018d409300197000000000898019f000000000083004b00000c960000c13d000000e00030043f000001e401100370000000000101043b000018b200100198000018b3080000410000000008006019000018b109100197000000000898019f000000000018004b00000c960000c13d000001000010043f0000001b0000006b00000c960000613d000018d200500198000018d3010000410000000001006019000000000141019f000018d200700198000018d3040000410000000004006019000000000664019f000018b004600197000018b005100197000000000745013f000000000045004b0000000008000019000018b008004041000000000061004b0000000001000019000018b001002041000018b00070009c000000000801c0190000016001000039000000400010043f0000000301000039000001200010043f000018d504000041000001400040043f000018d60060009c00000000050000390000000105002039000018b00060009c00000000060000390000000106004039000000000008004b000046f30000c13d000000000556016f0000000100500190000046f30000c13d000000000032004b0000000005000019000018b005004041000018b006300197000018b002200197000000000762013f000000000062004b0000000002000019000018b002002041000018b00070009c000000000205c019000000000002004b000046f30000c13d000018bc0030009c000046f30000213d000018d70030009c000046f30000a13d0000001d01000029000000000010043f000018d801000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000800200043d0000187d02200197000000a00300043d0000002003300210000018d903300197000000000223019f000000c00300043d0000004003300210000018da03300197000000000232019f000000e00300043d0000006003300210000018db03300197000000000232019f000001000300043d0000008003300210000000000232019f000000000101043b000000000021041b0000006601000039000000000101041a000018dc020000410000000000200443000018c501100197001700000001001d000000040010044300000000010004140000187d0010009c0000187d01008041000000c001100210000018dd011001c7000080020200003961ee61e90000040f000000010020019000004a9c0000613d000000000101043b000000000001004b00000c960000613d000000400300043d000018de01000041000000000013043500000004013000390000001d0200002900000000002104350000187d0030009c001600000003001d0000187d010000410000000001034019001500400010021800000000010004140000187d0010009c0000187d01008041000000c00110021000000015011001af000018df011001c7000000170200002961ee61e40000040f00000001002001900000486e0000613d0000001601000029000018e10010009c00000e1c0000213d0000001601000029000000400010043f0000006801000039000000000301041a000018e10030009c00000e1c0000213d0000000102300039000000000021041b0000000502300210000000e00220018f0000001d042001ef0000187d0520021f0000192f05500167000000000010043f0000000303300270000018e20330009a000000000603041a000000000556016f000000000445019f000000000043041b000000000301041a000000000003004b000044470000613d000000010430008c000036e00000c13d0000006501000039000000000201041a000018e3010000410000001603000029000000000013043500000000010004140000187d0010009c0000187d01008041000000c00110021000000015011001af000018e4011001c7000018c50220019761ee61e90000040f00000060031002700000187d03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000001605700029000005900000613d000000000801034f0000001609000029000000008a08043c0000000009a90436000000000059004b0000058c0000c13d000000000006004b0000059d0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000004aeb0000613d0000001f01400039000000600210018f0000001601200029000000000021004b00000000020000390000000102004039000018e10010009c00000e1c0000213d000000010020019000000e1c0000c13d000000400010043f000000200030008c00000c960000413d00000016010000290000000001010433001700000001001d000018c50010009c00000c960000213d000018dc0100004100000000001004430000001701000029000000040010044300000000010004140000187d0010009c0000187d01008041000000c001100210000018dd011001c7000080020200003961ee61e90000040f000000010020019000004a9c0000613d000000000101043b000000000001004b00000c960000613d000000400300043d000000a4013000390000001802000029000000000021043500000084013000390000001902000029000000000021043500000064013000390000001a02000029000000000021043500000044013000390000001b0200002900000000002104350000001c010000290000187d0110019700000024023000390000000000120435000018e501000041000000000013043500000004013000390000001d0200002900000000002104350000187d0030009c001c00000003001d0000187d010000410000000001034019001b00400010021800000000010004140000187d0010009c0000187d01008041000000c0011002100000001b011001af000018e6011001c7000000170200002961ee61e40000040f000000010020019000004d170000613d0000001c01000029000018e10010009c00000e1c0000213d0000001c02000029000000400020043f0000001d01000029000000000012043500000000010004140000187d0010009c0000187d01008041000000c0011002100000001b011001af000018e7011001c70000800d020000390000000103000039000018e80400004161ee61e40000040f000000010020019000000c960000613d0000001d01000029000000000010043f0000006b01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000201043b0000000001000367000000c403100370000000000303043b000018c50030009c00000c960000213d000000000402041a000018e904400197000000000334019f000000000032041b000000e403100370000000000303043b000018b200300198000018b3040000410000000004006019000018b105300197000000000454019f000000000034004b00000c960000c13d000018cb043001970000000103200039000000000503041a000018cc05500197000000000545019f000000000053041b0000010405100370000000000505043b000018b200500198000018b3060000410000000006006019000018b107500197000000000676019f000000000056004b00000c960000c13d0000008005500210000000000445019f000000000043041b0000012403100370000000000303043b000018b200300198000018b3040000410000000004006019000018b105300197000000000454019f000000000034004b00000c960000c13d000018cb033001970000000202200039000000000402041a000018cc04400197000000000434019f000000000042041b0000014401100370000000000101043b000018b200100198000018b3040000410000000004006019000018b105100197000000000454019f000000000014004b00000c960000c13d0000008001100210000000000131019f000000000012041b000000400100043d001c00000001001d000018b90010009c00000e1c0000213d0000001c020000290000008001200039000000400010043f0000002003200039000018c001000041001a00000003001d000000000013043500000000001204350000006001200039001b00000001001d00000000000104350000004001200039001900000001001d00000000000104350000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001c020000290000000002020433000018cb022001970000001a0300002900000000030304330000008003300210000000000223019f000000000101043b000000000021041b00000019020000290000000002020433000018cb022001970000001b0300002900000000030304330000008003300210000000000223019f0000000101100039000000000021041b000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000002002100039000018c00300004100000000003204350000000000010435000000400200043d000018b70020009c00000e1c0000213d0000004004200039000000400040043f000000200420003900000000003404350000000000020435000000400300043d001c00000003001d000018cf0030009c00000e1c0000213d0000001c040000290000006003400039000000400030043f0000004003400039001b00000003001d00000000002304350000002002400039001a00000002001d000000000012043500000000000404350000001d01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001c020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b0000001a0200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000103100039000000000023041b0000001b0200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f000000020110003900000b750000013d000000240020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b001d00000001001d0000187d0010009c00000c960000213d000000800000043f000000a00000043f000000c00000043f000000e00000043f0000014001000039000000400010043f000001000000043f000001200000043f0000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001c00000002001d000018b90020009c00000e1c0000213d000000000101043b0000001c070000290000008002700039000000400020043f000000000201041a000018b003200197000000010400008a000018b00030009c0000000003000019000000000304601900000080033002100000008005200270000000000335019f000000800000008b0000000003026019000018b106200197000018b200200198000018b3020000410000000002006019000000000262019f0000000006270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f001b00000006001d00000000002604350000000101100039000000000101041a000018b002100197000018b00020009c000000000400c01900000080024002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000004003700039001a00000003001d0000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f0000006002700039001900000002001d00000000001204350000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000000102000039000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c00000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b304000041000000000400601900000000021401a000000000030000390000000103006039000018bc0020009c0000000002000039000000010200203900000000003201a00000001c0300002900000000020300190000001b0200c0290000000002020433000018b200200198000018b3030000410000000003006019000018b200400198000018b3060000410000000006006019000000400500043d000018b70050009c00000e1c0000213d000018b102200197000000000423019f000000000116019f00000000064100a90000004001500039000000400010043f00000002010000390000000003150436000018bd020000410000000000230435000000400200043d000018be0760009a000018bf0070009c00003bbe0000213d000018c4010000410000000000120435000000040120003900000020040000390000000000410435000000240420003900000000010504330000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b000007780000413d0000372a0000013d000000640020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000202043b001d00000002001d0000187d0020009c00000c960000213d0000004402100370000000000402043b000018b103400197001a18b20040019c000018b3020000410000000002006019001b00000003001d000000000232019f001c00000004001d000000000042004b00000c960000c13d0000002401100370000000000101043b001900000001001d0000000001000411000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400300043d000018b70030009c00000e1c0000213d000000000101043b000000000401041a0000004001300039000000400010043f00000001010000390000000002130436000018b8010000410000000000120435000000400100043d000000ff00400190000034b60000c13d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000240410003900000000030304330000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000007bf0000413d000007c90000a13d000000000243001900000000000204350000001f02300039000046270000013d000000440020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000302043b0000187d0030009c00000c960000213d0000002401100370000000000201043b000000000103001961ee5f6c0000040f000000400200043d001d00000002001d61ee54a90000040f0000001d010000290000187d0010009c0000187d01008041000000400110021000001916011001c7000061ef0001042e000000440020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b001d00000001001d0000187d0010009c00000c960000213d61ee5f590000040f61ee5ceb0000040f0000001d01000029000000000010043f0000006c01000039000000200010043f000000400100003961ee61d30000040f001b00000001001d000000400100043d001c00000001001d61ee54e40000040f000000010100008a0000001b07000029000000000207041a000018b003200197000018b00030009c0000000003000019000000000301601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000001c0600002900000020046000390000000000340435000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000000002604350000000102700039000000000202041a000018b200200198000018b3030000410000000003006019000018b104200197000000000343019f00000040046000390000000000340435000018b003200197000018b00030009c000000000100c01900000080011002100000008003200270000000000113019f000000800000008b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000000600260003900000000001204350000001d0100002961ee55600000040f00000024020000390000000002200367000000000202043b000000000020043f000000200010043f000000400100003961ee61d30000040f61ee57780000040f00000000020100190000001c0100002961ee5cfa0000040f001b00000001001d000000400200043d001d00000002001d0000001c0100002961ee54b80000040f0000001d0100002900000080021000390000001b0100002961ee54a90000040f0000001d010000290000187d0010009c0000187d010080410000004001100210000018cd011001c7000061ef0001042e000000240020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b001200000001001d0000006601000039000000000101041a000000c002000039000000400020043f0000000102000039000000800020043f000018b802000041000000a00020043f000018c5011001970000000002000411000000000012004b00000c980000c13d0000006801000039000000000201041a000000c00020043f000000000010043f000000080020008c00000dd80000413d000000e001000039000018f2040000410000000003000019000000e005100039000000000604041a000000e0076002700000000000750435000000c0056002700000187d05500197000000c0071000390000000000570435000000a0056002700000187d05500197000000a007100039000000000057043500000080056002700000187d055001970000008007100039000000000057043500000060056002700000187d055001970000006007100039000000000057043500000040056002700000187d055001970000004007100039000000000057043500000020056002700000187d05500197000000200710003900000000005704350000187d05600197000000000051043500000001044000390000010001100039000000080330003900000007053001bf000000000025004b000008620000413d00000ddb0000013d000000440020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000202043b001d00000002001d0000187d0020009c00000c960000213d0000002401100370000000000301043b000018b200300198000018b3010000410000000001006019000018b102300197000000000121019f001c00000003001d000000000031004b00000c960000c13d0000006601000039000000000101041a000000c002000039000000400020043f0000000102000039000000800020043f000018b802000041000000a00020043f000018c5011001970000000002000411000000000012004b00000c980000c13d61ee56be0000040f00000000020100190000001c01000029000018ca0010009c0000000001000039000000010100403961ee56990000040f0000001d01000029000000000010043f0000007101000039000000200010043f000000400100003961ee61d30000040f0000001c02000029000018cb02200197000000000301041a000018cc0330019700000b740000013d000000a40020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000202043b0000187d0020009c00000c960000213d0000004402100370000000000202043b000018b200200198000018b3030000410000000003006019000018b104200197000000000343019f000000000023004b00000c960000c13d0000006402100370000000000202043b000018b200200198000018b3030000410000000003006019000018b104200197000000000343019f000000000023004b00000c960000c13d0000008401100370000000000101043b000018b200100198000018b3020000410000000002006019000018b103100197000000000232019f000000000012004b00000c960000c13d0000000001000411000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400300043d000018b70030009c00000e1c0000213d000000000101043b000000000101041a0000004002300039000000400020043f00000001020000390000000002230436000018b8040000410000000000420435000000ff00100190000037380000c13d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000009040000413d000007c60000013d000000440020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000002402100370000000000402043b000018b200400198000018b3020000410000000002006019000018b103400197000000000232019f0000000401100370000000000101043b001d00000001001d001c00000004001d000000000042004b00000c960000c13d0000000001000411000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018b70020009c00000e1c0000213d000000000101043b000000000301041a0000004001200039000000400010043f00000001010000390000000001120436000018b8040000410000000000410435000000400700043d000000ff003001900000341b0000c13d000018c4030000410000000000370435000000040370003900000020040000390000000000430435000000240370003900000000020204330000000000230435000000000002004b0000094f0000613d0000004403700039000000000400001900000000053400190000000006140019000000000606043300000000006504350000002004400039000000000024004b000009450000413d0000094f0000a13d000000000132001900000000000104350000001f01200039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0070009c0000187d070080410000004002700210000000000121019f000061f000010430000000240020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b0000187d0010009c00000c960000213d000000000010043f0000007101000039000000200010043f000000400100003961ee61d30000040f000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000800010043f000018f101000041000061ef0001042e0000000001000416000000000001004b00000c960000c13d000000650100003900000c880000013d000000440020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b001d00000001001d0000187d0010009c00000c960000213d000000800000043f000000e00000043f000001000000043f000000e001000039000000a00010043f000001200000043f000001400000043f0000012001000039000000c00010043f000001600000043f000001800000043f000001a00000043f000001c00000043f000001e00000043f0000024001000039000000400010043f000002000000043f000002200000043f0000001d01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000400200043d001c00000002001d000018cf0020009c00000e1c0000213d0000001c040000290000006002400039000000400020043f000000000201041a000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000002240436001b00000002001d000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000103100039000000000303041a000018b004300197000000010500008a000018b00040009c0000000004000019000000000405601900000080044002100000008005300270000000000445019f000000800000008b0000000004036019000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000020052000390000000000450435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000000003204350000001b030000290000000000230435000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000201100039000000000101041a000018b003100197000018b00030009c000000010300008a000000000300c01900000080033002100000008004100270000000000334019f000000800000008b0000000003016019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000020042000390000000000340435000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001c010000290000004001100039001a00000001001d00000000002104350000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001900000002001d000018b90020009c00000e1c0000213d000000000101043b00000019050000290000008002500039000000400020043f000000000201041a000018b003200197000018b00030009c000000010600008a0000000003000019000000000306601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000004250436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f001700000004001d00000000002404350000000101100039000000000101041a000018b002100197000018b00020009c000000000600c01900000080026002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000004003500039001500000003001d0000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f0000006002500039001600000002001d000000000012043500000024010000390000000001100367000000000101043b001800000001001d0000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001802000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000201043b000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f000018cf0010009c00000e1c0000213d0000006004100039000000400040043f000000000402041a000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000000004304350000000003310436000000400500043d000018bb0050009c00000e1c0000213d0000000004050019001d00000004001d0000002004400039000000400040043f0000000102200039000000000202041a000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f000000000025043500000000005304350000000002010433000000190100002961ee5cfa0000040f0000001c020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000332019f000000400200043d00000000033204360000001b0400002900000000040404330000000054040434000018b106400197000018b200400198000018b3040000410000000004006019000000000464019f00000000004304350000000003050433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000400420003900000000003404350000001a0300002900000000030304330000000043030434000018b105300197000018b200300198000018b3030000410000000003006019000000000353019f000000600520003900000000003504350000000003040433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000800420003900000000003404350000001d030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000a004200039000000000034043500000019030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000c004200039000000000034043500000017030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000e004200039000000000034043500000015030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000010004200039000000000034043500000016030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000001200420003900000000003404350000000031010434000018b104100197000018b200100198000018b3010000410000000001006019000000000141019f000001400420003900000000001404350000000001030433000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000001600320003900000000001304350000187d0020009c0000187d0200804100000040012002100000191c011001c7000061ef0001042e000000c40020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000202043b001d00000002001d0000187d0020009c00000c960000213d0000012002000039000000400020043f0000002402100370000000000202043b000018d200200198000018d3030000410000000003006019000018d404200197000000000343019f000000000032004b00000c960000c13d000000800020043f0000004403100370000000000303043b000018d200300198000018d3040000410000000004006019000018d405300197000000000454019f000000000043004b00000c960000c13d000000a00030043f0000006404100370000000000404043b000018d200400198000018d3050000410000000005006019000018d406400197000000000565019f000000000054004b00000c960000c13d000000c00040043f0000008405100370000000000505043b000018d200500198000018d3060000410000000006006019000018d407500197000000000676019f000000000065004b00000c960000c13d000000e00050043f000000a401100370000000000101043b000018b200100198000018b3060000410000000006006019000018b107100197000000000676019f000000000016004b00000c960000c13d000001000010043f0000003301000039000000000101041a000018c5011001970000000006000411000000000061004b0000375f0000c13d000000000042004b0000000001000019000018b00100a041000018b004400197000018b002200197000000000642013f000000000042004b0000000002000019000018b002002041000018b00060009c000000000201c019000000000053004b0000000001000019000018b001008041000018b004500197000018b003300197000000000543013f000000000043004b0000000003000019000018b003004041000018b00050009c000000000301c019000000000003004b0000000001000039000000010100c039000000000002004b0000000002000039000000010200c039001c00000012017361ee56be0000040f00000000020100190000001c0100002961ee56990000040f0000001d01000029000000000010043f000018d801000041000000200010043f000000400100003961ee61d30000040f000000800200003961ee56cf0000040f00000b760000013d0000000001000416000000000001004b00000c960000c13d000000000102001961ee54940000040f0000006603000039000000000303041a000018c5033001970000000004000411000000000034004b00000000030000390000000103006039001b00000003001d001c00000001001d001d00000002001d61ee56880000040f00000000020100190000001b0100002961ee56990000040f0000001c010000290000187d01100197000000000010043f000018d801000041000000200010043f000000400100003961ee61d30000040f0000001d020000290000008002200210000000000301041a000018cb03300197000000000223019f000000000021041b000000400100043d0000187d0010009c0000187d010080410000004001100210000061ef0001042e000000440020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000402100370000000000202043b002200000002001d0000002401100370000000000101043b002100000001001d002000000000003d0000006801000039000000000201041a000000800020043f000000000010043f000000080020008c00000d020000413d000000a001000039000018f2040000410000000003000019000000e005100039000000000604041a000000e0076002700000000000750435000000c0056002700000187d05500197000000c0071000390000000000570435000000a0056002700000187d05500197000000a007100039000000000057043500000080056002700000187d055001970000008007100039000000000057043500000060056002700000187d055001970000006007100039000000000057043500000040056002700000187d055001970000004007100039000000000057043500000020056002700000187d05500197000000200710003900000000005704350000187d05600197000000000051043500000001044000390000010001100039000000080330003900000007053001bf000000000025004b00000b900000413d00000d050000013d0000000001000416000000000001004b00000c960000c13d000000800000043f000018f101000041000061ef0001042e000000240020008c00000c960000413d0000000003000416000000000003004b00000c960000c13d0000000403100370000000000303043b000018e10030009c00000c960000213d0000002304300039000000000024004b00000c960000813d0000000405300039000000000451034f000000000604043b000018e10060009c00000c960000213d00000000046300190000002404400039000000000024004b00000c960000213d0000006502000039000000000202041a000018c5022001970000000007000411000000000027004b00000d770000c13d000001c00060008c00000c960000413d0000014002000039001d00000002001d000000400020043f0000002005500039000000000251034f000000000202043b0000187d0020009c00000c960000213d000000800020043f0000002005500039000000000651034f000000000606043b000018b200600198000018b3070000410000000007006019000018b108600197000000000787019f000000000067004b00000c960000c13d000000a00060043f0000002005500039000000000651034f000000000606043b000018b200600198000018b3070000410000000007006019000018b108600197000000000787019f000000000067004b00000c960000c13d000000c00060043f0000002005500039000000000651034f000000000606043b000018b200600198000018b3070000410000000007006019000018b108600197000000000787019f000000000067004b00000c960000c13d000000e00060043f0000000004340049000000a40340008a000018bc0030009c00000c960000213d000000a00030008c00000c960000413d000001e003000039000000400030043f0000002005500039000000000651034f000000000606043b000018c50060009c00000c960000213d000001400060043f0000002005500039000000000651034f000000000606043b000018b200600198000018b3070000410000000007006019000018b108600197000000000787019f000000000067004b00000c960000c13d000001600060043f0000002005500039000000000651034f000000000606043b000018b200600198000018b3070000410000000007006019000018b108600197000000000787019f000000000067004b00000c960000c13d000001800060043f0000002005500039000000000651034f000000000606043b000018b200600198000018b3070000410000000007006019000018b108600197000000000787019f000000000067004b00000c960000c13d000001a00060043f0000002005500039000000000651034f000000000606043b000018b200600198000018b3070000410000000007006019000018b108600197000000000787019f000000000067004b00000c960000c13d000001c00060043f0000014006000039000001000060043f000001440440008a000018bc0040009c00000c960000213d000000a00040008c00000c960000413d0000028004000039000000400040043f0000002005500039000000000651034f000000000606043b000018d200600198000018d3070000410000000007006019000018d408600197000000000787019f000000000076004b00000c960000c13d000001e00060043f0000002007500039000000000571034f000000000505043b000018d200500198000018d3080000410000000008006019000018d409500197000000000898019f000000000085004b00000c960000c13d000002000050043f0000002007700039000000000871034f000000000808043b000018d200800198000018d3090000410000000009006019000018d40a8001970000000009a9019f000000000098004b00000c960000c13d000002200080043f0000002009700039000000000791034f000000000707043b000018d200700198000018d30a000041000000000a006019000018d40b700197000000000aba019f0000000000a7004b00000c960000c13d000002400070043f0000002009900039000000000191034f000000000101043b000018b200100198000018b3090000410000000009006019000018b10a1001970000000009a9019f000000000019004b00000c960000c13d000002600010043f000001200030043f000000000002004b0000000001000019000048cc0000c13d61ee55820000040f0000001d0200002961ee56e50000040f00000b760000013d0000000001000416000000000001004b00000c960000c13d0000003301000039000000000101041a000018c501100197000000800010043f000018f101000041000061ef0001042e000000240020008c00000c960000413d0000000002000416000000000002004b00000c960000c13d0000000401100370000000000101043b000018c50010009c00000d5a0000a13d0000000001000019000061f000010430000018c401000041000000c00010043f0000002001000039000000c40010043f0000000101000039000000e40010043f000018b801000041000001040010043f000001050000043f0000190f01000041000061f000010430000018f204000041000000a0010000390000000003000019000000000404041a000000000023004b00000cc70000813d0000187d05400197000000000151043600000001033001bf000000000023004b00000cc90000413d000000000023004b00000ccf0000813d00000040054002700000187d0550019700000000015104360000000103300039000000000023004b00000cd10000413d000000000023004b00000cd70000813d00000080054002700000187d0550019700000000015104360000000103300039000000000023004b00000cd90000413d000000000023004b00000cdf0000813d000000c0054002700000187d0550019700000000015104360000000103300039000000000023004b00000ce10000413d00000ce30000013d000000000023004b00000cae0000813d00000020054002700000187d0550019700000000015104360000000103300039000000000023004b00000cb00000413d000000000023004b00000cb60000813d00000060054002700000187d0550019700000000015104360000000103300039000000000023004b00000cb80000413d000000000023004b00000cbe0000813d000000a0054002700000187d0550019700000000015104360000000103300039000000000023004b00000cc00000413d000000000023004b00000ce30000813d000000e0024002700000000001210436000000610110008a0000193002100197000018b90020009c00000e1c0000213d0000008001200039000000400010043f00000020030000390000000000310435000000a004200039000000800300043d0000000000340435000000c002200039000000000003004b00000cf90000613d000000a004000039000000000500001900000000460404340000187d0660019700000000026204360000000105500039000000000035004b00000cf30000413d00000000021200490000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061ef0001042e000018f204000041000000a0010000390000000003000019000000000404041a000000000023004b00000d260000813d0000187d05400197000000000151043600000001033001bf000000000023004b00000d280000413d000000000023004b00000d2e0000813d00000040054002700000187d0550019700000000015104360000000103300039000000000023004b00000d300000413d000000000023004b00000d360000813d00000080054002700000187d0550019700000000015104360000000103300039000000000023004b00000d380000413d000000000023004b00000d3e0000813d000000c0054002700000187d0550019700000000015104360000000103300039000000000023004b00000d400000413d00000d420000013d000000000023004b00000d0d0000813d00000020054002700000187d0550019700000000015104360000000103300039000000000023004b00000d0f0000413d000000000023004b00000d150000813d00000060054002700000187d0550019700000000015104360000000103300039000000000023004b00000d170000413d000000000023004b00000d1d0000813d000000a0054002700000187d0550019700000000015104360000000103300039000000000023004b00000d1f0000413d000000000023004b00000d420000813d000000e0024002700000000001210436000000610110008a0000193001100197000018b90010009c00000e1c0000213d0000008001100039000000400010043f001e00000000003d001f00800000003d000000800200043d000000000002004b0000000002000019000013040000c13d001d00000001001d61ee54830000040f0000001d0200002900000000012100490000187d0010009c0000187d0100804100000060011002100000187d0020009c0000187d020080410000004002200210000000000121019f000061ef0001042e0000003302000039000000000202041a000018c5022001970000000003000411000000000032004b00000d6e0000c13d000000000001004b000034190000c13d000018c401000041000000800010043f0000002001000039000000840010043f0000002601000039000000a40010043f000018c601000041000000c40010043f000018c701000041000000e40010043f000018c801000041000061f000010430000018c401000041000000800010043f0000002001000039000000840010043f000000a40010043f000018ef01000041000000c40010043f0000191701000041000061f000010430000018c401000041000000800010043f0000002001000039000000840010043f0000002a01000039000000a40010043f000018fb01000041000000c40010043f000018fc01000041000000e40010043f000018c801000041000061f000010430000018f204000041000000a0010000390000000003000019000000000404041a000000000023004b00000da70000813d0000187d05400197000000000151043600000001033001bf000000000023004b00000da90000413d000000000023004b00000daf0000813d00000040054002700000187d0550019700000000015104360000000103300039000000000023004b00000db10000413d000000000023004b00000db70000813d00000080054002700000187d0550019700000000015104360000000103300039000000000023004b00000db90000413d000000000023004b00000dbf0000813d000000c0054002700000187d0550019700000000015104360000000103300039000000000023004b00000dc10000413d00000dc30000013d000000000023004b00000d8e0000813d00000020054002700000187d0550019700000000015104360000000103300039000000000023004b00000d900000413d000000000023004b00000d960000813d00000060054002700000187d0550019700000000015104360000000103300039000000000023004b00000d980000413d000000000023004b00000d9e0000813d000000a0054002700000187d0550019700000000015104360000000103300039000000000023004b00000da00000413d000000000023004b00000dc30000813d000000e0024002700000000001210436000000610110008a0000193001100197000018b90010009c00000e1c0000213d0000008001100039000000400010043f000000800200043d000000000002004b0000000003000019000025da0000c13d000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f00000000002104350000187d0010009c0000187d01008041000000400110021000001915011001c7000061ef0001042e000018f204000041000000e0010000390000000003000019000000000404041a000000000023004b00000dfc0000813d0000187d05400197000000000151043600000001033001bf000000000023004b00000dfe0000413d000000000023004b00000e040000813d00000040054002700000187d0550019700000000015104360000000103300039000000000023004b00000e060000413d000000000023004b00000e0c0000813d00000080054002700000187d0550019700000000015104360000000103300039000000000023004b00000e0e0000413d000000000023004b00000e140000813d000000c0054002700000187d0550019700000000015104360000000103300039000000000023004b00000e160000413d00000e180000013d000000000023004b00000de30000813d00000020054002700000187d0550019700000000015104360000000103300039000000000023004b00000de50000413d000000000023004b00000deb0000813d00000060054002700000187d0550019700000000015104360000000103300039000000000023004b00000ded0000413d000000000023004b00000df30000813d000000a0054002700000187d0550019700000000015104360000000103300039000000000023004b00000df50000413d000000000023004b00000e180000813d000000e0024002700000000001210436000000a10110008a0000193001100197000019100010009c00000e220000a13d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000000c001100039000000400010043f000000c00200043d000000000002004b00000b770000613d0000000002000019000f00000002001d0000000501200210000000e00110003900000000010104330000187d01100197001c00000001001d000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001d00000002001d000018b90020009c00000e1c0000213d000000000101043b0000001d070000290000008002700039000000400020043f000000000201041a000018b003200197000018b00030009c000000010500008a0000000003000019000000000305601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000004270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f001600000004001d00000000002404350000000101100039000000000101041a000018b002100197000018b00020009c0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000004003700039001100000003001d0000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f0000006002700039001000000002001d00000000001204350000001c01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001202000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c00000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b304000041000000000400601900000000021401a000000000030000390000000103006039000018bc0020009c0000000002000039000000010200203900000000003201a000000016030000290000001d02000029000000000203c0190000000002020433000018b200200198000018b3030000410000000003006019000018b200400198000018b3050000410000000005006019000000400400043d000018b70040009c00000e1c0000213d000018b102200197000000000323019f000000000115019f00000000053100a90000004001400039000000400010043f00000002010000390000000002140436000018bd010000410000000000120435000000400100043d000018be0650009a000018bf0060009c00003b6d0000a13d000018b70010009c00000e1c0000213d000018b002000041000018c04620012b000018b002400099001500000002001d001300000004001d0000000002046019000018b05450012c001400000006001d000000000464013f000018b00550c0990000004006100039000000400060043f0000002006100039000000000036043500000000022500d9000000ff034002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000000210435000012fb0000613d00000011020000290000000002020433000018b200200198000018b30400004100000000040060190000001d030000290000000005030433000018b200500198000018b3060000410000000006006019000000400300043d000018b70030009c00000e1c0000213d000018b102200197000000000224019f000018b104500197000000000446019f00000000042400a90000004002300039000000400020043f00000002020000390000000002230436000018bd050000410000000000520435000018be0540009a000018bf0050009c00003d380000a13d000000140000006b00000013030000290000000002030019000000150200c029000018b04340012c000000140330014f000018b00440c09900000000022400d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c0190000000003010433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018b104200197000018b200200198000018b3020000410000000002006019000000000442019f000018bc0040009c00000f2d0000213d000018b102400099000000000023004b0000000005000019000018b005002041000018b002200197000018b006300197000000000726013f000000000026004b0000000002000019000018b002004041000018b00070009c000000000205c019000000000002004b000044470000c13d000018b00040009c00000f3d0000413d000018b302400099000000000023004b0000000005000019000018b005004041000018b002200197000018b006300197000000000726013f000000000026004b0000000002000019000018b002002041000018b00070009c000000000205c019000000000002004b000044470000c13d00000011020000290000000002020433000018b200200198000018b3050000410000000005006019000000400600043d000018b70060009c00000e1c0000213d000018b10220019700000000072501a00000004002600039000000400020043f00000003020000390000000005260436000018c2020000410000000000250435000000400200043d00003d4d0000613d0000000003430019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018c0033000d1000018b04330012c000018b00440c099000018b06570012c000000000353013f000018b00660c09900000000046400d9000000ff033002120000000005430049000000000335019f0000000003046019000000000004004b000000000403c019000018b70020009c00000e1c0000213d0000004003200039000000400030043f00000002030000390000000003320436000018bd050000410000000000530435000018b20540009a000018c30050009c00003d610000a13d000018b102400197000018b200400198000018b3030000410000000003006019000000000423019f0000001d050000290000000000450435000018b200300198000018b3030000410000000003006019000000000223019f000018bc0020009c00000c960000213d000000000002004b00000c960000613d00000016020000290000000002020433000018b200200198000018b3040000410000000004006019000000400300043d000018b70030009c00000e1c0000213d000018b10220019700000000042401a000000000050104330000004001300039000000400010043f00000003010000390000000002130436000018c2010000410000000000120435000000400100043d00003d760000613d000018b102500197000018b200500198000018b3030000410000000003006019000000000223019f000018c0022000d1000018b03220012c000018b00330c099000018b05440012c000000000442013f000018b00550c09900000000025300d9000000ff034002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b70010009c00000e1c0000213d0000004003100039000000400030043f00000002030000390000000003310436000018bd040000410000000000430435000018b20420009a000018c30040009c00003d8a0000a13d000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f00000010020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c00000fc80000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c00000fd80000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d0000000001120019000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000100200002900000000001204350000001c01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001202000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000201041a000018cc02200197000000000021041b0000001c01000029000000000001004b000010c40000613d000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000201043b000000400900043d000018cf0090009c00000e1c0000213d0000006001900039000000400010043f000000000102041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000000000a190436000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000000103200039000000000303041a000018b004300197000018b00040009c000000010400008a000000000400c01900000080044002100000008005300270000000000445019f000000800000008b0000000004036019000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000020051000390000000000450435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000000031043500000000001a0435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000000202200039000000000202041a000018b003200197000018b00030009c000000010300008a000000000300c01900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000002210436000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000000000320435000000400b90003900000000001b04350000000003010433000018b104300197000018b200300198000018b303000041000000000300601900000000044301a0000011d00000613d00000000030000390000000103006039000018bc0040009c0000000005000039000000010500203900000000003501a000000016050000290000001d03000029000000000305c0190000000003030433000018b105300197000018b200300198000018b3030000410000000003006019000000000353019f0000000005020433000018b106500197000018b200500198000018b3050000410000000005006019000000000565019f000000000035004b000011d80000613d000000400600043d000018b70060009c00000e1c0000213d00000000074300a90000004004600039000000400040043f00000002040000390000000004460436000018bd050000410000000000540435000000400500043d000018be0870009a000018bf0080009c000043ba0000a13d000000140000006b00000013060000290000000004060019000000150400c029000018b07670012c000000140660014f000018b00770c09900000000074700d9000000ff046002120000000006740049000000000446019f0000000004076019000000000007004b000000000704c0190000000004020433000018b200400198000018b3060000410000000006006019000018b70050009c00000e1c0000213d000018b10440019700000000084601a00000004004500039000000400040043f00000003040000390000000006450436000018c2040000410000000000460435000000400400043d000043ce0000613d000018b105700197000018b200700198000018b3060000410000000006006019000000000556019f000018c0055000d1000018b06550012c000018b00660c099000018b08780012c000000000575013f000018b00880c09900000000068600d9000000ff055002120000000007650049000000000557019f0000000005066019000000000006004b000000000605c019000018b70040009c00000e1c0000213d0000004005400039000000400050043f00000002050000390000000005540436000018bd070000410000000000750435000018b20760009a000018c30070009c000043e20000a13d000018b104600197000018b200600198000018b3050000410000000005006019000000000445019f0000000000410435000011d70000013d000000c00100043d000000000001004b000012020000613d00000000020000190000000501200210000000e00110003900000000010104330000187d01100198000011c80000613d001a00000002001d001b00000001001d000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000400900043d000018cf0090009c00000e1c0000213d0000006002900039000000400020043f000000000201041a000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000000000a290436000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000103100039000000000303041a000018b004300197000018b00040009c000000010400008a000000000400c01900000080044002100000008005300270000000000445019f000000800000008b0000000004036019000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000020052000390000000000450435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000000032043500000000002a0435000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000201100039000000000101041a000018b003100197000018b00030009c000000010300008a000000000300c01900000080033002100000008004100270000000000334019f000000800000008b0000000003016019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000020042000390000000000340435000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000004005900039000000000025043500000000020a04330000000013020434000018b104300197000018b200300198000018b303000041000000000300601900000000044301a0001900000005001d000011960000613d00000000030000390000000103006039000018bc0040009c0000000005000039000000010500203900000000003501a000000016050000290000001d03000029000000000305c0190000000003030433000018b105300197000018b200300198000018b3030000410000000003006019000000000353019f0000000005010433000018b106500197000018b200500198000018b3050000410000000005006019000000000565019f000000000035004b0000119e0000613d000000400600043d000018b70060009c00000e1c0000213d00000000074300a90000004004600039000000400040043f00000002040000390000000004460436000018bd050000410000000000540435000000400500043d000018be0870009a000018bf0080009c00003c510000a13d000000140000006b00000013060000290000000004060019000000150400c029000018b07670012c000000140660014f000018b00770c09900000000074700d9000000ff046002120000000006740049000000000446019f0000000004076019000000000007004b000000000704c0190000000004010433000018b200400198000018b3060000410000000006006019000018b70050009c00000e1c0000213d000018b10440019700000000084601a00000004004500039000000400040043f00000003040000390000000006450436000018c2040000410000000000460435000000400400043d00003c3d0000613d000018b105700197000018b200700198000018b3060000410000000006006019000000000556019f000018c0055000d1000018b06550012c000018b00660c099000018b08780012c000000000575013f000018b00880c09900000000068600d9000000ff055002120000000007650049000000000557019f0000000005066019000000000006004b000000000605c019000018b70040009c00000e1c0000213d0000004005400039000000400050043f00000002050000390000000005540436000018bd070000410000000000750435000018b20760009a000018c30070009c00003c280000a13d000018b104600197000018b200600198000018b3050000410000000005006019000000000445019f000000000042043500000000003104350000119e0000013d0000001d020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000000000021043500170000000a001d001800000009001d0000001b01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d00000018020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b000000170200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000103100039000000000023041b000000190200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000201100039000000000021041b0000001a020000290000187d0020009c000044470000613d00000001012000390000187d02100197000000c00100043d000000000012004b000010c80000413d000012020000013d0000001d010000290000000001010433000018b103100197000018b200100198000018b3010000410000000001006019000000000331019f000000000032043500190000000b001d001a0000000a001d001b00000009001d0000001c01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001b020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b0000001a0200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000103100039000000000023041b000000190200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000201100039000000000021041b0000001c01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001d020000290000000002020433000018cb02200197000000160300002900000000030304330000008003300210000000000223019f000000000101043b000000000021041b00000011020000290000000002020433000018cb02200197000000100300002900000000030304330000008003300210000000000223019f0000000101100039000000000021041b000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000002002100039000000000002043500000000000104350000001c01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400700043d000018b90070009c00000e1c0000213d000000000101043b0000008002700039000000400020043f000000000201041a000018b003200197000018b00030009c000000010500008a0000000003000019000000000305601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000004270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f001b00000004001d00000000002404350000000101100039000000000101041a000018b002100197000018b00020009c0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040037000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001d00000007001d000000600270003900000000001204350000001c01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001202000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c0000001d0500002900000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a000000000040500190000001b0400c029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00000e1c0000213d000000000113019f000018b103400197000000000532019f00000000075100a90000004001600039000000400010043f00000002010000390000000004160436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c00003d9f0000a13d000018b70010009c00000e1c0000213d000000140000006b00000013040000290000000008040019000000150800c029000018b06470012c000000140440014f000018b00660c0990000004007100039000000400070043f0000002007100039000000000057043500000000058600d9000000ff044002120000000006540049000000000446019f0000000004056019000000000005004b000000000504c019000018b104500197000018b200500198000018b3050000410000000005006019000000000645019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200500198000018b3010000410000000001006019000000000141019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d10400004100000012050000290000001c0600002961ee61e40000040f000000010020019000000c960000613d0000000f01000029000018cb01100197000018cb0010009c000044470000613d0000000102100039000000c00100043d000000000012004b00000e280000413d00000b760000013d000000800100003900000000020000190000000502200210000000000121001900000020011000390000000001010433001d00000001001d001c00220000002d0000000001000411000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400300043d000018b70030009c00000e1c0000213d000000000101043b000000000401041a0000004001300039000000400010043f00000001010000390000000002130436000018b8010000410000000000120435000000400100043d000000ff0040019000003baa0000613d000018b70010009c00000e1c0000213d0000001d020000290000187d042001970000004002100039000000400020043f0000002002100039000018ce03000041000000000032043500000003020000390000000000210435001d00000004001d000000000040043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000400200043d001b00000002001d000018cf0020009c00000e1c0000213d0000001b040000290000006002400039000000400020043f000000000201041a000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000002240436001300000002001d000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000103100039000000000303041a000018b004300197000018b00040009c000000010400008a000000000400c01900000080044002100000008005300270000000000445019f000000800000008b0000000004036019000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000020052000390000000000450435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000000032043500000013030000290000000000230435000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000201100039000000000101041a000018b003100197000018b00030009c000000010300008a000000000300c01900000080033002100000008004100270000000000334019f000000800000008b0000000003016019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000020042000390000000000340435000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001b010000290000004001100039000d00000001001d00000000002104350000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001c02000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001a00000002001d000018bb0020009c00000e1c0000213d000000000101043b0000001a030000290000002002300039000000400020043f0000000101100039000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f00000000001304350000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001900000002001d000018b90020009c00000e1c0000213d000000000101043b00000019070000290000008002700039000000400020043f000000000201041a000018b003200197000018b00030009c000000010600008a0000000003000019000000000306601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000004270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f001200000004001d00000000002404350000000101100039000000000101041a000018b002100197000018b00020009c0000000002000019000000000206601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000004003700039001500000003001d0000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f0000006002700039001700000002001d0000000000120435000000000000043f0000006c01000039000000200010043f000000400100043d001800000001001d000018b90010009c00000e1c0000213d00000018060000290000008001600039000000400010043f000018b401000041000000000101041a000018b002100197000018b00020009c000000010500008a0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000003160436000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001100000003001d0000000000130435000018ba01000041000000000101041a000018b002100197000018b00020009c0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000004003600039001400000003001d0000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f0000006002600039001600000002001d00000000001204350000001a010000290000000001010433000018b102100197000018b200100198000018b306000041000000000600601900000000012601a0000014ee0000613d000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000002003200039000018d0040000410000000000430435000000030300003900000000003204350000001a020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000432019f000a18b2001000a2000018bc0010009c000014690000213d0000000a02000029000000000024004b0000000003000019000018b003004041000018b005200197000018b007400197000000000857013f000000000057004b0000000005000019000018b005002041000018b00080009c000000000503c019000000000005004b000044470000c13d000918c1001000a2000018b00010009c0000147a0000413d0000000902000029000000000024004b0000000005000019000018b005002041000018b007200197000018b008400197000000000978013f000000000078004b0000000007000019000018b007004041000018b00090009c000000000705c019000000000007004b000044470000c13d0000000004140049000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f0000001a0200002900000000004204350000000d020000290000000002020433000c00000002001d0000000047020434000018b109700197000018b200700198000018b308000041000000000800601900000000079801a0000014970000613d000018bc0010009c000014970000213d000000000001004b000014970000613d000018bc0070009c000014970000213d000000000007004b000014970000613d000018bc09700129000000000019004b000044470000413d0000192f0010009c000014b90000613d000018b0a910012c000018b00aa0c099000018b002000041000018b0cb20012b000000000b9b013f000018b00cc0c0990000000009ac00d9000000ff0ab00212000000000b9a0049000000000aab019f000000000a096019000000000009004b00000000090ac019000018bc0010009c000014b90000213d000000000001004b000014b90000613d000018b00070009c000014b90000413d000000000079004b000000000a000019000018b00a002041000018b00b700197000018b009900197000000000cb9013f0000000000b9004b0000000009000019000018b009004041000018b000c0009c00000000090ac019000000000009004b000044470000c13d000000000007004b000014f10000613d0000192f0070009c000014dd0000613d000018b0a970012c000018b00aa0c099000018b002000041000018b0cb20012b000000000b9b013f000018b00cc0c0990000000009ac00d9000000ff0ab00212000000000b9a0049000000000aab019f000000000a096019000000000009004b00000000090ac019000018bc0070009c000014dd0000213d000000000007004b000014dd0000613d000018b00010009c000014dd0000413d000000000019004b000000000a000019000018b00a002041000018b00b100197000018b009900197000000000cb9013f0000000000b9004b0000000009000019000018b009004041000018b000c0009c00000000090ac019000000000009004b000044470000c13d000018b0a970012c000018b00aa0c099000018b002000041000018bccb20012b000000000b9b013f000018b00cc0c0990000000009ac00d9000000ff0ab00212000000000b9a0049000000000aab019f000000000a096019000000000009004b00000000090ac019000000000868016f000018b00080009c000014f50000813d000015020000013d0000000002000019000000000100001900001f650000013d0000000009000019000000000868016f000018b00080009c000015020000413d000000000019004b0000000008000019000018b008002041000018b00a100197000018b009900197000000000ba9013f0000000000a9004b0000000009000019000018b009004041000018b000b0009c000000000908c019000000000009004b000044470000c13d0000001b020000290000000008020433000018b109800197000018b200800198000018b3080000410000000008006019000000000a9801a0000048680000613d000000000c1700a9000018b000c0009c0000150f0000c13d0000192f00a0009c000044470000613d000018b0b9a0012c000018b008b00099000000000d0b0019000000000d08c019000018b0ecc0012c000000000f9c013f000018b00ee0c099000000000cde00d9000000ff0df00212000000000ecd0049000000000dde019f000000000d0c601900000000000c004b000000000c0dc0190000001302000029000000000d020433000000000d0d0433000018b10fd00197000018b200d00198000018b30e000041000000000e006019000000000dfe01a0000015310000613d000018bc0010009c000015310000213d000000000001004b000015310000613d000018bc00d0009c000015310000213d00000000000d004b000015310000613d000018bc0fd0012900000000001f004b000044470000413d0000192f0010009c000015530000613d000018b02f10012c000018b00220c099000018b003000041000018b05330012b0000000003f3013f000018b00550c099000000000f2500d9000000ff023002120000000003f20049000000000223019f00000000020f601900000000000f004b000000000f02c019000018bc0010009c000015530000213d000000000001004b000015530000613d000018b000d0009c000015530000413d0000000000df004b0000000002000019000018b002002041000018b003d00197000018b005f00197000000000f35013f000000000035004b0000000003000019000018b003004041000018b000f0009c000000000302c019000000000003004b000044470000c13d00000000000d004b000015880000613d0000192f00d0009c000015770000613d000018b032d0012c000018b00330c099000018b005000041000018b0f550012b000000000225013f000018b00ff0c099000000000f3f00d9000000ff022002120000000003f20049000000000223019f00000000020f601900000000000f004b000000000f02c019000018bc00d0009c000015770000213d00000000000d004b000015770000613d000018b00010009c000015770000413d00000000001f004b0000000002000019000018b002002041000018b003100197000018b005f00197000000000f35013f000000000035004b0000000003000019000018b003004041000018b000f0009c000000000302c019000000000003004b000044470000c13d000018b032d0012c000018b00330c099000018b005000041000018bcf550012b000000000225013f000018b00ff0c099000000000f3f00d9000000ff022002120000000003f20049000000000223019f00000000020f601900000000000f004b000000000f02c01900000000026e016f000018b00020009c0000158c0000813d000015990000013d000000000f00001900000000026e016f000018b00020009c000015990000413d00000000001f004b0000000002000019000018b002002041000018b003100197000018b005f00197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000302c019000000000003004b000044470000c13d00000000061d00a90000192f00a0009c0000159e0000c13d000018b00060009c000044470000613d000018b102c00197000018b203c00197000000000009004b00000000080b6019000018b06560012c000000000595013f000018b00660c09900000000068600d9000000ff055002120000000008650049000000000558019f0000000005066019000000000006004b000000000605c019000000000003004b000018b3030000410000000003006019000000000d23019f000018b200600198000018b3020000410000000002006019000b00000002001d000018b300d0009c000044470000613d0000000008040433000000000007004b000016140000613d000018bc0070009c0000161c0000213d000000000007004b0000161c0000613d000018b200800198000018b3090000410000000009006019000000400a00043d000018b700a0009c00000e1c0000213d000018b102800197000000000b2901a00000004002a00039000000400020043f000000030200003900000000092a0436000018c2020000410000000000290435000000400800043d000042770000613d000018b032b0012c000018b00330c099000018c0057000d1000018b07550012c000000000225013f000018b00770c09900000000093700d9000000ff022002120000000003920049000000000223019f0000000002096019000000000009004b000000000902c019000018b70080009c00000e1c0000213d0000004002800039000000400020043f00000002020000390000000007280436000018bd020000410000000000270435000018b20290009a000018c30020009c0000428b0000a13d00000015020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000732019f000018b102900197000018b200900198000018b3030000410000000003006019000000000823019f000018bc0080009c000016010000213d000018b20280009a000000000027004b0000000003000019000018b003004041000018b002200197000018b005700197000000000925013f000000000025004b0000000002000019000018b002002041000018b00090009c000000000203c019000000000002004b000044470000c13d000018b00080009c000016110000413d000018c10280009a000000000027004b0000000003000019000018b003002041000018b002200197000018b005700197000000000925013f000000000025004b0000000002000019000018b002004041000018b00090009c000000000203c019000000000002004b000044470000c13d00000000078700490000001508000029000016720000013d000018b102800197000018b200800198000018b303000041000000000300601900000000002301a00000161c0000c13d000018c0080000410000000000840435000018b200800198000018b3090000410000000009006019000000400a00043d000018b700a0009c00000e1c0000213d000018b102800197000000000b2901a00000004002a00039000000400020043f000000030200003900000000092a0436000018c2020000410000000000290435000000400800043d0000404d0000613d000018b032b0012c000018b00330c099000018c0057000d1000018b07550012c000000000225013f000018b00770c09900000000093700d9000000ff022002120000000003920049000000000223019f0000000002096019000000000009004b000000000902c019000018b70080009c00000e1c0000213d0000004002800039000000400020043f00000002020000390000000007280436000018bd020000410000000000270435000018b20290009a000018c30020009c000040610000a13d000018b102900197000018b200900198000018b3030000410000000003006019000000000723019f00000017020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000832019f000018bc0080009c000016600000213d000018b102800099000000000027004b0000000003000019000018b003002041000018b002200197000018b005700197000000000925013f000000000025004b0000000002000019000018b002004041000018b00090009c000000000203c019000000000002004b000044470000c13d000018b00080009c000016700000413d000018b302800099000000000027004b0000000003000019000018b003004041000018b002200197000018b005700197000000000925013f000000000025004b0000000002000019000018b002002041000018b00090009c000000000203c019000000000002004b000044470000c13d00000000077800190000001708000029000018b102700197000018b200700198000018b3030000410000000003006019000000000223019f00000000002804350000000c020000290000000002020433000018b103200197000018b200200198000018b302000041000000000200601900000000093201a000000000020000390000000102006039000018bc0090009c0000000003000039000000010300203900000000002301a000000012030000290000001907000029000000000703c0190000000008040433000018b200800198000018b30b000041000000000b006019000000400a00043d000018b700a0009c00000e1c0000213d000018b102800197000000000b2b01a0000000000c0704330000004002a00039000000400020043f000000030200003900000000082a0436000018c2020000410000000000280435000000400700043d00003db30000613d000018b102c00197000018b200c00198000018b3030000410000000003006019000000000223019f000018c0022000d1000018b03220012c000018b00330c099000018b085b0012c000000000252013f000018b00880c099000000000b8300d9000000ff022002120000000003b20049000000000223019f00000000020b601900000000000b004b000000000b02c019000018b70070009c00000e1c0000213d0000004002700039000000400020043f0000000202000039000000000a270436000018bd0200004100000000002a0435000000400800043d000018b202b0009a000018c30020009c00003dc70000a13d000018b200b00198000018b3070000410000000007006019000018b70080009c00000e1c0000213d000018b102b00197000000000227019f00000000099200a90000004002800039000000400020043f00000002020000390000000007280436000018bd020000410000000000270435000018be0290009a000018bf0020009c00003ddb0000a13d0000000002d00089000018b003000041000018c05830012b000018b003500099001000000003001d000e00000005001d0000000003056019000018b07590012c000f00000008001d000000000585013f000018b00770c09900000000033700d9000000ff055002120000000007350049000000000557019f0000000005036019000000000003004b000000000305c019000018b105200197000018b200200198000018b3020000410000000002006019000000000752019f000018b102300197000018b200300198000018b3030000410000000003006019000000000823019f000018bc0080009c000016f50000213d000018b102800099000000000027004b0000000003000019000018b003002041000018b002200197000018b005700197000000000925013f000000000025004b0000000002000019000018b002004041000018b00090009c000000000203c019000000000002004b000044470000c13d000018b00080009c000017050000413d000018b302800099000000000027004b0000000003000019000018b003004041000018b002200197000018b005700197000000000925013f000000000025004b0000000002000019000018b002002041000018b00090009c000000000203c019000000000002004b000044470000c13d0000000002780019000018b103200197000018b200200198000018b3020000410000000002006019000000000532019f0000000c070000290000000000570435000018b200200198000018b3020000410000000002006019000000000532019f000018bc0050009c000017730000213d000000000005004b000017730000613d00000019020000290000000002020433000018b107200197000018b200200198000018b3020000410000000002006019000000000372019f0000000000340435000018b200200198000018b3040000410000000004006019000000400800043d000018b70080009c00000e1c0000213d00000000097401a00000004002800039000000400020043f00000003020000390000000007280436000018c2020000410000000000270435000000400400043d000040b30000613d000018b03290012c000018b00330c099000018c0055000d1000018b07550012c000000000225013f000018b00770c09900000000073700d9000000ff022002120000000003720049000000000223019f0000000002076019000000000007004b000000000702c019000018b70040009c00000e1c0000213d0000004002400039000000400020043f00000002020000390000000005240436000018bd020000410000000000250435000018b20270009a000018c30020009c000040dc0000a13d000018b102700197000018b200700198000018b3030000410000000003006019000000000423019f00000015020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000532019f000018bc0050009c000017600000213d000018b102500099000000000024004b0000000003000019000018b003002041000018b002200197000018b007400197000000000827013f000000000027004b0000000002000019000018b002004041000018b00080009c000000000203c019000000000002004b000044470000c13d000018b00050009c000017700000413d000018b302500099000000000024004b0000000003000019000018b003004041000018b002200197000018b007400197000000000827013f000000000027004b0000000002000019000018b002002041000018b00080009c000000000203c019000000000002004b000044470000c13d00000000044500190000001505000029000017d00000013d00000012020000290000000002020433000018b107200197000018b200200198000018b3020000410000000002006019000000000372019f0000000000340435000018b200200198000018b3040000410000000004006019000000400800043d000018b70080009c00000e1c0000213d00000000097401a00000004002800039000000400020043f00000003020000390000000007280436000018c2020000410000000000270435000000400400043d0000409f0000613d000018b03290012c000018b00330c099000018c0055000d1000018b07550012c000000000225013f000018b00770c09900000000073700d9000000ff022002120000000003720049000000000223019f0000000002076019000000000007004b000000000702c019000018b70040009c00000e1c0000213d0000004002400039000000400020043f00000002020000390000000005240436000018bd020000410000000000250435000018b20270009a000018c30020009c000040c70000a13d00000017020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000432019f000018b102700197000018b200700198000018b3030000410000000003006019000000000523019f000018bc0050009c000017be0000213d000018b20250009a000000000024004b0000000003000019000018b003004041000018b002200197000018b007400197000000000827013f000000000027004b0000000002000019000018b002002041000018b00080009c000000000203c019000000000002004b000044470000c13d000018b00050009c000017ce0000413d000018c10250009a000000000024004b0000000003000019000018b003002041000018b002200197000018b007400197000000000827013f000000000027004b0000000002000019000018b002004041000018b00080009c000000000203c019000000000002004b000044470000c13d00000000045400490000001705000029000818b10060019b000018b102400197000018b200400198000018b3030000410000000003006019000000000223019f00000000002504350000000b02000029000018b200200198000018b3020000410000000002006019000000080c2001af000018b300c0009c000044470000613d000000130200002900000000050204330000000042050434000018b103200197000018b200200198000018b302000041000000000200601900000000073201a00000000006040433000018430000613d000018bc0070009c0000184b0000213d000000000007004b0000184b0000613d000018b200600198000018b3080000410000000008006019000000400900043d000018b70090009c00000e1c0000213d000018b102600197000000000a2801a00000004002900039000000400020043f00000003020000390000000008290436000018c2020000410000000000280435000000400600043d000042a00000613d000018b032a0012c000018b00330c099000018c0077000d1000018b08770012c000000000227013f000018b00880c09900000000083800d9000000ff022002120000000003820049000000000223019f0000000002086019000000000008004b000000000802c019000018b70060009c00000e1c0000213d0000004002600039000000400020043f00000002020000390000000007260436000018bd020000410000000000270435000018b20280009a000018c30020009c000042c10000a13d00000014020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000632019f000018b102800197000018b200800198000018b3030000410000000003006019000000000723019f000018bc0070009c000018300000213d000018b20270009a000000000026004b0000000003000019000018b003004041000018b002200197000018b008600197000000000928013f000000000028004b0000000002000019000018b002002041000018b00090009c000000000203c019000000000002004b000044470000c13d000018b00070009c000018400000413d000018c10270009a000000000026004b0000000003000019000018b003002041000018b002200197000018b008600197000000000928013f000000000028004b0000000002000019000018b002004041000018b00090009c000000000203c019000000000002004b000044470000c13d00000000067600490000001407000029000018a10000013d000018b102600197000018b200600198000018b303000041000000000300601900000000002301a00000184b0000c13d000018c0060000410000000000640435000018b200600198000018b3080000410000000008006019000000400900043d000018b70090009c00000e1c0000213d000018b102600197000000000a2801a00000004002900039000000400020043f00000003020000390000000008290436000018c2020000410000000000280435000000400600043d000040760000613d000018b032a0012c000018b00330c099000018c0077000d1000018b08770012c000000000227013f000018b00880c09900000000083800d9000000ff022002120000000003820049000000000223019f0000000002086019000000000008004b000000000802c019000018b70060009c00000e1c0000213d0000004002600039000000400020043f00000002020000390000000007260436000018bd020000410000000000270435000018b20280009a000018c30020009c0000408a0000a13d000018b102800197000018b200800198000018b3030000410000000003006019000000000623019f00000016020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000732019f000018bc0070009c0000188f0000213d000018b102700099000000000026004b0000000003000019000018b003002041000018b002200197000018b008600197000000000928013f000000000028004b0000000002000019000018b002004041000018b00090009c000000000203c019000000000002004b000044470000c13d000018b00070009c0000189f0000413d000018b302700099000000000026004b0000000003000019000018b003004041000018b002200197000018b008600197000000000928013f000000000028004b0000000002000019000018b002002041000018b00090009c000000000203c019000000000002004b000044470000c13d00000000066700190000001607000029000018b102600197000018b200600198000018b3030000410000000003006019000000000223019f00000000002704350000000002050433000018b103200197000018b200200198000018b302000041000000000200601900000000083201a000000000020000390000000102006039000018bc0080009c0000000003000039000000010300203900000000002301a000000011030000290000001806000029000000000603c0190000000007040433000018b200700198000018b30a000041000000000a006019000000400900043d000018b70090009c00000e1c0000213d000018b102700197000000000a2a01a0000000000b0604330000004002900039000000400020043f00000003020000390000000007290436000018c2020000410000000000270435000000400600043d00003df00000613d000018b102b00197000018b200b00198000018b3030000410000000003006019000000000223019f000018c0022000d1000018b03220012c000018b00330c099000018b097a0012c000000000272013f000018b00990c099000000000a9300d9000000ff022002120000000003a20049000000000223019f00000000020a601900000000000a004b000000000a02c019000018b70060009c00000e1c0000213d0000004002600039000000400020043f00000002020000390000000009260436000018bd020000410000000000290435000000400700043d000018b202a0009a000018c30020009c00003e040000a13d000018b200a00198000018b3060000410000000006006019000018b70070009c00000e1c0000213d000018b102a00197000000000226019f00000000088200a90000004002700039000000400020043f00000002020000390000000006270436000018bd020000410000000000260435000018be0280009a000018bf0020009c00003e1c0000a13d0000000002c000890000000f0000006b0000000e060000290000000003060019000000100300c029000018b07680012c0000000f0660014f000018b00770c09900000000033700d9000000ff066002120000000007360049000000000667019f0000000006036019000000000003004b000000000306c019000018b106200197000018b200200198000018b3020000410000000002006019000000000662019f000018b102300197000018b200300198000018b3030000410000000003006019000000000723019f000018bc0070009c000019200000213d000018b102700099000000000026004b0000000003000019000018b003002041000018b002200197000018b008600197000000000928013f000000000028004b0000000002000019000018b002004041000018b00090009c000000000203c019000000000002004b000044470000c13d000018b00070009c000019300000413d000018b302700099000000000026004b0000000003000019000018b003004041000018b002200197000018b008600197000000000928013f000000000028004b0000000002000019000018b002002041000018b00090009c000000000203c019000000000002004b000044470000c13d0000000002670019000018b103200197000018b200200198000018b3020000410000000002006019000000000632019f0000000000650435000018b200200198000018b3020000410000000002006019000000000532019f000018bc0050009c0000199d0000213d000000000005004b0000199d0000613d00000018020000290000000002020433000018b106200197000018b200200198000018b3020000410000000002006019000000000362019f0000000000340435000018b200200198000018b3040000410000000004006019000000400700043d000018b70070009c00000e1c0000213d00000000086401a00000004002700039000000400020043f00000003020000390000000006270436000018c2020000410000000000260435000000400400043d000041050000613d000018b03280012c000018b00330c099000018c0055000d1000018b06550012c000000000225013f000018b00660c09900000000063600d9000000ff022002120000000003620049000000000223019f0000000002066019000000000006004b000000000602c019000018b70040009c00000e1c0000213d0000004002400039000000400020043f00000002020000390000000005240436000018bd020000410000000000250435000018b20260009a000018c30020009c000041190000a13d000018b102600197000018b200600198000018b3030000410000000003006019000000000423019f00000014020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000532019f000018bc0050009c0000198a0000213d000018b102500099000000000024004b0000000003000019000018b003002041000018b002200197000018b006400197000000000726013f000000000026004b0000000002000019000018b002004041000018b00070009c000000000203c019000000000002004b000044470000c13d000018b00050009c0000199a0000413d000018b302500099000000000024004b0000000003000019000018b003004041000018b002200197000018b006400197000000000726013f000000000026004b0000000002000019000018b002002041000018b00070009c000000000203c019000000000002004b000044470000c13d00000000044500190000001405000029000019fa0000013d00000011020000290000000002020433000018b106200197000018b200200198000018b3020000410000000002006019000000000362019f0000000000340435000018b200200198000018b3040000410000000004006019000000400700043d000018b70070009c00000e1c0000213d00000000086401a00000004002700039000000400020043f00000003020000390000000006270436000018c2020000410000000000260435000000400400043d000040f10000613d000018b03280012c000018b00330c099000018c0055000d1000018b06550012c000000000225013f000018b00660c09900000000063600d9000000ff022002120000000003620049000000000223019f0000000002066019000000000006004b000000000602c019000018b70040009c00000e1c0000213d0000004002400039000000400020043f00000002020000390000000005240436000018bd020000410000000000250435000018b20260009a000018c30020009c0000412e0000a13d00000016020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000432019f000018b102600197000018b200600198000018b3030000410000000003006019000000000523019f000018bc0050009c000019e80000213d000018b20250009a000000000024004b0000000003000019000018b003004041000018b002200197000018b006400197000000000726013f000000000026004b0000000002000019000018b002002041000018b00070009c000000000203c019000000000002004b000044470000c13d000018b00050009c000019f80000413d000018c10250009a000000000024004b0000000003000019000018b003002041000018b002200197000018b006400197000000000726013f000000000026004b0000000002000019000018b002004041000018b00070009c000000000203c019000000000002004b000044470000c13d00000000045400490000001605000029000018b102400197000018b200400198000018b3030000410000000003006019000000000223019f00000000002504350000001b020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000432019f0000000a03000029000018b002300197000000000034004b0000000003000019000018b003004041000018b005400197000000000625013f000000000025004b0000000007000019000018b007002041000018b00060009c000000000703c0190000000906000029000018b002600197000000000325013f000000000025004b0000000002000019000018b002004041000000000064004b0000000005000019000018b005002041000018b00030009c000000000205c019000000000002004b0000000002000039000000010200c039000018bc0010009c00000000030000390000000103002039000018b00010009c00000000050000390000000105004039000000000007004b0000000006000039000000010600c039000000000565016f0000000100500190000044470000c13d000000000223016f0000000100200190000044470000c13d000a0000000c001d000c0000000d001d0000000001140049000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000001b0200002900000000001204350000001d01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001b020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b000000130200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000103100039000000000023041b0000000d0200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000201100039000000000021041b0000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001c02000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001a020000290000000002020433000018cb02200197000000000101043b0000000101100039000000000301041a000018cc03300197000000000223019f000000000021041b0000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001c02000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400300043d000018bb0030009c00000e1c0000213d000000000101043b0000002002300039000000400020043f000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f001b00000003001d00000000001304350000001c01000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400a00043d000018bb00a0009c0000000c070000290000000a080000290000001b0900002900000e1c0000213d000000000101043b0000002002a00039000000400020043f000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f00000000001a04350000000001090433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000018bc0010009c00001aeb0000213d000000000001004b00001aeb0000613d00000015020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018b20310009a000018b004200197000018b005300197000000000654013f000000000054004b0000000004000019000018b004002041000000000032004b0000000003000019000018b003004041000018b00060009c000000000403c019000000000004004b000044470000c13d0000000001120049000000150200002900001b140000013d00000017020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c00001b020000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c00001b120000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200190000001702000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000000002090433000018b101200197000018b200200198000018b303000041000000000300601900000000021301a000000000040000390000000104006039000018bc0020009c0000000002000039000000010200203900000000004201a000000012040000290000001902000029000000000204c0190000000002020433000018b200200198000018b3040000410000000004006019000018b200300198000018b3050000410000000005006019000000400300043d000018b70030009c00000e1c0000213d000018b102200197000000000224019f000000000115019f00000000012100a90000004002300039000000400020043f00000002020000390000000002230436000018bd040000410000000000420435000018be0410009a000018bf0040009c00003e310000a13d0000000f0000006b0000000e030000290000000002030019000000100200c029000018b03110012c0000000f0110014f000018b00330c09900000000022300d9000000ff011002120000000003210049000000000113019f0000000001026019000000000002004b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c00001b630000213d000018b102100099000000000027004b0000000003000019000018b003002041000018b002200197000018b004700197000000000524013f000000000024004b0000000002000019000018b002004041000018b00050009c000000000203c019000000000002004b000044470000c13d000018b00010009c00001b730000413d000018b302100099000000000027004b0000000003000019000018b003004041000018b002200197000018b004700197000000000524013f000000000024004b0000000002000019000018b002002041000018b00050009c000000000203c019000000000002004b000044470000c13d0000000001710019000018b102100197000018b200100198000018b301000041000000000100601900000000032101a000000000010000390000000101006039000018bc0030009c0000000002000039000000010200203900000000001201a000000012020000290000001901000029000000000102c0190000000001010433000018b200100198000018b3020000410000000002006019000000400400043d000018b70040009c00000e1c0000213d000018b10110019700000000051201a00000004001400039000000400010043f00000003010000390000000002140436000018c2010000410000000000120435000000400100043d00003e460000613d000018b04250012c000018b00440c099000018c0033000d1000018b05330012c000000000323013f000018b00550c09900000000024500d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b70010009c00000e1c0000213d0000004003100039000000400030043f00000002030000390000000003310436000018bd040000410000000000430435000018b20420009a000018c30040009c00003e5a0000a13d000018b101200197000018b200200198000018b3020000410000000002006019000000000312019f0000000000390435000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c00001be30000213d000000000001004b00001be30000613d00000015020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c00001bd00000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c00001be00000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d0000000001120019000000150200002900001c0c0000013d00000017020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000000000001004b00001bfa0000c13d000018b20310009a000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00010009c00001c0a0000413d000018c10310009a000000000032004b0000000004000019000018b004002041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200490000001702000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000000000012043500000000010a0433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000018bc0010009c00001c340000213d000000000001004b00001c340000613d00000014020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018b20310009a000018b004200197000018b005300197000000000654013f000000000054004b0000000004000019000018b004002041000000000032004b0000000003000019000018b003004041000018b00060009c000000000403c019000000000004004b000044470000c13d0000000001120049000000140200002900001c5d0000013d00000016020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c00001c4b0000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c00001c5b0000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200190000001602000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000000000012043500000000020a0433000018b101200197000018b200200198000018b303000041000000000300601900000000021301a000000000040000390000000104006039000018bc0020009c0000000002000039000000010200203900000000004201a000000011040000290000001802000029000000000204c0190000000002020433000018b200200198000018b3040000410000000004006019000018b200300198000018b3050000410000000005006019000000400300043d000018b70030009c00000e1c0000213d000018b102200197000000000224019f000000000115019f00000000012100a90000004002300039000000400020043f00000002020000390000000002230436000018bd040000410000000000420435000018be0410009a000018bf0040009c00003e6f0000a13d0000000f0000006b0000000e030000290000000002030019000000100200c029000018b03110012c0000000f0110014f000018b00330c09900000000022300d9000000ff011002120000000003210049000000000113019f0000000001026019000000000002004b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c00001cac0000213d000018b102100099000000000028004b0000000003000019000018b003002041000018b002200197000018b004800197000000000524013f000000000024004b0000000002000019000018b002004041000018b00050009c000000000203c019000000000002004b000044470000c13d000018b00010009c00001cbc0000413d000018b302100099000000000028004b0000000003000019000018b003004041000018b002200197000018b004800197000000000524013f000000000024004b0000000002000019000018b002002041000018b00050009c000000000203c019000000000002004b000044470000c13d0000000001810019000018b102100197000018b200100198000018b301000041000000000100601900000000032101a000000000010000390000000101006039000018bc0030009c0000000002000039000000010200203900000000001201a000000011020000290000001801000029000000000102c0190000000001010433000018b200100198000018b3020000410000000002006019000000400400043d000018b70040009c00000e1c0000213d000018b10110019700000000051201a00000004001400039000000400010043f00000003010000390000000002140436000018c2010000410000000000120435000000400100043d00003ead0000613d000018b04250012c000018b00440c099000018c0033000d1000018b05330012c000000000323013f000018b00550c09900000000024500d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b70010009c00000e1c0000213d0000004003100039000000400030043f00000002030000390000000003310436000018bd040000410000000000430435000018b20420009a000018c30040009c00003ec10000a13d000018b101200197000018b200200198000018b3020000410000000002006019000000000312019f00000000003a0435000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c001a0000000a001d00001d2d0000213d000000000001004b00001d2d0000613d00000014020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c00001d1a0000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c00001d2a0000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d0000000001120019000000140200002900001d560000013d00000016020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000000000001004b00001d440000c13d000018b20310009a000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00010009c00001d540000413d000018c10310009a000000000032004b0000000004000019000018b004002041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200490000001602000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001c02000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001b020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b0000001c01000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001a020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b0000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d00000019020000290000000002020433000018cb02200197000000120300002900000000030304330000008003300210000000000223019f000000000101043b000000000021041b00000015020000290000000002020433000018cb02200197000000170300002900000000030304330000008003300210000000000223019f0000000101100039000000000021041b000000000000043f0000006c01000039000000200010043f00000018010000290000000001010433000018cb01100197000000110200002900000000020204330000008002200210000000000112019f000018b402000041000000000012041b00000014010000290000000001010433000018cb01100197000000160200002900000000020204330000008002200210000000000112019f000018ba02000041000000000012041b000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000002002100039000000000002043500000000000104350000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400700043d000018b90070009c00000e1c0000213d000000000101043b0000008002700039000000400020043f000000000201041a000018b003200197000018b00030009c000000010600008a0000000003000019000000000306601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000004270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f001a00000004001d00000000002404350000000101100039000000000101041a000018b002100197000018b00020009c0000000002000019000000000206601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040037000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001b00000007001d000000600270003900000000001204350000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001c02000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c0000001b0500002900000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a000000000040500190000001a0400c029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00000e1c0000213d000000000113019f000018b103400197000000000532019f00000000075100a90000004001600039000000400010043f00000002010000390000000004160436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c00003eeb0000a13d000018b70010009c00000e1c0000213d0000000f0000006b0000000e060000290000000004060019000000100400c029000018b07670012c0000000f0660014f000018b00770c0990000004008100039000000400080043f0000002008100039000000000058043500000000044700d9000000ff056002120000000006450049000000000556019f0000000005046019000000000004004b000000000405c019000018b105400197000018b200400198000018b3040000410000000004006019000000000654019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200400198000018b3010000410000000001006019000000000151019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d1040000410000001c050000290000001d0600002961ee61e40000040f000000010020019000000c960000613d000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000002002100039000000000002043500000000000104350000006c01000039000000200010043f000000400600043d000018b90060009c00000e1c0000213d0000008001600039000000400010043f000018b401000041000000000101041a000018b002100197000018b00020009c000000010500008a0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000003160436000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001a00000003001d0000000000130435000018ba01000041000000000101041a000018b002100197000018b00020009c0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040036000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001b00000006001d000000600260003900000000001204350000001c01000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c0000001b0500002900000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a000000000040500190000001a0400c029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00000e1c0000213d000000000113019f000018b103400197000000000532019f00000000075100a90000004001600039000000400010043f00000002010000390000000004160436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c00003f280000a13d000018b70010009c00000e1c0000213d0000000f0000006b0000000e040000290000000008040019000000100800c029000018b06470012c0000000f0440014f000018b00660c0990000004007100039000000400070043f0000002007100039000000000057043500000000058600d9000000ff044002120000000006540049000000000446019f0000000004056019000000000005004b000000000504c019000018b104500197000018b200500198000018b3050000410000000005006019000000000645019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200500198000018b3010000410000000001006019000000000141019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d1040000410000001c05000029000000000600001961ee61e40000040f000000010020019000000c960000613d00000008020000290000000b012001af000018b204100198000018b301000041000000000100601900000000032101a0000025cd0000613d000000400100043d000018eb0010009c00000e1c0000213d000000a002100039000000400020043f000000800210003900000000000204350000006002100039000000000002043500000040021000390000000000020435000000200210003900000000000204350000000000010435000000400200043d000018eb0020009c00000e1c0000213d000000a001200039000000400010043f0000008001200039001800000001001d00000000000104350000006001200039001700000001001d00000000000104350000004001200039001900000001001d0000000000010435001b00000002001d0000000001020436001a00000001001d00000000000104350000001d01000029000000000010043f000018d801000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c70000801002000039001d00000003001d001c00000004001d61ee61e90000040f0000001c0b0000290000001d0a000029000000010020019000000c960000613d000000400300043d000018eb0030009c0000001b0c00002900000e1c0000213d000000000101043b000000a002300039000000400020043f000000000101041a000018b002100197000018b00020009c000000010200008a000000000200c01900000080022002100000008004100270000000000224019f000000800000008b00000000020160190000004004100270000018d404400197000018ed00100198000018d3050000410000000005006019000000000545019f000018b104200197000018b200200198000018b3020000410000000002006019000000000642019f000018d200100198000018d3070000410000000007006019000018d200700198000018d3020000410000000002006019000018f304200197000018b200200198000018b3020000410000000002006019000000000824019f0000002002100270000018d402200197000018ec00100198000018d3040000410000000004006019000000000924019f0000006002100270000018d402200197000018b200100198000018d3040000410000000004006019000000000424019f000000600230003900000000004204350000004004300039000000000054043500000020053000390000000000950435000018d409100197000000000197019f000000000013043500000080013000390000000000610435000000000398019f000018f40630009a000018f50060009c000044470000413d000018d6033000d1000018f606300197000018b200300198000018b3030000410000000003006019000000000363019f00000000003c04350000000003050433000018d405300197000018d200300198000018d3030000410000000003006019000018f306300197000000000556019f000018b200300198000018b3030000410000000003006019000000000335019f000018f40530009a000018f50050009c000044470000413d000018d6033000d1000018f605300197000018b200300198000018b3030000410000000003006019000000000353019f0000001a0500002900000000003504350000000003040433000018d404300197000018d200300198000018d3030000410000000003006019000018f305300197000000000445019f000018b200300198000018b3030000410000000003006019000000000334019f000018f40430009a000018f50040009c000044470000413d000018d6033000d1000018f604300197000018b200300198000018b3030000410000000003006019000000000343019f000000190400002900000000003404350000000002020433000018d403200197000018d200200198000018d3020000410000000002006019000018f304200197000000000334019f000018b200200198000018b3020000410000000002006019000000000223019f000018f40320009a000018f50030009c000044470000413d000018d6022000d1000018f603200197000018b200200198000018b3020000410000000002006019000000000232019f000000170300002900000000002304350000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000001802000029000000000012043500000000000b004b0000006001000039000000400100603900000000011c00190000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000018f70210009a000018cc0020009c000044470000413d000018c001100099000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000018b02110012c000018b00220c099000018b003000041000000324330011b000000000331013f000018b00440c09900000000014200d9000000ff023002120000000003120049000000000223019f0000000002016019000000000001004b000000000102c019000018b200100198000018b3020000410000000002006019000000400300043d000018b70030009c00000e1c0000213d000018b101100197000000000112019f0000000004a100a90000004001300039000000400010043f00000002010000390000000002130436000018bd010000410000000000120435000000400100043d000018be0540009a000018bf0050009c00003e840000a13d000018b002000041000018c03520012b000018b002300099001a00000002001d001800000003001d0000000002036019000018b04340012c001900000005001d000000000353013f000018b00440c09900000000022400d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b200200198000018b3030000410000000003006019000018b70010009c00000e1c0000213d000018b102200197000000000723019f0000004002100039000000400020043f00000002020000390000000003210436000018bd020000410000000000230435000018f80270009a000018f90020009c00003e980000a13d000018b001000041000000022110011b000018b00220c099000018b04370012c000000000113013f000018b00440c09900000000022400d9000000ff011002120000000003210049000000000113019f0000000001026019000000000002004b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000612019f000018b20860009a000018bc0060009c000020a40000213d000000000087004b0000000001000019000018b001004041000018b002800197000018b003700197000000000423013f000000000023004b0000000002000019000018b002002041000018b00040009c000000000201c019000000000002004b000044470000c13d000018c10960009a000018b00060009c000020b40000413d000000000097004b0000000001000019000018b001002041000018b002900197000018b003700197000000000423013f000000000023004b0000000002000019000018b002004041000018b00040009c000000000201c019000000000002004b000044470000c13d0000002001000029000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000018bc0010009c000020ca0000213d000018b102100099000000000026004b0000000003000019000018b003002041000018b002200197000018b004600197000000000524013f000000000024004b0000000002000019000018b002004041000018b00050009c000000000203c019000000000002004b000044470000c13d000018b00010009c000020da0000413d000018b302100099000000000026004b0000000003000019000018b003004041000018b002200197000018b004600197000000000524013f000000000024004b0000000002000019000018b002002041000018b00050009c000000000203c019000000000002004b000044470000c13d001000000009001d001100000008001d001200000007001d001500000006001d002000000061001d0000006c01000039000000200010043f000000400600043d000018b90060009c00000e1c0000213d0000008001600039000000400010043f000018b401000041000000000101041a000018b002100197000018b00020009c000000010500008a0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000003160436000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001d00000003001d0000000000130435000018ba01000041000000000101041a000018b002100197000018b00020009c0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000004003600039001c00000003001d0000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001400000006001d0000006002600039001b00000002001d00000000001204350000002201000029001600000001001d000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400300043d000018bb0030009c00000e1c0000213d000000000101043b0000002002300039000000400020043f000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f001300000003001d00000000001304350000002101000029001700000001001d000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400b00043d000018bb00b0009c0000001409000029000000130a00002900000e1c0000213d00000015080000290000001202800069000000000101043b0000002003b00039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001b0435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000018b30010009c0000001104000029000000100c000029000044470000613d0000000002100089000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000000000042004b0000000003000019000018b003004041000018b004400197000018b005200197000000000645013f000000000045004b0000000007000019000018b007002041000018b00060009c000000000703c019000018b003c00197000000000435013f000000000035004b0000000003000019000018b0030040410000000000c2004b0000000005000019000018b005002041000018b00040009c000000000305c019000000000003004b0000000003000039000000010300c039000018bc0080009c00000000040000390000000104002039000018b00080009c00000000050000390000000105004039000000000007004b0000000006000039000000010600c039000000000565016f0000000100500190000044470000c13d000000000334016f0000000100300190000044470000c13d00000000030a0433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018bc0030009c000021ae0000213d000000000003004b000021ae0000613d0000001c040000290000000004040433000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f000018b20530009a000018b006400197000018b007500197000000000876013f000000000076004b0000000006000019000018b006002041000000000054004b0000000005000019000018b005004041000018b00080009c000000000605c019000000000006004b000044470000c13d00000000033400490000001c04000029000021d70000013d0000001b040000290000000004040433000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f000018bc0040009c000021c50000213d000018b105400099000000000053004b0000000006000019000018b006002041000018b005500197000018b007300197000000000857013f000000000057004b0000000005000019000018b005004041000018b00080009c000000000506c019000000000005004b000044470000c13d000018b00040009c000021d50000413d000018b305400099000000000053004b0000000006000019000018b006004041000018b005500197000018b007300197000000000857013f000000000057004b0000000005000019000018b005002041000018b00080009c000000000506c019000000000005004b000044470000c13d00000000033400190000001b04000029000018b105300197000018b200300198000018b3030000410000000003006019000000000353019f000000000034043500000000040a0433000018b103400197000018b200400198000018b304000041000000000400601900000000053401a000000000060000390000000106006039000018bc0050009c0000000005000039000000010500203900000000006501a000000000050900190000001d0500c0290000000005050433000018b200500198000018b3060000410000000006006019000018b200400198000018b3070000410000000007006019000000400400043d000018b70040009c00000e1c0000213d000018b105500197000000000556019f000000000337019f00000000055300a90000004003400039000000400030043f00000002030000390000000003340436000018bd060000410000000000630435000018be0650009a000018bf0060009c00003ed60000a13d000000150220006a000000190000006b000000180400002900000000030400190000001a0300c029000018b05450012c000000190440014f000018b00550c09900000000033500d9000000ff044002120000000005340049000000000445019f0000000004036019000000000003004b000000000304c019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018bc0030009c0000222b0000213d000018b104300099000000000042004b0000000005000019000018b005002041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b000044470000c13d000018b00030009c0000223b0000413d000018b304300099000000000042004b0000000005000019000018b005004041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b000044470000c13d0000000002230019000018b103200197000018b200200198000018b302000041000000000200601900000000043201a000000000020000390000000102006039000018bc0040009c0000000003000039000000010300203900000000002301a000000000020900190000001d0200c0290000000002020433000018b200200198000018b3030000410000000003006019000000400500043d000018b70050009c00000e1c0000213d000018b10220019700000000062301a00000004002500039000000400020043f00000003020000390000000003250436000018c2020000410000000000230435000000400200043d00003eff0000613d000018b05360012c000018b00550c099000018c0044000d1000018b06440012c000000000334013f000018b00660c09900000000045600d9000000ff033002120000000005430049000000000335019f0000000003046019000000000004004b000000000403c019000018b70020009c00000e1c0000213d0000004003200039000000400030043f00000002030000390000000003320436000018bd050000410000000000530435000018b20540009a000018c30050009c00003f130000a13d000018b102400197000018b200400198000018b3030000410000000003006019000000000423019f00000000004a0435000018b200300198000018b3030000410000000003006019000000000223019f000018bc0020009c000022aa0000213d000000000002004b000022aa0000613d0000001c030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018bc0030009c000022970000213d000018b104300099000000000042004b0000000005000019000018b005002041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b000044470000c13d000018b00030009c000022a70000413d000018b304300099000000000042004b0000000005000019000018b005004041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b000044470000c13d00000000022300190000001c03000029000022d30000013d0000001b030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000000002004b000022c10000c13d000018b20420009a000000000043004b0000000005000019000018b005004041000018b004400197000018b006300197000000000746013f000000000046004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b000044470000c13d000018b00020009c000022d10000413d000018c10420009a000000000043004b0000000005000019000018b005002041000018b004400197000018b006300197000000000746013f000000000046004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b000044470000c13d00000000022300490000001b03000029000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f000000000023043500000000020b0433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c000022fb0000213d000000000002004b000022fb0000613d0000001c030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018b20420009a000018b005300197000018b006400197000000000765013f000000000065004b0000000005000019000018b005002041000000000043004b0000000004000019000018b004004041000018b00070009c000000000504c019000000000005004b000044470000c13d00000000022300490000001c03000029000023240000013d0000001b030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018bc0030009c000023120000213d000018b104300099000000000042004b0000000005000019000018b005002041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b000044470000c13d000018b00030009c000023220000413d000018b304300099000000000042004b0000000005000019000018b005004041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b000044470000c13d00000000022300190000001b03000029000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f000000000023043500000000030b0433000018b102300197000018b200300198000018b303000041000000000300601900000000042301a000000000050000390000000105006039000018bc0040009c0000000004000039000000010400203900000000005401a000000000040900190000001d0400c0290000000004040433000018b200400198000018b3050000410000000005006019000018b200300198000018b3060000410000000006006019000000400300043d000018b70030009c00000e1c0000213d000018b104400197000000000445019f000000000226019f00000000044200a90000004002300039000000400020043f00000002020000390000000002230436000018bd050000410000000000520435000018be0540009a000018bf0050009c00003f3c0000a13d000000190000006b000000180300002900000000020300190000001a0200c029000018b04340012c000000190330014f000018b00440c09900000000022400d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c000023720000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c000023820000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d0000000001120019000018b102100197000018b200100198000018b301000041000000000100601900000000032101a000000000010000390000000101006039000018bc0030009c0000000002000039000000010200203900000000001201a000000000010900190000001d0100c0290000000001010433000018b200100198000018b3020000410000000002006019000000400400043d000018b70040009c00000e1c0000213d000018b10110019700000000051201a00000004001400039000000400010043f00000003010000390000000002140436000018c2010000410000000000120435000000400100043d00003f510000613d000018b04250012c000018b00440c099000018c0033000d1000018b05330012c000000000323013f000018b00550c09900000000024500d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b70010009c00000e1c0000213d0000004003100039000000400030043f00000002030000390000000003310436000018bd040000410000000000430435000018b20420009a000018c30040009c00003f650000a13d000018b101200197000018b200200198000018b3020000410000000002006019000000000312019f00000000003b0435000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c000f0000000b001d000023f20000213d000000000001004b000023f20000613d0000001c020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c000023df0000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c000023ef0000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200190000001c020000290000241b0000013d0000001b020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000000000001004b000024090000c13d000018b20310009a000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00010009c000024190000413d000018c10310009a000000000032004b0000000004000019000018b004002041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200490000001b02000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001601000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d00000013020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b0000001701000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000000f020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b000000000000043f0000006c01000039000000200010043f0000001d01000029000000000101043300000014020000290000000002020433000018cb032001970000008004100210000000000334019f000018b404000041000000000034041b0000001b0300002900000000040304330000001c030000290000000003030433000018cb053001970000008006400210000000000556019f000018ba06000041000000000056041b000000400500043d000018b70050009c00000e1c0000213d0000004006500039000000400060043f0000002006500039000000000006043500000000000504350000006c05000039000000200050043f000000400600043d000018b90060009c00000e1c0000213d0000008005600039000000400050043f000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000060056000390000000000450435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000040046000390000000000340435000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f001d00000006001d0000000003260436000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f001c00000003001d00000000001304350000001701000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c0000001d0500002900000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a000000000040500190000001c0400c029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00000e1c0000213d000000000113019f000018b103400197000000000532019f00000000075100a90000004001600039000000400010043f00000002010000390000000004160436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c00003f7a0000a13d000018b70010009c00000e1c0000213d000000190000006b000000180600002900000000040600190000001a0400c029000018b07670012c000000190660014f000018b00770c0990000004008100039000000400080043f0000002008100039000000000058043500000000044700d9000000ff056002120000000006450049000000000556019f0000000005046019000000000004004b000000000405c019000018b105400197000018b200400198000018b3040000410000000004006019000000000654019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200400198000018b3010000410000000001006019000000000151019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d1040000410000001705000029000000000600001961ee61e40000040f000000010020019000000c960000613d000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000002002100039000000000002043500000000000104350000006c01000039000000200010043f000000400600043d000018b90060009c00000e1c0000213d0000008001600039000000400010043f000018b401000041000000000101041a000018b002100197000018b00020009c000000010500008a0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000003160436000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001c00000003001d0000000000130435000018ba01000041000000000101041a000018b002100197000018b00020009c0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040036000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001d00000006001d000000600260003900000000001204350000001601000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c0000001d0500002900000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a000000000040500190000001c0400c029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00000e1c0000213d000000000113019f000018b103400197000000000532019f00000000075100a90000004001600039000000400010043f00000002010000390000000004160436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c00003f8e0000a13d000018b70010009c00000e1c0000213d000000190000006b000000180400002900000000080400190000001a0800c029000018b06470012c000000190440014f000018b00660c0990000004007100039000000400070043f0000002007100039000000000057043500000000058600d9000000ff044002120000000006540049000000000446019f0000000004056019000000000005004b000000000504c019000018b104500197000018b200500198000018b3050000410000000005006019000000000645019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200500198000018b3010000410000000001006019000000000141019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d1040000410000001605000029000000000600001961ee61e40000040f000000010020019000000c960000613d000018cb010000410000001e0110017f000018cb0010009c000044470000613d001e00010010003d00000001021000390000001f010000290000000003010433000000000032004b000013060000413d0000002002000029000000400100043d00000d4e0000013d001c00000000001d001900000000001d000000400100043d001b00000001001d000018eb0010009c00000e1c0000213d0000001c010000290000000501100210000000a00110003900000000010104330000187d031001970000001b02000029000000a001200039000000400010043f0000008001200039001a00000001001d00000000000104350000006001200039001300000001001d00000000000104350000004001200039001500000001001d00000000000104350000000001020436001400000001001d0000000000010435001d00000003001d000000000030043f000018d801000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400300043d000018eb0030009c00000e1c0000213d000000000101043b000000a002300039000000400020043f000000000101041a000018b002100197000018b00020009c000000010200008a000000000200c01900000080022002100000008004100270000000000224019f000000800000008b00000000020160190000004004100270000018d404400197000018ed00100198000018d3050000410000000005006019000000000545019f000018b104200197000018b200200198000018b3020000410000000002006019000000000642019f000018d200100198000018d3070000410000000007006019000018d200700198000018d3020000410000000002006019000018f304200197000018b200200198000018b3020000410000000002006019000000000824019f0000002002100270000018d402200197000018ec00100198000018d3040000410000000004006019000000000924019f0000006002100270000018d402200197000018b200100198000018d3040000410000000004006019000000000424019f000000600230003900000000004204350000004004300039000000000054043500000020053000390000000000950435000018d409100197000000000197019f000000000013043500000080013000390000000000610435000000000398019f000018f40630009a000018f50060009c000044470000413d000018d6033000d1000018f606300197000018b200300198000018b3030000410000000003006019000000000363019f0000001b0600002900000000003604350000000003050433000018d405300197000018d200300198000018d3030000410000000003006019000018f306300197000000000556019f000018b200300198000018b3030000410000000003006019000000000335019f000018f40530009a000018f50050009c000044470000413d000018d6033000d1000018f605300197000018b200300198000018b3030000410000000003006019000000000353019f000000140500002900000000003504350000000003040433000018d404300197000018d200300198000018d3030000410000000003006019000018f305300197000000000445019f000018b200300198000018b3030000410000000003006019000000000334019f000018f40430009a000018f50040009c000044470000413d000018d6033000d1000018f604300197000018b200300198000018b3030000410000000003006019000000000343019f000000150400002900000000003404350000000002020433000018d403200197000018d200200198000018d3020000410000000002006019000018f304200197000000000334019f000018b200200198000018b3020000410000000002006019000000000223019f000018f40320009a000018f50030009c000044470000413d000018d6022000d1000018f603200197000018b200200198000018b3020000410000000002006019000000000232019f000000130300002900000000002304350000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000001a020000290000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000002002100039000000000002043500000000000104350000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400700043d000018b90070009c00000e1c0000213d000000000101043b0000008002700039000000400020043f000000000201041a000018b003200197000018b00030009c000000010500008a0000000003000019000000000305601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000004270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f001700000004001d00000000002404350000000101100039000000000101041a000018b002100197000018b00020009c0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040037000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001800000007001d000000600270003900000000001204350000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001202000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c000000180500002900000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b304000041000000000400601900000000021401a000000000030000390000000103006039000018bc0020009c0000000002000039000000010200203900000000003201a00000000002050019000000170200c0290000000002020433000018b200200198000018b3030000410000000003006019000018b200400198000018b3050000410000000005006019000000400400043d000018b70040009c00000e1c0000213d000018b102200197000000000323019f000000000115019f00000000053100a90000004001400039000000400010043f00000002010000390000000002140436000018bd010000410000000000120435000000400100043d000018be0650009a000018bf0060009c00003b960000a13d000018b70010009c00000e1c0000213d000018b002000041000018c0a920012b000018b008a0009900000000020a0019000000000208c019000018b05450012c000000000494013f000018b00550c0990000004006100039000000400060043f0000002006100039000000000036043500000000032500d9000000ff024002120000000004320049000000000224019f0000000002036019000000000003004b000000000302c019000018b102300197000018b200300198000018b3030000410000000003006019000000000423019f00000000004104350000001906000029000018b200600198000018b3010000410000000001006019000018b2033001970000001104000029000000020040008c0000275f0000c13d000018b305000041000018c004000041000000000003004b0000000005006019000027770000013d000000000003004b0000276d0000c13d000000000004004b000000150400002900000000030400190000001b030060290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000443019f0000000005000019000027770000013d000000000004004b0000001404000029000000130400c0290000000003040433000018b104300197000018b200300198000018b3030000410000000003006019000000000443019f000018b305000041000018b10360019700000000022501a0001800000008001d001700000009001d00160000000a001d000027ef0000613d000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f000019110040009c00003c720000613d000000400500043d000018b70050009c00000e1c0000213d00000000062400a90000004002500039000000400020043f00000002020000390000000004250436000018bd020000410000000000240435000000400200043d000018be0760009a000018bf0070009c00003c760000a13d000000000009004b00000000040a0019000000000408c019000018b06560012c000000000595013f000018b00660c09900000000044600d9000000ff055002120000000006450049000000000556019f0000000005046019000000000004004b000000000405c0190000001a050000290000000005050433000018b200500198000018b3060000410000000006006019000018b200400198000018b3070000410000000007006019000018b70020009c00000e1c0000213d000018b105500197000000000556019f000018b104400197000000000447019f00000000054500a90000004004200039000000400040043f00000002040000390000000004420436000018bd060000410000000000640435000018be0650009a000018bf0060009c00003c8a0000a13d000000000009004b00000000020a0019000000000208c019000018b05450012c000000000494013f000018b00550c09900000000022500d9000000ff044002120000000005240049000000000445019f0000000004026019000000000002004b000000000204c019000018b200100198000018b3010000410000000001006019000000000131019f000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0010009c000027dd0000213d000018b103100099000000000032004b0000000004000019000018b004002041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00010009c000027ed0000413d000018b303100099000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d0000000001120019000027f00000013d000000000131019f001900000001001d0000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001202000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400400043d000018bb0040009c0000001809000029000000170a000029000000160b00002900000e1c0000213d000000000101043b0000002002400039000000400020043f0000000101100039000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000321019f0000000000340435000018b200100198000018b301000041000000000100601900000000002101a0000028fe0000613d001400000004001d0000001d01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000301043b000000400200043d000018cf0020009c0000001809000029000000170a000029000000160b000029000000140800002900000e1c0000213d0000006001200039000000400010043f000000000103041a000018b104100197000018b200100198000018b3010000410000000001006019000000000141019f0000000001120436000000400400043d000018b70040009c00000e1c0000213d0000004005400039000000400050043f0000000105300039000000000505041a000018b006500197000018b00060009c000000010600008a000000000600c01900000080066002100000008007500270000000000667019f000000800000008b0000000006056019000018b107600197000018b200600198000018b3060000410000000006006019000000000676019f00000020074000390000000000670435000018b106500197000018b200500198000018b3050000410000000005006019000000000565019f00000000005404350000000000410435000000400500043d000018b70050009c00000e1c0000213d0000004004500039000000400040043f0000000203300039000000000303041a000018b004300197000018b00040009c000000010400008a000000000400c01900000080044002100000008006300270000000000446019f000000800000008b0000000004036019000018b106400197000018b200400198000018b3040000410000000004006019000000000464019f00000020065000390000000000460435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000000000350435000000400420003900000000005404350000000002020433000018b200200198000018b3030000410000000003006019000000400500043d000018b70050009c00000e1c0000213d000018b10220019700000000062301a000000000070804330000004002500039000000400020043f00000003020000390000000003250436000018c2020000410000000000230435000000400200043d00003c9f0000613d000018b103700197000018b200700198000018b3050000410000000005006019000000000335019f000018c0033000d1000018b05330012c000018b00550c099000018b07660012c000000000363013f000018b00770c09900000000067500d9000000ff033002120000000005630049000000000335019f0000000003066019000000000006004b000000000603c019000018b70020009c00000e1c0000213d0000004003200039000000400030043f00000002030000390000000005320436000018bd030000410000000000350435000000400300043d000018b20760009a000018c30070009c00003cb30000a13d000018b200600198000018b302000041000000000200601900000000040404330000000005040433000018b200500198000018b3070000410000000007006019000018b70030009c00000e1c0000213d000018b104600197000000000442019f000018b102500197000000000227019f00000000064200a90000004002300039000000400020043f00000002020000390000000005230436000018bd020000410000000000250435000000400200043d000018be0760009a000018bf0070009c00003ce90000a13d00000000000a004b00000000030b0019000000000309c019000018b06560012c0000000007a5013f000018b00660c09900000000053600d9000000ff037002120000000006530049000000000336019f0000000003056019000000000005004b000000000503c01900000000010104330000000003010433000018b200300198000018b3060000410000000006006019000018b200500198000018b3010000410000000001006019000018b70020009c00000e1c0000213d000018b103300197000000000336019f00000000064300a90000004003200039000000400030043f00000002030000390000000003320436000018bd040000410000000000430435000018be0460009a000018bf0040009c00003cfd0000a13d000018b103500197000000000431019f00000000000a004b00000000010b0019000000000109c019000018b05260012c0000000002a2013f000018b00550c09900000000051500d9000000ff012002120000000002510049000000000112019f0000000001056019000000000005004b000000000501c019000018b101500197000018b200500198000018b3020000410000000002006019000000000212019f000029020000013d0000000003000019000000000100001900000000040000190000000002000019000018b200400198000018b304000041000000000400601900000000033401a000002a6a0000613d0000001a040000290000000005040433000018b200500198000018b3060000410000000006006019000000400400043d000018b70040009c00000e1c0000213d000018b105500197000000000556019f00000000053500a90000004003400039000000400030043f00000002030000390000000003340436000018bd060000410000000000630435000018be0650009a000018bf0060009c00003cd40000a13d00000000000a004b00000000030b0019000000000309c019000018b05450012c0000000004a4013f000018b00550c09900000000053500d9000000ff034002120000000004530049000000000334019f0000000003056019000000000005004b000000000503c019000018b200200198000018b3030000410000000003006019000000000113019f000018b102500197000018b200500198000018b3040000410000000004006019000000000224019f000000000001004b0000293e0000613d000018bc0020009c0000293e0000213d000000000002004b0000293e0000613d000018bc0010009c0000293e0000213d000000000001004b0000293e0000613d000018bc05100129000000000025004b000044470000413d000000000002004b000029420000613d0000192f0020009c000029f30000c13d000000000001004b000029770000613d0000192f0010009c000029660000613d000018b06510012c000018b00660c099000018b007000041000018b08770012b000000000757013f000018b00880c09900000000056800d9000000ff067002120000000007560049000000000667019f0000000006056019000000000005004b000000000506c019000018bc0010009c000029660000213d000000000001004b000029660000613d000018b00020009c000029660000413d000000000025004b0000000006000019000018b006002041000018b007200197000018b005500197000000000875013f000000000075004b0000000005000019000018b005004041000018b00080009c000000000506c019000000000005004b000044470000c13d000018b06510012c000018b00660c099000018b007000041000018bc8770012b000000000757013f000018b00880c09900000000056800d9000000ff067002120000000007560049000000000667019f0000000006056019000000000005004b000000000506c019000000000334016f000018b00030009c0000297b0000813d000029880000013d0000000005000019000000000334016f000018b00030009c000029880000413d000000000025004b0000000003000019000018b003002041000018b004200197000018b005500197000000000645013f000000000045004b0000000004000019000018b004004041000018b00060009c000000000403c019000000000004004b000044470000c13d00000000011200a9000018b00010009c00003d120000813d000000040010008c000029910000813d000000000001004b000000010300c0390000000003006019000029960000013d00000001021002700000000102200039000000000012004b0000000003010019000029c40000413d000018b101300197000018b200300198000018b3020000410000000002006019000000000112019f000019030210009a000018b30020009c000044470000413d0000001104000029000000000004004b00002a140000613d000018c002000041000000020040008c000018c00400004100002a1b0000613d000000150200002900002a150000013d0000000003230019000018b04330012c000018b00440c099000018b005000041000000026550011b000000000353013f000018b00660c09900000000046400d9000000ff033002120000000005430049000000000335019f0000000003046019000000000004004b000000000403c019000018b003200197000018b005400197000000000635013f000000000035004b0000000003000019000018b003002041000000000024004b0000000005000019000018b005004041000018b00060009c000000000305c019000000000003004b00000000030200190000000002040019000029960000613d000000000002004b000048680000613d000018b04320012c000018b00440c099000018b06510012c000000000535013f000018b00660c09900000000034600d9000000ff045002120000000005340049000000000445019f0000000004036019000000000003004b000000000304c019000018bc0030009c000029e20000213d000018bc04300167000000000024004b0000000005000019000018b005004041000018b006200197000018b004400197000000000764013f000000000064004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b000044470000c13d000018b00030009c000029a70000413d000018b004300099000000000024004b0000000005000019000018b005002041000018b006200197000018b004400197000000000764013f000000000064004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b000029a70000613d000044470000013d000018b06520012c000018b00660c099000018b007000041000018b08770012b000000000757013f000018b00880c09900000000056800d9000000ff067002120000000007560049000000000667019f0000000006056019000000000005004b000000000506c019000018bc0020009c000029420000213d000000000002004b000029420000613d000018b00010009c000029420000413d000000000015004b0000000006000019000018b006002041000018b007100197000018b005500197000000000875013f000000000075004b0000000005000019000018b005004041000018b00080009c000000000506c019000000000005004b000029420000613d000044470000013d0000001b020000290000000004020433000018b102400197000018b200400198000018b3040000410000000004006019000000000424019f0000190300300198000018b3050000410000000005006019000018b200400198000018b3040000410000000004006019000000400300043d000018b70030009c00000e1c0000213d00000001011002100000190201100197000000000151019f000000000224019f00000000011200a90000004002300039000000400020043f00000002020000390000000002230436000018bd040000410000000000420435000018be0410009a000018bf0040009c00003d230000a13d00000000000a004b00000000090b6019000018b02110012c0000000001a1013f000018b00220c09900000000029200d9000000ff011002120000000003210049000000000113019f0000000001026019000000000002004b000000000201c0190000001903000029000018b101300197000018b200300198000018b3030000410000000003006019000000000113019f000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0010009c00002a590000213d000018b103100099000000000032004b0000000004000019000018b004002041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00010009c00002a690000413d000018b303100099000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d001900000012001d0000001c010000290000187d0010009c000044470000613d0000001c010000290000000101100039001c187d0010019b000000800100043d0000001c0010006b000025dc0000413d00003c730000013d0000006803000039000000000203041a000000000002004b00000b770000613d001500800000003d0000000101000029000818b10010019b000e18b20010019c000018b301000041000000000100601900000008081001af0000000004000019000900000008001d000000000030043f0000000501400210000000e00110018f0000000302400270000018e20220009a000000000202041a000000000112022f0000187d01100197000000990010008c000034100000613d001000000004001d001a00000001001d000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001900000002001d000018b90020009c00000e1c0000213d000000000101043b000000190a0000290000008002a00039000000400020043f000000000201041a000018b003200197000018b00030009c000000010900008a0000000003000019000000000309601900000080033002100000008004200270000000000334019f000018b200200198000018b3040000410000000004006019000018b105200197000000000454019f000000000b4a04360000001a05000029000000000005004b000000150400002900000000040a6019001500000004001d000000800000008b000000000203c019000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00180000000b001d00000000002b04350000000101100039000000000101041a000018b002100197000018b00020009c0000000002000019000000000209601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018b103100197000018b200100198000018b30100004100000000010060190000004009a00039000000000431019f001700000009001d00000000004904350000006004a00039001600000004001d0000000000240435000018b200100198000018b301000041000000000100601900000000003101a00000340f0000613d000000000050043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000400200043d001400000002001d000018cf0020009c000000020700003900000e1c0000213d00000014040000290000006002400039000000400020043f000000000201041a000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000002240436001300000002001d000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000103100039000000000303041a000018b004300197000018b00040009c000000010400008a000000000400c01900000080044002100000008005300270000000000445019f000000800000008b0000000004036019000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000020052000390000000000450435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000000032043500000013030000290000000000230435000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000201100039000000000101041a000018b003100197000018b00030009c000000010300008a000000000300c01900000080033002100000008004100270000000000334019f000000800000008b0000000003016019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000020042000390000000000340435000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000000000012043500000014010000290000004001100039000f00000001001d000000000021043500000017010000290000000001010433000018b200100198000018b302000041000000000200601900000019030000290000000004030433000018b200400198000018b3050000410000000005006019000000400300043d000018b70030009c00000e1c0000213d000018b101100197000000000112019f000018b102400197000000000225019f00000000041200a90000004001300039000000400010043f0000000002730436000018bd010000410000000000120435000000400100043d000018be0540009a000018bf0050009c000042d60000a13d000018b002000041000018c03520012b000018b002300099001d00000002001d001b00000003001d0000000002036019000018b04340012c001c00000005001d000000000553013f000018b00440c09900000000032400d9000000ff025002120000000004320049000000000224019f0000000002036019000000000003004b000000000302c01900000016020000290000000002020433000018b200200198000018b304000041000000000400601900000018050000290000000005050433000018b200500198000018b3060000410000000006006019000018b70010009c00000e1c0000213d000018b102200197000000000224019f000018b104500197000000000446019f00000000052400a90000004002100039000000400020043f0000000004710436000018bd020000410000000000240435000000400200043d000018be0650009a000018bf0060009c000042ea0000a13d000018b2013001970000001c0000006b0000001b0600002900000000040600190000001d0400c029000018b06550012c0000001c0550014f000018b00660c09900000000044600d9000000ff055002120000000006450049000000000556019f0000000005046019000000000004004b000000000405c019000000000001004b000018b3010000410000000001006019000018b70020009c00000e1c0000213d000018b10330019700000000053101a00000004001200039000000400010043f00000003010000390000000003120436000018c2010000410000000000130435000000400100043d000043000000613d000018b102400197000018b200400198000018b3030000410000000003006019000000000223019f000018c0022000d1000018b03220012c000018b00330c099001100000005001d000018b05450012c000000000242013f000018b00550c09900000000045300d9000000ff022002120000000003420049000000000223019f0000000002046019000000000004004b000000000402c019000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000000003710436000018bd020000410000000000230435001200000004001d000018b20240009a000018c30020009c000043140000a13d0000001a01000029000000000010043f0000006b01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400600043d000018eb0060009c000000080f0000290000000e0e000029000000120200002900000e1c0000213d000018b103200197000018b205200197000000000101043b000000a002600039000000400020043f000000000201041a000018c50220019700000000082604360000000102100039000000000402041a000018b002400197000018b00020009c000000010d00008a000000000200001900000000020d601900000080022002100000008007400270000000000727019f000000800000008b0000000007046019000018b102700197000018b200700198000018b30a000041000000000a006019000000400760003900000000092a019f0000000000970435000018b109400197000018b200400198000018b30b000041000000000b00601900000000049b019f00000000004804350000000201100039000000000101041a000018b004100197000018b00040009c000000000400001900000000040d601900000080044002100000008007100270000000000747019f000000800000008b0000000007016019000018b104100197000018b200100198000018b30c000041000000000c0060190000006001600039000000000d4c019f0000000000d104350000008001600039000018b106700197000018b200700198000018b3070000410000000007006019000000000d67019f0000000000d10435000000000005004b000018b3010000410000000001006019000000000131019f000018b200a00198000018b3030000410000000003006019000000000001004b00002c790000613d000018b200b00198000018b3050000410000000005006019000000000a95019f000018b005a00197000018b00b100197000000000d5b013f00000000005b004b000000000e000019000018b00e0020410000000009a1004b0000000005000019000018b005004041000018b000d0009c000000000e05c019000018b205c0019700000000000e004b00002c800000613d000000000005004b000018b3050000410000000005006019000000400600043d000018b70060009c0000000e0e000029000000090d000029000000020a00003900000e1c0000213d000000000445019f00000000071400a90000004004600039000000400040043f0000000004a60436000018bd050000410000000000540435000000400500043d000018be0970009a000018bf0090009c000045090000a13d0000001c0000006b0000001b0600002900000000040600190000001d0400c029000018b07670012c0000001c0660014f000018b00770c09900000000074700d9000000ff046002120000000006740049000000000446019f0000000004076019000000000007004b000000000704c0190000000004080433000018b200400198000018b3060000410000000006006019000018b70050009c00000e1c0000213d000018b10440019700000000084601a00000004004500039000000400040043f00000003040000390000000006450436000018c2040000410000000000460435000000400400043d0000451d0000613d000018b105700197000018b200700198000018b3060000410000000006006019000000000556019f000018c0055000d1000018b06550012c000018b00660c099000018b08780012c000000000575013f000018b00880c09900000000068600d9000000ff055002120000000007650049000000000557019f0000000005066019000000000006004b000000000605c019000018b70040009c00000e1c0000213d0000004005400039000000400050043f0000000005a40436000018bd070000410000000000750435000018b20760009a000018c30070009c000045520000a13d000018b104600197000018b200600198000018b3050000410000000005006019000000000445019f00002d260000013d0000000002000019000000090d000029000000020a000039000000400300043d000018b70030009c00002d4e0000a13d00000e1c0000013d000018bc00a0009c0000000e0e000029000000090d00002900002c920000213d000018b208a0009a000000000081004b000000000c000019000018b00c004041000018b008800197000000000d8b013f00000000008b004b0000000008000019000018b008002041000018b000d0009c000000090d00002900000000080cc019000000000008004b000044470000c13d000018b000a0009c00002ca20000413d000018c108a0009a000000000081004b000000000c000019000018b00c002041000018b008800197000000000d8b013f00000000008b004b0000000008000019000018b008004041000018b000d0009c000000090d00002900000000080cc019000000000008004b000044470000c13d000018f708a0009a000018cc0080009c000044470000413d000018c008a00099000018b200800198000018b30a000041000000000a006019000000400b00043d000018b700b0009c00000e1c0000213d000018b108800197000000000c8a01a00000004008b00039000000400080043f0000000308000039000000000a8b0436000018c20800004100000000008a0435000000400800043d000045310000613d000018b10a900197000018b200900198000018b30900004100000000090060190000000009a9019f000018c0099000d1000018b0a990012c000018b00aa0c099000018b0cbc0012c0000000009b9013f000018b00cc0c099000000000bca00d9000000ff09900212000000000ab9004900000000099a019f00000000090b601900000000000b004b000000000b09c019000018b70080009c000000020a00003900000e1c0000213d0000004009800039000000400090043f000000000aa80436000018bd0900004100000000009a0435000000400900043d000018b20cb0009a000018c300c0009c000045670000a13d000018b200700198000018b3070000410000000007006019000018b200b00198000018b3080000410000000008006019000018b70090009c000000020a00003900000e1c0000213d000000000667019f000018b107b00197000000000778019f00000000076700a90000004006900039000000400060043f0000000006a90436000018bd080000410000000000860435000018be0870009a000018bf0080009c000045880000a13d0000001c0000006b0000001b0800002900000000060800190000001d0600c029000018b08770012c0000001c0770014f000018b00880c09900000000066800d9000000ff077002120000000008670049000000000778019f0000000007066019000000000006004b000000000607c019000000000005004b000018b3050000410000000005006019000000000445019f000018b105600197000018b200600198000018b3060000410000000006006019000000000556019f000018bc0040009c00002d100000213d000018b106400099000000000065004b0000000007000019000018b007002041000018b006600197000018b008500197000000000968013f000000000068004b0000000006000019000018b006004041000018b00090009c000000000607c019000000000006004b000044470000c13d000018b00040009c00002d200000413d000018b306400099000000000065004b0000000007000019000018b007004041000018b006600197000018b008500197000000000968013f000000000068004b0000000006000019000018b006002041000018b00090009c000000000607c019000000000006004b000044470000c13d0000000004450019000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f000018b200300198000018b3030000410000000003006019000000000223019f000018bc0020009c00002d3a0000213d000018b103200099000000000034004b0000000005000019000018b005002041000018b003300197000018b006400197000000000736013f000000000036004b0000000003000019000018b003004041000018b00070009c000000000305c019000000000003004b000044470000c13d000018b00020009c00002d4a0000413d000018b303200099000000000034004b0000000005000019000018b005004041000018b003300197000018b006400197000000000736013f000000000036004b0000000003000019000018b003002041000018b00070009c000000000305c019000000000003004b000044470000c13d0000000002240019000000400300043d000018b70030009c00000e1c0000213d0000004004300039000000400040043f0000002004300039000018bd0500004100000000005404350000000000a30435000000400300043d000018b70030009c00000e1c0000213d000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f000018b04220012c000018b00440c099000018b005000041000518ff60500133000000050220014f000018b005600099000700000005001d000600000006001d00000000050660190000004006300039000000400060043f0000002006300039000018c20700004100000000007604350000000306000039000000000063043500000000035400d9000000ff022002120000000004320049000000000224019f0000000002036019000000000003004b000000000302c019000000400400043d000018b70040009c00000e1c0000213d0000004002400039000000400020043f0000000002a40436000018bd050000410000000000520435000018b20530009a000018c30050009c000043290000a13d000018b102300197000018b200300198000018b3030000410000000003006019000000000323019f000018bc0030009c00002d870000213d000019000030009c000044470000213d000000400400043d000018b70040009c00000e1c0000213d0000004002400039000000400020043f0000000002a40436000018bd050000410000000000520435000018bc00d0009c0000433e0000213d00000000000d004b00002df40000613d000019010530009a000018c00300004100000001020000390000000004f2016f0000000000e20170000018b306000041000000000600601900000000004601a0000018b104500197000018b20550019700002dc60000613d000000000005004b000018b3070000410000000007006019000018b200300198000018b3080000410000000008006019000000400600043d000018b70060009c00000e1c0000213d000000000747019f000018b103300197000000000338019f00000000073700a90000004003600039000000400030043f0000000003a60436000018bd080000410000000000830435000018be0870009a000018bf0080009c000038820000a13d0000001c0000006b0000001b0600002900000000030600190000001d0300c029000018b07670012c0000001c0660014f000018b00770c09900000000033700d9000000ff066002120000000007360049000000000667019f0000000006036019000000000003004b000000000306c019000018b106300197000018b200300198000018b3030000410000000003006019000000000363019f000000000005004b000018b3050000410000000005006019000000400600043d000018b70060009c00000e1c0000213d000000000454019f00000000054400a90000004004600039000000400040043f0000000004a60436000018bd070000410000000000740435000018be0750009a000018bf0070009c0000383f0000a13d000000010420021000001902044001970000190300200198000018b3020000410000000002006019000018b200200198000018b3060000410000000006006019000000000646019f0000000000d6004b0000000007000019000018b00700a041000018b006600197000018b008d00197000000000986013f000000000086004b0000000006000019000018b006002041000018b00090009c000000000607c019000000000242019f000018c00450012a000018b105400197000018b200400198000018b3040000410000000004006019000000000554019f000000000006004b00002d960000c13d00002df50000013d000018c003000041000018b104300197000c18b20030019c000018b3020000410000000002006019000d00000004001d000000000442019f000018b002400197000018b003200167000018b00020009c0000000002000019000018b002002041001200000004001d000019040040009c0000000004000019000018b004004041000018b00030009c000000000204c019000000000002004b000044470000c13d0000001202000029000018c00220009a000018b200200198000018b3040000410000000004006019000000400300043d000018b70030009c00000e1c0000213d000018b102200197000000000224019f00000000041200a90000004001300039000000400010043f0000000002a30436000018bd010000410000000000120435000000400100043d000018be0540009a000018bf0050009c000043530000a13d0000001c0000006b0000001b0300002900000000020300190000001d0200c029000018b04340012c0000001c0330014f000018b00440c09900000000022400d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b200200198000018b3030000410000000003006019000018b70010009c00000e1c0000213d000018b102200197000000000223019f0000004003100039000000400030043f0000000003a10436000018bd040000410000000000430435000019050420009a000019060040009c000043670000a13d0000001c0000006b0000001b0300002900000000010300190000001d0100c02900001907032000d1000018b04330012c0000001c0330014f000018b00440c09900000000011400d9000000ff033002120000000004130049000000000334019f0000000003016019000000000001004b000000000103c019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000018bc0010009c00002e5d0000213d000018b20310009a000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00010009c00002e6d0000413d000018c10310009a000000000032004b0000000004000019000018b004002041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d0000000002120049000018b200200198000018b3030000410000000003006019000000400400043d000018b70040009c00000e1c0000213d000018b102200197000000000223019f00000011052000b90000004002400039000000400020043f0000000003a40436000018bd020000410000000000230435000000400200043d000018be0650009a000018bf0060009c0000437c0000a13d0000001c0000006b0000001b0400002900000000030400190000001d0300c029000018b05450012c0000001c0440014f000018b00550c09900000000033500d9000000ff044002120000000005340049000000000445019f0000000004036019000000000003004b000000000304c01900000018040000290000000004040433000018b200400198000018b3050000410000000005006019000018b70020009c00000e1c0000213d000018b104400197000000000445019f00000012054000b90000004004200039000000400040043f0000000004a20436000018bd060000410000000000640435000018be0650009a000018bf0060009c000043900000a13d0000001c0000006b0000001b0400002900000000020400190000001d0200c029000018b05450012c0000001c0440014f000018b00550c09900000000022500d9000000ff044002120000000005240049000000000445019f0000000004026019000000000002004b000000000204c019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f00000018040000290000000000240435000018bc0010009c00002eb90000213d000019000010009c000044470000213d00000019020000290000000002020433000018b200200198000018b3050000410000000005006019000019010110009a000b18b20010019c000018b3060000410000000006006019000000400400043d000018b70040009c00000e1c0000213d000018b102200197000000000225019f000a18b10010019b0000000a016001af000400000001001d00000000011200a90000004002400039000000400020043f0000000002a40436000018bd050000410000000000520435000018be0510009a000018bf0050009c000043a50000a13d000018b102300197000018b2033001970000001c0000006b0000001b0500002900000000040500190000001d0400c029000018b05110012c0000001c0110014f000018b00550c09900000000044500d9000000ff011002120000000005410049000000000115019f0000000001046019000000000004004b000000000401c019000018b101400197000018b200400198000018b3040000410000000004006019000000000114019f00000019040000290000000000140435000000000003004b000018b301000041000000000100601900110000002101a4000031580000613d0000001a01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000000043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400800043d000018bb0080009c000000020700003900000e1c0000213d000000000101043b0000002002800039000000400020043f000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000321019f0000000000380435000018b200100198000018b3010000410000000001006019000000000121019f000018bc0010009c00002f360000213d000000000001004b00002f360000613d00000017020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018b20310009a000018b004200197000018b005300197000000000654013f000000000054004b0000000004000019000018b004002041000000000032004b0000000003000019000018b003004041000018b00060009c000000000403c019000000000004004b000044470000c13d0000000001120049000000170200002900002f5f0000013d00000016020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c00002f4d0000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c00002f5d0000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200190000001602000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000000002080433000018b101200197000018b200200198000018b303000041000000000300601900000000021301a000000000040000390000000104006039000018bc0020009c0000000002000039000000010200203900000000004201a000000018040000290000001902000029000000000204c0190000000002020433000018b200200198000018b3040000410000000004006019000018b200300198000018b3050000410000000005006019000000400300043d000018b70030009c00000e1c0000213d000018b102200197000000000224019f000000000115019f00000000012100a90000004002300039000000400020043f0000000002730436000018bd040000410000000000420435000018be0410009a000018bf0040009c0000444d0000a13d0000001c0000006b0000001b0300002900000000020300190000001d0200c029000018b03110012c0000001c0110014f000018b00330c09900000000022300d9000000ff011002120000000003210049000000000113019f0000000001026019000000000002004b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c00002fae0000213d000018b1021000990000001104000029000000000024004b0000000003000019000018b003002041000018b002200197000018b004400197000000000524013f000000000024004b0000000002000019000018b002004041000018b00050009c000000000203c019000000000002004b000044470000c13d000018b00010009c00002fbf0000413d000018b3021000990000001104000029000000000024004b0000000003000019000018b003004041000018b002200197000018b004400197000000000524013f000000000024004b0000000002000019000018b002002041000018b00050009c000000000203c019000000000002004b000044470000c13d0000001101100029000018b102100197000018b200100198000018b301000041000000000100601900000000032101a000000000010000390000000101006039000018bc0030009c0000000002000039000000010200203900000000001201a000000018020000290000001901000029000000000102c0190000000001010433000018b200100198000018b3020000410000000002006019000000400400043d000018b70040009c00000e1c0000213d000018b10110019700000000051201a00000004001400039000000400010043f00000003010000390000000002140436000018c2010000410000000000120435000000400100043d000044620000613d000018b04250012c000018b00440c099000018c0033000d1000018b05330012c000000000323013f000018b00550c09900000000024500d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000000003710436000018bd040000410000000000430435000018b20420009a000018c30040009c000044760000a13d000018b101200197000018b200200198000018b3020000410000000002006019000000000312019f0000000000380435000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c000300000008001d0000302f0000213d000000000001004b0000302f0000613d00000017020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c0000301c0000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c0000302c0000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200190000001702000029000030580000013d00000016020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000000000001004b000030460000c13d000018b20310009a000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00010009c000030560000413d000018c10310009a000000000032004b0000000004000019000018b004002041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200490000001602000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001a01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000000043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d00000003020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000002002100039000000000002043500000000000104350000001a01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400700043d000018b90070009c00000e1c0000213d000000000101043b0000008002700039000000400020043f000000000201041a000018b003200197000018b00030009c000000010600008a0000000003000019000000000306601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000004270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f000200000004001d00000000002404350000000101100039000000000101041a000018b002100197000018b00020009c0000000002000019000000000206601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040037000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000300000007001d000000600270003900000000001204350000001a01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000000043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c0000000208000039000000030500002900000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a00000000004050019000000020400c029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00000e1c0000213d000000000113019f000018b103400197000000000532019f00000000075100a90000004001600039000000400010043f0000000004860436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c000044a00000a13d000018b70010009c00000e1c0000213d0000001c0000006b0000001b0600002900000000040600190000001d0400c029000018b07670012c0000001c0660014f000018b00770c0990000004008100039000000400080043f0000002008100039000000000058043500000000044700d9000000ff056002120000000006450049000000000556019f0000000005046019000000000004004b000000000405c019000018b105400197000018b200400198000018b3040000410000000004006019000000000654019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200400198000018b3010000410000000001006019000000000151019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d10400004100000000050000190000001a0600002961ee61e40000040f000000010020019000000c960000613d0000001a01000029000000000010043f0000007101000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000101041a000018b102100197000018b200100198000018b301000041000000000100601900000000002101a00000001a040000290000000d050000290000000c060000290000000b070000290000000a08000029000032b70000613d000000000040043f0000007101000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000201043b000000400100043d000018b70010009c00000008090000290000000e0a000029000000090b000029000000020c00003900000e1c0000213d000000000202041a0000004003100039000000400030043f0000002003100039000018bd0400004100000000004304350000000000c10435000000400100043d000018b70010009c00000e1c0000213d000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018b03220012c000018b00330c099000000050220014f000000050000006b00000006040000290000000006040019000000070600c0290000004004100039000000400040043f0000002004100039000018c20500004100000000005404350000000304000039000000000041043500000000016300d9000000ff022002120000000003120049000000000223019f0000000002016019000000000001004b000000000102c019000000400300043d000018b70030009c00000e1c0000213d0000004002300039000000400020043f0000000002c30436000018bd040000410000000000420435000018b20410009a000018c30040009c0000448b0000a13d000018b102100197000018b200100198000018b3010000410000000001006019000000000221019f000018bc0020009c000031be0000213d000019000020009c000044470000213d000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000018bd0400004100000000004304350000000000c10435000018c00100004100000000000b004b000032290000613d000019010420009a0000000102000039000000000392016f0000000000a20170000018b305000041000000000500601900000000003501a0000018b103400197000018b204400197000031fc0000613d000000000004004b000018b3050000410000000005006019000018b200100198000018b3070000410000000007006019000000400600043d000018b70060009c00000e1c0000213d000000000535019f000018b101100197000000000117019f00000000011500a90000004005600039000000400050043f0000000005c60436000018bd070000410000000000750435000018be0710009a000018bf0070009c00003b810000a13d0000001c0000006b0000001b0600002900000000050600190000001d0500c029000018b06110012c0000001c0110014f000018b00660c09900000000055600d9000000ff011002120000000006510049000000000116019f0000000001056019000000000005004b000000000501c019000018b101500197000018b200500198000018b3050000410000000005006019000000000115019f000000000004004b000018b3040000410000000004006019000000400500043d000018b70050009c00000e1c0000213d000000000343019f00000000043300a90000004003500039000000400030043f0000000003c50436000018bd060000410000000000630435000018be0640009a000018bf0060009c000038970000a13d000000010320021000001902033001970000190300200198000018b3020000410000000002006019000018b200200198000018b3050000410000000005006019000000000535019f0000000000b5004b0000000006000019000018b00600a041000018b005500197000018b007b00197000000000875013f000000000075004b0000000005000019000018b005002041000018b00080009c000000000506c019000000000232019f000018c00340012a000018b104300197000018b200300198000018b3030000410000000003006019000000000443019f000000000005004b000031cc0000c13d000018b200100198000018b302000041000000000200601900000018030000290000000004030433000018b200400198000018b3050000410000000005006019000000400300043d000018b70030009c00000e1c0000213d000018b101100197000000000112019f000018b102400197000000000225019f00000000041200a90000004002300039000000400020043f0000000002c30436000018bd050000410000000000520435000018be0540009a000018bf0050009c000044b40000a13d0000001c0000006b0000001b0300002900000000020300190000001d0200c029000018b04340012c0000001c0330014f000018b00440c09900000000022400d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000001803000029000000000023043500000019020000290000000002020433000018b200200198000018b3040000410000000004006019000000400300043d000018b70030009c00000e1c0000213d000018b102200197000000000224019f00000000041200a90000004002300039000000400020043f0000000002c30436000018bd050000410000000000520435000018be0540009a000018bf0050009c000044c90000a13d0000001c0000006b0000001b0300002900000000020300190000001d0200c029000018b04340012c0000001c0330014f000018b00440c09900000000022400d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000019030000290000000000230435000000400400043d000018b70040009c00000e1c0000213d00000004051000b90000004002400039000000400020043f0000000003c40436000018bd020000410000000000230435000000400200043d000018be0650009a000018bf0060009c000044de0000a13d0000001c0000006b0000001b0400002900000000030400190000001d0300c029000018b05450012c0000001c0640014f000018b00550c09900000000043500d9000000ff036002120000000005430049000000000335019f0000000003046019000000000004004b000000000403c019000018b70020009c00000e1c0000213d00000012011000b90000004003200039000000400030043f0000000003c20436000018bd050000410000000000530435000018be0510009a000018bf0050009c000044f20000a13d000018b108400197000018b2074001970000001c0000006b0000001b0300002900000000020300190000001d0200c029000018b03110012c0000001c0110014f000018b00330c09900000000022300d9000000ff011002120000000003210049000000000113019f0000000001026019000000000002004b000000000201c019000018b105200197000018b2062001970000001a04000029000000400100043d000000800210003900000011030000290000000000320435000000200210003900000001030000290000000000320435000000000006004b000018b3020000410000000002006019000000000252019f00000060031000390000000000230435000000000007004b000018b3020000410000000002006019000000000282019f0000004003100039000000000023043500000000004104350000187d0010009c0000187d01008041000000400110021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f00001908011001c70000800d020000390000000103000039000019090400004161ee61e40000040f000000010020019000000c960000613d0000000f0100002900000000020104330000000013020434000018b104300197000018b200300198000018b303000041000000000300601900000000044301a00000334a0000613d00000000030000390000000103006039000018bc0040009c0000000005000039000000010500203900000000003501a000000018050000290000001903000029000000000305c0190000000003030433000018b105300197000018b200300198000018b3030000410000000003006019000000000353019f0000000005010433000018b106500197000018b200500198000018b3050000410000000005006019000000000565019f000000000035004b0000000209000039000033520000613d000000400600043d000018b70060009c00000e1c0000213d00000000074300a90000004004600039000000400040043f0000000004960436000018bd050000410000000000540435000000400500043d000018be0870009a000018bf0080009c0000459d0000a13d0000001c0000006b0000001b0600002900000000040600190000001d0400c029000018b07670012c0000001c0660014f000018b00770c09900000000074700d9000000ff046002120000000006740049000000000446019f0000000004076019000000000007004b000000000704c0190000000004010433000018b200400198000018b3060000410000000006006019000018b70050009c00000e1c0000213d000018b10440019700000000084601a00000004004500039000000400040043f00000003040000390000000006450436000018c2040000410000000000460435000000400400043d000045c50000613d000018b105700197000018b200700198000018b3060000410000000006006019000000000556019f000018c0055000d1000018b06550012c000018b00660c099000018b08780012c000000000575013f000018b00880c09900000000068600d9000000ff055002120000000007650049000000000557019f0000000005066019000000000006004b000000000605c019000018b70040009c00000e1c0000213d0000004005400039000000400050043f0000000005940436000018bd070000410000000000750435000018b20760009a000018c30070009c000045fa0000a13d000018b104600197000018b200600198000018b3050000410000000005006019000000000445019f00000000004204350000000000310435000033520000013d00000019020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000000210435000000130100002900000000020104330000000013020434000018b104300197000018b200300198000018b303000041000000000300601900000000044301a0000033c10000613d00000000030000390000000103006039000018bc0040009c0000000005000039000000010500203900000000003501a00000001503000029000000200330c0390000000003030433000018b105300197000018b200300198000018b3030000410000000003006019000000000353019f0000000005010433000018b106500197000018b200500198000018b3050000410000000005006019000000000565019f000000000035004b000033c90000613d000000400600043d000018b70060009c000000020900003900000e1c0000213d00000000074300a90000004004600039000000400040043f0000000005960436000018bd040000410000000000450435000000400400043d000018be0870009a000018bf0080009c000045b10000a13d0000001c0000006b0000001b0500002900000000080500190000001d0800c029000018b06570012c0000001c0550014f000018b00660c09900000000078600d9000000ff055002120000000006750049000000000556019f0000000005076019000000000007004b000000000705c0190000000005010433000018b200500198000018b3060000410000000006006019000018b70040009c00000e1c0000213d000018b10550019700000000085601a00000004005400039000000400050043f00000003050000390000000006540436000018c2050000410000000000560435000000400500043d000045e60000613d000018b104700197000018b200700198000018b3060000410000000006006019000000000446019f000018c0044000d1000018b06440012c000018b00660c099000018b08780012c000000000474013f000018b00880c09900000000068600d9000000ff044002120000000007640049000000000447019f0000000004066019000000000006004b000000000604c019000018b70050009c00000e1c0000213d0000004004500039000000400040043f0000000004950436000018bd070000410000000000740435000018b20760009a000018c30070009c0000460f0000a13d000018b104600197000018b200600198000018b3050000410000000005006019000000000445019f00000000004204350000000000310435000033c90000013d00000015020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000000002104350000001a01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d00000014020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b000000130200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000103100039000000000023041b0000000f0200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000201100039000000000021041b0000001a01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d00000019020000290000000002020433000018cb02200197000000180300002900000000030304330000008003300210000000000223019f000000000101043b000000000021041b00000017020000290000000002020433000018cb02200197000000160300002900000000030304330000008003300210000000000223019f0000000101100039000000000021041b00000010040000290000187d014001970000187d0010009c000044470000613d00000001041000390000006803000039000000000103041a000000000014004b00002a810000413d00000b760000013d61ee55200000040f00000b760000013d0000006c01000039000000200010043f001b00000007001d000018b90070009c00000e1c0000213d0000001b060000290000008001600039000000400010043f000018b401000041000000000101041a000018b002100197000000010300008a000018b00020009c0000000002000019000000000203601900000080022002100000008004100270000000000224019f000000800000008b0000000002016019000018b104100197000018b200100198000018b3010000410000000001006019000000000141019f0000000004160436000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001a00000004001d0000000000140435000018ba01000041000000000101041a000018b002100197000018b00020009c000000000300c01900000080023002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000004003600039001900000003001d0000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f0000006002600039001800000002001d00000000001204350000001d01000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001700000002001d000018bb0020009c00000e1c0000213d000000000101043b00000017030000290000002002300039000000400020043f000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000000000130435000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f00000020021000390000000000020435000000000001043500000017010000290000000002010433000018b101200197000018b200200198000018b304000041000000000400601900000000021401a000000000030000390000000103006039000018bc0020009c0000000002000039000000010200203900000000003201a00000001a030000290000001b02000029000000000203c0190000000002020433000018b200200198000018b3030000410000000003006019000018b200400198000018b3060000410000000006006019000000400500043d000018b70050009c00000e1c0000213d000018b102200197000000000423019f000000000116019f00000000064100a90000004001500039000000400010043f00000002020000390000000003250436000018bd010000410000000000130435000000400100043d000018be0760009a000018bf0070009c00003fa80000213d000018c4020000410000000000210435000000040210003900000020040000390000000000420435000000240410003900000000020504330000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b000034ae0000413d000045060000013d000018b70010009c00000e1c0000213d0000004002100039000000400020043f00000003020000390000000003210436000018ce0200004100000000002304350000001c02000029000018bc0020009c000037160000213d0000001c0000006b000037160000613d0000001d01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000400200043d001800000002001d000018cf0020009c00000e1c0000213d00000018040000290000006002400039000000400020043f000000000201041a000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000002240436001700000002001d000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000103100039000000000303041a000018b004300197000000010500008a000018b00040009c0000000004000019000000000405601900000080044002100000008005300270000000000445019f000000800000008b0000000004036019000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000020052000390000000000450435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000000032043500000017030000290000000000230435000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000201100039000000000101041a000018b003100197000018b00030009c000000010300008a000000000300c01900000080033002100000008004100270000000000334019f000000800000008b0000000003016019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000020042000390000000000340435000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000000000012043500000018010000290000004001100039001600000001001d00000000002104350000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001902000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001500000002001d000018bb0020009c00000e1c0000213d000000000101043b00000015030000290000002002300039000000400020043f0000000101100039000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f00000000001304350000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001400000002001d000018b90020009c00000e1c0000213d000000000101043b00000014070000290000008002700039000000400020043f000000000201041a000018b003200197000018b00030009c000000010600008a0000000003000019000000000306601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000004270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f001200000004001d00000000002404350000000101100039000000000101041a000018b002100197000018b00020009c0000000002000019000000000206601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000004003700039001100000003001d0000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f0000006002700039001000000002001d0000000000120435000000000000043f0000006c01000039000000200010043f000000400100043d001300000001001d000018b90010009c00000e1c0000213d00000013060000290000008001600039000000400010043f000018b401000041000000000101041a000018b002100197000018b00020009c000000010500008a0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000003160436000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000f00000003001d0000000000130435000018ba01000041000000000101041a000018b002100197000018b00020009c0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000004003600039000e00000003001d0000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f0000006002600039000d00000002001d00000000001204350000001c01000029000018b10010009c000035d80000c13d00000015010000290000000001010433001b18b10010019b001a18b20010019b0000001a0000006b000018b3010000410000000001006019001c001b001001b400000000020000190000000003000019000047680000c13d000000400100043d001d00000001001d000036de0000013d001800000001001d000018dc0100004100000000001004430000000001000410000000040010044300000000010004140000187d0010009c0000187d01008041000000c001100210000018dd011001c7000080020200003961ee61e90000040f000000010020019000004a9c0000613d0000001802000029000000ff0220018f000000000101043b000000010020008c000038ac0000c13d000000000001004b000038ac0000c13d000000000200041a0000001801000029000001130000013d0000001d01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000400200043d001a00000002001d000018cf0020009c00000e1c0000213d0000001a040000290000006002400039000000400020043f000000000201041a000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000002240436001900000002001d000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000103100039000000000303041a000018b004300197000000010500008a000018b00040009c0000000004000019000000000405601900000080044002100000008006300270000000000446019f000000800000008b0000000004036019000018b106400197000018b200400198000018b3040000410000000004006019000000000464019f00000020062000390000000000460435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000000032043500000019030000290000000000230435000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000201100039000000000101041a000018b003100197000018b00030009c0000000003000019000000000305601900000080033002100000008004100270000000000334019f000000800000008b0000000003016019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000020042000390000000000340435000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001a010000290000004001100039001800000001001d00000000002104350000000001020433000018b102100197000018b200100198000018b304000041000000000400601900000000022401a000000000010000190000366a0000613d000000190100002900000000010104330000000001010433000018b103100197000018b200100198000018b306000041000000000600601900000000033601a00000000001000019000044250000c13d000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000002003200039000018ee0400004100000000004304350000000203000039000000000032043561ee56990000040f0000001d0100002961ee554f0000040f61ee570d0000040f000000000000043f0000006c02000039000000200020043f00000018020000290000000002020433001600000002001d0000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018b403000041000000000303041a001800000003001d001700000001001d00000000010200190000001c0200002961ee56560000040f000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000001602000029000000000012043500000019010000290000000001010433001900000001001d0000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000001b0200002961ee56560000040f000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000190200002900000000001204350000001d0100002961ee55710000040f0000001a0200002961ee57140000040f0000001c01000029000000170200002961ee61400000040f001a00000001001d0000001d0100002961ee554f0000040f0000000101100039001d00000001001d000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000001a0200002961ee56560000040f000018cb011001970000001d03000029000000000203041a000018cc02200197000000000112019f000000000013041b0000001802000029000018b101200197000018b200200198000018b3020000410000000002006019000000000212019f0000001b0100002961ee61400000040f000000000000043f0000006c02000039000000200020043f000018ba02000041000000000202041a000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000000030100190000000001020019000000000203001961ee56560000040f000018cb01100197000018ba03000041000000000203041a000018cc02200197000000000112019f000000000013041b000000400100043d001d00000001001d0000001c020000290000001b0300002961ee54fa0000040f00000d500000013d000000000501041a000000000045004b00003fa20000a13d000000010340008a000000000035004b00003fa20000a13d0000000505400210000000e00850018f0000000304400270000018e20740009a000000000907041a000000000489022f0000187d05400197000000000010043f0000000504300210000000e00640018f0000000304300270000018e20440009a000000000a04041a000000000a6a022f0000187d0aa001970000000000a5004b000005740000813d000000000a8a01cf0000187d0880021f0000192f08800167000000000889016f00000000088a019f000000000087041b000000000701041a000000000037004b00003fa20000a13d00000000056501cf0000187d0660021f0000192f06600167000000000704041a000000000667016f000000000556019f000000000054041b000000000003004b0000000004030019000036e00000c13d000005740000013d0000ff0000200190000038540000c13d00000064021000390000192203000041000000000032043500000044021000390000192303000041000000000032043500000024021000390000002b03000039000038b50000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b000037230000413d0000372d0000a13d000000000341001900000000000304350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0020009c0000187d020080410000004002200210000000000121019f000061f00001043000000000010003670000004402100370000000000202043b000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c000038cb0000213d000000000002004b0000000002000019000038cc0000613d0000006402100370000000000202043b000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c000038cb0000213d000000000002004b0000000002000019000038cc0000613d0000008401100370000000000101043b000018b102100197000018b200100198000018b301000041000000000100601900000000012101a00000000002000039000000010200c039000018b00010009c00000000010000390000000101004039000000000221016f000038cc0000013d000018c401000041000001200010043f0000002001000039000001240010043f000001440010043f000018ef01000041000001640010043f000018f001000041000061f000010430000000000300001900000000010000190000006802000039000000000202041a000000000012004b00003fa20000a13d0000000502100210000000e00220018f0000000301100270000018e20110009a000000000101041a000000000121022f0000187d01100197000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c70000801002000039001d00000003001d61ee61e90000040f0000001d0f000029000018bd0e000041000000020d000039000000010020019000000c960000613d000000400200043d000018b90020009c00000e1c0000213d000000000401043b0000008001200039000000400010043f000000000104041a000018b003100197000018b00030009c000000010800008a0000000003000019000000000308601900000080033002100000008005100270000000000535019f000000800000008b0000000005016019000018b103100197000018b200100198000018b3060000410000000006006019000000000136019f0000000001120436000018b107500197000018b200500198000018b3050000410000000005006019000000000575019f00000000005104350000000104400039000000000404041a000018b005400197000018b00050009c0000000005000019000000000508601900000080055002100000008007400270000000000757019f000000800000008b0000000007046019000018b105400197000018b200400198000018b30400004100000000040060190000004008200039000000000954019f0000000000980435000018b200600198000018b3060000410000000006006019000018b108700197000018b200700198000018b3070000410000000007006019000000000787019f00000060082000390000000000780435000018b200400198000018b3020000410000000002006019000000400400043d000018b70040009c00000e1c0000213d000000000336019f000000000252019f00000000063200a90000004002400039000000400020043f0000000002d404360000000000e20435000018be0360009a000018bf0030009c000042240000a13d000018b002000041000018c07520012b000018b0037000990000000002070019000000000203c019000018b06460012c000000000454013f000018b00660c09900000000022600d9000000ff044002120000000006240049000000000446019f0000000004026019000000000002004b000000000204c0190000000504f002100000001b094000290000000006000367000000000996034f000000000b09043b000018b200b00198000018b3090000410000000009006019000018b10ab001970000000009a9019f0000000000b9004b00000c960000c13d000000400a00043d000018b700a0009c00000e1c0000213d000018b10c200197000018b2002001980000004002a00039000000400020043f000000050200003900000000092a04360000191d020000410000000000290435000018b3020000410000000002006019000000000cc2019f000000400200043d0000000000bc004b000042390000c13d0000000008080433000018b200800198000018b30900004100000000090060190000000001010433000018b200100198000018b30a000041000000000a006019000018b70020009c00000e1c0000213d000018b108800197000000000889019f000018b10110019700000000011a019f00000000018100a90000004008200039000000400080043f0000000008d204360000000000e80435000018be0910009a000018bf0090009c0000424d0000a13d000000000005004b0000000003076019000018b02110012c000000000551013f000018b00220c09900000000013200d9000000ff025002120000000003120049000000000223019f0000000002016019000000000001004b000000000102c0190000001a00f0006c00003fa20000813d0000001902400029000000000226034f000000000402043b000018b200400198000018b3020000410000000002006019000018b103400197000000000232019f000000000042004b00000c960000c13d000000400300043d000018b70030009c00000e1c0000213d000018b105100197000018b2001001980000004001300039000000400010043f000000050100003900000000021304360000191d010000410000000000120435000018b3010000410000000001006019000000000151019f000000000041004b000042620000c13d000018cb00f0009c000044470000613d0000000101f00039000018cb031001970000001c0030006c0000376a0000413d00000b760000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000206043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b0000384c0000413d000046230000013d0000000002000411000018c5062001970000003304000039000000000204041a000018e903200197000000000363019f000000000034041b0000187d0010009c0000187d01008041000000400110021000000000030004140000187d0030009c0000187d03008041000000c003300210000000000113019f000018c50520019700001921011001c70000800d020000390000000303000039000019190400004161ee61e40000040f000000010020019000000c960000613d0000003301000039000000000101041a000018c5021001970000000003000411000000000032004b000038c00000c13d0000006502000039000000000302041a000018e9033001970000001a033001af000000000032041b000000190000006b000041430000c13d000000400100043d0000006402100039000018c70300004100000000003204350000004402100039000018c603000041000000000032043500000024021000390000002603000039000038b50000013d000000400100043d000018c4020000410000000000210435000000040210003900000020040000390000000000420435000000000206043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b0000388f0000413d000045060000013d000000400100043d000018c4020000410000000000210435000000040210003900000020040000390000000000420435000000000205043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b000038a40000413d000045060000013d000000400100043d00000064021000390000191e03000041000000000032043500000044021000390000191f03000041000000000032043500000024021000390000002e030000390000000000320435000018c40200004100000000002104350000000402100039000000200300003900000000003204350000187d0010009c0000187d01008041000000400110021000001920011001c7000061f000010430000000400100043d0000004402100039000018ef030000410000000000320435000018c4020000410000000000210435000000240210003900000020030000390000000000320435000000040210003900003d1d0000013d0000000002000019000000400300043d000018b70030009c00000e1c0000213d0000004001300039000000400010043f00000003010000390000000001130436000018ce040000410000000000410435000000400400043d001d00000004001d000000010020019000003c080000613d0000006501000039000000000201041a000018e3010000410000001d0300002900000000001304350000187d0030009c0000187d010000410000000001034019000000400110021000000000030004140000187d0030009c0000187d03008041000000c003300210000000000113019f000018e4011001c7000018c50220019761ee61e90000040f00000060031002700000187d03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000001d05700029000038f90000613d000000000801034f0000001d09000029000000008a08043c0000000009a90436000000000059004b000038f50000c13d000000000006004b000039060000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000402f0000613d0000001f01400039000000600110018f0000001d02100029000000000012004b00000000010000390000000101004039001c00000002001d000018e10020009c00000e1c0000213d000000010010019000000e1c0000c13d0000001c01000029000000400010043f000000200030008c00000c960000413d0000001d010000290000000002010433000018c50020009c00000c960000213d0000190b010000410000001c040000290000000001140436001d00000001001d00000004010000390000000001100367000000000101043b0000187d01100197000000040340003900000000001304350000187d0040009c0000187d010000410000000001044019000000400110021000000000030004140000187d0030009c0000187d03008041000000c003300210000000000113019f000018df011001c761ee61e90000040f00000060031002700000187d03300197000000800030008c000000800400003900000000040340190000001f0640018f000000e0074001900000001c057000290000393f0000613d000000000801034f0000001c09000029000000008a08043c0000000009a90436000000000059004b0000393b0000c13d000000000006004b0000394c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000046e70000613d0000001f01400039000001e00110018f0000001c01100029000018e10010009c00000e1c0000213d000000400010043f000000800030008c00000c960000413d000018b90010009c00000e1c0000213d0000008002100039000000400020043f0000001c0200002900000000020204330000187d0020009c00000c960000213d00000000032104360000001d040000290000000004040433000018b200400198000018b3050000410000000005006019000018b106400197000000000565019f000000000045004b00000c960000c13d00000000004304350000001c0300002900000040033000390000000003030433000018b200300198000018b3040000410000000004006019000018b105300197000000000454019f000000000034004b00000c960000c13d000000400410003900000000003404350000001c0300002900000060033000390000000003030433000018b200300198000018b3040000410000000004006019000018b105300197000000000454019f000000000034004b00000c960000c13d00000060011000390000000000310435000000400400043d000018b70040009c00000e1c0000213d0000004001400039000000400010043f000000020100003900000000031404360000190c010000410000000000130435000000000002004b000049380000c13d00000004010000390000000001100367000000000101043b0000187d01100197000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000400200043d001d00000002001d000018cf0020009c00000e1c0000213d0000001d040000290000006002400039000000400020043f000000000201041a000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000002240436001c00000002001d000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000103100039000000000303041a000018b004300197000000010500008a000018b00040009c0000000004000019000000000405601900000080044002100000008005300270000000000445019f000000800000008b0000000004036019000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000020052000390000000000450435000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000000003204350000001c030000290000000000230435000000400200043d000018b70020009c00000e1c0000213d0000004003200039000000400030043f0000000201100039000000000101041a000018b003100197000018b00030009c000000010300008a000000000300c01900000080033002100000008004100270000000000334019f000000800000008b0000000003016019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000020042000390000000000340435000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001d010000290000004001100039001b00000001001d000000000021043500000004010000390000000001100367000000000101043b0000187d01100197000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001a00000002001d000018b90020009c00000e1c0000213d000000000101043b0000001a050000290000008002500039000000400020043f000000000201041a000018b003200197000018b00030009c000000010600008a0000000003000019000000000306601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000020045000390000000000340435000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000000002504350000000101100039000000000101041a000018b200100198000018b3020000410000000002006019000018b103100197000000000232019f00000040035000390000000000230435000018b002100197000018b00020009c0000000002000019000000000206601900000080022002100000008003100270000000000223019f000000800000008b000000000102c019000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f00000060025000390000000000120435000000000000043f0000006c01000039000000200010043f000000400100043d001900000001001d000018b90010009c00000e1c0000213d00000019040000290000008001400039000000400010043f000018b401000041000000000101041a000018b002100197000018b00020009c000000010500008a0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000020034000390000000000230435000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000000000140435000018ba01000041000000000101041a000018b002100197000018b00020009c0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040034000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000000600240003900000000001204350000001b0100002900000000010104330000000001010433000018b102100197000018b200100198000018b301000041000000000100601900000000022101a0000000400100043d00004d240000c13d00000004020000390000000002200367000000000202043b000018eb0010009c00000e1c0000213d000000a003100039000000400030043f000000800310003900000000000304350000006003100039000000000003043500000040031000390000000000030435000000200310003900000000000304350000000000010435000000400100043d001800000001001d000018eb0010009c00000e1c0000213d0000001803000029000000a001300039000000400010043f0000008001300039001500000001001d00000000000104350000006001300039001400000001001d00000000000104350000004001300039001600000001001d00000000000104350000000001030436001700000001001d00000000000104350000187d01200197000000000010043f000018d801000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400300043d000018eb0030009c00000e1c0000213d000000000101043b000000a002300039000000400020043f000000000101041a000018b002100197000018b00020009c000000010200008a000000000200c01900000080022002100000008004100270000000000224019f000000800000008b00000000020160190000004004100270000018d404400197000018ed00100198000018d3050000410000000005006019000000000545019f000018b104200197000018b200200198000018b3020000410000000002006019000000000642019f000018d200100198000018d3070000410000000007006019000018d200700198000018d3020000410000000002006019000018f304200197000018b200200198000018b3020000410000000002006019000000000824019f0000002002100270000018d402200197000018ec00100198000018d3040000410000000004006019000000000924019f0000006002100270000018d402200197000018b200100198000018d3040000410000000004006019000000000424019f000000600230003900000000004204350000004004300039000000000054043500000020053000390000000000950435000018d409100197000000000197019f000000000013043500000080013000390000000000610435000000000398019f000018f40630009a000018f50060009c000044470000413d000018d6033000d1000018f606300197000018b200300198000018b3030000410000000003006019000000000363019f000000180600002900000000003604350000000003050433000018d405300197000018d200300198000018d3030000410000000003006019000018f306300197000000000556019f000018b200300198000018b3030000410000000003006019000000000335019f000018f40530009a000018f50050009c000044470000413d000018d6033000d1000018f605300197000018b200300198000018b3030000410000000003006019000000000353019f000000170500002900000000003504350000000003040433000018d404300197000018d200300198000018d3030000410000000003006019000018f305300197000000000445019f000018b200300198000018b3030000410000000003006019000000000334019f000018f40430009a000018f50040009c000044470000413d000018d6033000d1000018f604300197000018b200300198000018b3030000410000000003006019000000000343019f000000160400002900000000003404350000000002020433000018d403200197000018d200200198000018d3020000410000000002006019000018f304200197000000000334019f000018b200200198000018b3020000410000000002006019000000000223019f000018f40320009a000018f50030009c000044470000413d000018d6022000d1000018f603200197000018b200200198000018b3020000410000000002006019000000000232019f000000140300002900000000002304350000000002010433000018b101200197000018b200200198000018b3060000410000000006006019000000000216019f00000015030000290000000000230435000000400500043d000018b70050009c00000e1c0000213d00000000020003670000004403200370000000000303043b0000004004500039000000400040043f00000002040000390000000004450436000018bd070000410000000000740435000018b200600198000018b3060000410000000006006019000000000616019f000018b200300198000018b3010000410000000001006019000018b107300197000000000171019f00000000066100a9000018be0760009a000018bf0070009c00004da00000213d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000205043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00003b650000413d000046230000013d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003b790000413d000007c60000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000206043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b00003b8e0000413d000046230000013d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003ba20000413d000007c60000013d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000240410003900000000030304330000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003bb60000413d000007c60000013d000018b70020009c00000e1c0000213d000018b003000041000018c05330012b000018b00550c099000018b07660012c000000000336013f000018b00770c0990000004006200039000000400060043f0000002006200039000000000046043500000000045700d9000000ff033002120000000005430049000000000335019f0000000003046019000000000004004b000000000403c019000018b103400197000018b200400198000018b3040000410000000004006019000000000334019f00000000003204350000001a020000290000000002020433000018b200200198000018b30300004100000000030060190000001c040000290000000004040433000018b200400198000018b3060000410000000006006019000000400500043d000018b70050009c00000e1c0000213d000018b102200197000000000223019f000018b103400197000000000336019f00000000042300a90000004002500039000000400020043f0000000002150436000018bd030000410000000000320435000000400300043d000018be0640009a000018bf0060009c000043f70000213d000018c4010000410000000000130435000000040130003900000020040000390000000000410435000000240430003900000000010504330000000000140435000000000001004b00003cc90000613d0000004404300039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000015004b00003bfe0000413d00003cc90000a13d000000000241001900003cc80000013d000018c4020000410000001d050000290000000000250435000000040250003900000020040000390000000000420435000000240450003900000000020304330000000000240435000000000002004b00003c200000613d0000001d030000290000004403300039000000000400001900000000053400190000000006140019000000000606043300000000006504350000002004400039000000000024004b00003c160000413d00003c200000a13d000000000132001900000000000104350000001f01200039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000001d02000029000037330000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000204043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b00003c350000413d000046230000013d000018c4010000410000000000140435000000040140003900000020020000390000000000210435000000240240003900000000010504330000000000120435000000000001004b000045db0000613d0000004402400039000000000300001900000000052300190000000007630019000000000707043300000000007504350000002003300039000000000013004b00003c490000413d000045d80000013d000018c4010000410000000000150435000000040150003900000020020000390000000000210435000000240250003900000000010604330000000000120435000000000001004b00003c670000613d0000004402500039000000000300001900000000062300190000000007430019000000000707043300000000007604350000002003300039000000000013004b00003c5d0000413d00003c670000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0050009c0000187d050080410000004002500210000000000121019f000061f000010430001918b300000045000000400100043d000000190300002900000dcd0000013d000018c4010000410000000000120435000000040120003900000020030000390000000000310435000000240320003900000000010504330000000000130435000000000001004b0000372d0000613d0000004403200039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000015004b00003c820000413d000042fd0000013d000000400100043d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000000202043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00003c970000413d000046230000013d000018c4010000410000000000120435000000040120003900000020040000390000000000410435000000240420003900000000010504330000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b00003cab0000413d0000372a0000013d000018c4010000410000000000130435000000040130003900000020040000390000000000410435000000240430003900000000010204330000000000140435000000000001004b00003cc90000613d0000004402300039000000000400001900000000062400190000000007540019000000000707043300000000007604350000002004400039000000000014004b00003cbf0000413d00003cc90000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0030009c0000187d030080410000004002300210000000000121019f000061f000010430000000400100043d000018c4020000410000000000210435000000040210003900000020050000390000000000520435000000000204043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b00003ce10000413d000045060000013d000018c4010000410000000000120435000000040120003900000020040000390000000000410435000000240420003900000000010304330000000000140435000000000001004b0000372d0000613d0000004403200039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000014004b00003cf50000413d000042fd0000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000202043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b00003d0a0000413d000045060000013d000000400100043d000000440210003900001913030000410000000000320435000000240210003900000019030000390000000000320435000018c40200004100000000002104350000000402100039000000200300003900000000003204350000187d0010009c0000187d01008041000000400110021000001914011001c7000061f000010430000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003d300000413d000007c60000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003d450000413d000007c60000013d000018c4010000410000000000120435000000040120003900000020030000390000000000310435000000240320003900000000010604330000000000130435000000000001004b0000372d0000613d0000004403200039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000014004b00003d590000413d000042fd0000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000202043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b00003d6e0000413d000045060000013d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000240410003900000000030304330000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003d820000413d000007c60000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b00003d970000413d0000372a0000013d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00003dab0000413d000046230000013d000018c4010000410000000000170435000000040170003900000020020000390000000000210435000000240270003900000000010a04330000000000120435000000000001004b00003e1a0000613d0000004402700039000000000300001900000000042300190000000005830019000000000505043300000000005404350000002003300039000000000013004b00003dbf0000413d00003e170000013d000018c4010000410000000000180435000000040180003900000020020000390000000000210435000000240280003900000000010704330000000000120435000000000001004b000045470000613d0000004402800039000000000300001900000000042300190000000005a30019000000000505043300000000005404350000002003300039000000000013004b00003dd30000413d000045440000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000208043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000053400190000000006740019000000000606043300000000006504350000002004400039000000000024004b00003de80000413d000046230000013d000018c4010000410000000000160435000000040160003900000020020000390000000000210435000000240260003900000000010904330000000000120435000000000001004b000042b60000613d0000004402600039000000000300001900000000042300190000000005730019000000000505043300000000005404350000002003300039000000000013004b00003dfc0000413d000042b30000013d000018c4010000410000000000170435000000040170003900000020020000390000000000210435000000240270003900000000010604330000000000120435000000000001004b00003e1a0000613d0000004402700039000000000300001900000000042300190000000005930019000000000505043300000000005404350000002003300039000000000013004b00003e100000413d00003e1a0000a13d000000000221001900000000000204350000001f01100039000009500000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000207043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000053400190000000007640019000000000707043300000000007504350000002004400039000000000024004b00003e290000413d000046230000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003e3e0000413d000007c60000013d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003e520000413d000007c60000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b00003e670000413d0000372a0000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003e7c0000413d000007c60000013d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000240410003900000000030304330000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003e900000413d000007c60000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b00003ea50000413d0000372a0000013d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003eb90000413d000007c60000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b00003ece0000413d0000372a0000013d000000400100043d000018c4020000410000000000210435000000040210003900000020050000390000000000520435000000000204043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b00003ee30000413d000045060000013d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00003ef70000413d000046230000013d000018c4010000410000000000120435000000040120003900000020040000390000000000410435000000240420003900000000010504330000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b00003f0b0000413d0000372a0000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000202043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b00003f200000413d000045060000013d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00003f340000413d000046230000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003f490000413d000007c60000013d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00003f5d0000413d000007c60000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b00003f720000413d0000372a0000013d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00003f860000413d000046230000013d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00003f9a0000413d000046230000013d0000191201000041000000000010043f0000003201000039000000040010043f000018df01000041000061f000010430000018b70010009c00000e1c0000213d000018b003000041000018c05330012b000018b00550c099000018b07660012c000000000336013f000018b00770c0990000004006100039000000400060043f0000002006100039000000000046043500000000045700d9000000ff033002120000000005430049000000000335019f0000000003046019000000000004004b000000000403c019000018b103400197000018b200400198000018b3040000410000000004006019000000000534019f0000000000510435000018b200400198000018b3010000410000000001006019000000000131019f000018b00010009c00004ca90000413d000018b30010009c000044470000613d0000000001100089000018b200100198000018b3030000410000000003006019000018b104100197000000000443019f000018b0054001970000001c07000029000018b003700197000000000653013f000000000053004b0000000005000019000018b005002041000000000047004b0000000004000019000018b004004041000018b00060009c000000000504c019000000000005004b000000000107c019000018b200100198000018b3040000410000000004006019000018b10510019700000000045401a00000000005000039000000010500c039000018b00040009c0000000004000039000000010400403900000000005401700000000001006019000018b104100197000018b200100198000018b3010000410000000001006019000000000141019f000018bc0010009c00003ffd0000213d000018b20410009a0000001c0040006b0000000005000019000018b005004041000018b004400197000000000643013f000000000043004b0000000004000019000018b004002041000018b00060009c000000000405c019000000000004004b000044470000c13d000018b00010009c0000400c0000413d000018c10410009a0000001c0040006b0000000005000019000018b005002041000018b004400197000000000643013f000000000043004b0000000003000019000018b003004041000018b00060009c000000000305c019000000000003004b000044470000c13d00000017030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018bc0030009c000046fe0000213d000000000003004b000046fe0000613d00000019040000290000000004040433000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f000018b20530009a000018b006400197000018b007500197000000000876013f000000000076004b0000000006000019000018b006002041000000000054004b0000000005000019000018b005004041000018b00080009c000000000605c019000000000006004b000044470000c13d00000000033400490000001904000029000047270000013d0000001f0530018f000018e006300198000000400200043d00000000046200190000403a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000040360000c13d000000000005004b000040470000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f000000000014043500000060013002100000187d0020009c0000187d020080410000004002200210000000000112019f000061f000010430000018c4010000410000000000180435000000040180003900000020020000390000000000210435000000240280003900000000010a04330000000000120435000000000001004b000045470000613d0000004402800039000000000300001900000000042300190000000005930019000000000505043300000000005404350000002003300039000000000013004b000040590000413d000045440000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000208043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000053400190000000006740019000000000606043300000000006504350000002004400039000000000024004b0000406e0000413d000046230000013d000018c4010000410000000000160435000000040160003900000020020000390000000000210435000000240260003900000000010904330000000000120435000000000001004b000042b60000613d0000004402600039000000000300001900000000042300190000000005830019000000000505043300000000005404350000002003300039000000000013004b000040820000413d000042b30000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000206043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000053400190000000006740019000000000606043300000000006504350000002004400039000000000024004b000040970000413d000046230000013d000018c4010000410000000000140435000000040140003900000020020000390000000000210435000000240240003900000000010804330000000000120435000000000001004b000045db0000613d0000004402400039000000000300001900000000052300190000000006730019000000000606043300000000006504350000002003300039000000000013004b000040ab0000413d000045d80000013d000018c4010000410000000000140435000000040140003900000020020000390000000000210435000000240240003900000000010804330000000000120435000000000001004b000045db0000613d0000004402400039000000000300001900000000052300190000000006730019000000000606043300000000006504350000002003300039000000000013004b000040bf0000413d000045d80000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000204043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b000040d40000413d000046230000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000204043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b000040e90000413d000046230000013d000018c4010000410000000000140435000000040140003900000020020000390000000000210435000000240240003900000000010704330000000000120435000000000001004b000045db0000613d0000004402400039000000000300001900000000052300190000000007630019000000000707043300000000007504350000002003300039000000000013004b000040fd0000413d000045d80000013d000018c4010000410000000000140435000000040140003900000020020000390000000000210435000000240240003900000000010704330000000000120435000000000001004b000045db0000613d0000004402400039000000000300001900000000052300190000000007630019000000000707043300000000007504350000002003300039000000000013004b000041110000413d000045d80000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000204043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b000041260000413d000046230000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000204043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b0000413b0000413d000046230000013d000018e9011001970000001906000029000000000161019f0000003302000039000000000012041b000000400100043d0000187d0010009c0000187d01008041000000400110021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f00001921011001c70000800d0200003900000003030000390000191904000041000000000500041161ee61e40000040f000000010020019000000c960000613d0000006601000039000000000201041a000018e9022001970000001d022001af000000000021041b0000001a01000029000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000201041a0000192c0220019700000001022001bf000000000021041b0000001d01000029000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000201041a0000192c0220019700000001022001bf000000000021041b0000001c01000029000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b000000000201041a0000192c0220019700000001022001bf000000000021041b000000400300043d000019250030009c00000e1c0000813d000000a001300039000000400010043f0000008002300039000018c00100004100000000001204350000006004300039000019260500004100000000005404350000004005300039000019270600004100000000006504350000002006300039000019070700004100000000007604350000001b070000290000000000730435000000000000043f0000006b07000039000000200070043f0000000003030433000018c5033001970000192807000041000000000807041a000018e908800197000000000338019f000000000037041b0000000003060433000018cb0330019700000000050504330000008005500210000000000335019f0000192905000041000000000035041b0000000003040433000018cb0330019700000000020204330000008002200210000000000232019f0000192a03000041000000000023041b000000400200043d000018eb0020009c00000e1c0000213d000000a003200039000000400030043f000000800320003900000000001304350000006001200039000018d604000041000000000041043500000040052000390000000000450435000000200620003900000000004604350000000000420435000000000000043f000018d804000041000000200040043f00000000020204330000187d0220019700000000040604330000002004400210000018d904400197000000000224019f00000000040504330000004004400210000018da04400197000000000242019f00000000010104330000006001100210000018db01100197000000000112019f00000000020304330000008002200210000000000121019f0000192b02000041000000000012041b000000400100043d000018b90010009c00000e1c0000213d0000008002100039000000400020043f0000002002100039000018c003000041000000000032043500000000003104350000006003100039000000000003043500000040041000390000000000040435000000000000043f0000006c05000039000000200050043f0000000001010433000018cb0110019700000000020204330000008002200210000000000112019f000018b402000041000000000012041b0000000001040433000018cb0110019700000000020304330000008002200210000000000112019f000018ba02000041000000000012041b0000006802000039000000000102041a000018e10010009c00000e1c0000213d0000000103100039000000000032041b000000000020043f0000000502100210000000e00220018f0000187d0220021f0000192f022001670000000301100270000018e20110009a000000000301041a000000000223016f000000000021041b000000400100043d00000000000104350000187d0010009c0000187d01008041000000400110021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018e7011001c70000800d020000390000000103000039000018e80400004161ee61e40000040f000000010020019000000b760000c13d00000c960000013d000000400100043d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000000304043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000042310000413d000007c60000013d000018c4010000410000000000120435000000040120003900000020030000390000000000310435000000240320003900000000010a04330000000000130435000000000001004b0000372d0000613d0000004403200039000000000400001900000000053400190000000006940019000000000606043300000000006504350000002004400039000000000014004b000042450000413d000042fd0000013d000000400100043d000018c4030000410000000000310435000000040310003900000020040000390000000000430435000000000202043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000053400190000000006840019000000000606043300000000006504350000002004400039000000000024004b0000425a0000413d000046230000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b0000426f0000413d000007c60000013d000018c4010000410000000000180435000000040180003900000020020000390000000000210435000000240280003900000000010a04330000000000120435000000000001004b000045470000613d0000004402800039000000000300001900000000042300190000000005930019000000000505043300000000005404350000002003300039000000000013004b000042830000413d000045440000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000208043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000053400190000000006740019000000000606043300000000006504350000002004400039000000000024004b000042980000413d000046230000013d000018c4010000410000000000160435000000040160003900000020020000390000000000210435000000240260003900000000010904330000000000120435000000000001004b000042b60000613d0000004402600039000000000300001900000000042300190000000005830019000000000505043300000000005404350000002003300039000000000013004b000042ac0000413d000042b60000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0060009c0000187d060080410000004002600210000000000121019f000061f000010430000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000206043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000053400190000000006740019000000000606043300000000006504350000002004400039000000000024004b000042ce0000413d000046230000013d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000240410003900000000030304330000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000042e20000413d000007c60000013d000018c4030000410000000000320435000000040320003900000020050000390000000000530435000000240320003900000000010104330000000000130435000000000001004b0000372d0000613d0000004403200039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000015004b000042f60000413d0000372d0000a13d00000000033100190000372c0000013d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000240410003900000000020204330000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b0000430c0000413d000045060000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b000043210000413d0000372a0000013d000000400100043d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000000304043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000043360000413d000007c60000013d000000400100043d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000000304043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b0000434b0000413d000007c60000013d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000240410003900000000030304330000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b0000435f0000413d000007c60000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b000043740000413d0000372a0000013d000018c4010000410000000000120435000000040120003900000020050000390000000000510435000000240520003900000000010404330000000000150435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b000043880000413d0000372a0000013d000000400100043d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000000202043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b0000439d0000413d000046230000013d000000400100043d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000000304043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000043b20000413d000007c60000013d000018c4010000410000000000150435000000040150003900000020020000390000000000210435000000240250003900000000010604330000000000120435000000000001004b00003c670000613d0000004402500039000000000300001900000000062300190000000007430019000000000707043300000000007604350000002003300039000000000013004b000043c60000413d00003c640000013d000018c4010000410000000000140435000000040140003900000020020000390000000000210435000000240240003900000000010504330000000000120435000000000001004b000045db0000613d0000004402400039000000000300001900000000052300190000000007630019000000000707043300000000007504350000002003300039000000000013004b000043da0000413d000045d80000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000204043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b000043ef0000413d000046230000013d00000019020000290000000002020433000018b200200198000018b30500004100000000050060190000001b060000290000000006060433000018b200600198000018b3070000410000000007006019000018b70030009c00000e1c0000213d000018b102200197000000000225019f000018b105600197000000000557019f00000000062500a90000004002300039000000400020043f0000000005130436000018bd020000410000000000250435000000400200043d000018be0760009a000018bf0070009c000046310000213d000018c4010000410000000000120435000000040120003900000020040000390000000000410435000000240420003900000000010304330000000000140435000000000001004b0000372d0000613d0000004403200039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000014004b0000441d0000413d000042fd0000013d000018bc0020009c000044360000213d000018b1012000990000001c08000029000000000018004b0000000007000019000018b007002041000018b001100197000018b008800197000000000918013f000000000018004b0000000001000019000018b001004041000018b00090009c000000000107c019000000000001004b000044470000c13d000018b00020009c0000466a0000413d000018b3012000990000001c08000029000000000018004b0000000007000019000018b007004041000018b001100197000018b008800197000000000918013f000000000018004b0000000001000019000018b001002041000018b00090009c000000000107c019000000000001004b0000466a0000613d0000191201000041000000000010043f0000001101000039000000040010043f000018df01000041000061f000010430000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b0000445a0000413d000007c60000013d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b0000446e0000413d000007c60000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b000044830000413d0000372a0000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000044980000413d000007c60000013d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b000044ac0000413d000046230000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000044c10000413d000007c60000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000044d60000413d000007c60000013d000018c4010000410000000000120435000000040120003900000020050000390000000000510435000000240520003900000000010404330000000000150435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b000044ea0000413d0000372a0000013d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000202043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b000044ff0000413d000046260000a13d0000000003420019000046250000013d000018c4010000410000000000150435000000040150003900000020020000390000000000210435000000240250003900000000010604330000000000120435000000000001004b00003c670000613d0000004402500039000000000300001900000000062300190000000007430019000000000707043300000000007604350000002003300039000000000013004b000045150000413d00003c640000013d000018c4010000410000000000140435000000040140003900000020020000390000000000210435000000240240003900000000010504330000000000120435000000000001004b000045db0000613d0000004402400039000000000300001900000000052300190000000007630019000000000707043300000000007504350000002003300039000000000013004b000045290000413d000045d80000013d000018c4010000410000000000180435000000040180003900000020020000390000000000210435000000240280003900000000010b04330000000000120435000000000001004b000045470000613d0000004402800039000000000300001900000000042300190000000005a30019000000000505043300000000005404350000002003300039000000000013004b0000453d0000413d000045470000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0080009c0000187d080080410000004002800210000000000121019f000061f000010430000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000204043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b0000455f0000413d000046230000013d000018c4010000410000000000190435000000040190003900000020020000390000000000210435000000240290003900000000010804330000000000120435000000000001004b0000457d0000613d0000004402900039000000000300001900000000042300190000000005a30019000000000505043300000000005404350000002003300039000000000013004b000045730000413d0000457d0000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0090009c0000187d090080410000004002900210000000000121019f000061f000010430000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000209043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000053400190000000007640019000000000707043300000000007504350000002004400039000000000024004b000045950000413d000046230000013d000018c4010000410000000000150435000000040150003900000020020000390000000000210435000000240250003900000000010604330000000000120435000000000001004b00003c670000613d0000004402500039000000000300001900000000062300190000000007430019000000000707043300000000007604350000002003300039000000000013004b000045a90000413d00003c640000013d000018c4010000410000000000140435000000040140003900000020020000390000000000210435000000240240003900000000010604330000000000120435000000000001004b000045db0000613d0000004402400039000000000300001900000000062300190000000007530019000000000707043300000000007604350000002003300039000000000013004b000045bd0000413d000045d80000013d000018c4010000410000000000140435000000040140003900000020020000390000000000210435000000240240003900000000010504330000000000120435000000000001004b000045db0000613d0000004402400039000000000300001900000000052300190000000007630019000000000707043300000000007504350000002003300039000000000013004b000045d10000413d000045db0000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0040009c0000187d040080410000004002400210000000000121019f000061f000010430000018c4010000410000000000150435000000040150003900000020020000390000000000210435000000240250003900000000010404330000000000120435000000000001004b00003c670000613d0000004402500039000000000300001900000000042300190000000007630019000000000707043300000000007404350000002003300039000000000013004b000045f20000413d00003c640000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000204043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b000046070000413d000046230000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000205043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b0000461c0000413d000046260000a13d000000000332001900000000000304350000001f02200039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f000010430000018b70020009c00000e1c0000213d000018b04340012c000018b00440c099000018b005000041000018c07550012b000000000353013f000018b00770c099000018b08660012c000000000556013f000018b00880c0990000004006200039000000400060043f00000020062000390000191b09000041000000000096043500000000067800d9000000ff055002120000000008650049000000000558019f0000000005066019000000000006004b000000000605c01900000000047400d9000018b105600197000018b200600198000018b3060000410000000006006019000000000556019f000000ff033002120000000006430049000000000336019f0000000003046019000000000004004b000000000403c019000018b103400197000018b200400198000018b3040000410000000004006019000000000334019f000000000053004b0000000004000019000018b004008041000018b005500197000018b003300197000000000653013f000000000053004b0000000003000019000018b003004041000018b00060009c000000000304c0190000000000120435000000000003004b0000000001000039000000010100c03961ee56990000040f00000b760000013d0000001c01200029000018b107100197000018b200100198000018b3080000410000000008006019000000000778019f000018bc0070009c000046fc0000213d000000000007004b00000000010000190000366a0000613d000018bc0030009c000046860000213d000018b1013000990000001b0a00002900000000001a004b0000000009000019000018b009002041000018b001100197000018b00aa00197000000000b1a013f00000000001a004b0000000001000019000018b001004041000018b000b0009c000000000109c019000000000001004b000044470000c13d000018b00030009c000046970000413d000018b3013000990000001b0a00002900000000001a004b0000000009000019000018b009004041000018b001100197000018b00aa00197000000000b1a013f00000000001a004b0000000001000019000018b001002041000018b000b0009c000000000109c019000000000001004b000044470000c13d0000001b01300029000018b109100197000018b200100198000018b30a000041000000000a00601900000000099a019f000018bc0090009c000046fc0000213d000000000009004b00000000010000190000366a0000613d000018bc0020009c000046ad0000213d000000000002004b000046ad0000613d000018bc0030009c000046ad0000213d000000000003004b000046ad0000613d000018bc01300129000000000021004b000044470000413d000000000052004b0000488a0000c13d000000000053004b000048ab0000c13d000018b05130012c000018b00550c099000018b00b000041000018bccbb0012b000000000b1b013f000018b00cc0c09900000000015c00d9000000ff05b00212000000000b15004900000000055b019f0000000005016019000000000446016f000000000001004b000000000105c019000018b00040009c000046ce0000413d000000000021004b0000000004000019000018b004002041000018b005200197000018b001100197000000000651013f000000000051004b0000000001000019000018b001004041000018b00060009c000000000104c019000000000001004b000044470000c13d000018bc01900129000000000071004b000044470000413d00000000048a016f000018b00040009c000046d60000413d000000000071004b000044470000213d00000000012300a900000000027900a9000000000012004b0000000003000019000018b003002041000018b002200197000018b001100197000000000412013f000000000012004b0000000001000019000018b001004041000018b00040009c000000000103c019000000000001004b0000000001000039000000010100c0390000366a0000013d0000001f0530018f000018e006300198000000400200043d00000000046200190000403a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000046ee0000c13d0000403a0000013d000018c402000041000001600020043f0000002002000039000001640020043f000001840010043f000001a40040043f000001a70000043f000018ea01000041000061f00001043000000000010000190000366a0000013d00000018040000290000000004040433000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f000018bc0040009c000047150000213d000018b105400099000000000053004b0000000006000019000018b006002041000018b005500197000018b007300197000000000857013f000000000057004b0000000005000019000018b005004041000018b00080009c000000000506c019000000000005004b000044470000c13d000018b00040009c000047250000413d000018b305400099000000000053004b0000000006000019000018b006004041000018b005500197000018b007300197000000000857013f000000000057004b0000000005000019000018b005002041000018b00080009c000000000506c019000000000005004b000044470000c13d00000000033400190000001804000029000018b105300197000018b200300198000018b3030000410000000003006019000000000353019f000000000034043500000017030000290000000004030433000018b103400197000018b200400198000018b304000041000000000400601900000000053401a000000000060000390000000106006039000018bc0050009c0000000005000039000000010500203900000000006501a00000001a060000290000001b05000029000000000506c0190000000005050433000018b200500198000018b3060000410000000006006019000018b200400198000018b3070000410000000007006019000000400400043d000018b70040009c00000e1c0000213d000018b105500197000000000556019f000000000337019f00000000055300a90000004003400039000000400030043f0000000003240436000018bd060000410000000000630435000018be0650009a000018bf0060009c0000479b0000213d000000400100043d000018c4020000410000000000210435000000040210003900000020050000390000000000520435000000000204043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b000047600000413d000045060000013d000000400200043d000018b70020009c00000e1c0000213d00000015030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000001c06000029000000000063004b0000000004000019000018b004008041000018b005300197000018b003600197000000000635013f000000000035004b0000000005000019000018b005004041000018b00060009c000000000504c0190000004004200039000000400040043f00000003040000390000000004420436000018d0060000410000000000640435000000000005004b000048000000c13d000000400100043d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000000202043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b000047930000413d000046230000013d000018b003000041000018c04330012b000018b00440c099000018b06550012c000000000335013f000018b00660c09900000000044600d9000000ff033002120000000005430049000000000335019f0000000003046019000000000004004b000000000403c019000018b103400197000018b200400198000018b3040000410000000004006019000000000334019f000018bc0030009c000047bd0000213d000018b104300099000000000041004b0000000005000019000018b005002041000018b004400197000018b006100197000000000746013f000000000046004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b000044470000c13d000018b00030009c000047cd0000413d000018b304300099000000000041004b0000000005000019000018b005004041000018b004400197000018b006100197000000000746013f000000000046004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b000044470000c13d0000000003130019000018b104300197000018b200300198000018b303000041000000000300601900000000054301a000000000030000390000000103006039000018bc0050009c0000000004000039000000010400203900000000003401a00000001a040000290000001b040060290000000003040433000018b200300198000018b3040000410000000004006019000000400600043d000018b70060009c00000e1c0000213d000018b10330019700000000073401a00000004003600039000000400030043f00000003030000390000000004360436000018c2030000410000000000340435000000400300043d000048ff0000c13d000018c4010000410000000000130435000000040130003900000020020000390000000000210435000000240230003900000000010604330000000000120435000000000001004b00003cc90000613d0000004402300039000000000500001900000000062500190000000007450019000000000707043300000000007604350000002005500039000000000015004b000047f80000413d00003cc60000013d00000015020000290000000002020433000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000001c04000029001b18b2004000a2000018bc0040009c000048190000213d0000001b05000029000000000052004b0000000004000019000018b004004041000018b005500197000018b006200197000000000756013f000000000056004b0000000005000019000018b005002041000018b00070009c000000000504c019000000000005004b000044470000c13d0000001c04000029001a18c1004000a2000018b00040009c0000482b0000413d0000001a05000029000000000052004b0000000004000019000018b004002041000018b005500197000018b006200197000000000756013f000000000056004b0000000005000019000018b005004041000018b00070009c000000000504c019000000000005004b000044470000c13d0000001c0220006a000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f00000015040000290000000000240435000000160200002900000000020204330000000004020433000018b106400197000018b200400198000018b305000041000000000500601900000000046501a00000492b0000c13d000000010600008a0000001c0060006b0000494d0000c13d000000000004004b0000000006000019000048510000613d0000192f0040009c00004af70000c13d000018b07640012c000018b00770c099000018b008000041000018bc9880012b000000000868013f000018b00990c09900000000067900d9000000ff078002120000000008670049000000000778019f0000000007066019000000000006004b000000000607c019000000000515016f000018b00050009c000048600000413d0000001c0060006c0000000005000019000018b005002041000018b006600197000000000736013f000000000036004b0000000006000019000018b006004041000018b00070009c000000000605c019000000000006004b000044470000c13d00000018050000290000000005050433000018b106500197000018b200500198000018b305000041000000000500601900000000056501a000004b180000c13d0000191201000041000000000010043f0000001201000039000000040010043f000018df01000041000061f00001043000000060061002700000001f0460018f000018e005600198000000400200043d00000000035200190000487a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000048760000c13d0000187d06600197000000000004004b000048880000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000040480000013d000018b0b120012c000018b00bb0c099000018b00c000041000018b0dcc0012b000000000c1c013f000018b00dd0c0990000000001bd00d9000000ff0bc00212000000000c1b0049000000000bbc019f000000000b016019000000000001004b00000000010bc019000018bc0020009c000046af0000213d000000000002004b000046af0000613d000018b00030009c000046af0000413d000000000031004b000000000b000019000018b00b002041000018b00c300197000018b001100197000000000dc1013f0000000000c1004b0000000001000019000018b001004041000018b000d0009c00000000010bc019000000000001004b000044470000c13d000046af0000013d000018b05130012c000018b00550c099000018b00b000041000018b0cbb0012b000000000b1b013f000018b00cc0c09900000000015c00d9000000ff05b00212000000000b15004900000000055b019f0000000005016019000000000001004b000000000105c019000018bc0030009c000046b10000213d000000000003004b000046b10000613d000018b00020009c000046b10000413d000000000021004b0000000005000019000018b005002041000018b00b200197000018b001100197000000000cb1013f0000000000b1004b0000000001000019000018b001004041000018b000c0009c000000000105c019000000000001004b000044470000c13d000046b10000013d000000000086004b0000000001000019000018b001002041000018b003800197000018b006600197000000000836013f000000000036004b0000000003000019000018b003004041000018b00080009c000000000301c019000000000003004b0000496f0000c13d000000000075004b0000000001000019000018b001004041000018b003700197000018b005500197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000301c019000000000003004b0000000001000019000049700000c13d000000000020043f0000006b01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000001000200043d0000000002020433000000000101043b000000000101041a000000000112013f000018c50010019800000000010000390000000101006039000000400400043d000018b70040009c00000e1c0000213d000049700000013d000018b06470012c000018b00660c099000018c0055000d1000018b07550012c000000000545013f000018b00770c09900000000046700d9000000ff055002120000000006450049000000000556019f0000000005046019000000000004004b000000000405c019000018b70030009c00000e1c0000213d0000004005300039000000400050043f0000000002230436000018bd050000410000000000520435000018b20540009a000018c30050009c00004ab20000213d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000049230000413d000007c60000013d0000001c06000029000018bc0060009c0000483c0000213d0000001c0000006b0000483c0000613d000018bc0040009c0000483c0000213d000000000004004b0000483c0000613d000018bc064001290000001c0060006c000044470000413d0000483c0000013d000000400100043d000018c4020000410000000000210435000000040210003900000020050000390000000000520435000000000204043300000024041000390000000000240435000000000002004b000046260000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b000049450000413d000045060000013d0000001c0a000029000018b076a0012c000018b00770c099000018b008000041000018b09880012b000000000868013f000018b00990c09900000000067900d9000000ff078002120000000008670049000000000778019f0000000007066019000000000006004b000000000607c019000018bc00a0009c0000483f0000213d0000001c0000006b0000483f0000613d000018b00040009c0000483f0000413d000000000046004b0000000007000019000018b007002041000018b008400197000018b006600197000000000986013f000000000086004b0000000006000019000018b006004041000018b00090009c000000000607c019000000000006004b000044470000c13d0000483f0000013d00000000010000190000004002400039000000400020043f00000003020000390000000002240436000018d5030000410000000000320435000000010010019000004a9d0000613d000000800100043d0000187d01100197000000000010043f000018d801000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001d00000002001d000018eb0020009c00000e1c0000213d000000000101043b0000001d07000029000000a002700039000000400020043f000000000201041a000018b001200197000000010300008a000018b00010009c000000000300c01900000080013002100000008003200270000000000113019f000000800000008b0000000001026019000018d200200198000018d3030000410000000003006019000018d404200197000000000343019f0000002004200270000018d404400197000018ec00200198000018d3050000410000000005006019000000000445019f0000004005200270000018d405500197000018ed00200198000018d3060000410000000006006019000000000556019f0000006006200270000018d406600197000018b200200198000018d3020000410000000002006019000000000262019f0000006006700039000000000026043500000040087000390000000000580435000000200570003900000000004504350000000000370435000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000008002700039001a00000002001d0000000000120435000001e00100043d000018d402100197000018d200100198000018d3010000410000000001006019000000000121019f0000000000170435000002000100043d000018d402100197000018d200100198000018d3010000410000000001006019000000000121019f001900000005001d0000000000150435000002200100043d000018d402100197000018d200100198000018d3010000410000000001006019000000000121019f001b00000008001d0000000000180435000002400100043d000018d402100197000018d200100198000018d3010000410000000001006019000000000121019f001c00000006001d0000000000160435000000800100043d0000187d01100197000000000010043f000018d801000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001d0200002900000000020204330000187d02200197000000190300002900000000030304330000002003300210000018d903300197000000000223019f0000001b0300002900000000030304330000004003300210000018da03300197000000000232019f0000001c0300002900000000030304330000006003300210000018db03300197000000000232019f0000001a0300002900000000030304330000008003300210000000000232019f000000000101043b000000000021041b0000006501000039000000000201041a000018e301000041000000400300043d001d00000003001d00000000001304350000187d0030009c0000187d010000410000000001034019000000400110021000000000030004140000187d0030009c0000187d03008041000000c003300210000000000113019f000018e4011001c7000018c50220019761ee61e90000040f00000060031002700000187d03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000001d0b0000290000001d0570002900004a250000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00004a210000c13d000000000006004b00004a320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000004cea0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000018e10010009c00000e1c0000213d000000010020019000000e1c0000c13d000000400010043f000000200030008c00000c960000413d00000000010b0433001d00000001001d000018c50010009c00000c960000213d000000800100043d001c00000001001d000000a00100043d001b00000001001d000000c00100043d001a00000001001d000000e00100043d001900000001001d000018dc0100004100000000001004430000001d01000029000000040010044300000000010004140000187d0010009c0000187d01008041000000c001100210000018dd011001c7000080020200003961ee61e90000040f000000010020019000004a9c0000613d000000000101043b000000000001004b00000c960000613d0000001902000029000018b101200197000018b2002001980000001a03000029000018b102300197000018b2033001970000001b05000029000018b104500197000018b2055001970000001c060000290000187d06600197000000400900043d00000024079000390000187d080000410000000000870435000018e507000041000000000079043500000004079000390000000000670435000018b3060000410000000006006019000000000116019f000000a4069000390000000000160435000000000003004b000018b3010000410000000001006019000000000121019f00000084029000390000000000120435000000000005004b000018b3010000410000000001006019000000000141019f00000064029000390000000000120435000000440190003900000000000104350000187d0090009c001c00000009001d0000187d010000410000000001094019000000400110021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018e6011001c70000001d0200002961ee61e40000040f000000010020019000004d650000613d0000001c01000029000018e10010009c00000e1c0000213d0000001c01000029000000400010043f000001000100043d001d00000001001d000000800100043d0000187d0110019700000c800000013d000000000001042f000000400100043d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000000304043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00004aaa0000413d000007c60000013d000018b102400197000018b200400198000018b3030000410000000003006019000000000423019f00000017050000290000000000450435000018b200300198000018b3030000410000000003006019000000000223019f000018bc0020009c00004c790000213d000000000002004b00004c790000613d00000019030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018bc0030009c00004ad80000213d000018b104300099000000000042004b0000000005000019000018b005002041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b000044470000c13d000018b00030009c00004ae80000413d000018b304300099000000000042004b0000000005000019000018b005004041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b000044470000c13d0000000002230019001800190000002d00004ca10000013d0000001f0530018f000018e006300198000000400200043d00000000046200190000403a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004af20000c13d0000403a0000013d000018b07640012c000018b00770c099000018b008000041000018b09880012b000000000868013f000018b00990c09900000000067900d9000000ff078002120000000008670049000000000778019f0000000007066019000000000006004b000000000607c019000018bc0040009c000048440000213d000000000004004b000048440000613d0000001c07000029000018b00070009c000048440000413d0000001c0060006c0000000007000019000018b007002041000018b006600197000000000836013f000000000036004b0000000006000019000018b006004041000018b00080009c000000000607c019000000000006004b000044470000c13d000048440000013d0000001c084000b9000018b00080009c00004b1d0000c13d0000192f0050009c000044470000613d000018b07650012c000018b0047000990000000009070019000000000904c019000018b0a880012c000000000b68013f000018b00aa0c09900000000089a00d9000000ff09b00212000000000a89004900000000099a019f0000000009086019000000000008004b000000000809c019000000170900002900000000090904330000000009090433000018b10b900197000018b200900198000018b30a000041000000000a0060190000000009ba019f000018b200800198000018b30b000041000000000b006019000c0000000b001d000000000009004b00004cbb0000c13d000000010b00008a0000001c00b0006b00004cc80000c13d000000000009004b000000000b00001900004b4e0000613d0000192f0090009c00004cf60000c13d000018b0cb90012c000018b00cc0c099000018b00d000041000018bcedd0012b000000000dbd013f000018b00ee0c099000000000bce00d9000000ff0cd00212000000000dbc0049000000000ccd019f000000000c0b601900000000000b004b000000000b0cc01900000000011a016f000018b00010009c00004b5d0000413d0000001c00b0006c0000000001000019000018b001002041000018b00ab00197000000000b3a013f00000000003a004b0000000003000019000018b003004041000018b000b0009c000000000301c019000000000003004b000044470000c13d0000001c019000b90000192f0050009c00004b620000c13d000018b00010009c000044470000613d000918b10080019b000000000006004b0000000004076019000018b03110012c000000000561013f000018b00330c09900000000014300d9000000ff035002120000000004130049000000000334019f0000000003016019000000000001004b000000000103c0190000000c03000029000018b200300198000018b303000041000000000300601900000009043001af000018b200100198000018b3030000410000000003006019000a00000003001d000b00000004001d000018b30040009c000044470000613d000818b10010019b0000000b010000290000000003100089000000140100002961ee57f80000040f0000000a01000029000018b200100198000018b301000041000000000100601900000008011001af000700000001001d000018b30010009c000044470000613d0000001701000029000000000201043300000007010000290000000003100089000000130100002961ee57f80000040f00000018010000290000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000001b03000029000018b002300197000000000031004b0000000003000019000018b003004041000018b004100197000000000524013f000000000024004b0000000006000019000018b006002041000018b00050009c000000000603c0190000001a05000029000018b002500197000000000324013f000000000024004b0000000002000019000018b002004041000000000051004b0000000004000019000018b004002041000018b00030009c000000000204c019000000000002004b0000000002000039000000010200c0390000001c04000029000018bc0040009c00000000030000390000000103002039000018b00040009c00000000040000390000000104004039000000000006004b0000000005000039000000010500c039000000000454016f0000000100400190000044470000c13d000000000223016f0000000100200190000044470000c13d0000001c0110006a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000180200002900000000001204350000001d01000029000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d00000018020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b000000170200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000103100039000000000023041b000000160200002900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000201100039000000000021041b0000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001902000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d00000015020000290000000002020433000018cb02200197000000000101043b0000000101100039000000000301041a000018cc03300197000000000223019f000000000021041b0000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001902000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001c00000002001d000018bb0020009c00000e1c0000213d000000000101043b0000001c030000290000002002300039000000400020043f000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f00000000001304350000001901000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001b00000002001d000018bb0020009c00000e1c0000213d000000000101043b0000001b030000290000002002300039000000400020043f000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f00000000001304350000001c010000290000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000018bc0010009c00004e670000213d000000000001004b00004e670000613d00000011020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018b20310009a000018b004200197000018b005300197000000000654013f000000000054004b0000000004000019000018b004002041000000000032004b0000000003000019000018b003004041000018b00060009c000000000403c019000000000004004b000044470000c13d0000000001120049000000110200002900004e900000013d00000018030000290000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000000002004b00004c900000c13d000018b20420009a000000000043004b0000000005000019000018b005004041000018b004400197000018b006300197000000000746013f000000000046004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b000044470000c13d000018b00020009c00004ca00000413d000018c10420009a000000000043004b0000000005000019000018b005002041000018b004400197000018b006300197000000000746013f000000000046004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b000044470000c13d0000000002230049001c001c00100071000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f00000018020000290000000000120435000000000000043f0000006c01000039000000200010043f000018b4010000410000001b0200002961ee56fd0000040f000000000000043f0000006d01000039000000200010043f000018b5010000410000001d0200002961ee57690000040f000000170200002961ee579b0000040f000000400100043d001d00000001001d0000001c0200002900000d4f0000013d0000001c0b000029000018bc00b0009c00004b390000213d0000001c0000006b00004b390000613d000018bc0090009c00004b390000213d000000000009004b00004b390000613d000018bc0b9001290000001c00b0006c000044470000413d00004b390000013d0000001c0f000029000018b0cbf0012c000018b00cc0c099000018b00d000041000018b0edd0012b000000000dbd013f000018b00ee0c099000000000bce00d9000000ff0cd00212000000000dbc0049000000000ccd019f000000000c0b601900000000000b004b000000000b0cc019000018bc00f0009c00004b3c0000213d0000001c0000006b00004b3c0000613d000018b00090009c00004b3c0000413d00000000009b004b000000000c000019000018b00c002041000018b00d900197000018b00bb00197000000000edb013f0000000000db004b000000000b000019000018b00b004041000018b000e0009c000000000b0cc01900000000000b004b000044470000c13d00004b3c0000013d0000001f0530018f000018e006300198000000400200043d00000000046200190000403a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004cf10000c13d0000403a0000013d000018b0cb90012c000018b00cc0c099000018b00d000041000018b0edd0012b000000000dbd013f000018b00ee0c099000000000bce00d9000000ff0cd00212000000000dbc0049000000000ccd019f000000000c0b601900000000000b004b000000000b0cc019000018bc0090009c00004b410000213d000000000009004b00004b410000613d0000001c0c000029000018b000c0009c00004b410000413d0000001c00b0006c000000000c000019000018b00c002041000018b00bb00197000000000d3b013f00000000003b004b000000000b000019000018b00b004041000018b000d0009c000000000b0cc01900000000000b004b000044470000c13d00004b410000013d00000060061002700000001f0460018f000018e005600198000000400200043d00000000035200190000487a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00004d1f0000c13d0000487a0000013d000018b70010009c00000e1c0000213d0000001c0300002900000000030304330000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018c0033000d1000018b04330012c000018b00440c099000018b05220012c000000000223013f000018b00550c0990000004003100039000000400030043f0000002003100039000018c20600004100000000006304350000000303000039000000000031043500000000015400d9000000ff022002120000000003120049000000000223019f0000000002016019000000000001004b000000000102c019000000400300043d000018b70030009c00000e1c0000213d0000004002300039000000400020043f00000002020000390000000002230436000018bd040000410000000000420435000000400400043d000018b20510009a000018c30050009c00004d720000213d000018c4010000410000000000140435000000040140003900000020050000390000000000510435000000240540003900000000010304330000000000150435000000000001004b000045db0000613d0000004403400039000000000500001900000000063500190000000007250019000000000707043300000000007604350000002005500039000000000015004b00004d5b0000413d000045db0000a13d0000000002310019000045da0000013d00000060061002700000001f0460018f000018e005600198000000400200043d00000000035200190000487a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00004d6d0000c13d0000487a0000013d000018b70040009c00000e1c0000213d00000000020003670000004403200370000000000303043b0000004005400039000000400050043f00000002050000390000000005540436000018bd060000410000000000650435000018b106100197000018b200100198000018b3010000410000000001006019000000000661019f000018b200300198000018b3010000410000000001006019000018b107300197000000000171019f00000000066100a9000018be0760009a000018bf0070009c00004da00000213d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000204043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000063400190000000007540019000000000707043300000000007604350000002004400039000000000024004b00004d980000413d000046230000013d000018b004000041000018c05440012b000018b00550c099000018b07660012c000000000646013f000018b00770c09900000000045700d9000000ff056002120000000006450049000000000556019f0000000005046019000000000004004b000000000405c019000018b200400198000018b3050000410000000005006019001800000005001d000018b200500198000018b3050000410000000005006019000000400800043d000018b70080009c00000e1c0000213d001718b10040019b00000017045001af0000004005800039000000400050043f000000030500003900000000075804360000190d0500004100000000005704350000006405200370000000000505043b000018b106500197000018b200500198000018b3050000410000000005006019000000000565019f000018b006400197000000000054004b0000000009000019000018b009008041000018b005500197000000000a56013f000000000056004b000000000b000019000018b00b004041000018b000a0009c000000000b09c019000000400500043d00000000000b004b00004de80000c13d000018c4010000410000000000150435000000040150003900000020020000390000000000210435000000240250003900000000010804330000000000120435000000000001004b00003c670000613d0000004402500039000000000300001900000000042300190000000006730019000000000606043300000000006404350000002003300039000000000013004b00004de00000413d00003c640000013d000018b70050009c00000e1c0000213d0000004007500039000000400070043f000000030700003900000000077504360000190d0800004100000000008704350000008402200370000000000202043b000018b108200197000018b200200198000018b3020000410000000002006019000000000282019f000000000024004b0000000008000019000018b00800a041000018b002200197000000000926013f000000000026004b0000000002000019000018b002002041000018b00090009c000000000208c019000000000002004b00004e180000c13d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000205043300000024031000390000000000230435000000000002004b000046260000613d0000004403100039000000000400001900000000053400190000000006740019000000000606043300000000006504350000002004400039000000000024004b00004e100000413d000046230000013d0000001d020000290000000002020433000018b105200197000018b200200198000018b302000041000000000200601900000000005201a000004e400000c13d000018bc0010009c00004e2f0000213d000018b102100099000000000024004b0000000005000019000018b005002041000018b002200197000000000726013f000000000026004b0000000002000019000018b002004041000018b00070009c000000000205c019000000000002004b000044470000c13d000018b00010009c00004e3e0000413d000018b302100099000000000024004b0000000005000019000018b005004041000018b002200197000000000726013f000000000026004b0000000002000019000018b002002041000018b00070009c000000000205c019000000000002004b000044470000c13d000000000114001900004fd30000013d0000001b0200002900000000020204330000000002020433000018b200200198000018b3040000410000000004006019000000400500043d000018b70050009c00000e1c0000213d000018b10220019700000000062401a00000004002500039000000400020043f00000003020000390000000004250436000018c2020000410000000000240435000000400200043d00004ed20000c13d000018c4010000410000000000120435000000040120003900000020030000390000000000310435000000240320003900000000010504330000000000130435000000000001004b0000372d0000613d0000004403200039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000015004b00004e5f0000413d000042fd0000013d00000010020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c00004e7e0000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c00004e8e0000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200190000001002000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001c010000290000000002010433000018b101200197000018b200200198000018b303000041000000000300601900000000021301a000000000040000390000000104006039000018bc0020009c0000000002000039000000010200203900000000004201a000000012040000290000001402000029000000000204c0190000000002020433000018b200200198000018b3040000410000000004006019000018b200300198000018b3050000410000000005006019000000400300043d000018b70030009c00000e1c0000213d000018b102200197000000000224019f000000000115019f00000000012100a90000004002300039000000400020043f00000002020000390000000002230436000018bd040000410000000000420435000018be0410009a000018bf0040009c00004eff0000213d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00004eca0000413d000007c60000013d000018b05460012c000018b00550c099000018c0011000d1000018b06110012c000000000141013f000018b00660c09900000000055600d9000000ff011002120000000004510049000000000114019f0000000001056019000000000005004b000000000501c019000018b70020009c00000e1c0000213d0000004001200039000000400010043f00000002010000390000000004120436000018bd010000410000000000140435000000400100043d000018b20650009a000018c30060009c00004f670000213d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240310003900000000020204330000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00004ef70000413d000046230000013d000018b002000041000018c03220012b000018b00330c099000018b04110012c000000000121013f000018b00440c09900000000023400d9000000ff011002120000000003210049000000000113019f0000000001026019000000000002004b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c00004f220000213d000018b1021000990000000b04000029000000000024004b0000000003000019000018b003002041000018b002200197000018b004400197000000000524013f000000000024004b0000000002000019000018b002004041000018b00050009c000000000203c019000000000002004b000044470000c13d000018b00010009c00004f330000413d000018b3021000990000000b04000029000000000024004b0000000003000019000018b003004041000018b002200197000018b004400197000000000524013f000000000024004b0000000002000019000018b002002041000018b00050009c000000000203c019000000000002004b000044470000c13d0000000b01100029000018b102100197000018b200100198000018b301000041000000000100601900000000032101a000000000010000390000000101006039000018bc0030009c0000000002000039000000010200203900000000001201a000000012020000290000001401000029000000000102c0190000000001010433000018b200100198000018b3020000410000000002006019000000400400043d000018b70040009c00000e1c0000213d000018b10110019700000000051201a00000004001400039000000400010043f00000003010000390000000002140436000018c2010000410000000000120435000000400100043d00004f940000c13d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00004f5f0000413d000007c60000013d000018b200500198000018b30200004100000000020060190000001d040000290000000004040433000018b200400198000018b3060000410000000006006019000018b70010009c00000e1c0000213d000018b105500197000000000252019f000018b104400197000000000446019f00000000022400a90000004004100039000000400040043f00000002040000390000000004410436000018bd050000410000000000540435000018be0520009a000018bf0050009c00004fc10000213d000000400200043d000018c4030000410000000000320435000000040320003900000020050000390000000000530435000000000101043300000024032000390000000000130435000000000001004b0000372d0000613d0000004403200039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000015004b00004f8c0000413d000042fd0000013d000018b04250012c000018b00440c099000018c0033000d1000018b05330012c000000000323013f000018b00550c09900000000024500d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b70010009c00000e1c0000213d0000004003100039000000400030043f00000002030000390000000003310436000018bd040000410000000000430435000018b20420009a000018c30040009c0000505f0000213d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b00004fb90000413d0000372a0000013d000018b001000041000018c04110012b000018b00440c099000018b05220012c000000000112013f000018b00550c09900000000024500d9000000ff011002120000000004210049000000000114019f0000000001026019000000000002004b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001600000001001d0000001b0100002900000000020104330000001a0100002961ee57f80000040f000000170200002900000018032001af001b00000003001d0000001c010000290000000002010433000000190100002961ee57f80000040f0000001d010000290000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000001602000029001600000002001d61ee56560000040f000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000001d02000029000000000012043500000000010003670000002402100370000000000202043b001c00000002001d0000000401100370000000000101043b61ee55600000040f0000001c0200002961ee57690000040f0000000101100039001c00000001001d000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000160200002961ee56560000040f000018cb011001970000001c03000029000000000203041a000018cc02200197000000000112019f000000000013041b00000004010000390000000001100367000000000101043b61ee55710000040f0000001d0200002961ee57140000040f00000000010003670000002402100370000000000202043b001d00000002001d0000000401100370000000000101043b61ee55600000040f0000001d0200002961ee57690000040f61ee57780000040f00000024020000390000000002200367000000000202043b000000000000043f0000006d03000039000000200030043f001d00000001001d000018b50100004161ee57690000040f61ee57780000040f00000044020000390000000002200367000000000202043b001c00000001001d000000000102001961ee578c0000040f00000000030100190000001a010000290000001d0200002961ee5b400000040f0000001b0100002961ee578c0000040f000000000301001900000019010000290000001c0200002961ee5b400000040f00000000010003670000002402100370000000000202043b001b00000002001d0000000401100370000000000101043b61ee55600000040f0000001b0200002961ee57690000040f0000001d0200002961ee579b0000040f00000024010000390000000001100367000000000201043b000000000000043f0000006d01000039000000200010043f000018b50100004161ee57690000040f0000001c0200002961ee579b0000040f00000004010000390000000001100367000000000101043b61ee554f0000040f0000001a0200002961ee56fd0000040f000000000000043f0000006c01000039000000200010043f000018b401000041000000190200002961ee56fd0000040f00000000020003670000000401200370000000000101043b0000002402200370000000000202043b61ee5e540000040f00000024010000390000000001100367000000000101043b61ee5d680000040f00000b760000013d000018b101200197000018b200200198000018b3020000410000000002006019000000000312019f0000001c040000290000000000340435000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c000050980000213d000000000001004b000050980000613d00000011020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c000050850000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c000050950000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200190000001102000029000050c10000013d00000010020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000000000001004b000050af0000c13d000018b20310009a000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00010009c000050bf0000413d000018c10310009a000000000032004b0000000004000019000018b004002041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200490000001002000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001b010000290000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000018bc0010009c000050ea0000213d000000000001004b000050ea0000613d0000000e020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018b20310009a000018b004200197000018b005300197000000000654013f000000000054004b0000000004000019000018b004002041000000000032004b0000000003000019000018b003004041000018b00060009c000000000403c019000000000004004b000044470000c13d00000000011200490000000e02000029000051130000013d0000000d020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c000051010000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c000051110000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200190000000d02000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001b010000290000000002010433000018b101200197000018b200200198000018b303000041000000000300601900000000021301a000000000040000390000000104006039000018bc0020009c0000000002000039000000010200203900000000004201a00000000f040000290000001302000029000000000204c0190000000002020433000018b200200198000018b3040000410000000004006019000018b200300198000018b3050000410000000005006019000000400300043d000018b70030009c00000e1c0000213d000018b102200197000000000224019f000000000115019f00000000012100a90000004002300039000000400020043f00000002020000390000000002230436000018bd040000410000000000420435000018be0410009a000018bf0040009c000051550000213d000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b0000514d0000413d000007c60000013d000018b002000041000018c03220012b000018b00330c099000018b04110012c000000000121013f000018b00440c09900000000023400d9000000ff011002120000000003210049000000000113019f0000000001026019000000000002004b000000000201c019000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c000051780000213d000018b1021000990000000704000029000000000024004b0000000003000019000018b003002041000018b002200197000018b004400197000000000524013f000000000024004b0000000002000019000018b002004041000018b00050009c000000000203c019000000000002004b000044470000c13d000018b00010009c000051890000413d000018b3021000990000000704000029000000000024004b0000000003000019000018b003004041000018b002200197000018b004400197000000000524013f000000000024004b0000000002000019000018b002002041000018b00050009c000000000203c019000000000002004b000044470000c13d0000000701100029000018b102100197000018b200100198000018b301000041000000000100601900000000032101a000000000010000390000000101006039000018bc0030009c0000000002000039000000010200203900000000001201a00000000f020000290000001301000029000000000102c0190000000001010433000018b200100198000018b3020000410000000002006019000000400400043d000018b70040009c00000e1c0000213d000018b10110019700000000051201a00000004001400039000000400010043f00000003010000390000000002140436000018c2010000410000000000120435000000400100043d000051bd0000c13d000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000007c90000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000051b50000413d000007c60000013d000018b04250012c000018b00440c099000018c0033000d1000018b05330012c000000000323013f000018b00550c09900000000024500d9000000ff033002120000000004230049000000000334019f0000000003026019000000000002004b000000000203c019000018b70010009c00000e1c0000213d0000004003100039000000400030043f00000002030000390000000003310436000018bd040000410000000000430435000018b20420009a000018c30040009c000051ea0000213d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b0000372d0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b000051e20000413d0000372a0000013d000018b101200197000018b200200198000018b3020000410000000002006019000000000312019f0000001b040000290000000000340435000018b200200198000018b3020000410000000002006019000000000112019f000018bc0010009c000052230000213d000000000001004b000052230000613d0000000e020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c000052100000213d000018b103200099000000000031004b0000000004000019000018b004002041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00020009c000052200000413d000018b303200099000000000031004b0000000004000019000018b004004041000018b003300197000018b005100197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200190000000e020000290000524c0000013d0000000d020000290000000002020433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000000000001004b0000523a0000c13d000018b20310009a000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000044470000c13d000018b00010009c0000524a0000413d000018c10310009a000000000032004b0000000004000019000018b004002041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003004041000018b00060009c000000000304c019000000000003004b000044470000c13d00000000011200490000000d02000029000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000000001204350000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001902000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001c020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b0000001901000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d0000001b020000290000000002020433000018cb02200197000000000101043b000000000301041a000018cc03300197000000000223019f000000000021041b0000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d00000014020000290000000002020433000018cb02200197000000120300002900000000030304330000008003300210000000000223019f000000000101043b000000000021041b00000011020000290000000002020433000018cb02200197000000100300002900000000030304330000008003300210000000000223019f0000000101100039000000000021041b000000000000043f0000006c01000039000000200010043f00000013010000290000000001010433000018cb011001970000000f0200002900000000020204330000008002200210000000000112019f000018b402000041000000000012041b0000000e010000290000000001010433000018cb011001970000000d0200002900000000020204330000008002200210000000000112019f000018ba02000041000000000012041b000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000002002100039000000000002043500000000000104350000001d01000029000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d001c00000002001d000018b90020009c00000e1c0000213d000000000101043b0000001c070000290000008002700039000000400020043f000000000201041a000018b003200197000018b00030009c000000010600008a0000000003000019000000000306601900000080033002100000008004200270000000000334019f000000800000008b0000000003026019000018b104200197000018b200200198000018b3020000410000000002006019000000000242019f0000000004270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f001b00000004001d00000000002404350000000101100039000000000101041a000018b002100197000018b00020009c0000000002000019000000000206601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040037000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000000600270003900000000001204350000001d01000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000000101043b0000001902000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c00000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a00000001b040000290000001c04006029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00000e1c0000213d000000000113019f000018b103400197000000000532019f00000000075100a90000004001600039000000400010043f00000002010000390000000004160436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c000053740000213d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b0000536c0000413d000046230000013d000018b70010009c00000e1c0000213d000018b004000041000018c06440012b000018b00660c099000018b08770012c000000000447013f000018b00880c0990000004007100039000000400070043f0000002007100039000000000057043500000000056800d9000000ff044002120000000006540049000000000446019f0000000004056019000000000005004b000000000504c019000018b104500197000018b200500198000018b3050000410000000005006019000000000645019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200500198000018b3010000410000000001006019000000000141019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d10400004100000019050000290000001d0600002961ee61e40000040f000000010020019000000c960000613d000000400100043d000018b70010009c00000e1c0000213d0000004002100039000000400020043f0000002002100039000000000002043500000000000104350000006c01000039000000200010043f000000400100043d001d00000001001d000018b90010009c00000e1c0000213d0000001d060000290000008001600039000000400010043f000018b401000041000000000101041a000018b002100197000018b00020009c000000010500008a0000000002000019000000000205601900000080022002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000003160436000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f001c00000003001d0000000000130435000018ba01000041000000000101041a000018b002100197000018b00020009c000000000500c01900000080025002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040036000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000000600260003900000000001204350000001901000029000000000010043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000000c960000613d000000400200043d000018bb0020009c00000e1c0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00000e1c0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a00000001c040000290000001d04006029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00000e1c0000213d000000000113019f000018b103400197000000000532019f00000000075100a90000004001600039000000400010043f00000002010000390000000004160436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c000054480000213d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b000046260000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b000054400000413d000046230000013d000018b70010009c00000e1c0000213d000018b004000041000018c06440012b000018b00660c099000018b08770012c000000000447013f000018b00880c0990000004007100039000000400070043f0000002007100039000000000057043500000000056800d9000000ff044002120000000006540049000000000446019f0000000004056019000000000005004b000000000504c019000018b104500197000018b200500198000018b3050000410000000005006019000000000645019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200500198000018b3010000410000000001006019000000000141019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d1040000410000001905000029000000000600001961ee61e40000040f000000010020019000000c960000613d00000009020000290000000c022001af00000008030000290000000a033001af000035df0000013d000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000001210436000000000001042d000018b200100198000018b3020000410000000002006019000018b103100197000000000232019f000000000012004b000054920000c13d000000000001042d0000000001000019000061f000010430000018bc0010009c000054a70000213d000000430010008c000054a70000a13d00000000020003670000000401200370000000000101043b0000187d0010009c000054a70000213d0000002402200370000000000202043b000018b200200198000018b3030000410000000003006019000018b104200197000000000343019f000000000023004b000054a70000c13d000000000001042d0000000001000019000061f0000104300000000031010434000018b104100197000018b200100198000018b3010000410000000001006019000000000141019f00000000011204360000000002030433000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000000210435000000000001042d0000000043010434000018b105300197000018b200300198000018b3030000410000000003006019000000000353019f00000000033204360000000004040433000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f000000000043043500000040031000390000000003030433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f0000004004200039000000000034043500000060011000390000000001010433000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000060022000390000000000120435000000000001042d000019310010009c000054de0000813d0000006001100039000000400010043f000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000019320010009c000054e90000813d0000008001100039000000400010043f000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000019250010009c000054f40000813d000000a001100039000000400010043f000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f00000020041000390000000000340435000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000000002104350000004001100039000000000001042d000018bc0010009c0000551e0000213d000000630010008c0000551e0000a13d00000000020003670000000401200370000000000101043b0000187d0010009c0000551e0000213d0000004403200370000000000303043b000018b200300198000018b3040000410000000004006019000018b105300197000000000454019f000000000034004b0000551e0000c13d0000002402200370000000000202043b000000000001042d0000000001000019000061f000010430000018c5061001970000003301000039000000000201041a000018e903200197000000000363019f000000000031041b000000400100043d0000187d0010009c0000187d01008041000000400110021000000000030004140000187d0030009c0000187d03008041000000c003300210000000000113019f000018c50520019700001921011001c70000800d020000390000000303000039000019190400004161ee61e40000040f0000000100200190000055380000613d000000000001042d0000000001000019000061f000010430000000400100043d000019250010009c000055490000813d000000a002100039000000400020043f000000800210003900000000000204350000006002100039000000000002043500000040021000390000000000020435000000200210003900000000000204350000000000010435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f0000104300000187d01100197000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f00000001002001900000555e0000613d000000000101043b000000000001042d0000000001000019000061f0000104300000187d01100197000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f00000001002001900000556f0000613d000000000101043b000000000001042d0000000001000019000061f0000104300000187d01100197000000000010043f0000006e01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f0000000100200190000055800000613d000000000101043b000000000001042d0000000001000019000061f0000104300000187d01100197000000000010043f0000006b01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f0000000100200190000055910000613d000000000101043b000000000001042d0000000001000019000061f0000104300005000000000002000000400300043d000019250030009c0000564e0000813d000000a002300039000000400020043f0000008002300039000200000002001d00000000000204350000006002300039000100000002001d00000000000204350000004002300039000300000002001d0000000000020435000500000003001d0000000002030436000400000002001d00000000000204350000187d01100197000000000010043f000018d801000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f0000000100200190000056540000613d000000400300043d000018eb0030009c000000050a0000290000564e0000213d000000000101043b000000a002300039000000400020043f000000000101041a000018b002100197000000010400008a000018b00020009c000000000400c01900000080024002100000008004100270000000000224019f000000800000008b00000000020160190000004004100270000018d404400197000018ed00100198000018d3050000410000000005006019000000000545019f000018b104200197000018b200200198000018b3020000410000000002006019000000000642019f000018d200100198000018d3070000410000000007006019000018d200700198000018d3020000410000000002006019000018f304200197000018b200200198000018b3020000410000000002006019000000000824019f0000002002100270000018d402200197000018ec00100198000018d3040000410000000004006019000000000924019f0000006002100270000018d402200197000018b200100198000018d3040000410000000004006019000000000424019f000000600230003900000000004204350000004004300039000000000054043500000020053000390000000000950435000018d409100197000000000197019f000000000013043500000080013000390000000000610435000000000398019f000018f40630009a000019330060009c000056480000a13d000018d6033000d1000018f606300197000018b200300198000018b3030000410000000003006019000000000363019f00000000003a04350000000003050433000018d405300197000018d200300198000018d3030000410000000003006019000018f306300197000000000556019f000018b200300198000018b3030000410000000003006019000000000335019f000018f40530009a000018f50050009c000056480000413d000018d6033000d1000018f605300197000018b200300198000018b3030000410000000003006019000000000353019f000000040500002900000000003504350000000003040433000018d404300197000018d200300198000018d3030000410000000003006019000018f305300197000000000445019f000018b200300198000018b3030000410000000003006019000000000334019f000018f40430009a000018f50040009c000056480000413d000018d6033000d1000018f604300197000018b200300198000018b3030000410000000003006019000000000343019f000000030400002900000000003404350000000002020433000018d403200197000018d200200198000018d3020000410000000002006019000018f304200197000000000334019f000018b200200198000018b3020000410000000002006019000000000223019f000018f40320009a000018f50030009c000056480000413d000018d6022000d1000018f603200197000018b200200198000018b3020000410000000002006019000000000232019f000000010300002900000000002304350000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000000202000029000000000012043500000000010a0019000000000001042d0000191201000041000000000010043f0000001101000039000000040010043f000018df01000041000061f0000104300000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f0000104300000000001000019000061f000010430000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000018bc0010009c000056700000213d000018b103100099000000000032004b0000000004000019000018b00400a041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000056820000613d000018b00010009c000056800000413d000018b303100099000000000032004b0000000004000019000018b004004041000018b003300197000018b005200197000000000635013f000000000035004b0000000003000019000018b003002041000018b00060009c000000000304c019000000000003004b000056820000c13d0000000001120019000000000001042d0000191201000041000000000010043f0000001101000039000000040010043f000018df01000041000061f000010430000000400100043d000019340010009c000056930000813d0000004002100039000000400020043f0000002002100039000018b803000041000000000032043500000001020000390000000000210435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000000000001004b0000569c0000613d000000000001042d000000400100043d000018c4030000410000000000310435000000040310003900000020040000390000000000430435000000003202043400000024041000390000000000240435000000000002004b000056b30000613d0000004404100039000000000500001900000000065400190000000007530019000000000707043300000000007604350000002005500039000000000025004b000056a90000413d000056b30000a13d000000000324001900000000000304350000001f02200039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f000010430000000400100043d000019340010009c000056c90000813d0000004002100039000000400020043f0000002002100039000018d503000041000000000032043500000003020000390000000000210435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f00001043000000000430204340000187d0330019700000000040404330000002004400210000018d904400197000000000343019f000000400420003900000000040404330000004004400210000018da04400197000000000343019f000000600420003900000000040404330000006004400210000018db04400197000000000343019f000000800220003900000000020204330000008002200210000000000223019f000000000021041b000000000001042d0000000043020434000018c503300197000000000501041a000018e905500197000000000335019f000000000031041b0000000003040433000018cb03300197000000400420003900000000040404330000008004400210000000000334019f0000000104100039000000000034041b000000800320003900000060022000390000000002020433000018cb0220019700000000030304330000008003300210000000000223019f0000000201100039000000000021041b000000000001042d0000000043020434000018cb0330019700000000040404330000008004400210000000000334019f000000000031041b00000040032000390000000003030433000018cb03300197000000600220003900000000020204330000008002200210000000000232019f0000000101100039000000000021041b000000000001042d000000000101041a000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000000001042d0000000043020434000018cb03300197000000000501041a000018cc05500197000000000335019f000000000031041b00000000030404330000000043030434000018cb0330019700000000040404330000008004400210000000000334019f0000000104100039000000000034041b000000400220003900000000020204330000000032020434000018cb0220019700000000030304330000008003300210000000000223019f0000000201100039000000000021041b000000000001042d0000000002010019000000400100043d000019320010009c000057630000813d0000008003100039000000400030043f000000000402041a000018b005400197000000010300008a000018b00050009c0000000005000019000000000503601900000080055002100000008006400270000000000556019f000000800000008b0000000005046019000018b107500197000018b200500198000018b3050000410000000005006019000000000575019f00000020071000390000000000570435000018b105400197000018b200400198000018b3040000410000000004006019000000000454019f00000000004104350000000102200039000000000202041a000018b200200198000018b3040000410000000004006019000018b105200197000000000454019f00000040051000390000000000450435000018b004200197000018b00040009c000000000300c01900000080033002100000008004200270000000000334019f000000800000008b000000000203c019000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f00000060031000390000000000230435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f0000000100200190000057760000613d000000000101043b000000000001042d0000000001000019000061f0000104300000000002010019000000400100043d000019350010009c000057860000813d0000002003100039000000400030043f000000000202041a000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000000210435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000018b30010009c000057950000613d0000000001100089000000000001042d0000191201000041000000000010043f0000001101000039000000040010043f000018df01000041000061f0000104300000000002020433000018cb02200197000000000301041a000018cc03300197000000000223019f000000000021041b000000000001042d0000000001000411000000000010043f0000006a01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f0000000100200190000057bd0000613d000000400300043d000019340030009c000057bf0000813d000000000101043b000000000101041a0000004002300039000000400020043f00000001020000390000000002230436000018b8040000410000000000420435000000ff00100190000057c50000613d000000000001042d0000000001000019000061f0000104300000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000303043300000024041000390000000000340435000000000003004b000057dc0000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b000057d20000413d000057dc0000a13d000000000243001900000000000204350000001f02300039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f000010430000000400100043d000019340010009c000057f20000813d0000004002100039000000400020043f00000020021000390000190c03000041000000000032043500000002020000390000000000210435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f0000104300000000074020434000018b105400197000018b200400198000018b304000041000000000400601900000000095401a00000000306000039000000020500003900000060041000390000585b0000613d000018bc0090009c000058640000213d000000000009004b000058640000613d0000000008070433000018b200800198000018b30a000041000000000a006019000000400b00043d000018b700b0009c00005a0a0000213d000018b108800197000000000c8a01a00000004008b00039000000400080043f000000000a6b0436000018c20800004100000000008a0435000000400800043d00005afd0000613d000018b0bac0012c000018b00bb0c099000018c0099000d1000018b0c990012c0000000009a9013f000018b00cc0c099000000000abc00d9000000ff09900212000000000ba9004900000000099b019f00000000090a601900000000000a004b000000000a09c019000018b70080009c00005a0a0000213d0000004009800039000000400090043f0000000009580436000018bd0b0000410000000000b90435000018b20ba0009a000018c300b0009c00005b1e0000a13d00000040081000390000000009080433000018b10b900197000018b200900198000018b30900004100000000090060190000000009b9019f000018b10ba00197000018b200a00198000018b30a000041000000000a006019000000000aba019f000018bc00a0009c000058490000213d000018b20ba0009a0000000000b9004b000000000c000019000018b00c004041000018b00bb00197000018b00d900197000000000ebd013f0000000000bd004b000000000b000019000018b00b002041000018b000e0009c000000000b0cc01900000000000b004b00005a100000c13d000018b000a0009c000058590000413d000018c10ba0009a0000000000b9004b000000000c000019000018b00c002041000018b00bb00197000018b00d900197000000000ebd013f0000000000bd004b000000000b000019000018b00b004041000018b000e0009c000000000b0cc01900000000000b004b00005a100000c13d0000000009a90049000058b80000013d0000000008070433000018b10a800197000018b200800198000018b30800004100000000080060190000000000a801a0000058640000c13d000018c00800004100000000008704350000000008070433000018b200800198000018b30a000041000000000a006019000000400b00043d0000193400b0009c00005a0a0000813d000018b108800197000000000c8a01a00000004008b00039000000400080043f000000000a6b0436000018c20800004100000000008a0435000000400800043d00005a6d0000613d000018b0bac0012c000018b00bb0c099000018c0099000d1000018b0c990012c0000000009a9013f000018b00cc0c099000000000abc00d9000000ff09900212000000000ba9004900000000099b019f00000000090a601900000000000a004b000000000a09c019000018b70080009c00005a0a0000213d0000004009800039000000400090043f0000000009580436000018bd0b0000410000000000b90435000018b20ba0009a000018c300b0009c00005a810000a13d000018b108a00197000018b200a00198000018b3090000410000000009006019000000000889019f0000000009040433000018b10a900197000018b200900198000018b30900004100000000090060190000000009a9019f000018bc0090009c000058a60000213d000018b10a9000990000000000a8004b000000000b000019000018b00b00a041000018b00aa00197000018b00c800197000000000dac013f0000000000ac004b000000000a000019000018b00a002041000018b000d0009c000000000a0bc01900000000000a004b00005a100000613d000018b00090009c000058b60000413d000018b30a9000990000000000a8004b000000000b000019000018b00b004041000018b00aa00197000018b00c800197000000000dac013f0000000000ac004b000000000a000019000018b00a002041000018b000d0009c000000000a0bc01900000000000a004b00005a100000c13d00000000098900190000000008040019000018b10a900197000018b200900198000018b30900004100000000090060190000000009a9019f00000000009804350000000008020433000018b109800197000018b200800198000018b3080000410000000008006019000000000b9801a000000000080000390000000108006039000018bc00b0009c0000000009000039000000010900203900000000008901a000000020081000390000000009010019000000000908c019000000000a070433000018b200a00198000018b30d000041000000000d006019000000400c00043d000018b700c0009c00005a0a0000213d000018b10aa00197000000000dad01a0000000000e0904330000004009c00039000000400090043f000000000a6c0436000018c20900004100000000009a0435000000400900043d00005a160000613d000018b10ae00197000018b200e00198000018b30c000041000000000c006019000000000aac019f000018c00aa000d1000018b0caa0012c000018b00cc0c099000018b0edd0012c000000000ada013f000018b00ee0c099000000000dec00d9000000ff0aa00212000000000cda0049000000000aac019f000000000a0d601900000000000d004b000000000d0ac019000018b70090009c00005a0a0000213d000000400a9000390000004000a0043f000000000c590436000018bd0a0000410000000000ac0435000000400a00043d000018b20ed0009a000018c300e0009c00005a370000a13d000018b200d00198000018b3090000410000000009006019000018b700a0009c00005a0a0000213d000018b10cd001970000000009c9019f000000000bb900a90000004009a00039000000400090043f00000000095a0436000018bd0c0000410000000000c90435000018be0cb0009a000018bf00c0009c00005a580000a13d000018b009000041000018c0a990012b000018b00aa0c099000018b0cbb0012c00000000099b013f000018b00cc0c099000000000aac00d9000000ff09900212000000000ba9004900000000099b019f00000000090a601900000000000a004b000000000a09c019000018b109300197000018b200300198000018b3030000410000000003006019000000000393019f000018b109a00197000018b200a00198000018b30a000041000000000a00601900000000099a019f000018bc0090009c000059320000213d000018b10a9000990000000000a3004b000000000b000019000018b00b002041000018b00aa00197000018b00c300197000000000dac013f0000000000ac004b000000000a000019000018b00a004041000018b000d0009c000000000a0bc01900000000000a004b00005a100000c13d000018b00090009c000059420000413d000018b30a9000990000000000a3004b000000000b000019000018b00b004041000018b00aa00197000018b00c300197000000000dac013f0000000000ac004b000000000a000019000018b00a002041000018b000d0009c000000000a0bc01900000000000a004b00005a100000c13d0000000003390019000018b109300197000018b200300198000018b3030000410000000003006019000000000a93019f0000000000a20435000018b200300198000018b3020000410000000002006019000000000392019f000018bc0030009c000059ab0000213d000000000003004b000059ab0000613d0000000004010433000018b102400197000018b200400198000018b3040000410000000004006019000000000824019f0000000000870435000018b200400198000018b3040000410000000004006019000000400700043d000018b70070009c00005a0a0000213d00000000082401a00000004002700039000000400020043f0000000004670436000018c2020000410000000000240435000000400200043d00005a960000613d000018b06480012c000018b00660c099000018c0033000d1000018b07330012c000000000343013f000018b00770c09900000000046700d9000000ff033002120000000006430049000000000336019f0000000003046019000000000004004b000000000403c019000018b70020009c00005a0a0000213d0000004003200039000000400030043f0000000003520436000018bd050000410000000000530435000018b20540009a000018c30050009c00005ae60000a13d000018b102400197000018b200400198000018b3030000410000000003006019000000000223019f00000040041000390000000001040433000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000018bc0010009c000059990000213d000018b103100099000000000032004b0000000005000019000018b005002041000018b003300197000018b006200197000000000736013f000000000036004b0000000003000019000018b003004041000018b00070009c000000000305c019000000000003004b00005a100000c13d000018b00010009c000059a90000413d000018b303100099000000000032004b0000000005000019000018b005004041000018b003300197000018b006200197000000000736013f000000000036004b0000000003000019000018b003002041000018b00070009c000000000305c019000000000003004b00005a100000c13d000000000121001900005a030000013d0000000002080433000018b101200197000018b200200198000018b3020000410000000002006019000000000812019f0000000000870435000018b200200198000018b3020000410000000002006019000000400700043d000018b70070009c00005a0a0000213d00000000081201a00000004001700039000000400010043f0000000002670436000018c2010000410000000000120435000000400100043d00005aac0000613d000018b06280012c000018b00660c099000018c0033000d1000018b07330012c000000000323013f000018b00770c09900000000026700d9000000ff033002120000000006230049000000000336019f0000000003026019000000000002004b000000000203c019000018b70010009c00005a0a0000213d0000004003100039000000400030043f0000000003510436000018bd050000410000000000530435000018b20520009a000018c30050009c00005ac40000a13d0000000001040433000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f000018bc0020009c000059f20000213d000018b20320009a000000000031004b0000000005000019000018b005004041000018b003300197000018b006100197000000000736013f000000000036004b0000000003000019000018b003002041000018b00070009c000000000305c019000000000003004b00005a100000c13d000018b00020009c00005a020000413d000018c10320009a000000000031004b0000000005000019000018b005002041000018b003300197000018b006100197000000000736013f000000000036004b0000000003000019000018b003004041000018b00070009c000000000305c019000000000003004b00005a100000c13d0000000001210049000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f0000000000140435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f0000104300000191201000041000000000010043f0000001101000039000000040010043f000018df01000041000061f000010430000018c4010000410000000000190435000000040190003900000020020000390000000000210435000000240290003900000000010c04330000000000120435000000000001004b00005a2c0000613d0000004402900039000000000300001900000000042300190000000005a30019000000000505043300000000005404350000002003300039000000000013004b00005a220000413d00005a2c0000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0090009c0000187d090080410000004002900210000000000121019f000061f000010430000018c40100004100000000001a04350000000401a00039000000200200003900000000002104350000002402a0003900000000010904330000000000120435000000000001004b00005a4d0000613d0000004402a00039000000000300001900000000042300190000000005c30019000000000505043300000000005404350000002003300039000000000013004b00005a430000413d00005a4d0000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d00a0009c0000187d0a0080410000004002a00210000000000121019f000061f000010430000000400100043d000018c402000041000000000021043500000004021000390000002003000039000000000032043500000000020a043300000024031000390000000000230435000000000002004b00005b350000613d0000004403100039000000000400001900000000053400190000000006940019000000000606043300000000006504350000002004400039000000000024004b00005a650000413d00005b320000013d000018c4010000410000000000180435000000040180003900000020020000390000000000210435000000240280003900000000010b04330000000000120435000000000001004b00005b130000613d0000004402800039000000000300001900000000042300190000000005a30019000000000505043300000000005404350000002003300039000000000013004b00005a790000413d00005b100000013d000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000208043300000024031000390000000000230435000000000002004b00005b350000613d0000004403100039000000000400001900000000053400190000000006940019000000000606043300000000006504350000002004400039000000000024004b00005a8e0000413d00005b320000013d000018c4010000410000000000120435000000040120003900000020030000390000000000310435000000240320003900000000010704330000000000130435000000000001004b00005adb0000613d0000004403200039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000015004b00005aa20000413d00005adb0000a13d000000000331001900005ada0000013d000018c4030000410000000000310435000000040310003900000020040000390000000000430435000000240410003900000000030704330000000000340435000000000003004b00005ac20000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00005ab80000413d00005ac20000a13d000000000243001900000000000204350000001f0230003900005b360000013d000000400200043d000018c4040000410000000000420435000000040420003900000020050000390000000000540435000000000101043300000024042000390000000000140435000000000001004b00005adb0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b00005ad10000413d00005adb0000a13d000000000341001900000000000304350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0020009c0000187d020080410000004002200210000000000121019f000061f000010430000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000202043300000024041000390000000000240435000000000002004b00005b350000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b00005af30000413d00005b350000a13d000000000342001900005b340000013d000018c4010000410000000000180435000000040180003900000020020000390000000000210435000000240280003900000000010b04330000000000120435000000000001004b00005b130000613d0000004402800039000000000300001900000000042300190000000005a30019000000000505043300000000005404350000002003300039000000000013004b00005b090000413d00005b130000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0080009c0000187d080080410000004002800210000000000121019f000061f000010430000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000208043300000024031000390000000000230435000000000002004b00005b350000613d0000004403100039000000000400001900000000053400190000000006940019000000000606043300000000006504350000002004400039000000000024004b00005b2b0000413d00005b350000a13d000000000332001900000000000304350000001f02200039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f0000104300000000004020433000018b105400197000018b200400198000018b3040000410000000004006019000000000554019f000018bc0050009c00005b610000213d000000000005004b00005b610000613d00000040041000390000000006040433000018b107600197000018b200600198000018b3060000410000000006006019000000000676019f000018b20750009a000018b008600197000018b009700197000000000a98013f000000000098004b0000000008000019000018b008002041000000000076004b0000000007000019000018b007004041000018b000a0009c000000000807c019000000000008004b00005c870000c13d000000000556004900005b890000013d00000060041000390000000006040433000018b107600197000018b200600198000018b3060000410000000006006019000000000676019f000018bc0060009c00005b780000213d000018b107600099000000000075004b0000000008000019000018b008002041000018b007700197000018b009500197000000000a79013f000000000079004b0000000007000019000018b007004041000018b000a0009c000000000708c019000000000007004b00005c870000c13d000018b00060009c00005b880000413d000018b307600099000000000075004b0000000008000019000018b008004041000018b007700197000018b009500197000000000a79013f000000000079004b0000000007000019000018b007002041000018b000a0009c000000000708c019000000000007004b00005c870000c13d0000000005560019000018b106500197000018b200500198000018b3050000410000000005006019000000000565019f00000000005404350000000005020433000018b104500197000018b200500198000018b307000041000000000700601900000000054701a000000000060000390000000106006039000018bc0050009c0000000005000039000000010500203900000000006501a000000020051000390000000006010019000000000605c0190000000006060433000018b200600198000018b3080000410000000008006019000018b200700198000018b3090000410000000009006019000000400700043d000019340070009c00005c8d0000813d000018b106600197000000000668019f000000000449019f00000000086400a90000004004700039000000400040043f00000002040000390000000006470436000018bd090000410000000000960435000018be0980009a000018bf0090009c00005c930000a13d000018b006000041000018c07660012b000018b00770c099000018b09880012c000000000668013f000018b00990c09900000000077900d9000000ff066002120000000008760049000000000668019f0000000006076019000000000007004b000000000706c019000018b106300197000018b200300198000018b3030000410000000003006019000000000363019f000018b106700197000018b200700198000018b3070000410000000007006019000000000667019f000018bc0060009c00005bdc0000213d000018b107600099000000000073004b0000000008000019000018b00800a041000018b007700197000018b009300197000000000a79013f000000000079004b0000000007000019000018b007002041000018b000a0009c000000000708c019000000000007004b00005c870000613d000018b00060009c00005bec0000413d000018b307600099000000000073004b0000000008000019000018b008004041000018b007700197000018b009300197000000000a79013f000000000079004b0000000007000019000018b007002041000018b000a0009c000000000708c019000000000007004b00005c870000c13d0000000003360019000018b106300197000018b200300198000018b303000041000000000300601900000000066301a000000000030000390000000103006039000018bc0060009c0000000007000039000000010700203900000000003701a000000000050160190000000003050433000018b200300198000018b3050000410000000005006019000000400700043d000018b70070009c00005c8d0000213d000018b10330019700000000083501a00000004003700039000000400030043f00000003030000390000000005370436000018c2030000410000000000350435000000400300043d00005ca80000613d000018b07580012c000018b00770c099000018c0066000d1000018b08660012c000000000656013f000018b00880c09900000000057800d9000000ff066002120000000007560049000000000667019f0000000006056019000000000005004b000000000506c019000018b70030009c00005c8d0000213d0000004006300039000000400060043f0000000004430436000018bd060000410000000000640435000018b20650009a000018c30060009c00005cc90000a13d000018b103500197000018b200500198000018b3040000410000000004006019000000000534019f0000000000520435000018b200400198000018b3020000410000000002006019000000000232019f000018bc0020009c00005c580000213d000000000002004b00005c580000613d00000040011000390000000003010433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000018bc0030009c00005c460000213d000018b104300099000000000042004b0000000005000019000018b005002041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b00005c870000c13d000018b00030009c00005c560000413d000018b304300099000000000042004b0000000005000019000018b005004041000018b004400197000018b006200197000000000746013f000000000046004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b00005c870000c13d000000000223001900005c800000013d00000060011000390000000003010433000018b104300197000018b200300198000018b3030000410000000003006019000000000343019f000000000002004b00005c6f0000c13d000018b20420009a000000000043004b0000000005000019000018b005004041000018b004400197000018b006300197000000000746013f000000000046004b0000000004000019000018b004002041000018b00070009c000000000405c019000000000004004b00005c870000c13d000018b00020009c00005c7f0000413d000018c10420009a000000000043004b0000000005000019000018b005002041000018b004400197000018b006300197000000000746013f000000000046004b0000000004000019000018b004004041000018b00070009c000000000405c019000000000004004b00005c870000c13d0000000002230049000018b103200197000018b200200198000018b3020000410000000002006019000000000232019f0000000000210435000000000001042d0000191201000041000000000010043f0000001101000039000000040010043f000018df01000041000061f0000104300000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000000400100043d000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000000207043300000024031000390000000000230435000000000002004b00005ce00000613d0000004403100039000000000400001900000000053400190000000007640019000000000707043300000000007504350000002004400039000000000024004b00005ca00000413d00005cdd0000013d000018c4010000410000000000130435000000040130003900000020020000390000000000210435000000240230003900000000010704330000000000120435000000000001004b00005cbe0000613d0000004402300039000000000400001900000000062400190000000007540019000000000707043300000000007604350000002004400039000000000014004b00005cb40000413d00005cbe0000a13d000000000221001900000000000204350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0030009c0000187d030080410000004002300210000000000121019f000061f000010430000000400100043d000018c4020000410000000000210435000000040210003900000020050000390000000000520435000000000203043300000024031000390000000000230435000000000002004b00005ce00000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00005cd60000413d00005ce00000a13d000000000332001900000000000304350000001f02200039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f000010430000000400100043d000019340010009c00005cf40000813d0000004002100039000000400020043f000000200210003900000000000204350000000000010435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000000400300043d000019340030009c00005d410000813d0000004004300039000000400040043f0000002004300039000000000004043500000000000304350000000003020433000018b102300197000018b200300198000018b304000041000000000400601900000000032401a000000000050000390000000105006039000018bc0030009c0000000003000039000000010300203900000000005301a0000000200110c0390000000001010433000018b200100198000018b3030000410000000003006019000018b200400198000018b3050000410000000005006019000000400400043d000018b70040009c00005d410000213d000018b101100197000000000313019f000000000125019f00000000051300a90000004001400039000000400010043f00000002010000390000000002140436000018bd010000410000000000120435000000400100043d000018be0650009a000018bf0060009c00005d470000a13d000018b70010009c00005d410000213d000018b002000041000018c04220012b000018b00440c099000018b06550012c000000000225013f000018b00660c0990000004005100039000000400050043f0000002005100039000000000035043500000000034600d9000000ff022002120000000004320049000000000224019f0000000002036019000000000003004b000000000302c019000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f0000000000210435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b00005d5d0000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b00005d530000413d00005d5d0000a13d000000000243001900000000000204350000001f02300039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f00001043000030000000000020000000006010019000000400100043d000019340010009c00005e2b0000813d0000004002100039000000400020043f0000002002100039000000000002043500000000000104350000006c01000039000000200010043f000000400700043d000018b90070009c00005e2b0000213d0000008001700039000000400010043f000018b401000041000000000101041a000018b002100197000000010300008a000018b00020009c0000000002000019000000000203601900000080022002100000008004100270000000000224019f000000800000008b0000000002016019000018b105100197000018b200100198000018b3010000410000000001006019000000000151019f0000000005170436000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000100000005001d0000000000150435000018ba01000041000000000101041a000018b002100197000018b00020009c000000000300c01900000080023002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040037000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000200000007001d00000060027000390000000000120435000300000006001d000000000060043f000018b501000041000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000005e310000613d000000400200043d000018bb0020009c0000000305000029000000020600002900005e2b0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00005e2b0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a00000000004060019000000010400c029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00005e2b0000213d000000000113019f000018b103400197000000000932019f00000000079100a90000004001600039000000400010043f00000002010000390000000004160436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c00005e330000a13d000018b70010009c00005e2b0000213d000018b004000041000018c06440012b000018b00660c099000018b08770012c000000000447013f000018b00880c0990000004007100039000000400070043f0000002007100039000000000097043500000000076800d9000000ff044002120000000006740049000000000446019f0000000004076019000000000007004b000000000704c019000018b104700197000018b200700198000018b3070000410000000007006019000000000647019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200700198000018b3010000410000000001006019000000000141019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d104000041000000000600001961ee61e40000040f000000010020019000005e310000613d000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f0000104300000000001000019000061f000010430000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b00005e490000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00005e3f0000413d00005e490000a13d000000000332001900000000000304350000001f02200039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f0000104300004000000000002000400000002001d000000400200043d000019340020009c00005f300000813d0000004003200039000000400030043f0000002003200039000000000003043500000000000204350000187d01100197000300000001001d000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000005f360000613d000000400700043d000018b90070009c00005f300000213d000000000101043b0000008002700039000000400020043f000000000201041a000018b003200197000000010400008a000018b00030009c0000000003000019000000000304601900000080033002100000008005200270000000000335019f000000800000008b0000000003026019000018b106200197000018b200200198000018b3020000410000000002006019000000000262019f0000000006270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f000100000006001d00000000002604350000000101100039000000000101041a000018b002100197000018b00020009c000000000400c01900000080024002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040037000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000200000007001d000000600270003900000000001204350000000301000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000005f360000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f000000010020019000005f360000613d000000400200043d000018bb0020009c000000020500002900005f300000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c00005f300000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b302000041000000000200601900000000031201a000000000040000390000000104006039000018bc0030009c0000000003000039000000010300203900000000004301a00000000004050019000000010400c029000018b200200198000018b30300004100000000030060190000000004040433000018b200400198000018b3020000410000000002006019000000400600043d000018b70060009c00005f300000213d000000000113019f000018b103400197000000000532019f00000000075100a90000004001600039000000400010043f00000002010000390000000004160436000018bd010000410000000000140435000000400100043d000018be0870009a000018bf0080009c00005f380000a13d000018b70010009c00005f300000213d000018b004000041000018c06440012b000018b00660c099000018b08770012c000000000447013f000018b00880c0990000004007100039000000400070043f0000002007100039000000000057043500000000056800d9000000ff044002120000000006540049000000000446019f0000000004056019000000000005004b000000000504c019000018b104500197000018b200500198000018b3050000410000000005006019000000000645019f0000000000610435000018b200200198000018b3010000410000000001006019000000000131019f000000400200043d00000020032000390000000000130435000018b200500198000018b3010000410000000001006019000000000141019f00000000001204350000187d0020009c0000187d02008041000000400120021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f000018b6011001c70000800d020000390000000303000039000018d1040000410000000405000029000000030600002961ee61e40000040f000000010020019000005f360000613d000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f0000104300000000001000019000061f000010430000018c4020000410000000000210435000000040210003900000020030000390000000000320435000000240310003900000000020604330000000000230435000000000002004b00005f4e0000613d0000004403100039000000000500001900000000063500190000000007450019000000000707043300000000007604350000002005500039000000000025004b00005f440000413d00005f4e0000a13d000000000332001900000000000304350000001f02200039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f000010430000000400100043d000019320010009c00005f660000813d0000008002100039000000400020043f0000006002100039000000000002043500000040021000390000000000020435000000200210003900000000000204350000000000010435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f0000104300004000000000002000400000002001d000000400200043d000019340020009c0000602b0000813d0000004003200039000000400030043f0000002003200039000000000003043500000000000204350000187d01100197000300000001001d000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f0000000100200190000060310000613d000000400700043d000018b90070009c0000602b0000213d000000000101043b0000008002700039000000400020043f000000000201041a000018b003200197000000010400008a000018b00030009c0000000003000019000000000304601900000080033002100000008005200270000000000335019f000000800000008b0000000003026019000018b106200197000018b200200198000018b3020000410000000002006019000000000262019f0000000006270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f000100000006001d00000000002604350000000101100039000000000101041a000018b002100197000018b00020009c000000000400c01900000080024002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040037000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000200000007001d000000600270003900000000001204350000000301000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f0000000100200190000060310000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f0000000100200190000060310000613d000000400200043d000018bb0020009c00000002050000290000602b0000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c0000602b0000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b304000041000000000400601900000000021401a000000000030000390000000103006039000018bc0020009c0000000002000039000000010200203900000000003201a00000000002050019000000010200c0290000000002020433000018b200200198000018b3030000410000000003006019000018b200400198000018b3050000410000000005006019000000400400043d000018b70040009c0000602b0000213d000018b102200197000000000323019f000000000115019f00000000053100a90000004001400039000000400010043f00000002010000390000000002140436000018bd010000410000000000120435000000400100043d000018be0650009a000018bf0060009c000060330000a13d000018b70010009c0000602b0000213d000018b002000041000018c04220012b000018b00440c099000018b06550012c000000000225013f000018b00660c0990000004005100039000000400050043f0000002005100039000000000035043500000000034600d9000000ff022002120000000004320049000000000224019f0000000002036019000000000003004b000000000302c019000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f0000000000210435000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f0000104300000000001000019000061f000010430000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000060490000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b0000603f0000413d000060490000a13d000000000243001900000000000204350000001f02300039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f0000104300004000000000002000400000002001d000000400200043d000019340020009c000061170000813d0000004003200039000000400030043f0000002003200039000000000003043500000000000204350000187d01100197000300000001001d000000000010043f0000006c01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f00000001002001900000611d0000613d000000400700043d000018b90070009c000061170000213d000000000101043b0000008002700039000000400020043f000000000201041a000018b003200197000000010400008a000018b00030009c0000000003000019000000000304601900000080033002100000008005200270000000000335019f000000800000008b0000000003026019000018b106200197000018b200200198000018b3020000410000000002006019000000000262019f0000000006270436000018b102300197000018b200300198000018b3030000410000000003006019000000000223019f000100000006001d00000000002604350000000101100039000000000101041a000018b002100197000018b00020009c000000000400c01900000080024002100000008003100270000000000223019f000000800000008b0000000002016019000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f00000040037000390000000000130435000018b101200197000018b200200198000018b3020000410000000002006019000000000112019f000200000007001d000000600270003900000000001204350000000301000029000000000010043f0000006d01000039000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f00000001002001900000611d0000613d000000000101043b0000000402000029000000000020043f000000200010043f00000000010004140000187d0010009c0000187d01008041000000c001100210000018b6011001c7000080100200003961ee61e90000040f00000001002001900000611d0000613d000000400200043d000018bb0020009c0000000205000029000061170000213d000000000101043b0000002003200039000000400030043f000000000101041a000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f0000000000120435000000400100043d000018b70010009c000061170000213d0000004003100039000000400030043f0000002003100039000000000003043500000000000104350000000002020433000018b101200197000018b200200198000018b304000041000000000400601900000000021401a000000000030000390000000103006039000018bc0020009c0000000002000039000000010200203900000000003201a00000000002050019000000010200c0290000000002020433000018b200200198000018b3030000410000000003006019000018b200400198000018b3050000410000000005006019000000400400043d000018b70040009c000061170000213d000018b102200197000000000323019f000000000115019f00000000053100a90000004001400039000000400010043f00000002010000390000000002140436000018bd010000410000000000120435000000400100043d000018be0650009a000018bf0060009c0000611f0000a13d000018b70010009c000061170000213d000018b002000041000018c04220012b000018b00440c099000018b06550012c000000000225013f000018b00660c0990000004005100039000000400050043f0000002005100039000000000035043500000000034600d9000000ff022002120000000004320049000000000224019f0000000002036019000000000003004b000000000302c019000018b102300197000018b200300198000018b3030000410000000003006019000000000423019f0000000000410435000018b200300198000018b3010000410000000001006019000000000121019f000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f0000104300000000001000019000061f000010430000018c4030000410000000000310435000000040310003900000020050000390000000000530435000000240510003900000000030404330000000000350435000000000003004b000061350000613d0000004404100039000000000500001900000000064500190000000007250019000000000707043300000000007604350000002005500039000000000035004b0000612b0000413d000061350000a13d000000000243001900000000000204350000001f02300039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f000010430000018b200200198000018b3030000410000000003006019000000400400043d000019340040009c000061730000813d000018b10220019700000000052301a00000004002400039000000400020043f00000003020000390000000003240436000018c2020000410000000000230435000000400200043d000061790000613d000018b103100197000018b200100198000018b3010000410000000001006019000000000131019f000018c0011000d1000018b03110012c000018b00330c099000018b05450012c000000000441013f000018b00550c09900000000015300d9000000ff034002120000000004130049000000000334019f0000000003016019000000000001004b000000000103c019000018b70020009c000061730000213d0000004003200039000000400030043f00000002030000390000000003320436000018bd040000410000000000430435000018b20410009a000018c30040009c0000619a0000a13d000018b102100197000018b200100198000018b3010000410000000001006019000000000121019f000000000001042d0000191201000041000000000010043f0000004101000039000000040010043f000018df01000041000061f000010430000018c4010000410000000000120435000000040120003900000020050000390000000000510435000000240520003900000000010404330000000000150435000000000001004b0000618f0000613d0000004404200039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000015004b000061850000413d0000618f0000a13d000000000341001900000000000304350000001f01100039000019300110019700000044011000390000187d0010009c0000187d0100804100000060011002100000187d0020009c0000187d020080410000004002200210000000000121019f000061f000010430000000400100043d000018c4040000410000000000410435000000040410003900000020050000390000000000540435000000000202043300000024041000390000000000240435000000000002004b000061b10000613d0000004404100039000000000500001900000000064500190000000007350019000000000707043300000000007604350000002005500039000000000025004b000061a70000413d000061b10000a13d000000000342001900000000000304350000001f02200039000019300220019700000044022000390000187d0020009c0000187d0200804100000060022002100000187d0010009c0000187d010080410000004001100210000000000112019f000061f000010430000000030020008c000061cc0000813d000000000002004b000061c40000613d000018c003000041000000020020008c000061ca0000613d00000040011000390000000001010433000018b102100197000018b200100198000018b3010000410000000001006019000000000321019f0000000001030019000000000001042d0000191201000041000000000010043f0000002101000039000000040010043f000018df01000041000061f000010430000000000001042f0000187d0010009c0000187d01008041000000600110021000000000020004140000187d0020009c0000187d02008041000000c002200210000000000112019f00001921011001c7000080100200003961ee61e90000040f0000000100200190000061e20000613d000000000101043b000000000001042d0000000001000019000061f000010430000061e7002104210000000102000039000000000001042d0000000002000019000000000001042d000061ec002104230000000102000039000000000001042d0000000002000019000000000001042d000061ee00000432000061ef0001042e000061f00001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000aed8e96600000000000000000000000000000000000000000000000000000000d98752eb00000000000000000000000000000000000000000000000000000000ec6271d100000000000000000000000000000000000000000000000000000000f2fde38a00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000f39eeb1000000000000000000000000000000000000000000000000000000000f8a42e5100000000000000000000000000000000000000000000000000000000ec6271d200000000000000000000000000000000000000000000000000000000ecd9cba800000000000000000000000000000000000000000000000000000000e334be3200000000000000000000000000000000000000000000000000000000e334be3300000000000000000000000000000000000000000000000000000000e343738c00000000000000000000000000000000000000000000000000000000d98752ec00000000000000000000000000000000000000000000000000000000e0b0621f00000000000000000000000000000000000000000000000000000000c55607b400000000000000000000000000000000000000000000000000000000c9fe9ac200000000000000000000000000000000000000000000000000000000c9fe9ac300000000000000000000000000000000000000000000000000000000d386c1e800000000000000000000000000000000000000000000000000000000c55607b500000000000000000000000000000000000000000000000000000000c7167cf500000000000000000000000000000000000000000000000000000000b8d80d8a00000000000000000000000000000000000000000000000000000000b8d80d8b00000000000000000000000000000000000000000000000000000000c362d19e00000000000000000000000000000000000000000000000000000000aed8e96700000000000000000000000000000000000000000000000000000000b1cb0f42000000000000000000000000000000000000000000000000000000004ac8d8c0000000000000000000000000000000000000000000000000000000008936f7cc000000000000000000000000000000000000000000000000000000008da5cb5a000000000000000000000000000000000000000000000000000000008da5cb5b0000000000000000000000000000000000000000000000000000000098de72fe00000000000000000000000000000000000000000000000000000000ad733b8e000000000000000000000000000000000000000000000000000000008936f7cd000000000000000000000000000000000000000000000000000000008a1d43c9000000000000000000000000000000000000000000000000000000007c1e1486000000000000000000000000000000000000000000000000000000007c1e148700000000000000000000000000000000000000000000000000000000871d0912000000000000000000000000000000000000000000000000000000004ac8d8c100000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000003d5cc9db000000000000000000000000000000000000000000000000000000004604d19a000000000000000000000000000000000000000000000000000000004604d19b0000000000000000000000000000000000000000000000000000000047428e7b000000000000000000000000000000000000000000000000000000003d5cc9dc0000000000000000000000000000000000000000000000000000000045be7ed600000000000000000000000000000000000000000000000000000000153ca6bf00000000000000000000000000000000000000000000000000000000153ca6c00000000000000000000000000000000000000000000000000000000030972b5000000000000000000000000000000000000000000000000000000000130ea373000000000000000000000000000000000000000000000000000000001459457a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffff0000000000000000000000000000000080000000000000000000000000000000ffffffffffffffffffffffffffffffff800000000000000000000000000000007febd347df14ea35c529e50fb2dd629d4a6226f5ccc893710fb466f8b83823fcda90043ba5b4096ba14704bc227ab0d3167da15b887e62ab2e76e37daa7113560200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f7febd347df14ea35c529e50fb2dd629d4a6226f5ccc893710fb466f8b83823fd000000000000000000000000000000000000000000000000ffffffffffffffdf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f46000000000000000000000000000000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000fffffffffffffffff21f494c589bfffffffffffffffffffff21f494c589c00000000000000000000000000000000000000000000000000000de0b6b3a7640000ffffffffffffffffffffffffffffffff8000000000000000000000000000000144425a0000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffff08c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000100000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000494c410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f494c5000000000000000000000000000000000000000000000000000000000004da7342ed266c6597ab266d863b65f2ae7910d2080ccf3ddd47438a529562da40000000000000000000000000000000000000000000000000000000080000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffff4250430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000003b9ac9ffb6ad4743e88e2c9f40d48e56287cc4f2c3013181bb128d12ca2114c48fe29266000000000000000000000000000000000000000000000000ffffffff000000000000000000000000000000000000000000000000ffffffff000000000000000000000000000000000000000000000000ffffffff0000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000008762d42200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff5deacbdf27bb6d74bbde9afdfc388454374cc280d184baf1d69924f3ddf688ad8f4f8ecc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000002da1c59b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c400000000000000000000000002000000000000000000000000000000000000200000000000000000000000003286b0394bf1350245290b7226c92ed186bd716f28938e62dbb895298f018172ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000064000001600000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5f00000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000800000000000000000000000494d0000000000000000000000000000000000000000000000000000000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000000000000000000640000012000000000000000000000000000000000000000000000000000000020000000800000000000000000a2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c22097753000000000000000000000000000000007fffffffffffffffffffffff80000000000000000000000000000000000000000000000225c17d04dad2965cc5a02a24fffffffffffffffffffffffffffffffffffffffbb47d05f64a5ad34674bfabb9000000000000000000000000000000007ffffffffffffffffffffffffffffe000000000000000000000000000000000080000000000000000de0b6b3a76400010000000000000000000000000000000100000000000000000000000000000000fffffffffffffffffffffffffffffffdfffffffffffffffffffffffffffffffe00000000000000000000000000000000ffffffffffffffffffffffffffffff8053657175656e63657247617465643a2063616c6c6572206973206e6f742074686520656e64706f696e740000000000000000000000000000000000000000000049544900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093a800000000000000000000000000000000000000000000000000000000001e13380000000000000000000000000000000007ffffffffffffffff21f494c589bfffffffffffffffffffffffffffffffffffffffffffffffffffff21f494c589c0000000000000000000000000000000000007ffffffffffffffffffffffffffffffe0000000000000000000000000000000040000000000000000000000000000000ffffffffffffffffffffffffffffffff80000000000000000de0b6b3a764000000000000000000000000000000000000a0000000000000000000000000000000fffffffffffffffffffffffffffffffebffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000b1a2bc2ec50000002000000000000000000000000000000000000a00000000000000000000000006ac06550b1d7756afb13ae15bdb7f009838eeb491868f6cea5664968b8ed71fd00000000000000000000000000000000000000640000014000000000000000001d029b4d000000000000000000000000000000000000000000000000000000004950000000000000000000000000000000000000000000000000000000000000535448000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064000000c00000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f0000000000000000000000000000000000000000000000001bc16d674ec800004e487b710000000000000000000000000000000000000000000000000000000064732d6d6174682d737172742d6e6f6e2d706f73697469766500000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006400000080000000000000000002000000000000000000000000000000000000000000008000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e000000000000000000000000000000000000000000000008000000000000000004d5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000004453594e43000000000000000000000000000000000000000000000000000000647920696e697469616c697a6564000000000000000000000000000000000000496e697469616c697a61626c653a20636f6e747261637420697320616c726561000000000000000000000000000000000000008400000000000000000000000002000000000000000000000000000000000000000000000000000000000000006e697469616c697a696e67000000000000000000000000000000000000000000496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420697f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000008e1bc9bf040000000000000000000000000000000000000000000000000000002386f26fc10000c8cc8bda7ad4886bea3ebbdafa02e79d37c39bf4011696b26a31a0802fd9458bc8cc8bda7ad4886bea3ebbdafa02e79d37c39bf4011696b26a31a0802fd9458cc8cc8bda7ad4886bea3ebbdafa02e79d37c39bf4011696b26a31a0802fd9458dc11dc3860403ba02263f4a190a69cab05b0ed2b0adae8555367d909fc65d3537ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff80fffffffffffffffffffffffffffffffffffffffbb47d05f64a5ad34674bfabb8000000000000000000000000000000000000000000000000ffffffffffffffc0000000000000000000000000000000000000000000000000ffffffffffffffe0bc2fb589374d1b4cadf215d78085f33f813c7f68e46274cef9d9a43732371de0
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.