Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 173 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Redeem Zc Token | 16662364 | 1100 days ago | IN | 0 ETH | 0.00438381 | ||||
| Redeem Zc Token | 16474952 | 1126 days ago | IN | 0 ETH | 0.00378407 | ||||
| Redeem Vault Int... | 16267864 | 1155 days ago | IN | 0 ETH | 0.00203758 | ||||
| Redeem Zc Token | 16267863 | 1155 days ago | IN | 0 ETH | 0.00238207 | ||||
| Redeem Vault Int... | 16267841 | 1155 days ago | IN | 0 ETH | 0.00232173 | ||||
| Redeem Zc Token | 16267840 | 1155 days ago | IN | 0 ETH | 0.00237702 | ||||
| Redeem Vault Int... | 16267820 | 1155 days ago | IN | 0 ETH | 0.00255702 | ||||
| Redeem Zc Token | 16217930 | 1162 days ago | IN | 0 ETH | 0.00279314 | ||||
| Redeem Zc Token | 16217925 | 1162 days ago | IN | 0 ETH | 0.00242672 | ||||
| Redeem Vault Int... | 16096435 | 1179 days ago | IN | 0 ETH | 0.00230973 | ||||
| Redeem Vault Int... | 16088899 | 1180 days ago | IN | 0 ETH | 0.00221331 | ||||
| Redeem Zc Token | 16088898 | 1180 days ago | IN | 0 ETH | 0.00228372 | ||||
| Redeem Vault Int... | 16088896 | 1180 days ago | IN | 0 ETH | 0.00253667 | ||||
| Redeem Vault Int... | 16088894 | 1180 days ago | IN | 0 ETH | 0.00224738 | ||||
| Redeem Zc Token | 16088893 | 1180 days ago | IN | 0 ETH | 0.00250001 | ||||
| Redeem Vault Int... | 15850889 | 1213 days ago | IN | 0 ETH | 0.00134734 | ||||
| Redeem Vault Int... | 15850858 | 1213 days ago | IN | 0 ETH | 0.00134734 | ||||
| Redeem Zc Token | 15850858 | 1213 days ago | IN | 0 ETH | 0.00113388 | ||||
| Redeem Vault Int... | 15836756 | 1215 days ago | IN | 0 ETH | 0.00153982 | ||||
| Redeem Vault Int... | 15817188 | 1218 days ago | IN | 0 ETH | 0.00210017 | ||||
| Redeem Vault Int... | 15817082 | 1218 days ago | IN | 0 ETH | 0.00218064 | ||||
| Redeem Zc Token | 15817081 | 1218 days ago | IN | 0 ETH | 0.00200319 | ||||
| Redeem Zc Token | 15816908 | 1218 days ago | IN | 0 ETH | 0.00232175 | ||||
| Redeem Zc Token | 15816905 | 1218 days ago | IN | 0 ETH | 0.00192859 | ||||
| Redeem Zc Token | 15816900 | 1218 days ago | IN | 0 ETH | 0.0019671 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Swivel
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity >= 0.8.4;
import './Interfaces.sol';
import './Hash.sol';
import './Sig.sol';
import './Safe.sol';
contract Swivel {
/// @dev maps the key of an order to a boolean indicating if an order was cancelled
mapping (bytes32 => bool) public cancelled;
/// @dev maps the key of an order to an amount representing its taken volume
mapping (bytes32 => uint256) public filled;
/// @dev maps a token address to a point in time, a hold, after which a withdrawal can be made
mapping (address => uint256) public withdrawals;
string constant public NAME = 'Swivel Finance';
string constant public VERSION = '2.0.0';
uint256 constant public HOLD = 3 days;
bytes32 public immutable domain;
address public immutable marketPlace;
address public admin;
uint16 constant public MIN_FEENOMINATOR = 33;
/// @dev holds the fee demoninators for [zcTokenInitiate, zcTokenExit, vaultInitiate, vaultExit]
uint16[4] public feenominators;
/// @notice Emitted on order cancellation
event Cancel (bytes32 indexed key, bytes32 hash);
/// @notice Emitted on any initiate*
/// @dev filled is 'principalFilled' when (vault:false, exit:false) && (vault:true, exit:true)
/// @dev filled is 'premiumFilled' when (vault:true, exit:false) && (vault:false, exit:true)
event Initiate(bytes32 indexed key, bytes32 hash, address indexed maker, bool vault, bool exit, address indexed sender, uint256 amount, uint256 filled);
/// @notice Emitted on any exit*
/// @dev filled is 'principalFilled' when (vault:false, exit:false) && (vault:true, exit:true)
/// @dev filled is 'premiumFilled' when (vault:true, exit:false) && (vault:false, exit:true)
event Exit(bytes32 indexed key, bytes32 hash, address indexed maker, bool vault, bool exit, address indexed sender, uint256 amount, uint256 filled);
/// @notice Emitted on token withdrawal scheduling
event ScheduleWithdrawal(address indexed token, uint256 hold);
/// @notice Emitted on token withdrawal blocking
event BlockWithdrawal(address indexed token);
/// @notice Emitted on a change to the feenominators array
event SetFee(uint256 indexed index, uint256 indexed feenominator);
/// @param m deployed MarketPlace contract address
/// @param v deployed contract address used as verifier
constructor(address m, address v) {
admin = msg.sender;
domain = Hash.domain(NAME, VERSION, block.chainid, v);
marketPlace = m;
feenominators = [200, 600, 400, 200];
}
// ********* INITIATING *************
/// @notice Allows a user to initiate a position
/// @param o Array of offline Swivel.Orders
/// @param a Array of order volume (principal) amounts relative to passed orders
/// @param c Array of Components from valid ECDSA signatures
function initiate(Hash.Order[] calldata o, uint256[] calldata a, Sig.Components[] calldata c) external returns (bool) {
uint256 len = o.length;
// for each order filled, routes the order to the right interaction depending on its params
for (uint256 i; i < len; i++) {
Hash.Order memory order = o[i];
if (!order.exit) {
if (!order.vault) {
initiateVaultFillingZcTokenInitiate(o[i], a[i], c[i]);
} else {
initiateZcTokenFillingVaultInitiate(o[i], a[i], c[i]);
}
} else {
if (!order.vault) {
initiateZcTokenFillingZcTokenExit(o[i], a[i], c[i]);
} else {
initiateVaultFillingVaultExit(o[i], a[i], c[i]);
}
}
}
return true;
}
/// @notice Allows a user to initiate a Vault by filling an offline zcToken initiate order
/// @dev This method should pass (underlying, maturity, maker, sender, principalFilled) to MarketPlace.custodialInitiate
/// @param o Order being filled
/// @param a Amount of volume (premium) being filled by the taker's initiate
/// @param c Components of a valid ECDSA signature
function initiateVaultFillingZcTokenInitiate(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
// checks order signature, order cancellation and order expiry
bytes32 hash = validOrderHash(o, c);
// checks the side, and the amount compared to available
require((a + filled[hash]) <= o.premium, 'taker amount > available volume');
filled[hash] += a;
// transfer underlying tokens
Erc20 uToken = Erc20(o.underlying);
Safe.transferFrom(uToken, msg.sender, o.maker, a);
uint256 principalFilled = (a * o.principal) / o.premium;
Safe.transferFrom(uToken, o.maker, address(this), principalFilled);
MarketPlace mPlace = MarketPlace(marketPlace);
// mint tokens
require(CErc20(mPlace.cTokenAddress(o.underlying, o.maturity)).mint(principalFilled) == 0, 'minting CToken failed');
// alert marketplace
require(mPlace.custodialInitiate(o.underlying, o.maturity, o.maker, msg.sender, principalFilled), 'custodial initiate failed');
// transfer fee in vault notional to swivel (from msg.sender)
uint256 fee = principalFilled / feenominators[2];
require(mPlace.transferVaultNotionalFee(o.underlying, o.maturity, msg.sender, fee), 'notional fee transfer failed');
emit Initiate(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, principalFilled);
}
/// @notice Allows a user to initiate a zcToken by filling an offline vault initiate order
/// @dev This method should pass (underlying, maturity, sender, maker, a) to MarketPlace.custodialInitiate
/// @param o Order being filled
/// @param a Amount of volume (principal) being filled by the taker's initiate
/// @param c Components of a valid ECDSA signature
function initiateZcTokenFillingVaultInitiate(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
bytes32 hash = validOrderHash(o, c);
require((a + filled[hash]) <= o.principal, 'taker amount > available volume');
filled[hash] += a;
Erc20 uToken = Erc20(o.underlying);
uint256 premiumFilled = (a * o.premium) / o.principal;
Safe.transferFrom(uToken, o.maker, msg.sender, premiumFilled);
// transfer principal + fee in underlying to swivel (from sender)
uint256 fee = premiumFilled / feenominators[0];
Safe.transferFrom(uToken, msg.sender, address(this), (a + fee));
MarketPlace mPlace = MarketPlace(marketPlace);
// mint tokens
require(CErc20(mPlace.cTokenAddress(o.underlying, o.maturity)).mint(a) == 0, 'minting CToken Failed');
// alert marketplace
require(mPlace.custodialInitiate(o.underlying, o.maturity, msg.sender, o.maker, a), 'custodial initiate failed');
emit Initiate(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, premiumFilled);
}
/// @notice Allows a user to initiate zcToken? by filling an offline zcToken exit order
/// @dev This method should pass (underlying, maturity, maker, sender, a) to MarketPlace.p2pZcTokenExchange
/// @param o Order being filled
/// @param a Amount of volume (principal) being filled by the taker's initiate
/// @param c Components of a valid ECDSA signature
function initiateZcTokenFillingZcTokenExit(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
bytes32 hash = validOrderHash(o, c);
require((a + filled[hash]) <= o.principal, 'taker amount > available volume');
filled[hash] += a;
uint256 premiumFilled = (a * o.premium) / o.principal;
Erc20 uToken = Erc20(o.underlying);
// transfer underlying tokens, then take fee
Safe.transferFrom(uToken, msg.sender, o.maker, a - premiumFilled);
uint256 fee = premiumFilled / feenominators[0];
Safe.transferFrom(uToken, msg.sender, address(this), fee);
// alert marketplace
require(MarketPlace(marketPlace).p2pZcTokenExchange(o.underlying, o.maturity, o.maker, msg.sender, a), 'zcToken exchange failed');
emit Initiate(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, premiumFilled);
}
/// @notice Allows a user to initiate a Vault by filling an offline vault exit order
/// @dev This method should pass (underlying, maturity, maker, sender, principalFilled) to MarketPlace.p2pVaultExchange
/// @param o Order being filled
/// @param a Amount of volume (interest) being filled by the taker's exit
/// @param c Components of a valid ECDSA signature
function initiateVaultFillingVaultExit(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
bytes32 hash = validOrderHash(o, c);
require((a + filled[hash]) <= o.premium, 'taker amount > available volume');
filled[hash] += a;
Safe.transferFrom(Erc20(o.underlying), msg.sender, o.maker, a);
MarketPlace mPlace = MarketPlace(marketPlace);
uint256 principalFilled = (a * o.principal) / o.premium;
// alert marketplace
require(mPlace.p2pVaultExchange(o.underlying, o.maturity, o.maker, msg.sender, principalFilled), 'vault exchange failed');
// transfer fee (in vault notional) to swivel
uint256 fee = principalFilled / feenominators[2];
require(mPlace.transferVaultNotionalFee(o.underlying, o.maturity, msg.sender, fee), "notional fee transfer failed");
emit Initiate(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, principalFilled);
}
// ********* EXITING ***************
/// @notice Allows a user to exit (sell) a currently held position to the marketplace.
/// @param o Array of offline Swivel.Orders
/// @param a Array of order volume (principal) amounts relative to passed orders
/// @param c Components of a valid ECDSA signature
function exit(Hash.Order[] calldata o, uint256[] calldata a, Sig.Components[] calldata c) external returns (bool) {
uint256 len = o.length;
// for each order filled, routes the order to the right interaction depending on its params
for (uint256 i; i < len; i++) {
Hash.Order memory order = o[i];
// if the order being filled is not an exit
if (!order.exit) {
// if the order being filled is a vault initiate or a zcToken initiate
if (!order.vault) {
// if filling a zcToken initiate with an exit, one is exiting zcTokens
exitZcTokenFillingZcTokenInitiate(o[i], a[i], c[i]);
} else {
// if filling a vault initiate with an exit, one is exiting vault notional
exitVaultFillingVaultInitiate(o[i], a[i], c[i]);
}
} else {
// if the order being filled is a vault exit or a zcToken exit
if (!order.vault) {
// if filling a zcToken exit with an exit, one is exiting vault
exitVaultFillingZcTokenExit(o[i], a[i], c[i]);
} else {
// if filling a vault exit with an exit, one is exiting zcTokens
exitZcTokenFillingVaultExit(o[i], a[i], c[i]);
}
}
}
return true;
}
/// @notice Allows a user to exit their zcTokens by filling an offline zcToken initiate order
/// @dev This method should pass (underlying, maturity, sender, maker, principalFilled) to MarketPlace.p2pZcTokenExchange
/// @param o Order being filled
/// @param a Amount of volume (interest) being filled by the taker's exit
/// @param c Components of a valid ECDSA signature
function exitZcTokenFillingZcTokenInitiate(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
bytes32 hash = validOrderHash(o, c);
require((a + filled[hash]) <= o.premium, 'taker amount > available volume');
filled[hash] += a;
Erc20 uToken = Erc20(o.underlying);
uint256 principalFilled = (a * o.principal) / o.premium;
// transfer underlying from initiating party to exiting party, minus the price the exit party pays for the exit (premium), and the fee.
Safe.transferFrom(uToken, o.maker, msg.sender, principalFilled - a);
// transfer fee in underlying to swivel
uint256 fee = principalFilled / feenominators[1];
Safe.transferFrom(uToken, msg.sender, address(this), fee);
// alert marketplace
require(MarketPlace(marketPlace).p2pZcTokenExchange(o.underlying, o.maturity, msg.sender, o.maker, principalFilled), 'zcToken exchange failed');
emit Exit(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, principalFilled);
}
/// @notice Allows a user to exit their Vault by filling an offline vault initiate order
/// @dev This method should pass (underlying, maturity, sender, maker, a) to MarketPlace.p2pVaultExchange
/// @param o Order being filled
/// @param a Amount of volume (principal) being filled by the taker's exit
/// @param c Components of a valid ECDSA signature
function exitVaultFillingVaultInitiate(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
bytes32 hash = validOrderHash(o, c);
require((a + filled[hash]) <= o.principal, 'taker amount > available volume');
filled[hash] += a;
Erc20 uToken = Erc20(o.underlying);
// transfer premium from maker to sender
uint256 premiumFilled = (a * o.premium) / o.principal;
Safe.transferFrom(uToken, o.maker, msg.sender, premiumFilled);
uint256 fee = premiumFilled / feenominators[3];
// transfer fee in underlying to swivel from sender
Safe.transferFrom(uToken, msg.sender, address(this), fee);
// transfer <a> notional from sender to maker
require(MarketPlace(marketPlace).p2pVaultExchange(o.underlying, o.maturity, msg.sender, o.maker, a), 'vault exchange failed');
emit Exit(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, premiumFilled);
}
/// @notice Allows a user to exit their Vault filling an offline zcToken exit order
/// @dev This method should pass (underlying, maturity, maker, sender, a) to MarketPlace.exitFillingExit
/// @param o Order being filled
/// @param a Amount of volume (principal) being filled by the taker's exit
/// @param c Components of a valid ECDSA signature
function exitVaultFillingZcTokenExit(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
bytes32 hash = validOrderHash(o, c);
require((a + filled[hash]) <= o.principal, 'taker amount > available volume');
filled[hash] += a;
// redeem underlying on Compound and burn cTokens
MarketPlace mPlace = MarketPlace(marketPlace);
address cTokenAddr = mPlace.cTokenAddress(o.underlying, o.maturity);
require((CErc20(cTokenAddr).redeemUnderlying(a) == 0), "compound redemption error");
Erc20 uToken = Erc20(o.underlying);
// transfer principal-premium back to fixed exit party now that the interest coupon and zcb have been redeemed
uint256 premiumFilled = (a * o.premium) / o.principal;
Safe.transfer(uToken, o.maker, a - premiumFilled);
// transfer premium-fee to floating exit party
uint256 fee = premiumFilled / feenominators[3];
Safe.transfer(uToken, msg.sender, premiumFilled - fee);
// burn zcTokens + nTokens from o.maker and msg.sender respectively
require(mPlace.custodialExit(o.underlying, o.maturity, o.maker, msg.sender, a), 'custodial exit failed');
emit Exit(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, premiumFilled);
}
/// @notice Allows a user to exit their zcTokens by filling an offline vault exit order
/// @dev This method should pass (underlying, maturity, sender, maker, principalFilled) to MarketPlace.exitFillingExit
/// @param o Order being filled
/// @param a Amount of volume (interest) being filled by the taker's exit
/// @param c Components of a valid ECDSA signature
function exitZcTokenFillingVaultExit(Hash.Order calldata o, uint256 a, Sig.Components calldata c) internal {
bytes32 hash = validOrderHash(o, c);
require((a + filled[hash]) <= o.premium, 'taker amount > available volume');
filled[hash] += a;
// redeem underlying on Compound and burn cTokens
MarketPlace mPlace = MarketPlace(marketPlace);
address cTokenAddr = mPlace.cTokenAddress(o.underlying, o.maturity);
uint256 principalFilled = (a * o.principal) / o.premium;
require((CErc20(cTokenAddr).redeemUnderlying(principalFilled) == 0), "compound redemption error");
Erc20 uToken = Erc20(o.underlying);
// transfer principal-premium-fee back to fixed exit party now that the interest coupon and zcb have been redeemed
uint256 fee = principalFilled / feenominators[1];
Safe.transfer(uToken, msg.sender, principalFilled - a - fee);
Safe.transfer(uToken, o.maker, a);
// burn <principalFilled> zcTokens + nTokens from msg.sender and o.maker respectively
require(mPlace.custodialExit(o.underlying, o.maturity, msg.sender, o.maker, principalFilled), 'custodial exit failed');
emit Exit(o.key, hash, o.maker, o.vault, o.exit, msg.sender, a, principalFilled);
}
/// @notice Allows a user to cancel an order, preventing it from being filled in the future
/// @param o Order being cancelled
/// @param c Components of a valid ECDSA signature
function cancel(Hash.Order calldata o, Sig.Components calldata c) external returns (bool) {
bytes32 hash = validOrderHash(o, c);
require(msg.sender == o.maker, 'sender must be maker');
cancelled[hash] = true;
emit Cancel(o.key, hash);
return true;
}
// ********* ADMINISTRATIVE ***************
/// @param a Address of a new admin
function transferAdmin(address a) external authorized(admin) returns (bool) {
admin = a;
return true;
}
/// @notice Allows the admin to schedule the withdrawal of tokens
/// @param e Address of (erc20) token to withdraw
function scheduleWithdrawal(address e) external authorized(admin) returns (bool) {
uint256 when = block.timestamp + HOLD;
withdrawals[e] = when;
emit ScheduleWithdrawal(e, when);
return true;
}
/// @notice Emergency function to block unplanned withdrawals
/// @param e Address of token withdrawal to block
function blockWithdrawal(address e) external authorized(admin) returns (bool) {
withdrawals[e] = 0;
emit BlockWithdrawal(e);
return true;
}
/// @notice Allows the admin to withdraw the given token, provided the holding period has been observed
/// @param e Address of token to withdraw
function withdraw(address e) external authorized(admin) returns (bool) {
uint256 when = withdrawals[e];
require (when != 0, 'no withdrawal scheduled');
require (block.timestamp >= when, 'withdrawal still on hold');
withdrawals[e] = 0;
Erc20 token = Erc20(e);
Safe.transfer(token, admin, token.balanceOf(address(this)));
return true;
}
/// @notice Allows the admin to set a new fee denominator
/// @param i The index of the new fee denominator
/// @param d The new fee denominator
function setFee(uint16 i, uint16 d) external authorized(admin) returns (bool) {
require(d >= MIN_FEENOMINATOR, 'fee too high');
feenominators[i] = d;
emit SetFee(i, d);
return true;
}
/// @notice Allows the admin to bulk approve given compound addresses at the underlying token, saving marginal approvals
/// @param u array of underlying token addresses
/// @param c array of compound token addresses
function approveUnderlying(address[] calldata u, address[] calldata c) external authorized(admin) returns (bool) {
uint256 len = u.length;
require (len == c.length, 'array length mismatch');
uint256 max = 2**256 - 1;
for (uint256 i; i < len; i++) {
Erc20 uToken = Erc20(u[i]);
Safe.approve(uToken, c[i], max);
}
return true;
}
// ********* PROTOCOL UTILITY ***************
/// @notice Allows users to deposit underlying and in the process split it into/mint
/// zcTokens and vault notional. Calls mPlace.mintZcTokenAddingNotional
/// @param u Underlying token address associated with the market
/// @param m Maturity timestamp of the market
/// @param a Amount of underlying being deposited
function splitUnderlying(address u, uint256 m, uint256 a) external returns (bool) {
Erc20 uToken = Erc20(u);
Safe.transferFrom(uToken, msg.sender, address(this), a);
MarketPlace mPlace = MarketPlace(marketPlace);
require(CErc20(mPlace.cTokenAddress(u, m)).mint(a) == 0, 'minting CToken Failed');
require(mPlace.mintZcTokenAddingNotional(u, m, msg.sender, a), 'mint ZcToken adding Notional failed');
return true;
}
/// @notice Allows users deposit/burn 1-1 amounts of both zcTokens and vault notional,
/// in the process "combining" the two, and redeeming underlying. Calls mPlace.burnZcTokenRemovingNotional.
/// @param u Underlying token address associated with the market
/// @param m Maturity timestamp of the market
/// @param a Amount of zcTokens being redeemed
function combineTokens(address u, uint256 m, uint256 a) external returns (bool) {
MarketPlace mPlace = MarketPlace(marketPlace);
require(mPlace.burnZcTokenRemovingNotional(u, m, msg.sender, a), 'burn ZcToken removing Notional failed');
address cTokenAddr = mPlace.cTokenAddress(u, m);
require((CErc20(cTokenAddr).redeemUnderlying(a) == 0), "compound redemption error");
Safe.transfer(Erc20(u), msg.sender, a);
return true;
}
/// @notice Allows zcToken holders to redeem their tokens for underlying tokens after maturity has been reached (via MarketPlace).
/// @param u Underlying token address associated with the market
/// @param m Maturity timestamp of the market
/// @param a Amount of zcTokens being redeemed
function redeemZcToken(address u, uint256 m, uint256 a) external returns (bool) {
MarketPlace mPlace = MarketPlace(marketPlace);
// call marketplace to determine the amount redeemed
uint256 redeemed = mPlace.redeemZcToken(u, m, msg.sender, a);
// redeem underlying from compound
require(CErc20(mPlace.cTokenAddress(u, m)).redeemUnderlying(redeemed) == 0, 'compound redemption failed');
// transfer underlying back to msg.sender
Safe.transfer(Erc20(u), msg.sender, redeemed);
return true;
}
/// @notice Allows Vault owners to redeem any currently accrued interest (via MarketPlace)
/// @param u Underlying token address associated with the market
/// @param m Maturity timestamp of the market
function redeemVaultInterest(address u, uint256 m) external returns (bool) {
MarketPlace mPlace = MarketPlace(marketPlace);
// call marketplace to determine the amount redeemed
uint256 redeemed = mPlace.redeemVaultInterest(u, m, msg.sender);
// redeem underlying from compound
require(CErc20(mPlace.cTokenAddress(u, m)).redeemUnderlying(redeemed) == 0, 'compound redemption failed');
// transfer underlying back to msg.sender
Safe.transfer(Erc20(u), msg.sender, redeemed);
return true;
}
/// @notice Allows Swivel to redeem any currently accrued interest (via MarketPlace)
/// @param u Underlying token address associated with the market
/// @param m Maturity timestamp of the market
function redeemSwivelVaultInterest(address u, uint256 m) external returns (bool) {
MarketPlace mPlace = MarketPlace(marketPlace);
// call marketplace to determine the amount redeemed
uint256 redeemed = mPlace.redeemVaultInterest(u, m, address(this));
// redeem underlying from compound
require(CErc20(mPlace.cTokenAddress(u, m)).redeemUnderlying(redeemed) == 0, 'compound redemption failed');
// NOTE: for swivel redeem there is no transfer out as there is in redeemVaultInterest
return true;
}
/// @notice Varifies the validity of an order and it's signature.
/// @param o An offline Swivel.Order
/// @param c Components of a valid ECDSA signature
/// @return the hashed order.
function validOrderHash(Hash.Order calldata o, Sig.Components calldata c) internal view returns (bytes32) {
bytes32 hash = Hash.order(o);
require(!cancelled[hash], 'order cancelled');
require(o.expiry >= block.timestamp, 'order expired');
require(o.maker == Sig.recover(Hash.message(domain, hash), c), 'invalid signature');
return hash;
}
modifier authorized(address a) {
require(msg.sender == a, 'sender must be authorized');
_;
}
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity >= 0.8.4;
/**
@notice Encapsulation of the logic to produce EIP712 hashed domain and messages.
Also to produce / verify hashed and signed Orders.
See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md
See/attribute https://github.com/0xProject/0x-monorepo/blob/development/contracts/utils/contracts/src/LibEIP712.sol
*/
library Hash {
/// @dev struct represents the attributes of an offchain Swivel.Order
struct Order {
bytes32 key;
address maker;
address underlying;
bool vault;
bool exit;
uint256 principal;
uint256 premium;
uint256 maturity;
uint256 expiry;
}
// EIP712 Domain Separator typeHash
// keccak256(abi.encodePacked(
// 'EIP712Domain(',
// 'string name,',
// 'string version,',
// 'uint256 chainId,',
// 'address verifyingContract',
// ')'
// ));
bytes32 constant internal DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;
// EIP712 typeHash of an Order
// keccak256(abi.encodePacked(
// 'Order(',
// 'bytes32 key,',
// 'address maker,',
// 'address underlying,',
// 'bool vault,',
// 'bool exit,',
// 'uint256 principal,',
// 'uint256 premium,',
// 'uint256 maturity,',
// 'uint256 expiry',
// ')'
// ));
bytes32 constant internal ORDER_TYPEHASH = 0x7ddd38ab5ed1c16b61ca90eeb9579e29da1ba821cf42d8cdef8f30a31a6a4146;
/// @param n EIP712 domain name
/// @param version EIP712 semantic version string
/// @param i Chain ID
/// @param verifier address of the verifying contract
function domain(string memory n, string memory version, uint256 i, address verifier) internal pure returns (bytes32) {
bytes32 hash;
assembly {
let nameHash := keccak256(add(n, 32), mload(n))
let versionHash := keccak256(add(version, 32), mload(version))
let pointer := mload(64)
mstore(pointer, DOMAIN_TYPEHASH)
mstore(add(pointer, 32), nameHash)
mstore(add(pointer, 64), versionHash)
mstore(add(pointer, 96), i)
mstore(add(pointer, 128), verifier)
hash := keccak256(pointer, 160)
}
return hash;
}
/// @param d Type hash of the domain separator (see Hash.domain)
/// @param h EIP712 hash struct (order for example)
function message(bytes32 d, bytes32 h) internal pure returns (bytes32) {
bytes32 hash;
assembly {
let pointer := mload(64)
mstore(pointer, 0x1901000000000000000000000000000000000000000000000000000000000000)
mstore(add(pointer, 2), d)
mstore(add(pointer, 34), h)
hash := keccak256(pointer, 66)
}
return hash;
}
/// @param o A Swivel Order
function order(Order calldata o) internal pure returns (bytes32) {
// TODO assembly
return keccak256(abi.encode(
ORDER_TYPEHASH,
o.key,
o.maker,
o.underlying,
o.vault,
o.exit,
o.principal,
o.premium,
o.maturity,
o.expiry
));
}
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity >= 0.8.4;
interface Erc20 {
function approve(address, uint256) external returns (bool);
function transfer(address, uint256) external returns (bool);
function balanceOf(address) external returns (uint256);
function transferFrom(address, address, uint256) external returns (bool);
}
interface CErc20 {
function mint(uint256) external returns (uint256);
function redeemUnderlying(uint256) external returns (uint256);
}
interface MarketPlace {
// adds notional and mints zctokens
function mintZcTokenAddingNotional(address, uint256, address, uint256) external returns (bool);
// removes notional and burns zctokens
function burnZcTokenRemovingNotional(address, uint256, address, uint256) external returns (bool);
// returns the amount of underlying principal to send
function redeemZcToken(address, uint256, address, uint256) external returns (uint256);
// returns the amount of underlying interest to send
function redeemVaultInterest(address, uint256, address) external returns (uint256);
// returns the cToken address for a given market
function cTokenAddress(address, uint256) external returns (address);
// EVFZE FF EZFVE call this which would then burn zctoken and remove notional
function custodialExit(address, uint256, address, address, uint256) external returns (bool);
// IVFZI && IZFVI call this which would then mint zctoken and add notional
function custodialInitiate(address, uint256, address, address, uint256) external returns (bool);
// IZFZE && EZFZI call this, tranferring zctoken from one party to another
function p2pZcTokenExchange(address, uint256, address, address, uint256) external returns (bool);
// IVFVE && EVFVI call this, removing notional from one party and adding to the other
function p2pVaultExchange(address, uint256, address, address, uint256) external returns (bool);
// IVFZI && IVFVE call this which then transfers notional from msg.sender (taker) to swivel
function transferVaultNotionalFee(address, uint256, address, uint256) external returns (bool);
}
// SPDX-License-Identifier: UNLICENSED
// Adapted from: https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol
pragma solidity >= 0.8.4;
import {Erc20} from "./Interfaces.sol";
/**
@notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
@author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
@dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
*/
library Safe {
/// @param e Erc20 token to execute the call with
/// @param t To address
/// @param a Amount being transferred
function approve(Erc20 e, address t, uint256 a) internal {
bool result;
assembly {
// Get a pointer to some free memory.
let pointer := mload(0x40)
// Write the abi-encoded calldata to memory piece by piece:
mstore(pointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
mstore(add(pointer, 4), and(t, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
mstore(add(pointer, 36), a) // Finally append the "amount" argument. No mask as it's a full 32 byte value.
// Call the token and store if it succeeded or not.
// We use 68 because the calldata length is 4 + 32 * 2.
result := call(gas(), e, 0, pointer, 68, 0, 0)
}
require(success(result), "approve failed");
}
/// @param e Erc20 token to execute the call with
/// @param t To address
/// @param a Amount being transferred
function transfer(Erc20 e, address t, uint256 a) internal {
bool result;
assembly {
// Get a pointer to some free memory.
let pointer := mload(0x40)
// Write the abi-encoded calldata to memory piece by piece:
mstore(pointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
mstore(add(pointer, 4), and(t, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
mstore(add(pointer, 36), a) // Finally append the "amount" argument. No mask as it's a full 32 byte value.
// Call the token and store if it succeeded or not.
// We use 68 because the calldata length is 4 + 32 * 2.
result := call(gas(), e, 0, pointer, 68, 0, 0)
}
require(success(result), "transfer failed");
}
/// @param e Erc20 token to execute the call with
/// @param f From address
/// @param t To address
/// @param a Amount being transferred
function transferFrom(Erc20 e, address f, address t, uint256 a) internal {
bool result;
assembly {
// Get a pointer to some free memory.
let pointer := mload(0x40)
// Write the abi-encoded calldata to memory piece by piece:
mstore(pointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
mstore(add(pointer, 4), and(f, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
mstore(add(pointer, 36), and(t, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
mstore(add(pointer, 68), a) // Finally append the "amount" argument. No mask as it's a full 32 byte value.
// Call the token and store if it succeeded or not.
// We use 100 because the calldata length is 4 + 32 * 3.
result := call(gas(), e, 0, pointer, 100, 0, 0)
}
require(success(result), "transfer from failed");
}
/// @notice normalize the acceptable values of true or null vs the unacceptable value of false (or something malformed)
/// @param r Return value from the assembly `call()` to Erc20['selector']
function success(bool r) private pure returns (bool) {
bool result;
assembly {
// Get how many bytes the call returned.
let returnDataSize := returndatasize()
// If the call reverted:
if iszero(r) {
// Copy the revert message into memory.
returndatacopy(0, 0, returnDataSize)
// Revert with the same message.
revert(0, returnDataSize)
}
switch returnDataSize
case 32 {
// Copy the return data into memory.
returndatacopy(0, 0, returnDataSize)
// Set success to whether it returned true.
result := iszero(iszero(mload(0)))
}
case 0 {
// There was no return data.
result := 1
}
default {
// It returned some malformed input.
result := 0
}
}
return result;
}
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity >= 0.8.4;
library Sig {
/// @dev ECDSA V,R and S components encapsulated here as we may not always be able to accept a bytes signature
struct Components {
uint8 v;
bytes32 r;
bytes32 s;
}
/// @param h Hashed data which was originally signed
/// @param c signature struct containing V,R and S
/// @return The recovered address
function recover(bytes32 h, Components calldata c) internal pure returns (address) {
// EIP-2 and malleable signatures...
// see https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/cryptography/ECDSA.sol
require(uint256(c.s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, 'invalid signature "s" value');
require(c.v == 27 || c.v == 28, 'invalid signature "v" value');
return ecrecover(h, c.v, c.r, c.s);
}
/// @param h Hashed data which was originally signed
/// @param sig Valid ECDSA signature
/// @dev splitAndRecover should only be used if it is known that the resulting
/// verifying bit (V) will be 27 || 28. Otherwise use recover, possibly calling split first.
/// @return The recovered address
function splitAndRecover(bytes32 h, bytes memory sig) internal pure returns (address) {
(uint8 v, bytes32 r, bytes32 s) = split(sig);
return ecrecover(h, v, r, s);
}
/// @param sig Valid ECDSA signature
/// @return v The verification bit
/// @return r First 32 bytes
/// @return s Next 32 bytes
function split(bytes memory sig) internal pure returns (uint8, bytes32, bytes32) {
require(sig.length == 65, 'invalid signature length');
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := mload(add(sig, 32))
s := mload(add(sig, 64))
v := byte(0, mload(add(sig, 96)))
}
return (v, r, s);
}
}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"m","type":"address"},{"internalType":"address","name":"v","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"BlockWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Cancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"bool","name":"vault","type":"bool"},{"indexed":false,"internalType":"bool","name":"exit","type":"bool"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"filled","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"bool","name":"vault","type":"bool"},{"indexed":false,"internalType":"bool","name":"exit","type":"bool"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"filled","type":"uint256"}],"name":"Initiate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"hold","type":"uint256"}],"name":"ScheduleWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"feenominator","type":"uint256"}],"name":"SetFee","type":"event"},{"inputs":[],"name":"HOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_FEENOMINATOR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"u","type":"address[]"},{"internalType":"address[]","name":"c","type":"address[]"}],"name":"approveUnderlying","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"e","type":"address"}],"name":"blockWithdrawal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bool","name":"vault","type":"bool"},{"internalType":"bool","name":"exit","type":"bool"},{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"internalType":"struct Hash.Order","name":"o","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Sig.Components","name":"c","type":"tuple"}],"name":"cancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"},{"internalType":"uint256","name":"a","type":"uint256"}],"name":"combineTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domain","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bool","name":"vault","type":"bool"},{"internalType":"bool","name":"exit","type":"bool"},{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"internalType":"struct Hash.Order[]","name":"o","type":"tuple[]"},{"internalType":"uint256[]","name":"a","type":"uint256[]"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Sig.Components[]","name":"c","type":"tuple[]"}],"name":"exit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feenominators","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"filled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bool","name":"vault","type":"bool"},{"internalType":"bool","name":"exit","type":"bool"},{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"internalType":"struct Hash.Order[]","name":"o","type":"tuple[]"},{"internalType":"uint256[]","name":"a","type":"uint256[]"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Sig.Components[]","name":"c","type":"tuple[]"}],"name":"initiate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketPlace","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"}],"name":"redeemSwivelVaultInterest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"}],"name":"redeemVaultInterest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"},{"internalType":"uint256","name":"a","type":"uint256"}],"name":"redeemZcToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"e","type":"address"}],"name":"scheduleWithdrawal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"i","type":"uint16"},{"internalType":"uint16","name":"d","type":"uint16"}],"name":"setFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"},{"internalType":"uint256","name":"m","type":"uint256"},{"internalType":"uint256","name":"a","type":"uint256"}],"name":"splitUnderlying","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"transferAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"e","type":"address"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b50604051620048f3380380620048f3833981016040819052620000349162000217565b600380546001600160a01b03191633179055604080518082018252600e81526d53776976656c2046696e616e636560901b602080830191909152825180840190935260058352640322e302e360dc1b83820152620000a092904690859062001ac1620000ef821b17901c565b60809081526001600160a01b03831660a05260408051918201815260c88083526102586020840152610190918301919091526060820152620000e6906004908162000146565b5050506200024f565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600183019183908215620001d15791602002820160005b838211156200019f57835183826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026200015d565b8015620001cf5782816101000a81549061ffff02191690556002016020816001010492830192600103026200019f565b505b50620001df929150620001e3565b5090565b5b80821115620001df5760008155600101620001e4565b80516001600160a01b03811681146200021257600080fd5b919050565b600080604083850312156200022b57600080fd5b6200023683620001fa565b91506200024660208401620001fa565b90509250929050565b60805160a05161461c620002d76000396000818161027a015281816104bd015281816107660152818161097f01528181610de60152818161125b01528181611fd9015281816122cd015281816124a50152818161292901528181612e15015281816133870152818161375001526139da0152600081816103cd0152611d49015261461c6000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80637a9262a2116100ee578063aba2870111610097578063d2144f5811610071578063d2144f58146103f9578063f851a4401461040c578063f8eaad351461041f578063ffa1ad741461043257600080fd5b8063aba28701146103b5578063c2fb26a6146103c8578063d0886f97146103ef57600080fd5b806399b64de1116100c857806399b64de114610346578063a102e38414610359578063a3f4df7e1461036c57600080fd5b80637a9262a21461030057806392ae37641461032057806395cb60c41461033357600080fd5b80632ac126221161015057806340d37cdf1161012a57806340d37cdf146102c757806351cff8d9146102da57806375829def146102ed57600080fd5b80632ac12622146102525780632e25d2a6146102755780633e1608b4146102b457600080fd5b8063154e0f2e11610181578063154e0f2e146101fe57806325dedb8514610211578063288cdc911461022457600080fd5b80630908ff2d146101a85780630d3f5352146101d057806312b516ae146101eb575b600080fd5b6101bb6101b6366004613f9c565b61046e565b60405190151581526020015b60405180910390f35b6101d8602181565b60405161ffff90911681526020016101c7565b6101bb6101f9366004613fd1565b61071e565b6101bb61020c366004613f9c565b610930565b6101bb61021f366004614049565b610b49565b6102446102323660046140b5565b60016020526000908152604090205481565b6040519081526020016101c7565b6101bb6102603660046140b5565b60006020819052908152604090205460ff1681565b61029c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c7565b6101bb6102c23660046140ce565b610ca1565b6101bb6102d5366004613fd1565b610d9e565b6101bb6102e8366004614132565b610fb0565b6101bb6102fb366004614132565b611170565b61024461030e366004614132565b60026020526000908152604090205481565b6101bb61032e366004613f9c565b61120d565b6101d86103413660046140b5565b611493565b6101bb610354366004614161565b6114c1565b6101bb610367366004614132565b6115f1565b6103a86040518060400160405280600e81526020017f53776976656c2046696e616e636500000000000000000000000000000000000081525081565b6040516101c79190614194565b6101bb6103c336600461424c565b611699565b6102447f000000000000000000000000000000000000000000000000000000000000000081565b6102446203f48081565b6101bb61040736600461424c565b61184e565b60035461029c906001600160a01b031681565b6101bb61042d366004614132565b611a03565b6103a86040518060400160405280600581526020017f322e302e3000000000000000000000000000000000000000000000000000000081525081565b6040517fb50a66f70000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052336044830152606482018390526000917f00000000000000000000000000000000000000000000000000000000000000009182169063b50a66f7906084016020604051808303816000875af1158015610508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052c9190614323565b6105a35760405162461bcd60e51b815260206004820152602560248201527f6275726e205a63546f6b656e2072656d6f76696e67204e6f74696f6e616c206660448201527f61696c656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052600091908316906305e1dc25906044016020604051808303816000875af115801561060f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106339190614340565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018690529091506001600160a01b0382169063852a12e3906024016020604051808303816000875af1158015610696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ba919061435d565b156107075760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b610712863386611b18565b50600195945050505050565b6040517fa11f48560000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390523060448301526000917f00000000000000000000000000000000000000000000000000000000000000009183919083169063a11f4856906064016020604051808303816000875af11580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d8919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919250908316906305e1dc25906044016020604051808303816000875af1158015610844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108689190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040161089591815260200190565b6020604051808303816000875af11580156108b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d8919061435d565b156109255760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b506001949350505050565b6040517fc5ee114d0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052336044830152606482018390526000917f00000000000000000000000000000000000000000000000000000000000000009183919083169063c5ee114d906084016020604051808303816000875af11580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201889052919250908316906305e1dc25906044016020604051808303816000875af1158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a819190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b8152600401610aae91815260200190565b6020604051808303816000875af1158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af1919061435d565b15610b3e5760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b610712863383611b18565b6003546000906001600160a01b0316338114610ba75760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b84838114610bf75760405162461bcd60e51b815260206004820152601560248201527f6172726179206c656e677468206d69736d617463680000000000000000000000604482015260640161059a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b82811015610c92576000898983818110610c3757610c37614376565b9050602002016020810190610c4c9190614132565b9050610c7f81898985818110610c6457610c64614376565b9050602002016020810190610c799190614132565b85611bbe565b5080610c8a816143d4565b915050610c1b565b50600198975050505050505050565b600080610cae8484611c5e565b9050610cc06040850160208601614132565b6001600160a01b0316336001600160a01b031614610d205760405162461bcd60e51b815260206004820152601460248201527f73656e646572206d757374206265206d616b6572000000000000000000000000604482015260640161059a565b6000818152602081905260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518435907f9e5d8891dc1b047de610617bc9bc2d8ccffebbc3d63363431a546831245858a690610d8c9084815260200190565b60405180910390a25060019392505050565b6040517fa11f48560000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390523360448301526000917f00000000000000000000000000000000000000000000000000000000000000009183919083169063a11f4856906064016020604051808303816000875af1158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e58919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919250908316906305e1dc25906044016020604051808303816000875af1158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b8152600401610f1591815260200190565b6020604051808303816000875af1158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f58919061435d565b15610fa55760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b610925853383611b18565b6003546000906001600160a01b031633811461100e5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6001600160a01b038316600090815260026020526040812054908190036110775760405162461bcd60e51b815260206004820152601760248201527f6e6f207769746864726177616c207363686564756c6564000000000000000000604482015260640161059a565b804210156110c75760405162461bcd60e51b815260206004820152601860248201527f7769746864726177616c207374696c6c206f6e20686f6c640000000000000000604482015260640161059a565b6001600160a01b038481166000818152600260205260408082209190915560035490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528793610925938593909116916370a08231906024016020604051808303816000875af1158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b919061435d565b611b18565b6003546000906001600160a01b03163381146111ce5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b600380546001600160a01b0385167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556001915050919050565b60008361121c81333086611df8565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000091908216906305e1dc25906044016020604051808303816000875af11580156112a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cb9190614340565b6001600160a01b031663a0712d68856040518263ffffffff1660e01b81526004016112f891815260200190565b6020604051808303816000875af1158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b919061435d565b156113885760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e204661696c65640000000000000000000000604482015260640161059a565b6040517fef267f2c0000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790523360448301526064820186905282169063ef267f2c906084016020604051808303816000875af11580156113fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114219190614323565b6107125760405162461bcd60e51b815260206004820152602360248201527f6d696e74205a63546f6b656e20616464696e67204e6f74696f6e616c2066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161059a565b600481600481106114a357600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b6003546000906001600160a01b031633811461151f5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b602161ffff841610156115745760405162461bcd60e51b815260206004820152600c60248201527f66656520746f6f20686967680000000000000000000000000000000000000000604482015260640161059a565b8260048561ffff166004811061158c5761158c614376565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508261ffff168461ffff167f032dc6a2d839eb179729a55633fdf1c41a1fc4739394154117005db2b354b9b560405160405180910390a35060019392505050565b6003546000906001600160a01b031633811461164f5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6001600160a01b038316600081815260026020526040808220829055517fb1c1232c5dd039bb1c46cc05eaf25828e4f8596b7f68bdb23073ba78b9ca382d9190a250600192915050565b600085815b81811015610c925760008989838181106116ba576116ba614376565b905061012002018036038101906116d19190614468565b9050806080015161178e57806060015161173c576117378a8a848181106116fa576116fa614376565b9050610120020189898581811061171357611713614376565b9050602002013588888681811061172c5761172c614376565b905060600201611eae565b61183b565b6117378a8a8481811061175157611751614376565b9050610120020189898581811061176a5761176a614376565b9050602002013588888681811061178357611783614376565b9050606002016121a7565b80606001516117e9576117378a8a848181106117ac576117ac614376565b905061012002018989858181106117c5576117c5614376565b905060200201358888868181106117de576117de614376565b905060600201612405565b61183b8a8a848181106117fe576117fe614376565b9050610120020189898581811061181757611817614376565b9050602002013588888681811061183057611830614376565b905060600201612889565b5080611846816143d4565b91505061169e565b600085815b81811015610c9257600089898381811061186f5761186f614376565b905061012002018036038101906118869190614468565b905080608001516119435780606001516118f1576118ec8a8a848181106118af576118af614376565b905061012002018989858181106118c8576118c8614376565b905060200201358888868181106118e1576118e1614376565b905060600201612d08565b6119f0565b6118ec8a8a8481811061190657611906614376565b9050610120020189898581811061191f5761191f614376565b9050602002013588888681811061193857611938614376565b905060600201613276565b806060015161199e576118ec8a8a8481811061196157611961614376565b9050610120020189898581811061197a5761197a614376565b9050602002013588888681811061199357611993614376565b905060600201613630565b6119f08a8a848181106119b3576119b3614376565b905061012002018989858181106119cc576119cc614376565b905060200201358888868181106119e5576119e5614376565b90506060020161390e565b50806119fb816143d4565b915050611853565b6003546000906001600160a01b0316338114611a615760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6000611a706203f480426144ff565b6001600160a01b0385166000818152600260205260409081902083905551919250907fe4b67652e856f57a7747dd2473850ce987087f4b1744a870504f1c047cb56f4f90610d8c9084815260200190565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b60006040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af1915050611b6c81613ca9565b611bb85760405162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c65640000000000000000000000000000000000604482015260640161059a565b50505050565b60006040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af1915050611c1281613ca9565b611bb85760405162461bcd60e51b815260206004820152600e60248201527f617070726f7665206661696c6564000000000000000000000000000000000000604482015260640161059a565b600080611c6a84613cf3565b60008181526020819052604090205490915060ff1615611ccc5760405162461bcd60e51b815260206004820152600f60248201527f6f726465722063616e63656c6c65640000000000000000000000000000000000604482015260640161059a565b428461010001351015611d215760405162461bcd60e51b815260206004820152600d60248201527f6f72646572206578706972656400000000000000000000000000000000000000604482015260640161059a565b6040517f190100000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060028201526022810182905260429020611d829084613df1565b6001600160a01b0316611d9b6040860160208701614132565b6001600160a01b031614611df15760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e6174757265000000000000000000000000000000604482015260640161059a565b9392505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af1915050611e5b81613ca9565b611ea75760405162461bcd60e51b815260206004820152601460248201527f7472616e736665722066726f6d206661696c6564000000000000000000000000604482015260640161059a565b5050505050565b6000611eba8483611c5e565b60008181526001602052604090205490915060c085013590611edc90856144ff565b1115611f2a5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b60008181526001602052604081208054859290611f489084906144ff565b9091555060009050611f606060860160408701614132565b9050600060c0860135611f7760a088013587614517565b611f819190614554565b9050611fa782611f976040890160208a01614132565b33611fa2898661458f565b611df8565b600454600090611fc19062010000900461ffff1683614554565b9050611fcf83333084611df8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166365a963aa61200e60608a0160408b01614132565b60e08a01353361202460408d0160208e01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810185905260a4016020604051808303816000875af11580156120a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c59190614323565b6121115760405162461bcd60e51b815260206004820152601760248201527f7a63546f6b656e2065786368616e6765206661696c6564000000000000000000604482015260640161059a565b336121226040890160208a01614132565b6001600160a01b031688357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd92667128348761215f60808d0160608e016145a6565b61216f60a08e0160808f016145a6565b604080519384529115156020840152151590820152606081018b90526080810187905260a0015b60405180910390a450505050505050565b60006121b38483611c5e565b60008181526001602052604090205490915060a0850135906121d590856144ff565b11156122235760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906122419084906144ff565b90915550600090506122596060860160408701614132565b9050600060a086013561227060c088013587614517565b61227a9190614554565b9050612297826122906040890160208a01614132565b3384611df8565b6004546000906122b5906601000000000000900461ffff1683614554565b90506122c383333084611df8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663bddbfbe461230260608a0160408b01614132565b60e08a01353361231860408d0160208e01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810189905260a4016020604051808303816000875af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190614323565b6121115760405162461bcd60e51b815260206004820152601560248201527f7661756c742065786368616e6765206661696c65640000000000000000000000604482015260640161059a565b60006124118483611c5e565b60008181526001602052604090205490915060a08501359061243390856144ff565b11156124815760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b6000818152600160205260408120805485929061249f9084906144ff565b909155507f0000000000000000000000000000000000000000000000000000000000000000905060006001600160a01b0382166305e1dc256124e76060890160408a01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b039290921660048201529089013560248201526044016020604051808303816000875af115801561254f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125739190614340565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018790529091506001600160a01b0382169063852a12e3906024016020604051808303816000875af11580156125d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fa919061435d565b156126475760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b60006126596060880160408901614132565b9050600060a088013561267060c08a013589614517565b61267a9190614554565b905061269a8261269060408b0160208c01614132565b61116b848b61458f565b6004546000906126b8906601000000000000900461ffff1683614554565b90506126c9833361116b848661458f565b6001600160a01b038516638c6b9b416126e860608c0160408d01614132565b60e08c01356126fd60408e0160208f01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015260248101929092529091166044820152336064820152608481018b905260a4016020604051808303816000875af1158015612778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279c9190614323565b6127e85760405162461bcd60e51b815260206004820152601560248201527f637573746f6469616c2065786974206661696c65640000000000000000000000604482015260640161059a565b336127f960408b0160208c01614132565b6001600160a01b03168a600001357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd9266712834898d606001602081019061283c91906145a6565b8e608001602081019061284f91906145a6565b604080519384529115156020840152151590820152606081018d90526080810187905260a0015b60405180910390a4505050505050505050565b60006128958483611c5e565b60008181526001602052604090205490915060c0850135906128b790856144ff565b11156129055760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906129239084906144ff565b909155507f0000000000000000000000000000000000000000000000000000000000000000905060006001600160a01b0382166305e1dc2561296b6060890160408a01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b039290921660048201529089013560248201526044016020604051808303816000875af11580156129d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f79190614340565b9050600060c0870135612a0e60a089013588614517565b612a189190614554565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b0383169063852a12e3906024016020604051808303816000875af1158015612a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9f919061435d565b15612aec5760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b6000612afe6060890160408a01614132565b600454909150600090612b1b9062010000900461ffff1684614554565b9050612b37823383612b2d8c8861458f565b61116b919061458f565b612b5182612b4b60408c0160208d01614132565b8a611b18565b6001600160a01b038516638c6b9b41612b7060608c0160408d01614132565b8b60e00135338d6020016020810190612b899190614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810186905260a4016020604051808303816000875af1158015612c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2a9190614323565b612c765760405162461bcd60e51b815260206004820152601560248201527f637573746f6469616c2065786974206661696c65640000000000000000000000604482015260640161059a565b33612c8760408b0160208c01614132565b6001600160a01b03168a600001357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd9266712834898d6060016020810190612cca91906145a6565b8e6080016020810190612cdd91906145a6565b604080519384529115156020840152151590820152606081018d90526080810188905260a001612876565b6000612d148483611c5e565b60008181526001602052604090205490915060c085013590612d3690856144ff565b1115612d845760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b60008181526001602052604081208054859290612da29084906144ff565b9091555060009050612dba6060860160408701614132565b9050612dd78133612dd16040890160208a01614132565b87611df8565b600060c0860135612dec60a088013587614517565b612df69190614554565b9050612e1382612e0c6040890160208a01614132565b3084611df8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381166305e1dc25612e5360608a0160408b01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908a013560248201526044016020604051808303816000875af1158015612ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edf9190614340565b6001600160a01b031663a0712d68836040518263ffffffff1660e01b8152600401612f0c91815260200190565b6020604051808303816000875af1158015612f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4f919061435d565b15612f9c5760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e206661696c65640000000000000000000000604482015260640161059a565b6001600160a01b03811663f8e51bcb612fbb60608a0160408b01614132565b60e08a0135612fd060408c0160208d01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810185905260a4016020604051808303816000875af115801561304b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306f9190614323565b6130bb5760405162461bcd60e51b815260206004820152601960248201527f637573746f6469616c20696e697469617465206661696c656400000000000000604482015260640161059a565b6004546000906130d790640100000000900461ffff1684614554565b90506001600160a01b038216633cf9a4e36130f860608b0160408c01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908b01356024820152336044820152606481018490526084016020604051808303816000875af115801561316d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131919190614323565b6131dd5760405162461bcd60e51b815260206004820152601c60248201527f6e6f74696f6e616c20666565207472616e73666572206661696c656400000000604482015260640161059a565b336131ee60408a0160208b01614132565b6001600160a01b031689357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef8861322b60808e0160608f016145a6565b8d608001602081019061323e91906145a6565b604080519384529115156020840152151590820152606081018c90526080810188905260a00160405180910390a45050505050505050565b60006132828483611c5e565b60008181526001602052604090205490915060a0850135906132a490856144ff565b11156132f25760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906133109084906144ff565b90915550600090506133286060860160408701614132565b9050600060a086013561333f60c088013587614517565b6133499190614554565b905061335f826122906040890160208a01614132565b6004546000906133739061ffff1683614554565b9050613385833330611fa2858b6144ff565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381166305e1dc256133c560608b0160408c01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908b013560248201526044016020604051808303816000875af115801561342d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134519190614340565b6001600160a01b031663a0712d68886040518263ffffffff1660e01b815260040161347e91815260200190565b6020604051808303816000875af115801561349d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c1919061435d565b1561350e5760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e204661696c65640000000000000000000000604482015260640161059a565b6001600160a01b03811663f8e51bcb61352d60608b0160408c01614132565b60e08b01353361354360408e0160208f01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039485166004820152602481019390935290831660448301529091166064820152608481018a905260a4016020604051808303816000875af11580156135c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e49190614323565b6131dd5760405162461bcd60e51b815260206004820152601960248201527f637573746f6469616c20696e697469617465206661696c656400000000000000604482015260640161059a565b600061363c8483611c5e565b60008181526001602052604090205490915060a08501359061365e90856144ff565b11156136ac5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906136ca9084906144ff565b909155506000905060a08501356136e560c087013586614517565b6136ef9190614554565b905060006137036060870160408801614132565b9050613724813361371a60408a0160208b01614132565b611fa2868a61458f565b6004546000906137389061ffff1684614554565b905061374682333084611df8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166365a963aa61378560608a0160408b01614132565b60e08a013561379a60408c0160208d01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810189905260a4016020604051808303816000875af1158015613815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138399190614323565b6138855760405162461bcd60e51b815260206004820152601760248201527f7a63546f6b656e2065786368616e6765206661696c6564000000000000000000604482015260640161059a565b336138966040890160208a01614132565b6001600160a01b031688357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef876138d360808d0160608e016145a6565b6138e360a08e0160808f016145a6565b604080519384529115156020840152151590820152606081018b90526080810188905260a001612196565b600061391a8483611c5e565b60008181526001602052604090205490915060c08501359061393c90856144ff565b111561398a5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906139a89084906144ff565b909155506139d890506139c16060860160408701614132565b336139d26040880160208901614132565b86611df8565b7f0000000000000000000000000000000000000000000000000000000000000000600060c0860135613a0e60a088013587614517565b613a189190614554565b90506001600160a01b03821663bddbfbe4613a396060890160408a01614132565b60e0890135613a4e60408b0160208c01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810184905260a4016020604051808303816000875af1158015613ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aed9190614323565b613b395760405162461bcd60e51b815260206004820152601560248201527f7661756c742065786368616e6765206661696c65640000000000000000000000604482015260640161059a565b600454600090613b5590640100000000900461ffff1683614554565b90506001600160a01b038316633cf9a4e3613b7660608a0160408b01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908a01356024820152336044820152606481018490526084016020604051808303816000875af1158015613beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0f9190614323565b613c5b5760405162461bcd60e51b815260206004820152601c60248201527f6e6f74696f6e616c20666565207472616e73666572206661696c656400000000604482015260640161059a565b33613c6c6040890160208a01614132565b6001600160a01b031688357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef8761215f60808d0160608e016145a6565b6000803d83613cbc57806000803e806000fd5b8060208114613cd4578015613ce55760009250613cea565b816000803e60005115159250613cea565b600192505b50909392505050565b60007f7ddd38ab5ed1c16b61ca90eeb9579e29da1ba821cf42d8cdef8f30a31a6a41468235613d286040850160208601614132565b613d386060860160408701614132565b613d4860808701606088016145a6565b613d5860a08801608089016145a6565b8760a001358860c001358960e001358a6101000135604051602001613dd49a99989796959493929190998a5260208a01989098526001600160a01b0396871660408a01529490951660608801529115156080870152151560a086015260c085015260e08401919091526101008301526101208201526101400190565b604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a060408301351115613e675760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202273222076616c75650000000000604482015260640161059a565b613e7460208301836145c3565b60ff16601b1480613e945750613e8d60208301836145c3565b60ff16601c145b613ee05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202276222076616c75650000000000604482015260640161059a565b600183613ef060208501856145c3565b604080516000815260208181018084529490945260ff9092168282015291850135606082015290840135608082015260a0016020604051602081039080840390855afa158015613f44573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151949350505050565b6001600160a01b0381168114613f8957600080fd5b50565b8035613f9781613f74565b919050565b600080600060608486031215613fb157600080fd5b8335613fbc81613f74565b95602085013595506040909401359392505050565b60008060408385031215613fe457600080fd5b8235613fef81613f74565b946020939093013593505050565b60008083601f84011261400f57600080fd5b50813567ffffffffffffffff81111561402757600080fd5b6020830191508360208260051b850101111561404257600080fd5b9250929050565b6000806000806040858703121561405f57600080fd5b843567ffffffffffffffff8082111561407757600080fd5b61408388838901613ffd565b9096509450602087013591508082111561409c57600080fd5b506140a987828801613ffd565b95989497509550505050565b6000602082840312156140c757600080fd5b5035919050565b6000808284036101808112156140e357600080fd5b610120808212156140f357600080fd5b84935060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee08301121561412657600080fd5b92959390920193505050565b60006020828403121561414457600080fd5b8135611df181613f74565b803561ffff81168114613f9757600080fd5b6000806040838503121561417457600080fd5b61417d8361414f565b915061418b6020840161414f565b90509250929050565b600060208083528351808285015260005b818110156141c1578581018301518582016040015282016141a5565b818111156141d3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f84011261421957600080fd5b50813567ffffffffffffffff81111561423157600080fd5b60208301915083602060608302850101111561404257600080fd5b6000806000806000806060878903121561426557600080fd5b863567ffffffffffffffff8082111561427d57600080fd5b818901915089601f83011261429157600080fd5b8135818111156142a057600080fd5b8a6020610120830285010111156142b657600080fd5b6020928301985096509088013590808211156142d157600080fd5b6142dd8a838b01613ffd565b909650945060408901359150808211156142f657600080fd5b5061430389828a01614207565b979a9699509497509295939492505050565b8015158114613f8957600080fd5b60006020828403121561433557600080fd5b8151611df181614315565b60006020828403121561435257600080fd5b8151611df181613f74565b60006020828403121561436f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614405576144056143a5565b5060010190565b604051610120810167ffffffffffffffff81118282101715614457577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b8035613f9781614315565b6000610120828403121561447b57600080fd5b61448361440c565b8235815261449360208401613f8c565b60208201526144a460408401613f8c565b60408201526144b56060840161445d565b60608201526144c66080840161445d565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508091505092915050565b60008219821115614512576145126143a5565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561454f5761454f6143a5565b500290565b60008261458a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000828210156145a1576145a16143a5565b500390565b6000602082840312156145b857600080fd5b8135611df181614315565b6000602082840312156145d557600080fd5b813560ff81168114611df157600080fdfea2646970667358221220ef13a69af84988ea5fbe4eedf2b1d197fa7ffe761e21cba8bddbabf9827e757364736f6c634300080d003300000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce0000000000000000000000003b983b701406010866bd68331aaed374fb9f50c9
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a35760003560e01c80637a9262a2116100ee578063aba2870111610097578063d2144f5811610071578063d2144f58146103f9578063f851a4401461040c578063f8eaad351461041f578063ffa1ad741461043257600080fd5b8063aba28701146103b5578063c2fb26a6146103c8578063d0886f97146103ef57600080fd5b806399b64de1116100c857806399b64de114610346578063a102e38414610359578063a3f4df7e1461036c57600080fd5b80637a9262a21461030057806392ae37641461032057806395cb60c41461033357600080fd5b80632ac126221161015057806340d37cdf1161012a57806340d37cdf146102c757806351cff8d9146102da57806375829def146102ed57600080fd5b80632ac12622146102525780632e25d2a6146102755780633e1608b4146102b457600080fd5b8063154e0f2e11610181578063154e0f2e146101fe57806325dedb8514610211578063288cdc911461022457600080fd5b80630908ff2d146101a85780630d3f5352146101d057806312b516ae146101eb575b600080fd5b6101bb6101b6366004613f9c565b61046e565b60405190151581526020015b60405180910390f35b6101d8602181565b60405161ffff90911681526020016101c7565b6101bb6101f9366004613fd1565b61071e565b6101bb61020c366004613f9c565b610930565b6101bb61021f366004614049565b610b49565b6102446102323660046140b5565b60016020526000908152604090205481565b6040519081526020016101c7565b6101bb6102603660046140b5565b60006020819052908152604090205460ff1681565b61029c7f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce81565b6040516001600160a01b0390911681526020016101c7565b6101bb6102c23660046140ce565b610ca1565b6101bb6102d5366004613fd1565b610d9e565b6101bb6102e8366004614132565b610fb0565b6101bb6102fb366004614132565b611170565b61024461030e366004614132565b60026020526000908152604090205481565b6101bb61032e366004613f9c565b61120d565b6101d86103413660046140b5565b611493565b6101bb610354366004614161565b6114c1565b6101bb610367366004614132565b6115f1565b6103a86040518060400160405280600e81526020017f53776976656c2046696e616e636500000000000000000000000000000000000081525081565b6040516101c79190614194565b6101bb6103c336600461424c565b611699565b6102447f07845c349637a5f759f053b812262883a65950f96419365efdf40d78cd31acfd81565b6102446203f48081565b6101bb61040736600461424c565b61184e565b60035461029c906001600160a01b031681565b6101bb61042d366004614132565b611a03565b6103a86040518060400160405280600581526020017f322e302e3000000000000000000000000000000000000000000000000000000081525081565b6040517fb50a66f70000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052336044830152606482018390526000917f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce9182169063b50a66f7906084016020604051808303816000875af1158015610508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052c9190614323565b6105a35760405162461bcd60e51b815260206004820152602560248201527f6275726e205a63546f6b656e2072656d6f76696e67204e6f74696f6e616c206660448201527f61696c656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052600091908316906305e1dc25906044016020604051808303816000875af115801561060f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106339190614340565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018690529091506001600160a01b0382169063852a12e3906024016020604051808303816000875af1158015610696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ba919061435d565b156107075760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b610712863386611b18565b50600195945050505050565b6040517fa11f48560000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390523060448301526000917f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce9183919083169063a11f4856906064016020604051808303816000875af11580156107b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d8919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919250908316906305e1dc25906044016020604051808303816000875af1158015610844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108689190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040161089591815260200190565b6020604051808303816000875af11580156108b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d8919061435d565b156109255760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b506001949350505050565b6040517fc5ee114d0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052336044830152606482018390526000917f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce9183919083169063c5ee114d906084016020604051808303816000875af11580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201889052919250908316906305e1dc25906044016020604051808303816000875af1158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a819190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b8152600401610aae91815260200190565b6020604051808303816000875af1158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af1919061435d565b15610b3e5760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b610712863383611b18565b6003546000906001600160a01b0316338114610ba75760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b84838114610bf75760405162461bcd60e51b815260206004820152601560248201527f6172726179206c656e677468206d69736d617463680000000000000000000000604482015260640161059a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005b82811015610c92576000898983818110610c3757610c37614376565b9050602002016020810190610c4c9190614132565b9050610c7f81898985818110610c6457610c64614376565b9050602002016020810190610c799190614132565b85611bbe565b5080610c8a816143d4565b915050610c1b565b50600198975050505050505050565b600080610cae8484611c5e565b9050610cc06040850160208601614132565b6001600160a01b0316336001600160a01b031614610d205760405162461bcd60e51b815260206004820152601460248201527f73656e646572206d757374206265206d616b6572000000000000000000000000604482015260640161059a565b6000818152602081905260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518435907f9e5d8891dc1b047de610617bc9bc2d8ccffebbc3d63363431a546831245858a690610d8c9084815260200190565b60405180910390a25060019392505050565b6040517fa11f48560000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390523360448301526000917f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce9183919083169063a11f4856906064016020604051808303816000875af1158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e58919061435d565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919250908316906305e1dc25906044016020604051808303816000875af1158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190614340565b6001600160a01b031663852a12e3826040518263ffffffff1660e01b8152600401610f1591815260200190565b6020604051808303816000875af1158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f58919061435d565b15610fa55760405162461bcd60e51b815260206004820152601a60248201527f636f6d706f756e6420726564656d7074696f6e206661696c6564000000000000604482015260640161059a565b610925853383611b18565b6003546000906001600160a01b031633811461100e5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6001600160a01b038316600090815260026020526040812054908190036110775760405162461bcd60e51b815260206004820152601760248201527f6e6f207769746864726177616c207363686564756c6564000000000000000000604482015260640161059a565b804210156110c75760405162461bcd60e51b815260206004820152601860248201527f7769746864726177616c207374696c6c206f6e20686f6c640000000000000000604482015260640161059a565b6001600160a01b038481166000818152600260205260408082209190915560035490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528793610925938593909116916370a08231906024016020604051808303816000875af1158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b919061435d565b611b18565b6003546000906001600160a01b03163381146111ce5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b600380546001600160a01b0385167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556001915050919050565b60008361121c81333086611df8565b6040517f05e1dc250000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690527f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce91908216906305e1dc25906044016020604051808303816000875af11580156112a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cb9190614340565b6001600160a01b031663a0712d68856040518263ffffffff1660e01b81526004016112f891815260200190565b6020604051808303816000875af1158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b919061435d565b156113885760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e204661696c65640000000000000000000000604482015260640161059a565b6040517fef267f2c0000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790523360448301526064820186905282169063ef267f2c906084016020604051808303816000875af11580156113fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114219190614323565b6107125760405162461bcd60e51b815260206004820152602360248201527f6d696e74205a63546f6b656e20616464696e67204e6f74696f6e616c2066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161059a565b600481600481106114a357600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b6003546000906001600160a01b031633811461151f5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b602161ffff841610156115745760405162461bcd60e51b815260206004820152600c60248201527f66656520746f6f20686967680000000000000000000000000000000000000000604482015260640161059a565b8260048561ffff166004811061158c5761158c614376565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508261ffff168461ffff167f032dc6a2d839eb179729a55633fdf1c41a1fc4739394154117005db2b354b9b560405160405180910390a35060019392505050565b6003546000906001600160a01b031633811461164f5760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6001600160a01b038316600081815260026020526040808220829055517fb1c1232c5dd039bb1c46cc05eaf25828e4f8596b7f68bdb23073ba78b9ca382d9190a250600192915050565b600085815b81811015610c925760008989838181106116ba576116ba614376565b905061012002018036038101906116d19190614468565b9050806080015161178e57806060015161173c576117378a8a848181106116fa576116fa614376565b9050610120020189898581811061171357611713614376565b9050602002013588888681811061172c5761172c614376565b905060600201611eae565b61183b565b6117378a8a8481811061175157611751614376565b9050610120020189898581811061176a5761176a614376565b9050602002013588888681811061178357611783614376565b9050606002016121a7565b80606001516117e9576117378a8a848181106117ac576117ac614376565b905061012002018989858181106117c5576117c5614376565b905060200201358888868181106117de576117de614376565b905060600201612405565b61183b8a8a848181106117fe576117fe614376565b9050610120020189898581811061181757611817614376565b9050602002013588888681811061183057611830614376565b905060600201612889565b5080611846816143d4565b91505061169e565b600085815b81811015610c9257600089898381811061186f5761186f614376565b905061012002018036038101906118869190614468565b905080608001516119435780606001516118f1576118ec8a8a848181106118af576118af614376565b905061012002018989858181106118c8576118c8614376565b905060200201358888868181106118e1576118e1614376565b905060600201612d08565b6119f0565b6118ec8a8a8481811061190657611906614376565b9050610120020189898581811061191f5761191f614376565b9050602002013588888681811061193857611938614376565b905060600201613276565b806060015161199e576118ec8a8a8481811061196157611961614376565b9050610120020189898581811061197a5761197a614376565b9050602002013588888681811061199357611993614376565b905060600201613630565b6119f08a8a848181106119b3576119b3614376565b905061012002018989858181106119cc576119cc614376565b905060200201358888868181106119e5576119e5614376565b90506060020161390e565b50806119fb816143d4565b915050611853565b6003546000906001600160a01b0316338114611a615760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d75737420626520617574686f72697a656400000000000000604482015260640161059a565b6000611a706203f480426144ff565b6001600160a01b0385166000818152600260205260409081902083905551919250907fe4b67652e856f57a7747dd2473850ce987087f4b1744a870504f1c047cb56f4f90610d8c9084815260200190565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b60006040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af1915050611b6c81613ca9565b611bb85760405162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c65640000000000000000000000000000000000604482015260640161059a565b50505050565b60006040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af1915050611c1281613ca9565b611bb85760405162461bcd60e51b815260206004820152600e60248201527f617070726f7665206661696c6564000000000000000000000000000000000000604482015260640161059a565b600080611c6a84613cf3565b60008181526020819052604090205490915060ff1615611ccc5760405162461bcd60e51b815260206004820152600f60248201527f6f726465722063616e63656c6c65640000000000000000000000000000000000604482015260640161059a565b428461010001351015611d215760405162461bcd60e51b815260206004820152600d60248201527f6f72646572206578706972656400000000000000000000000000000000000000604482015260640161059a565b6040517f190100000000000000000000000000000000000000000000000000000000000081527f07845c349637a5f759f053b812262883a65950f96419365efdf40d78cd31acfd60028201526022810182905260429020611d829084613df1565b6001600160a01b0316611d9b6040860160208701614132565b6001600160a01b031614611df15760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e6174757265000000000000000000000000000000604482015260640161059a565b9392505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af1915050611e5b81613ca9565b611ea75760405162461bcd60e51b815260206004820152601460248201527f7472616e736665722066726f6d206661696c6564000000000000000000000000604482015260640161059a565b5050505050565b6000611eba8483611c5e565b60008181526001602052604090205490915060c085013590611edc90856144ff565b1115611f2a5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b60008181526001602052604081208054859290611f489084906144ff565b9091555060009050611f606060860160408701614132565b9050600060c0860135611f7760a088013587614517565b611f819190614554565b9050611fa782611f976040890160208a01614132565b33611fa2898661458f565b611df8565b600454600090611fc19062010000900461ffff1683614554565b9050611fcf83333084611df8565b6001600160a01b037f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce166365a963aa61200e60608a0160408b01614132565b60e08a01353361202460408d0160208e01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810185905260a4016020604051808303816000875af11580156120a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c59190614323565b6121115760405162461bcd60e51b815260206004820152601760248201527f7a63546f6b656e2065786368616e6765206661696c6564000000000000000000604482015260640161059a565b336121226040890160208a01614132565b6001600160a01b031688357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd92667128348761215f60808d0160608e016145a6565b61216f60a08e0160808f016145a6565b604080519384529115156020840152151590820152606081018b90526080810187905260a0015b60405180910390a450505050505050565b60006121b38483611c5e565b60008181526001602052604090205490915060a0850135906121d590856144ff565b11156122235760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906122419084906144ff565b90915550600090506122596060860160408701614132565b9050600060a086013561227060c088013587614517565b61227a9190614554565b9050612297826122906040890160208a01614132565b3384611df8565b6004546000906122b5906601000000000000900461ffff1683614554565b90506122c383333084611df8565b6001600160a01b037f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce1663bddbfbe461230260608a0160408b01614132565b60e08a01353361231860408d0160208e01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810189905260a4016020604051808303816000875af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190614323565b6121115760405162461bcd60e51b815260206004820152601560248201527f7661756c742065786368616e6765206661696c65640000000000000000000000604482015260640161059a565b60006124118483611c5e565b60008181526001602052604090205490915060a08501359061243390856144ff565b11156124815760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b6000818152600160205260408120805485929061249f9084906144ff565b909155507f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce905060006001600160a01b0382166305e1dc256124e76060890160408a01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b039290921660048201529089013560248201526044016020604051808303816000875af115801561254f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125739190614340565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018790529091506001600160a01b0382169063852a12e3906024016020604051808303816000875af11580156125d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fa919061435d565b156126475760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b60006126596060880160408901614132565b9050600060a088013561267060c08a013589614517565b61267a9190614554565b905061269a8261269060408b0160208c01614132565b61116b848b61458f565b6004546000906126b8906601000000000000900461ffff1683614554565b90506126c9833361116b848661458f565b6001600160a01b038516638c6b9b416126e860608c0160408d01614132565b60e08c01356126fd60408e0160208f01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015260248101929092529091166044820152336064820152608481018b905260a4016020604051808303816000875af1158015612778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279c9190614323565b6127e85760405162461bcd60e51b815260206004820152601560248201527f637573746f6469616c2065786974206661696c65640000000000000000000000604482015260640161059a565b336127f960408b0160208c01614132565b6001600160a01b03168a600001357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd9266712834898d606001602081019061283c91906145a6565b8e608001602081019061284f91906145a6565b604080519384529115156020840152151590820152606081018d90526080810187905260a0015b60405180910390a4505050505050505050565b60006128958483611c5e565b60008181526001602052604090205490915060c0850135906128b790856144ff565b11156129055760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906129239084906144ff565b909155507f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce905060006001600160a01b0382166305e1dc2561296b6060890160408a01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b039290921660048201529089013560248201526044016020604051808303816000875af11580156129d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f79190614340565b9050600060c0870135612a0e60a089013588614517565b612a189190614554565b6040517f852a12e3000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b0383169063852a12e3906024016020604051808303816000875af1158015612a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9f919061435d565b15612aec5760405162461bcd60e51b815260206004820152601960248201527f636f6d706f756e6420726564656d7074696f6e206572726f7200000000000000604482015260640161059a565b6000612afe6060890160408a01614132565b600454909150600090612b1b9062010000900461ffff1684614554565b9050612b37823383612b2d8c8861458f565b61116b919061458f565b612b5182612b4b60408c0160208d01614132565b8a611b18565b6001600160a01b038516638c6b9b41612b7060608c0160408d01614132565b8b60e00135338d6020016020810190612b899190614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b0394851660048201526024810193909352908316604483015290911660648201526084810186905260a4016020604051808303816000875af1158015612c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2a9190614323565b612c765760405162461bcd60e51b815260206004820152601560248201527f637573746f6469616c2065786974206661696c65640000000000000000000000604482015260640161059a565b33612c8760408b0160208c01614132565b6001600160a01b03168a600001357f51cad9177cf46d59109ae978bb3cf5ffed2bb3d53fb3682fa56fbd9266712834898d6060016020810190612cca91906145a6565b8e6080016020810190612cdd91906145a6565b604080519384529115156020840152151590820152606081018d90526080810188905260a001612876565b6000612d148483611c5e565b60008181526001602052604090205490915060c085013590612d3690856144ff565b1115612d845760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b60008181526001602052604081208054859290612da29084906144ff565b9091555060009050612dba6060860160408701614132565b9050612dd78133612dd16040890160208a01614132565b87611df8565b600060c0860135612dec60a088013587614517565b612df69190614554565b9050612e1382612e0c6040890160208a01614132565b3084611df8565b7f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce6001600160a01b0381166305e1dc25612e5360608a0160408b01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908a013560248201526044016020604051808303816000875af1158015612ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edf9190614340565b6001600160a01b031663a0712d68836040518263ffffffff1660e01b8152600401612f0c91815260200190565b6020604051808303816000875af1158015612f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4f919061435d565b15612f9c5760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e206661696c65640000000000000000000000604482015260640161059a565b6001600160a01b03811663f8e51bcb612fbb60608a0160408b01614132565b60e08a0135612fd060408c0160208d01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810185905260a4016020604051808303816000875af115801561304b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306f9190614323565b6130bb5760405162461bcd60e51b815260206004820152601960248201527f637573746f6469616c20696e697469617465206661696c656400000000000000604482015260640161059a565b6004546000906130d790640100000000900461ffff1684614554565b90506001600160a01b038216633cf9a4e36130f860608b0160408c01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908b01356024820152336044820152606481018490526084016020604051808303816000875af115801561316d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131919190614323565b6131dd5760405162461bcd60e51b815260206004820152601c60248201527f6e6f74696f6e616c20666565207472616e73666572206661696c656400000000604482015260640161059a565b336131ee60408a0160208b01614132565b6001600160a01b031689357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef8861322b60808e0160608f016145a6565b8d608001602081019061323e91906145a6565b604080519384529115156020840152151590820152606081018c90526080810188905260a00160405180910390a45050505050505050565b60006132828483611c5e565b60008181526001602052604090205490915060a0850135906132a490856144ff565b11156132f25760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906133109084906144ff565b90915550600090506133286060860160408701614132565b9050600060a086013561333f60c088013587614517565b6133499190614554565b905061335f826122906040890160208a01614132565b6004546000906133739061ffff1683614554565b9050613385833330611fa2858b6144ff565b7f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce6001600160a01b0381166305e1dc256133c560608b0160408c01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908b013560248201526044016020604051808303816000875af115801561342d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134519190614340565b6001600160a01b031663a0712d68886040518263ffffffff1660e01b815260040161347e91815260200190565b6020604051808303816000875af115801561349d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c1919061435d565b1561350e5760405162461bcd60e51b815260206004820152601560248201527f6d696e74696e672043546f6b656e204661696c65640000000000000000000000604482015260640161059a565b6001600160a01b03811663f8e51bcb61352d60608b0160408c01614132565b60e08b01353361354360408e0160208f01614132565b60405160e086901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039485166004820152602481019390935290831660448301529091166064820152608481018a905260a4016020604051808303816000875af11580156135c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e49190614323565b6131dd5760405162461bcd60e51b815260206004820152601960248201527f637573746f6469616c20696e697469617465206661696c656400000000000000604482015260640161059a565b600061363c8483611c5e565b60008181526001602052604090205490915060a08501359061365e90856144ff565b11156136ac5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906136ca9084906144ff565b909155506000905060a08501356136e560c087013586614517565b6136ef9190614554565b905060006137036060870160408801614132565b9050613724813361371a60408a0160208b01614132565b611fa2868a61458f565b6004546000906137389061ffff1684614554565b905061374682333084611df8565b6001600160a01b037f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce166365a963aa61378560608a0160408b01614132565b60e08a013561379a60408c0160208d01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810189905260a4016020604051808303816000875af1158015613815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138399190614323565b6138855760405162461bcd60e51b815260206004820152601760248201527f7a63546f6b656e2065786368616e6765206661696c6564000000000000000000604482015260640161059a565b336138966040890160208a01614132565b6001600160a01b031688357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef876138d360808d0160608e016145a6565b6138e360a08e0160808f016145a6565b604080519384529115156020840152151590820152606081018b90526080810188905260a001612196565b600061391a8483611c5e565b60008181526001602052604090205490915060c08501359061393c90856144ff565b111561398a5760405162461bcd60e51b815260206004820152601f60248201527f74616b657220616d6f756e74203e20617661696c61626c6520766f6c756d6500604482015260640161059a565b600081815260016020526040812080548592906139a89084906144ff565b909155506139d890506139c16060860160408701614132565b336139d26040880160208901614132565b86611df8565b7f00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce600060c0860135613a0e60a088013587614517565b613a189190614554565b90506001600160a01b03821663bddbfbe4613a396060890160408a01614132565b60e0890135613a4e60408b0160208c01614132565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152602481019290925290911660448201523360648201526084810184905260a4016020604051808303816000875af1158015613ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aed9190614323565b613b395760405162461bcd60e51b815260206004820152601560248201527f7661756c742065786368616e6765206661696c65640000000000000000000000604482015260640161059a565b600454600090613b5590640100000000900461ffff1683614554565b90506001600160a01b038316633cf9a4e3613b7660608a0160408b01614132565b60405160e083811b7fffffffff000000000000000000000000000000000000000000000000000000001682526001600160a01b03929092166004820152908a01356024820152336044820152606481018490526084016020604051808303816000875af1158015613beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0f9190614323565b613c5b5760405162461bcd60e51b815260206004820152601c60248201527f6e6f74696f6e616c20666565207472616e73666572206661696c656400000000604482015260640161059a565b33613c6c6040890160208a01614132565b6001600160a01b031688357f32bc401d77ffde781b234d480866e0c360e724770a30ea3299309f9171e400ef8761215f60808d0160608e016145a6565b6000803d83613cbc57806000803e806000fd5b8060208114613cd4578015613ce55760009250613cea565b816000803e60005115159250613cea565b600192505b50909392505050565b60007f7ddd38ab5ed1c16b61ca90eeb9579e29da1ba821cf42d8cdef8f30a31a6a41468235613d286040850160208601614132565b613d386060860160408701614132565b613d4860808701606088016145a6565b613d5860a08801608089016145a6565b8760a001358860c001358960e001358a6101000135604051602001613dd49a99989796959493929190998a5260208a01989098526001600160a01b0396871660408a01529490951660608801529115156080870152151560a086015260c085015260e08401919091526101008301526101208201526101400190565b604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a060408301351115613e675760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202273222076616c75650000000000604482015260640161059a565b613e7460208301836145c3565b60ff16601b1480613e945750613e8d60208301836145c3565b60ff16601c145b613ee05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964207369676e6174757265202276222076616c75650000000000604482015260640161059a565b600183613ef060208501856145c3565b604080516000815260208181018084529490945260ff9092168282015291850135606082015290840135608082015260a0016020604051602081039080840390855afa158015613f44573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151949350505050565b6001600160a01b0381168114613f8957600080fd5b50565b8035613f9781613f74565b919050565b600080600060608486031215613fb157600080fd5b8335613fbc81613f74565b95602085013595506040909401359392505050565b60008060408385031215613fe457600080fd5b8235613fef81613f74565b946020939093013593505050565b60008083601f84011261400f57600080fd5b50813567ffffffffffffffff81111561402757600080fd5b6020830191508360208260051b850101111561404257600080fd5b9250929050565b6000806000806040858703121561405f57600080fd5b843567ffffffffffffffff8082111561407757600080fd5b61408388838901613ffd565b9096509450602087013591508082111561409c57600080fd5b506140a987828801613ffd565b95989497509550505050565b6000602082840312156140c757600080fd5b5035919050565b6000808284036101808112156140e357600080fd5b610120808212156140f357600080fd5b84935060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee08301121561412657600080fd5b92959390920193505050565b60006020828403121561414457600080fd5b8135611df181613f74565b803561ffff81168114613f9757600080fd5b6000806040838503121561417457600080fd5b61417d8361414f565b915061418b6020840161414f565b90509250929050565b600060208083528351808285015260005b818110156141c1578581018301518582016040015282016141a5565b818111156141d3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f84011261421957600080fd5b50813567ffffffffffffffff81111561423157600080fd5b60208301915083602060608302850101111561404257600080fd5b6000806000806000806060878903121561426557600080fd5b863567ffffffffffffffff8082111561427d57600080fd5b818901915089601f83011261429157600080fd5b8135818111156142a057600080fd5b8a6020610120830285010111156142b657600080fd5b6020928301985096509088013590808211156142d157600080fd5b6142dd8a838b01613ffd565b909650945060408901359150808211156142f657600080fd5b5061430389828a01614207565b979a9699509497509295939492505050565b8015158114613f8957600080fd5b60006020828403121561433557600080fd5b8151611df181614315565b60006020828403121561435257600080fd5b8151611df181613f74565b60006020828403121561436f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614405576144056143a5565b5060010190565b604051610120810167ffffffffffffffff81118282101715614457577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b8035613f9781614315565b6000610120828403121561447b57600080fd5b61448361440c565b8235815261449360208401613f8c565b60208201526144a460408401613f8c565b60408201526144b56060840161445d565b60608201526144c66080840161445d565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508091505092915050565b60008219821115614512576145126143a5565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561454f5761454f6143a5565b500290565b60008261458a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000828210156145a1576145a16143a5565b500390565b6000602082840312156145b857600080fd5b8135611df181614315565b6000602082840312156145d557600080fd5b813560ff81168114611df157600080fdfea2646970667358221220ef13a69af84988ea5fbe4eedf2b1d197fa7ffe761e21cba8bddbabf9827e757364736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce0000000000000000000000003b983b701406010866bd68331aaed374fb9f50c9
-----Decoded View---------------
Arg [0] : m (address): 0x76A3F123c651CbE62c80dB5FE2539fb755DAfDCe
Arg [1] : v (address): 0x3b983B701406010866bD68331aAed374fb9f50C9
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000076a3f123c651cbe62c80db5fe2539fb755dafdce
Arg [1] : 0000000000000000000000003b983b701406010866bd68331aaed374fb9f50c9
Deployed Bytecode Sourcemap
157:23895:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20645:451;;;;;;:::i;:::-;;:::i;:::-;;;865:14:5;;858:22;840:41;;828:2;813:18;20645:451:4;;;;;;;;817:44;;859:2;817:44;;;;;1066:6:5;1054:19;;;1036:38;;1024:2;1009:18;817:44:4;892:188:5;22861:525:4;;;;;;:::i;:::-;;:::i;21397:524::-;;;;;;:::i;:::-;;:::i;19089:367::-;;;;;;:::i;:::-;;:::i;388:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2886:25:5;;;2874:2;2859:18;388:42:4;2740:177:5;263:42:4;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;753:36;;;;;;;;-1:-1:-1;;;;;3086:55:5;;;3068:74;;3056:2;3041:18;753:36:4;2922:226:5;16885:275:4;;;;;;:::i;:::-;;:::i;22133:522::-;;;;;;:::i;:::-;;:::i;18135:368::-;;;;;;:::i;:::-;;:::i;17249:114::-;;;;;;:::i;:::-;;:::i;531:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;19838:440;;;;;;:::i;:::-;;:::i;964:30::-;;;;;;:::i;:::-;;:::i;18658:204::-;;;;;;:::i;:::-;;:::i;17820:161::-;;;;;;:::i;:::-;;:::i;583:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9533:1270::-;;;;;;:::i;:::-;;:::i;718:31::-;;;;;677:37;;708:6;677:37;;2791:755;;;;;;:::i;:::-;;:::i;793:20::-;;;;;-1:-1:-1;;;;;793:20:4;;;17487:213;;;;;;:::i;:::-;;:::i;633:40::-;;;;;;;;;;;;;;;;;;;;;20645:451;20790:55;;;;;-1:-1:-1;;;;;7368:15:5;;;20790:55:4;;;7350:34:5;7400:18;;;7393:34;;;20831:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;20719:4:4;;20764:11;;20790:34;;;;;7261:19:5;;20790:55:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20782:105;;;;-1:-1:-1;;;20782:105:4;;8108:2:5;20782:105:4;;;8090:21:5;8147:2;8127:18;;;8120:30;8186:34;8166:18;;;8159:62;8257:7;8237:18;;;8230:35;8282:19;;20782:105:4;;;;;;;;;20914:26;;;;;-1:-1:-1;;;;;8504:55:5;;;20914:26:4;;;8486:74:5;8576:18;;;8569:34;;;20893:18:4;;20914:20;;;;;;8459:18:5;;20914:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20955:38;;;;;;;;2886:25:5;;;20893:47:4;;-1:-1:-1;;;;;;20955:35:4;;;;;2859:18:5;;20955:38:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;20946:83;;;;-1:-1:-1;;;20946:83:4;;9261:2:5;20946:83:4;;;9243:21:5;9300:2;9280:18;;;9273:30;9339:27;9319:18;;;9312:55;9384:18;;20946:83:4;9059:349:5;20946:83:4;21035:38;21055:1;21059:10;21071:1;21035:13;:38::i;:::-;-1:-1:-1;21087:4:4;;20645:451;-1:-1:-1;;;;;20645:451:4:o;22861:525::-;23075:47;;;;;-1:-1:-1;;;;;9694:15:5;;;23075:47:4;;;9676:34:5;9726:18;;;9719:34;;;23116:4:4;9769:18:5;;;9762:43;22936:4:4;;22981:11;;22936:4;;23075:26;;;;;;9588:18:5;;23075:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23182:26;;;;;-1:-1:-1;;;;;8504:55:5;;;23182:26:4;;;8486:74:5;8576:18;;;8569:34;;;23056:66:4;;-1:-1:-1;23182:20:4;;;;;;8459:18:5;;23182:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23175:51:4;;23227:8;23175:61;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;23175:61:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;23167:105;;;;-1:-1:-1;;;23167:105:4;;10018:2:5;23167:105:4;;;10000:21:5;10057:2;10037:18;;;10030:30;10096:28;10076:18;;;10069:56;10142:18;;23167:105:4;9816:350:5;23167:105:4;-1:-1:-1;23377:4:4;;22861:525;-1:-1:-1;;;;22861:525:4:o;21397:524::-;21610:41;;;;;-1:-1:-1;;;;;7368:15:5;;;21610:41:4;;;7350:34:5;7400:18;;;7393:34;;;21637:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;21471:4:4;;21516:11;;21471:4;;21610:20;;;;;;7261:19:5;;21610:41:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21711:26;;;;;-1:-1:-1;;;;;8504:55:5;;;21711:26:4;;;8486:74:5;8576:18;;;8569:34;;;21591:60:4;;-1:-1:-1;21711:20:4;;;;;;8459:18:5;;21711:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21704:51:4;;21756:8;21704:61;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;21704:61:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;21696:105;;;;-1:-1:-1;;;21696:105:4;;10018:2:5;21696:105:4;;;10000:21:5;10057:2;10037:18;;;10030:30;10096:28;10076:18;;;10069:56;10142:18;;21696:105:4;9816:350:5;21696:105:4;21853:45;21873:1;21877:10;21889:8;21853:13;:45::i;19089:367::-;19180:5;;19196:4;;-1:-1:-1;;;;;19180:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;19222:1;19245:15;;::::1;19236:50;;;::::0;-1:-1:-1;;;19236:50:4;;10727:2:5;19236:50:4::1;::::0;::::1;10709:21:5::0;10766:2;10746:18;;;10739:30;10805:23;10785:18;;;10778:51;10846:18;;19236:50:4::1;10525:345:5::0;19236:50:4::1;19307:10;19293:11;19324:110;19344:3;19340:1;:7;19324:110;;;19362:12;19383:1;;19385;19383:4;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;19362:26;;19396:31;19409:6;19417:1;;19419;19417:4;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;19423:3;19396:12;:31::i;:::-;-1:-1:-1::0;19349:3:4;::::1;::::0;::::1;:::i;:::-;;;;19324:110;;;-1:-1:-1::0;19447:4:4::1;::::0;19089:367;-1:-1:-1;;;;;;;;19089:367:4:o;16885:275::-;16969:4;16981:12;16996:20;17011:1;17014;16996:14;:20::i;:::-;16981:35;-1:-1:-1;17045:7:4;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17031:21:4;:10;-1:-1:-1;;;;;17031:21:4;;17023:54;;;;-1:-1:-1;;;17023:54:4;;11655:2:5;17023:54:4;;;11637:21:5;11694:2;11674:18;;;11667:30;11733:22;11713:18;;;11706:50;11773:18;;17023:54:4;11453:344:5;17023:54:4;17084:9;:15;;;;;;;;;;;;:22;;;;17102:4;17084:22;;;17118:19;17125:5;;;17118:19;;;;17094:4;2886:25:5;;2874:2;2859:18;;2740:177;17118:19:4;;;;;;;;-1:-1:-1;17151:4:4;;16885:275;-1:-1:-1;;;16885:275:4:o;22133:522::-;22341:44;;;;;-1:-1:-1;;;;;9694:15:5;;;22341:44:4;;;9676:34:5;9726:18;;;9719:34;;;22374:10:4;9769:18:5;;;9762:43;22202:4:4;;22247:11;;22202:4;;22341:26;;;;;;9588:18:5;;22341:44:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22445:26;;;;;-1:-1:-1;;;;;8504:55:5;;;22445:26:4;;;8486:74:5;8576:18;;;8569:34;;;22322:63:4;;-1:-1:-1;22445:20:4;;;;;;8459:18:5;;22445:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22438:51:4;;22490:8;22438:61;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;22438:61:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;22430:105;;;;-1:-1:-1;;;22430:105:4;;10018:2:5;22430:105:4;;;10000:21:5;10057:2;10037:18;;;10030:30;10096:28;10076:18;;;10069:56;10142:18;;22430:105:4;9816:350:5;22430:105:4;22587:45;22607:1;22611:10;22623:8;22587:13;:45::i;18135:368::-;18184:5;;18200:4;;-1:-1:-1;;;;;18184:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;-1:-1:-1;;;;;18227:14:4;::::1;18212:12;18227:14:::0;;;:11:::1;:14;::::0;;;;;;18256:9;;;18247:46:::1;;;::::0;-1:-1:-1;;;18247:46:4;;12004:2:5;18247:46:4::1;::::0;::::1;11986:21:5::0;12043:2;12023:18;;;12016:30;12082:25;12062:18;;;12055:53;12125:18;;18247:46:4::1;11802:347:5::0;18247:46:4::1;18328:4;18309:15;:23;;18300:61;;;::::0;-1:-1:-1;;;18300:61:4;;12356:2:5;18300:61:4::1;::::0;::::1;12338:21:5::0;12395:2;12375:18;;;12368:30;12434:26;12414:18;;;12407:54;12478:18;;18300:61:4::1;12154:348:5::0;18300:61:4::1;-1:-1:-1::0;;;;;18368:14:4;;::::1;18385:1;18368:14:::0;;;:11:::1;:14;::::0;;;;;:18;;;;18442:5:::1;::::0;18449:30;;;;;18473:4:::1;18449:30;::::0;::::1;3068:74:5::0;18368:14:4;;18421:59:::1;::::0;18368:14;;18442:5;;::::1;::::0;18449:15:::1;::::0;3041:18:5;;18449:30:4::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18421:13;:59::i;17249:114::-:0;17303:5;;17319:4;;-1:-1:-1;;;;;17303:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;17331:5:::1;:9:::0;;-1:-1:-1;;;;;17331:9:4;::::1;::::0;;;::::1;;::::0;;;;-1:-1:-1;17249:114:4;;;;:::o;19838:440::-;19914:4;19947:1;19955:55;19947:1;19981:10;20001:4;20008:1;19955:17;:55::i;:::-;20082:26;;;;;-1:-1:-1;;;;;8504:55:5;;;20082:26:4;;;8486:74:5;8576:18;;;8569:34;;;20049:11:4;;20082:20;;;;;;8459:18:5;;20082:26:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20075:39:4;;20115:1;20075:42;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;20075:42:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;20067:81;;;;-1:-1:-1;;;20067:81:4;;12709:2:5;20067:81:4;;;12691:21:5;12748:2;12728:18;;;12721:30;12787:23;12767:18;;;12760:51;12828:18;;20067:81:4;12507:345:5;20067:81:4;20162:53;;;;;-1:-1:-1;;;;;7368:15:5;;;20162:53:4;;;7350:34:5;7400:18;;;7393:34;;;20201:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;20162:32:4;;;;;7261:19:5;;20162:53:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20154:101;;;;-1:-1:-1;;;20154:101:4;;13059:2:5;20154:101:4;;;13041:21:5;13098:2;13078:18;;;13071:30;13137:34;13117:18;;;13110:62;13208:5;13188:18;;;13181:33;13231:19;;20154:101:4;12857:399:5;964:30:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18658:204::-;18714:5;;18730:4;;-1:-1:-1;;;;;18714:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;859:2:::1;18750:21;::::0;::::1;;;18742:46;;;::::0;-1:-1:-1;;;18742:46:4;;13463:2:5;18742:46:4::1;::::0;::::1;13445:21:5::0;13502:2;13482:18;;;13475:30;13541:14;13521:18;;;13514:42;13573:18;;18742:46:4::1;13261:336:5::0;18742:46:4::1;18814:1;18795:13;18809:1;18795:16;;;;;;;;;:::i;:::-;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;18837:1;18827:12;;18834:1;18827:12;;;;;;;;;;;;-1:-1:-1::0;18853:4:4::1;::::0;18658:204;-1:-1:-1;;;18658:204:4:o;17820:161::-;17876:5;;17892:4;;-1:-1:-1;;;;;17876:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;-1:-1:-1;;;;;17906:14:4;::::1;17923:1;17906:14:::0;;;:11:::1;:14;::::0;;;;;:18;;;17938;::::1;::::0;17923:1;17938:18:::1;-1:-1:-1::0;17972:4:4::1;::::0;17820:161;-1:-1:-1;;17820:161:4:o;9533:1270::-;9641:4;9667:1;9641:4;9777:1004;9797:3;9793:1;:7;9777:1004;;;9815:23;9841:1;;9843;9841:4;;;;;;;:::i;:::-;;;;;;9815:30;;;;;;;;;;:::i;:::-;;;9908:5;:10;;;9903:869;;10016:5;:11;;;10011:346;;10126:51;10160:1;;10162;10160:4;;;;;;;:::i;:::-;;;;;;10166:1;;10168;10166:4;;;;;;;:::i;:::-;;;;;;;10172:1;;10174;10172:4;;;;;;;:::i;:::-;;;;;;10126:33;:51::i;:::-;9903:869;;10011:346;10297:47;10327:1;;10329;10327:4;;;;;;;:::i;:::-;;;;;;10333:1;;10335;10333:4;;;;;;;:::i;:::-;;;;;;;10339:1;;10341;10339:4;;;;;;;:::i;:::-;;;;;;10297:29;:47::i;9903:869::-;10457:5;:11;;;10452:309;;10556:45;10584:1;;10586;10584:4;;;;;;;:::i;:::-;;;;;;10590:1;;10592;10590:4;;;;;;;:::i;:::-;;;;;;;10596:1;;10598;10596:4;;;;;;;:::i;:::-;;;;;;10556:27;:45::i;10452:309::-;10705:45;10733:1;;10735;10733:4;;;;;;;:::i;:::-;;;;;;10739:1;;10741;10739:4;;;;;;;:::i;:::-;;;;;;;10745:1;;10747;10745:4;;;;;;;:::i;:::-;;;;;;10705:27;:45::i;:::-;-1:-1:-1;9802:3:4;;;;:::i;:::-;;;;9777:1004;;2791:755;2903:4;2929:1;2903:4;3039:485;3059:3;3055:1;:7;3039:485;;;3077:23;3103:1;;3105;3103:4;;;;;;;:::i;:::-;;;;;;3077:30;;;;;;;;;;:::i;:::-;;;3120:5;:10;;;3115:403;;3147:5;:11;;;3142:176;;3172:53;3208:1;;3210;3208:4;;;;;;;:::i;:::-;;;;;;3214:1;;3216;3214:4;;;;;;;:::i;:::-;;;;;;;3220:1;;3222;3220:4;;;;;;;:::i;:::-;;;;;;3172:35;:53::i;:::-;3115:403;;3142:176;3254:53;3290:1;;3292;3290:4;;;;;;;:::i;:::-;;;;;;3296:1;;3298;3296:4;;;;;;;:::i;:::-;;;;;;;3302:1;;3304;3302:4;;;;;;;:::i;:::-;;;;;;3254:35;:53::i;3115:403::-;3347:5;:11;;;3342:168;;3372:51;3406:1;;3408;3406:4;;;;;;;:::i;:::-;;;;;;3412:1;;3414;3412:4;;;;;;;:::i;:::-;;;;;;;3418:1;;3420;3418:4;;;;;;;:::i;:::-;;;;;;3372:33;:51::i;3342:168::-;3452:47;3482:1;;3484;3482:4;;;;;;;:::i;:::-;;;;;;3488:1;;3490;3488:4;;;;;;;:::i;:::-;;;;;;;3494:1;;3496;3494:4;;;;;;;:::i;:::-;;;;;;3452:29;:47::i;:::-;-1:-1:-1;3064:3:4;;;;:::i;:::-;;;;3039:485;;17487:213;17546:5;;17562:4;;-1:-1:-1;;;;;17546:5:4;23993:10;:15;;23985:53;;;;-1:-1:-1;;;23985:53:4;;10373:2:5;23985:53:4;;;10355:21:5;10412:2;10392:18;;;10385:30;10451:27;10431:18;;;10424:55;10496:18;;23985:53:4;10171:349:5;23985:53:4;17574:12:::1;17589:22;708:6;17589:15;:22;:::i;:::-;-1:-1:-1::0;;;;;17617:14:4;::::1;;::::0;;;:11:::1;:14;::::0;;;;;;:21;;;17650:27;17574:37;;-1:-1:-1;17617:14:4;17650:27:::1;::::0;::::1;::::0;17574:37;2886:25:5;;2874:2;2859:18;;2740:177;1674:572:0;1871:8;;1866:2;1859:10;;;1849:31;1934:14;;1916:16;;;1906:43;;;;1977:2;1971:9;;2003:15;1987:32;;2033:16;;;2026:34;;;;2074:16;;;2067:37;;;;2131:2;2118:16;;2111:27;2165:3;2152:17;;2145:35;2214:3;2195:23;;;1674:572::o;1647:830:2:-;1711:11;1811:4;1805:11;1906:66;1897:7;1890:83;-1:-1:-1;;;;;2045:1:2;2041:50;2037:1;2028:7;2024:15;2017:75;2162:1;2157:2;2148:7;2144:16;2137:27;2415:1;2412;2408:2;2399:7;2396:1;2393;2386:5;2381:36;2371:46;;;2437:15;2445:6;2437:7;:15::i;:::-;2429:43;;;;-1:-1:-1;;;2429:43:2;;15319:2:5;2429:43:2;;;15301:21:5;15358:2;15338:18;;;15331:30;15397:17;15377:18;;;15370:45;15432:18;;2429:43:2;15117:339:5;2429:43:2;1705:772;1647:830;;;:::o;697:828::-;760:11;860:4;854:11;955:66;946:7;939:83;-1:-1:-1;;;;;1094:1:2;1090:50;1086:1;1077:7;1073:15;1066:75;1211:1;1206:2;1197:7;1193:16;1186:27;1464:1;1461;1457:2;1448:7;1445:1;1442;1435:5;1430:36;1420:46;;;1486:15;1494:6;1486:7;:15::i;:::-;1478:42;;;;-1:-1:-1;;;1478:42:2;;15663:2:5;1478:42:2;;;15645:21:5;15702:2;15682:18;;;15675:30;15741:16;15721:18;;;15714:44;15775:18;;1478:42:2;15461:338:5;23582:362:4;23679:7;23694:12;23709:13;23720:1;23709:10;:13::i;:::-;23738:9;:15;;;;;;;;;;;23694:28;;-1:-1:-1;23738:15:4;;23737:16;23729:44;;;;-1:-1:-1;;;23729:44:4;;16006:2:5;23729:44:4;;;15988:21:5;16045:2;16025:18;;;16018:30;16084:17;16064:18;;;16057:45;16119:18;;23729:44:4;15804:339:5;23729:44:4;23799:15;23787:1;:8;;;:27;;23779:53;;;;-1:-1:-1;;;23779:53:4;;16350:2:5;23779:53:4;;;16332:21:5;16389:2;16369:18;;;16362:30;16428:15;16408:18;;;16401:43;16461:18;;23779:53:4;16148:337:5;23779:53:4;2505:2:0;2499:9;2531:66;2515:83;;23882:6:4;2625:1:0;2612:15;;2605:26;2658:2;2645:16;;2638:27;;;2699:2;2680:22;;23857:42:4;;23897:1;23857:11;:42::i;:::-;-1:-1:-1;;;;;23846:53:4;:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23846:53:4;;23838:83;;;;-1:-1:-1;;;23838:83:4;;16692:2:5;23838:83:4;;;16674:21:5;16731:2;16711:18;;;16704:30;16770:19;16750:18;;;16743:47;16807:18;;23838:83:4;16490:341:5;23838:83:4;23935:4;23582:362;-1:-1:-1;;;23582:362:4:o;2627:975:2:-;2706:11;2806:4;2800:11;2901:66;2892:7;2885:83;-1:-1:-1;;;;;3040:1:2;3036:50;3032:1;3023:7;3019:15;3012:75;-1:-1:-1;;;;;3163:1:2;3159:50;3154:2;3145:7;3141:16;3134:76;3280:1;3275:2;3266:7;3262:16;3255:27;3535:1;3532;3527:3;3518:7;3515:1;3512;3505:5;3500:37;3490:47;;;3557:15;3565:6;3557:7;:15::i;:::-;3549:48;;;;-1:-1:-1;;;3549:48:2;;17038:2:5;3549:48:2;;;17020:21:5;17077:2;17057:18;;;17050:30;17116:22;17096:18;;;17089:50;17156:18;;3549:48:2;16836:344:5;3549:48:2;2700:902;2627:975;;;;:::o;11190:1012:4:-;11309:12;11324:20;11339:1;11342;11324:14;:20::i;:::-;11364:12;;;;:6;:12;;;;;;11309:35;;-1:-1:-1;11381:9:4;;;;;11360:16;;:1;:16;:::i;:::-;11359:31;;11351:75;;;;-1:-1:-1;;;11351:75:4;;17387:2:5;11351:75:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;11351:75:4;17185:355:5;11351:75:4;11433:12;;;;:6;:12;;;;;:17;;11449:1;;11433:12;:17;;11449:1;;11433:17;:::i;:::-;;;;-1:-1:-1;11464:12:4;;-1:-1:-1;11485:12:4;;;;;;;;:::i;:::-;11464:34;-1:-1:-1;11505:23:4;11551:9;;;;11532:15;11536:11;;;;11532:1;:15;:::i;:::-;11531:29;;;;:::i;:::-;11505:55;-1:-1:-1;11706:67:4;11724:6;11732:7;;;;;;;;:::i;:::-;11741:10;11753:19;11771:1;11753:15;:19;:::i;:::-;11706:17;:67::i;:::-;11856:13;:16;11824:11;;11838:34;;11856:16;;;;;11838:15;:34;:::i;:::-;11824:48;;11878:57;11896:6;11904:10;11924:4;11931:3;11878:17;:57::i;:::-;-1:-1:-1;;;;;11987:11:4;11975:43;;12019:12;;;;;;;;:::i;:::-;12033:10;;;;12045;12057:7;;;;;;;;:::i;:::-;11975:107;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;11975:107:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;18672:15;;;18652:18;;;18645:43;18704:19;;;18697:35;;;18418:19;;11975:107:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11967:143;;;;-1:-1:-1;;;11967:143:4;;18945:2:5;11967:143:4;;;18927:21:5;18984:2;18964:18;;;18957:30;19023:25;19003:18;;;18996:53;19066:18;;11967:143:4;18743:347:5;11967:143:4;12166:10;12140:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12122:75:4;12127:5;;12122:75;12134:4;12149:7;;;;;;;;:::i;:::-;12158:6;;;;;;;;:::i;:::-;12122:75;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;12122:75:4;;;;;;;;11303:899;;;;11190:1012;;;:::o;12571:927::-;12686:12;12701:20;12716:1;12719;12701:14;:20::i;:::-;12741:12;;;;:6;:12;;;;;;12686:35;;-1:-1:-1;12758:11:4;;;;;12737:16;;:1;:16;:::i;:::-;12736:33;;12728:77;;;;-1:-1:-1;;;12728:77:4;;17387:2:5;12728:77:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;12728:77:4;17185:355:5;12728:77:4;12816:12;;;;:6;:12;;;;;:17;;12832:1;;12816:12;:17;;12832:1;;12816:17;:::i;:::-;;;;-1:-1:-1;12848:12:4;;-1:-1:-1;12869:12:4;;;;;;;;:::i;:::-;12848:34;-1:-1:-1;12934:21:4;12976:11;;;;12959:13;12963:9;;;;12959:1;:13;:::i;:::-;12958:29;;;;:::i;:::-;12934:53;-1:-1:-1;12993:61:4;13011:6;13019:7;;;;;;;;:::i;:::-;13028:10;13040:13;12993:17;:61::i;:::-;13091:13;:16;13061:11;;13075:32;;13091:16;;;;;13075:13;:32;:::i;:::-;13061:46;;13169:57;13187:6;13195:10;13215:4;13222:3;13169:17;:57::i;:::-;-1:-1:-1;;;;;13303:11:4;13291:41;;13333:12;;;;;;;;:::i;:::-;13347:10;;;;13359;13371:7;;;;;;;;:::i;:::-;13291:91;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;13291:91:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;18672:15;;;18652:18;;;18645:43;18704:19;;;18697:35;;;18418:19;;13291:91:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13283:125;;;;-1:-1:-1;;;13283:125:4;;20031:2:5;13283:125:4;;;20013:21:5;20070:2;20050:18;;;20043:30;20109:23;20089:18;;;20082:51;20150:18;;13283:125:4;19829:345:5;13859:1232:4;13972:12;13987:20;14002:1;14005;13987:14;:20::i;:::-;14027:12;;;;:6;:12;;;;;;13972:35;;-1:-1:-1;14044:11:4;;;;;14023:16;;:1;:16;:::i;:::-;14022:33;;14014:77;;;;-1:-1:-1;;;14014:77:4;;17387:2:5;14014:77:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;14014:77:4;17185:355:5;14014:77:4;14098:12;;;;:6;:12;;;;;:17;;14114:1;;14098:12;:17;;14114:1;;14098:17;:::i;:::-;;;;-1:-1:-1;14209:11:4;;-1:-1:-1;14176:18:4;-1:-1:-1;;;;;14248:20:4;;;14269:12;;;;;;;;:::i;:::-;14248:46;;14283:10;14248:46;;;;;;;-1:-1:-1;;;;;8504:55:5;;;;14248:46:4;;;8486:74:5;14283:10:4;;;;8576:18:5;;;8569:34;8459:18;;14248:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14309:38;;;;;;;;2886:25:5;;;14227:67:4;;-1:-1:-1;;;;;;14309:35:4;;;;;2859:18:5;;14309:38:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;14300:83;;;;-1:-1:-1;;;14300:83:4;;9261:2:5;14300:83:4;;;9243:21:5;9300:2;9280:18;;;9273:30;9339:27;9319:18;;;9312:55;9384:18;;14300:83:4;9059:349:5;14300:83:4;14390:12;14411;;;;;;;;:::i;:::-;14390:34;-1:-1:-1;14546:21:4;14588:11;;;;14571:13;14575:9;;;;14571:1;:13;:::i;:::-;14570:29;;;;:::i;:::-;14546:53;-1:-1:-1;14605:49:4;14619:6;14627:7;;;;;;;;:::i;:::-;14636:17;14640:13;14636:1;:17;:::i;14605:49::-;14742:13;:16;14712:11;;14726:32;;14742:16;;;;;14726:13;:32;:::i;:::-;14712:46;-1:-1:-1;14764:54:4;14778:6;14786:10;14798:19;14712:46;14798:13;:19;:::i;14764:54::-;-1:-1:-1;;;;;14905:20:4;;;14926:12;;;;;;;;:::i;:::-;14940:10;;;;14952:7;;;;;;;;:::i;:::-;14905:70;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;14905:70:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;14961:10:4;18652:18:5;;;18645:43;18704:19;;;18697:35;;;18418:19;;14905:70:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14897:104;;;;-1:-1:-1;;;14897:104:4;;20381:2:5;14897:104:4;;;20363:21:5;20420:2;20400:18;;;20393:30;20459:23;20439:18;;;20432:51;20500:18;;14897:104:4;20179:345:5;14897:104:4;15057:10;15031:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15013:73:4;15018:1;:5;;;15013:73;15025:4;15040:1;:7;;;;;;;;;;:::i;:::-;15049:1;:6;;;;;;;;;;:::i;:::-;15013:73;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;15013:73:4;;;;;;;;13966:1125;;;;;;13859:1232;;;:::o;15469:1228::-;15582:12;15597:20;15612:1;15615;15597:14;:20::i;:::-;15637:12;;;;:6;:12;;;;;;15582:35;;-1:-1:-1;15654:9:4;;;;;15633:16;;:1;:16;:::i;:::-;15632:31;;15624:75;;;;-1:-1:-1;;;15624:75:4;;17387:2:5;15624:75:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;15624:75:4;17185:355:5;15624:75:4;15710:12;;;;:6;:12;;;;;:17;;15726:1;;15710:12;:17;;15726:1;;15710:17;:::i;:::-;;;;-1:-1:-1;15821:11:4;;-1:-1:-1;15788:18:4;-1:-1:-1;;;;;15861:20:4;;;15882:12;;;;;;;;:::i;:::-;15861:46;;15896:10;15861:46;;;;;;;-1:-1:-1;;;;;8504:55:5;;;;15861:46:4;;;8486:74:5;15896:10:4;;;;8576:18:5;;;8569:34;8459:18;;15861:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15840:67;-1:-1:-1;15913:23:4;15959:9;;;;15940:15;15944:11;;;;15940:1;:15;:::i;:::-;15939:29;;;;:::i;:::-;15983:52;;;;;;;;2886:25:5;;;15913:55:4;;-1:-1:-1;;;;;;15983:35:4;;;;;2859:18:5;;15983:52:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;15974:97;;;;-1:-1:-1;;;15974:97:4;;9261:2:5;15974:97:4;;;9243:21:5;9300:2;9280:18;;;9273:30;9339:27;9319:18;;;9312:55;9384:18;;15974:97:4;9059:349:5;15974:97:4;16078:12;16099;;;;;;;;:::i;:::-;16269:13;:16;16078:34;;-1:-1:-1;16237:11:4;;16251:34;;16269:16;;;;;16251:15;:34;:::i;:::-;16237:48;-1:-1:-1;16291:60:4;16305:6;16313:10;16237:48;16325:19;16343:1;16325:15;:19;:::i;:::-;:25;;;;:::i;16291:60::-;16357:33;16371:6;16379:7;;;;;;;;:::i;:::-;16388:1;16357:13;:33::i;:::-;-1:-1:-1;;;;;16495:20:4;;;16516:12;;;;;;;;:::i;:::-;16530:1;:10;;;16542;16554:1;:7;;;;;;;;;;:::i;:::-;16495:84;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;16495:84:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;18672:15;;;18652:18;;;18645:43;18704:19;;;18697:35;;;18418:19;;16495:84:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16487:118;;;;-1:-1:-1;;;16487:118:4;;20381:2:5;16487:118:4;;;20363:21:5;20420:2;20400:18;;;20393:30;20459:23;20439:18;;;20432:51;20500:18;;16487:118:4;20179:345:5;16487:118:4;16661:10;16635:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16617:75:4;16622:1;:5;;;16617:75;16629:4;16644:1;:7;;;;;;;;;;:::i;:::-;16653:1;:6;;;;;;;;;;:::i;:::-;16617:75;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;16617:75:4;19341:483:5;3932:1345:4;4120:12;4135:20;4150:1;4153;4135:14;:20::i;:::-;4236:12;;;;:6;:12;;;;;;4120:35;;-1:-1:-1;4253:9:4;;;;;4232:16;;:1;:16;:::i;:::-;4231:31;;4223:75;;;;-1:-1:-1;;;4223:75:4;;17387:2:5;4223:75:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;4223:75:4;17185:355:5;4223:75:4;4309:12;;;;:6;:12;;;;;:17;;4325:1;;4309:12;:17;;4325:1;;4309:17;:::i;:::-;;;;-1:-1:-1;4367:12:4;;-1:-1:-1;4388:12:4;;;;;;;;:::i;:::-;4367:34;-1:-1:-1;4407:49:4;4367:34;4433:10;4445:7;;;;;;;;:::i;:::-;4454:1;4407:17;:49::i;:::-;4463:23;4509:9;;;;4490:15;4494:11;;;;4490:1;:15;:::i;:::-;4489:29;;;;:::i;:::-;4463:55;-1:-1:-1;4524:66:4;4542:6;4550:7;;;;;;;;:::i;:::-;4567:4;4574:15;4524:17;:66::i;:::-;4630:11;-1:-1:-1;;;;;4682:20:4;;;4703:12;;;;;;;;:::i;:::-;4682:46;;4717:10;4682:46;;;;;;;-1:-1:-1;;;;;8504:55:5;;;;4682:46:4;;;8486:74:5;4717:10:4;;;;8576:18:5;;;8569:34;8459:18;;4682:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4675:59:4;;4735:15;4675:76;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;4675:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:81;4667:115;;;;-1:-1:-1;;;4667:115:4;;20731:2:5;4667:115:4;;;20713:21:5;20770:2;20750:18;;;20743:30;20809:23;20789:18;;;20782:51;20850:18;;4667:115:4;20529:345:5;4667:115:4;-1:-1:-1;;;;;4821:24:4;;;4846:12;;;;;;;;:::i;:::-;4860:10;;;;4872:7;;;;;;;;:::i;:::-;4821:88;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;4821:88:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;4881:10:4;18652:18:5;;;18645:43;18704:19;;;18697:35;;;18418:19;;4821:88:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4813:126;;;;-1:-1:-1;;;4813:126:4;;21081:2:5;4813:126:4;;;21063:21:5;21120:2;21100:18;;;21093:30;21159:27;21139:18;;;21132:55;21204:18;;4813:126:4;20879:349:5;4813:126:4;5044:13;:16;5012:11;;5026:34;;5044:16;;;;;5026:15;:34;:::i;:::-;5012:48;-1:-1:-1;;;;;;5074:31:4;;;5106:12;;;;;;;;:::i;:::-;5074:74;;5120:10;5074:74;;;;;;;-1:-1:-1;;;;;7368:15:5;;;;5074:74:4;;;7350:34:5;5120:10:4;;;;7400:18:5;;;7393:34;5132:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;7261:19;;5074:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5066:115;;;;-1:-1:-1;;;5066:115:4;;21435:2:5;5066:115:4;;;21417:21:5;21474:2;21454:18;;;21447:30;21513;21493:18;;;21486:58;21561:18;;5066:115:4;21233:352:5;5066:115:4;5241:10;5215:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5193:79:4;5202:5;;5193:79;5209:4;5224:7;;;;;;;;:::i;:::-;5233:1;:6;;;;;;;;;;:::i;:::-;5193:79;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;5193:79:4;;;;;;;4047:1230;;;;;3932:1345;;;:::o;5651:1040::-;5772:12;5787:20;5802:1;5805;5787:14;:20::i;:::-;5827:12;;;;:6;:12;;;;;;5772:35;;-1:-1:-1;5844:11:4;;;;;5823:16;;:1;:16;:::i;:::-;5822:33;;5814:77;;;;-1:-1:-1;;;5814:77:4;;17387:2:5;5814:77:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;5814:77:4;17185:355:5;5814:77:4;5898:12;;;;:6;:12;;;;;:17;;5914:1;;5898:12;:17;;5914:1;;5898:17;:::i;:::-;;;;-1:-1:-1;5922:12:4;;-1:-1:-1;5943:12:4;;;;;;;;:::i;:::-;5922:34;-1:-1:-1;5963:21:4;6005:11;;;;5988:13;5992:9;;;;5988:1;:13;:::i;:::-;5987:29;;;;:::i;:::-;5963:53;-1:-1:-1;6022:61:4;6040:6;6048:7;;;;;;;;:::i;6022:61::-;6190:13;:16;6160:11;;6174:32;;6190:16;;6174:13;:32;:::i;:::-;6160:46;-1:-1:-1;6212:63:4;6230:6;6238:10;6258:4;6266:7;6160:46;6266:1;:7;:::i;6212:63::-;6315:11;-1:-1:-1;;;;;6367:20:4;;;6388:12;;;;;;;;:::i;:::-;6367:46;;6402:10;6367:46;;;;;;;-1:-1:-1;;;;;8504:55:5;;;;6367:46:4;;;8486:74:5;6402:10:4;;;;8576:18:5;;;8569:34;8459:18;;6367:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6360:59:4;;6420:1;6360:62;;;;;;;;;;;;;2886:25:5;;2874:2;2859:18;;2740:177;6360:62:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;6352:101;;;;-1:-1:-1;;;6352:101:4;;12709:2:5;6352:101:4;;;12691:21:5;12748:2;12728:18;;;12721:30;12787:23;12767:18;;;12760:51;12828:18;;6352:101:4;12507:345:5;6352:101:4;-1:-1:-1;;;;;6493:24:4;;;6518:12;;;;;;;;:::i;:::-;6532:10;;;;6544;6556:7;;;;;;;;:::i;:::-;6493:74;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;6493:74:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;18672:15;;;18652:18;;;18645:43;18704:19;;;18697:35;;;18418:19;;6493:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6485:112;;;;-1:-1:-1;;;6485:112:4;;21081:2:5;6485:112:4;;;21063:21:5;21120:2;21100:18;;;21093:30;21159:27;21139:18;;;21132:55;21204:18;;6485:112:4;20879:349:5;7064:866:4;7183:12;7198:20;7213:1;7216;7198:14;:20::i;:::-;7238:12;;;;:6;:12;;;;;;7183:35;;-1:-1:-1;7255:11:4;;;;;7234:16;;:1;:16;:::i;:::-;7233:33;;7225:77;;;;-1:-1:-1;;;7225:77:4;;17387:2:5;7225:77:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;7225:77:4;17185:355:5;7225:77:4;7309:12;;;;:6;:12;;;;;:17;;7325:1;;7309:12;:17;;7325:1;;7309:17;:::i;:::-;;;;-1:-1:-1;7333:21:4;;-1:-1:-1;7375:11:4;;;;7358:13;7362:9;;;;7358:1;:13;:::i;:::-;7357:29;;;;:::i;:::-;7333:53;-1:-1:-1;7393:12:4;7414;;;;;;;;:::i;:::-;7393:34;-1:-1:-1;7482:65:4;7393:34;7508:10;7520:7;;;;;;;;:::i;:::-;7529:17;7533:13;7529:1;:17;:::i;7482:65::-;7584:13;:16;7554:11;;7568:32;;7584:16;;7568:13;:32;:::i;:::-;7554:46;;7606:57;7624:6;7632:10;7652:4;7659:3;7606:17;:57::i;:::-;-1:-1:-1;;;;;7715:11:4;7703:43;;7747:12;;;;;;;;:::i;:::-;7761:10;;;;7773:7;;;;;;;;:::i;:::-;7703:93;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;7703:93:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;7782:10:4;18652:18:5;;;18645:43;18704:19;;;18697:35;;;18418:19;;7703:93:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7695:129;;;;-1:-1:-1;;;7695:129:4;;18945:2:5;7695:129:4;;;18927:21:5;18984:2;18964:18;;;18957:30;19023:25;19003:18;;;18996:53;19066:18;;7695:129:4;18743:347:5;7695:129:4;7896:10;7870:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7848:77:4;7857:5;;7848:77;7864:4;7879:7;;;;;;;;:::i;:::-;7888:6;;;;;;;;:::i;:::-;7848:77;;;19588:25:5;;;19656:14;;19649:22;19644:2;19629:18;;19622:50;19715:14;19708:22;19688:18;;;19681:50;19762:2;19747:18;;19740:34;;;19805:3;19790:19;;19783:35;;;19575:3;19560:19;7848:77:4;19341:483:5;8306:912:4;8421:12;8436:20;8451:1;8454;8436:14;:20::i;:::-;8476:12;;;;:6;:12;;;;;;8421:35;;-1:-1:-1;8493:9:4;;;;;8472:16;;:1;:16;:::i;:::-;8471:31;;8463:75;;;;-1:-1:-1;;;8463:75:4;;17387:2:5;8463:75:4;;;17369:21:5;17426:2;17406:18;;;17399:30;17465:33;17445:18;;;17438:61;17516:18;;8463:75:4;17185:355:5;8463:75:4;8545:12;;;;:6;:12;;;;;:17;;8561:1;;8545:12;:17;;8561:1;;8545:17;:::i;:::-;;;;-1:-1:-1;8569:62:4;;-1:-1:-1;8593:12:4;;;;;;;;:::i;:::-;8608:10;8620:7;;;;;;;;:::i;:::-;8629:1;8569:17;:62::i;:::-;8671:11;8638:18;8735:9;;;;8716:15;8720:11;;;;8716:1;:15;:::i;:::-;8715:29;;;;:::i;:::-;8689:55;-1:-1:-1;;;;;;8783:23:4;;;8807:12;;;;;;;;:::i;:::-;8821:10;;;;8833:7;;;;;;;;:::i;:::-;8783:87;;;;;;;;;;-1:-1:-1;;;;;18525:15:5;;;8783:87:4;;;18507:34:5;18557:18;;;18550:34;;;;18620:15;;;18600:18;;;18593:43;8842:10:4;18652:18:5;;;18645:43;18704:19;;;18697:35;;;18418:19;;8783:87:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8775:121;;;;-1:-1:-1;;;8775:121:4;;20031:2:5;8775:121:4;;;20013:21:5;20070:2;20050:18;;;20043:30;20109:23;20089:18;;;20082:51;20150:18;;8775:121:4;19829:345:5;8775:121:4;8985:13;:16;8953:11;;8967:34;;8985:16;;;;;8967:15;:34;:::i;:::-;8953:48;-1:-1:-1;;;;;;9015:31:4;;;9047:12;;;;;;;;:::i;:::-;9015:74;;9061:10;9015:74;;;;;;;-1:-1:-1;;;;;7368:15:5;;;;9015:74:4;;;7350:34:5;9061:10:4;;;;7400:18:5;;;7393:34;9073:10:4;7443:18:5;;;7436:43;7495:18;;;7488:34;;;7261:19;;9015:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9007:115;;;;-1:-1:-1;;;9007:115:4;;21435:2:5;9007:115:4;;;21417:21:5;21474:2;21454:18;;;21447:30;21513;21493:18;;;21486:58;21561:18;;9007:115:4;21233:352:5;9007:115:4;9182:10;9156:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9134:79:4;9143:5;;9134:79;9150:4;9165:7;;;;;;;;:::i;3804:847:2:-;3851:4;3863:11;3967:16;4032:1;4022:191;;4114:14;4111:1;4108;4093:36;4190:14;4187:1;4180:25;4022:191;4228:14;4254:2;4249:203;;;;4459:73;;;;4612:1;4602:11;;4221:400;;4249:203;4333:14;4330:1;4327;4312:36;4440:1;4434:8;4427:16;4420:24;4410:34;;4249:203;;4459:73;4523:1;4513:11;;4221:400;-1:-1:-1;4640:6:2;;3804:847;-1:-1:-1;;;3804:847:2:o;2764:300:0:-;2820:7;1437:66;2913:5;;2926:7;;;;;;;;:::i;:::-;2941:12;;;;;;;;:::i;:::-;2961:7;;;;;;;;:::i;:::-;2976:6;;;;;;;;:::i;:::-;2990:1;:11;;;3009:1;:9;;;3026:1;:10;;;3044:1;:8;;;2873:185;;;;;;;;;;;;;;;;21977:25:5;;;22033:2;22018:18;;22011:34;;;;-1:-1:-1;;;;;22142:15:5;;;22137:2;22122:18;;22115:43;22194:15;;;;22189:2;22174:18;;22167:43;22254:14;;22247:22;22241:3;22226:19;;22219:51;22314:14;22307:22;22301:3;22286:19;;22279:51;22361:3;22346:19;;22339:35;22405:3;22390:19;;22383:35;;;;22449:3;22434:19;;22427:35;22493:3;22478:19;;22471:35;21964:3;21949:19;;21590:922;2873:185:0;;;;;;;;;;;;;2863:196;;;;;;2856:203;;2764:300;;;:::o;412:477:3:-;486:7;677:66;669:3;;;;661:82;;653:122;;;;-1:-1:-1;;;653:122:3;;22719:2:5;653:122:3;;;22701:21:5;22758:2;22738:18;;;22731:30;22797:66;22777:18;;;22770:94;22881:18;;653:122:3;22517:388:5;653:122:3;789:3;;;;:1;:3;:::i;:::-;:9;;796:2;789:9;:22;;;-1:-1:-1;802:3:3;;;;:1;:3;:::i;:::-;:9;;809:2;802:9;789:22;781:62;;;;-1:-1:-1;;;781:62:3;;23386:2:5;781:62:3;;;23368:21:5;23425:2;23405:18;;;23398:30;23464:66;23444:18;;;23437:94;23548:18;;781:62:3;23184:388:5;781:62:3;857:27;867:1;870:3;;;;:1;:3;:::i;:::-;880;857:27;;;;;875:3;857:27;;;;;;23804:25:5;;;;23877:4;23865:17;;;23845:18;;;23838:45;875:3:3;;;;23899:18:5;;;23892:34;880:3:3;;;;23942:18:5;;;23935:34;23776:19;;857:27:3;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;857:27:3;;;;;;412:477;-1:-1:-1;;;;412:477:3:o;14:154:5:-;-1:-1:-1;;;;;93:5:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;69:93;14:154;:::o;173:134::-;241:20;;270:31;241:20;270:31;:::i;:::-;173:134;;;:::o;312:383::-;389:6;397;405;458:2;446:9;437:7;433:23;429:32;426:52;;;474:1;471;464:12;426:52;513:9;500:23;532:31;557:5;532:31;:::i;:::-;582:5;634:2;619:18;;606:32;;-1:-1:-1;685:2:5;670:18;;;657:32;;312:383;-1:-1:-1;;;312:383:5:o;1085:315::-;1153:6;1161;1214:2;1202:9;1193:7;1189:23;1185:32;1182:52;;;1230:1;1227;1220:12;1182:52;1269:9;1256:23;1288:31;1313:5;1288:31;:::i;:::-;1338:5;1390:2;1375:18;;;;1362:32;;-1:-1:-1;;;1085:315:5:o;1405:367::-;1468:8;1478:6;1532:3;1525:4;1517:6;1513:17;1509:27;1499:55;;1550:1;1547;1540:12;1499:55;-1:-1:-1;1573:20:5;;1616:18;1605:30;;1602:50;;;1648:1;1645;1638:12;1602:50;1685:4;1677:6;1673:17;1661:29;;1745:3;1738:4;1728:6;1725:1;1721:14;1713:6;1709:27;1705:38;1702:47;1699:67;;;1762:1;1759;1752:12;1699:67;1405:367;;;;;:::o;1777:773::-;1899:6;1907;1915;1923;1976:2;1964:9;1955:7;1951:23;1947:32;1944:52;;;1992:1;1989;1982:12;1944:52;2032:9;2019:23;2061:18;2102:2;2094:6;2091:14;2088:34;;;2118:1;2115;2108:12;2088:34;2157:70;2219:7;2210:6;2199:9;2195:22;2157:70;:::i;:::-;2246:8;;-1:-1:-1;2131:96:5;-1:-1:-1;2334:2:5;2319:18;;2306:32;;-1:-1:-1;2350:16:5;;;2347:36;;;2379:1;2376;2369:12;2347:36;;2418:72;2482:7;2471:8;2460:9;2456:24;2418:72;:::i;:::-;1777:773;;;;-1:-1:-1;2509:8:5;-1:-1:-1;;;;1777:773:5:o;2555:180::-;2614:6;2667:2;2655:9;2646:7;2642:23;2638:32;2635:52;;;2683:1;2680;2673:12;2635:52;-1:-1:-1;2706:23:5;;2555:180;-1:-1:-1;2555:180:5:o;3153:469::-;3273:6;3281;3325:9;3316:7;3312:23;3355:3;3351:2;3347:12;3344:32;;;3372:1;3369;3362:12;3344:32;3395:3;3418:2;3414;3410:11;3407:31;;;3434:1;3431;3424:12;3407:31;3457:9;3447:19;;3559:2;3490:66;3486:2;3482:75;3478:84;3475:104;;;3575:1;3572;3565:12;3475:104;3153:469;;3598:18;;;;;-1:-1:-1;;;3153:469:5:o;3627:247::-;3686:6;3739:2;3727:9;3718:7;3714:23;3710:32;3707:52;;;3755:1;3752;3745:12;3707:52;3794:9;3781:23;3813:31;3838:5;3813:31;:::i;4064:159::-;4131:20;;4191:6;4180:18;;4170:29;;4160:57;;4213:1;4210;4203:12;4228:256;4294:6;4302;4355:2;4343:9;4334:7;4330:23;4326:32;4323:52;;;4371:1;4368;4361:12;4323:52;4394:28;4412:9;4394:28;:::i;:::-;4384:38;;4441:37;4474:2;4463:9;4459:18;4441:37;:::i;:::-;4431:47;;4228:256;;;;;:::o;4489:656::-;4601:4;4630:2;4659;4648:9;4641:21;4691:6;4685:13;4734:6;4729:2;4718:9;4714:18;4707:34;4759:1;4769:140;4783:6;4780:1;4777:13;4769:140;;;4878:14;;;4874:23;;4868:30;4844:17;;;4863:2;4840:26;4833:66;4798:10;;4769:140;;;4927:6;4924:1;4921:13;4918:91;;;4997:1;4992:2;4983:6;4972:9;4968:22;4964:31;4957:42;4918:91;-1:-1:-1;5061:2:5;5049:15;5066:66;5045:88;5030:104;;;;5136:2;5026:113;;4489:656;-1:-1:-1;;;4489:656:5:o;5150:389::-;5232:8;5242:6;5296:3;5289:4;5281:6;5277:17;5273:27;5263:55;;5314:1;5311;5304:12;5263:55;-1:-1:-1;5337:20:5;;5380:18;5369:30;;5366:50;;;5412:1;5409;5402:12;5366:50;5449:4;5441:6;5437:17;5425:29;;5512:3;5505:4;5497;5489:6;5485:17;5477:6;5473:30;5469:41;5466:50;5463:70;;;5529:1;5526;5519:12;5544:1327;5754:6;5762;5770;5778;5786;5794;5847:2;5835:9;5826:7;5822:23;5818:32;5815:52;;;5863:1;5860;5853:12;5815:52;5903:9;5890:23;5932:18;5973:2;5965:6;5962:14;5959:34;;;5989:1;5986;5979:12;5959:34;6027:6;6016:9;6012:22;6002:32;;6072:7;6065:4;6061:2;6057:13;6053:27;6043:55;;6094:1;6091;6084:12;6043:55;6134:2;6121:16;6160:2;6152:6;6149:14;6146:34;;;6176:1;6173;6166:12;6146:34;6236:7;6229:4;6219:6;6211;6207:19;6203:2;6199:28;6195:39;6192:52;6189:72;;;6257:1;6254;6247:12;6189:72;6288:4;6280:13;;;;-1:-1:-1;6312:6:5;-1:-1:-1;6356:20:5;;;6343:34;;6389:16;;;6386:36;;;6418:1;6415;6408:12;6386:36;6457:72;6521:7;6510:8;6499:9;6495:24;6457:72;:::i;:::-;6548:8;;-1:-1:-1;6431:98:5;-1:-1:-1;6636:2:5;6621:18;;6608:32;;-1:-1:-1;6652:16:5;;;6649:36;;;6681:1;6678;6671:12;6649:36;;6720:91;6803:7;6792:8;6781:9;6777:24;6720:91;:::i;:::-;5544:1327;;;;-1:-1:-1;5544:1327:5;;-1:-1:-1;5544:1327:5;;6830:8;;5544:1327;-1:-1:-1;;;5544:1327:5:o;7533:118::-;7619:5;7612:13;7605:21;7598:5;7595:32;7585:60;;7641:1;7638;7631:12;7656:245;7723:6;7776:2;7764:9;7755:7;7751:23;7747:32;7744:52;;;7792:1;7789;7782:12;7744:52;7824:9;7818:16;7843:28;7865:5;7843:28;:::i;8614:251::-;8684:6;8737:2;8725:9;8716:7;8712:23;8708:32;8705:52;;;8753:1;8750;8743:12;8705:52;8785:9;8779:16;8804:31;8829:5;8804:31;:::i;8870:184::-;8940:6;8993:2;8981:9;8972:7;8968:23;8964:32;8961:52;;;9009:1;9006;8999:12;8961:52;-1:-1:-1;9032:16:5;;8870:184;-1:-1:-1;8870:184:5:o;10875:::-;10927:77;10924:1;10917:88;11024:4;11021:1;11014:15;11048:4;11045:1;11038:15;11064:184;11116:77;11113:1;11106:88;11213:4;11210:1;11203:15;11237:4;11234:1;11227:15;11253:195;11292:3;11323:66;11316:5;11313:77;11310:103;;11393:18;;:::i;:::-;-1:-1:-1;11440:1:5;11429:13;;11253:195::o;13602:401::-;13669:2;13663:9;13711:3;13699:16;;13745:18;13730:34;;13766:22;;;13727:62;13724:242;;;13822:77;13819:1;13812:88;13923:4;13920:1;13913:15;13951:4;13948:1;13941:15;13724:242;13982:2;13975:22;13602:401;:::o;14008:128::-;14073:20;;14102:28;14073:20;14102:28;:::i;14141:838::-;14221:6;14274:3;14262:9;14253:7;14249:23;14245:33;14242:53;;;14291:1;14288;14281:12;14242:53;14317:17;;:::i;:::-;14370:9;14357:23;14350:5;14343:38;14413;14447:2;14436:9;14432:18;14413:38;:::i;:::-;14408:2;14401:5;14397:14;14390:62;14484:38;14518:2;14507:9;14503:18;14484:38;:::i;:::-;14479:2;14472:5;14468:14;14461:62;14555:35;14586:2;14575:9;14571:18;14555:35;:::i;:::-;14550:2;14543:5;14539:14;14532:59;14624:36;14655:3;14644:9;14640:19;14624:36;:::i;:::-;14618:3;14611:5;14607:15;14600:61;14722:3;14711:9;14707:19;14694:33;14688:3;14681:5;14677:15;14670:58;14789:3;14778:9;14774:19;14761:33;14755:3;14748:5;14744:15;14737:58;14856:3;14845:9;14841:19;14828:33;14822:3;14815:5;14811:15;14804:58;14881:3;14944:2;14933:9;14929:18;14916:32;14911:2;14904:5;14900:14;14893:56;;14968:5;14958:15;;;14141:838;;;;:::o;14984:128::-;15024:3;15055:1;15051:6;15048:1;15045:13;15042:39;;;15061:18;;:::i;:::-;-1:-1:-1;15097:9:5;;14984:128::o;17545:228::-;17585:7;17711:1;17643:66;17639:74;17636:1;17633:81;17628:1;17621:9;17614:17;17610:105;17607:131;;;17718:18;;:::i;:::-;-1:-1:-1;17758:9:5;;17545:228::o;17778:274::-;17818:1;17844;17834:189;;17879:77;17876:1;17869:88;17980:4;17977:1;17970:15;18008:4;18005:1;17998:15;17834:189;-1:-1:-1;18037:9:5;;17778:274::o;18057:125::-;18097:4;18125:1;18122;18119:8;18116:34;;;18130:18;;:::i;:::-;-1:-1:-1;18167:9:5;;18057:125::o;19095:241::-;19151:6;19204:2;19192:9;19183:7;19179:23;19175:32;19172:52;;;19220:1;19217;19210:12;19172:52;19259:9;19246:23;19278:28;19300:5;19278:28;:::i;22910:269::-;22967:6;23020:2;23008:9;22999:7;22995:23;22991:32;22988:52;;;23036:1;23033;23026:12;22988:52;23075:9;23062:23;23125:4;23118:5;23114:16;23107:5;23104:27;23094:55;;23145:1;23142;23135:12
Swarm Source
ipfs://ef13a69af84988ea5fbe4eedf2b1d197fa7ffe761e21cba8bddbabf9827e7573
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.