Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 20619960 | 208 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ImpermaxV3Borrowable
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/**
*Submitted for verification at uniscan.xyz on 2025-07-01
*/
// File: contracts\libraries\SafeMath.sol
pragma solidity =0.5.16;
// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, errorMessage);
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot underflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction underflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot underflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, errorMessage);
return c;
}
/**
* @dev Returns the integer division of two unsigned integers.
* Reverts on division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers.
* Reverts with custom message on division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: contracts\interfaces\IERC20.sol
pragma solidity >=0.5.0;
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}
// File: contracts\ImpermaxERC20.sol
pragma solidity =0.5.16;
contract ImpermaxERC20 is IERC20 {
using SafeMath for uint;
string public name;
string public symbol;
uint8 public decimals = 18;
uint public totalSupply;
mapping(address => uint) public balanceOf;
mapping(address => mapping(address => uint)) public allowance;
bytes32 public DOMAIN_SEPARATOR;
mapping(address => uint) public nonces;
constructor() public {}
function _setName(string memory _name, string memory _symbol) internal {
name = _name;
symbol = _symbol;
uint chainId;
assembly {
chainId := chainid
}
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(_name)),
keccak256(bytes("1")),
chainId,
address(this)
)
);
}
function _mint(address to, uint value) internal {
totalSupply = totalSupply.add(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(address(0), to, value);
}
function _burn(address from, uint value) internal {
balanceOf[from] = balanceOf[from].sub(value);
totalSupply = totalSupply.sub(value);
emit Transfer(from, address(0), value);
}
function _approve(address owner, address spender, uint value) private {
allowance[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _transfer(address from, address to, uint value) internal {
balanceOf[from] = balanceOf[from].sub(value, "ImpermaxERC20: TRANSFER_TOO_HIGH");
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(from, to, value);
}
function approve(address spender, uint value) external returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function transfer(address to, uint value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external returns (bool) {
if (allowance[from][msg.sender] != uint(-1)) {
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value, "ImpermaxERC20: TRANSFER_NOT_ALLOWED");
}
_transfer(from, to, value);
return true;
}
function _checkSignature(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s, bytes32 typehash) internal {
require(deadline >= block.timestamp, "ImpermaxERC20: EXPIRED");
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(typehash, owner, spender, value, nonces[owner]++, deadline))
)
);
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == owner, "ImpermaxERC20: INVALID_SIGNATURE");
}
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
_checkSignature(owner, spender, value, deadline, v, r, s, PERMIT_TYPEHASH);
_approve(owner, spender, value);
}
}
// File: contracts\interfaces\IPoolToken.sol
pragma solidity >=0.5.0;
interface IPoolToken {
/*** Impermax ERC20 ***/
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
/*** Pool Token ***/
event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens);
event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens);
event Sync(uint totalBalance);
function underlying() external view returns (address);
function factory() external view returns (address);
function totalBalance() external view returns (uint);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function exchangeRate() external returns (uint);
function mint(address minter) external returns (uint mintTokens);
function redeem(address redeemer) external returns (uint redeemAmount);
function skim(address to) external;
function sync() external;
function _setFactory() external;
}
// File: contracts\PoolToken.sol
pragma solidity =0.5.16;
contract PoolToken is IPoolToken, ImpermaxERC20 {
uint internal constant initialExchangeRate = 1e18;
address public underlying;
address public factory;
uint public totalBalance;
uint public constant MINIMUM_LIQUIDITY = 1000;
event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens);
event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens);
event Sync(uint totalBalance);
/*** Initialize ***/
// called once by the factory
function _setFactory() external {
require(factory == address(0), "PoolToken: FACTORY_ALREADY_SET");
factory = msg.sender;
}
/*** PoolToken ***/
function _update() internal {
totalBalance = IERC20(underlying).balanceOf(address(this));
emit Sync(totalBalance);
}
function exchangeRate() public returns (uint)
{
uint _totalSupply = totalSupply; // gas savings
uint _totalBalance = totalBalance; // gas savings
if (_totalSupply == 0 || _totalBalance == 0) return initialExchangeRate;
return _totalBalance.mul(1e18).div(_totalSupply);
}
// this low-level function should be called from another contract
function mint(address minter) external nonReentrant update returns (uint mintTokens) {
uint balance = IERC20(underlying).balanceOf(address(this));
uint mintAmount = balance.sub(totalBalance);
mintTokens = mintAmount.mul(1e18).div(exchangeRate());
if(totalSupply == 0) {
// permanently lock the first MINIMUM_LIQUIDITY tokens
mintTokens = mintTokens.sub(MINIMUM_LIQUIDITY);
_mint(address(0), MINIMUM_LIQUIDITY);
}
require(mintTokens > 0, "PoolToken: MINT_AMOUNT_ZERO");
_mint(minter, mintTokens);
emit Mint(msg.sender, minter, mintAmount, mintTokens);
}
// this low-level function should be called from another contract
function redeem(address redeemer) external nonReentrant update returns (uint redeemAmount) {
uint redeemTokens = balanceOf[address(this)];
redeemAmount = redeemTokens.mul(exchangeRate()).div(1e18);
require(redeemAmount > 0, "PoolToken: REDEEM_AMOUNT_ZERO");
require(redeemAmount <= totalBalance, "PoolToken: INSUFFICIENT_CASH");
_burn(address(this), redeemTokens);
_safeTransfer(redeemer, redeemAmount);
emit Redeem(msg.sender, redeemer, redeemAmount, redeemTokens);
}
// force real balance to match totalBalance
function skim(address to) external nonReentrant {
_safeTransfer(to, IERC20(underlying).balanceOf(address(this)).sub(totalBalance));
}
// force totalBalance to match real balance
function sync() external nonReentrant update {}
/*** Utilities ***/
// same safe transfer function used by UniSwapV2 (with fixed underlying)
bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)")));
function _safeTransfer(address to, uint amount) internal {
require(underlying != address(0), "PoolToken: NOT_INITIALIZED");
(bool success, bytes memory data) = underlying.call(abi.encodeWithSelector(SELECTOR, to, amount));
require(success && (data.length == 0 || abi.decode(data, (bool))), "PoolToken: TRANSFER_FAILED");
}
// prevents a contract from calling itself, directly or indirectly.
bool internal _notEntered = true;
modifier nonReentrant() {
require(_notEntered, "PoolToken: REENTERED");
_notEntered = false;
_;
_notEntered = true;
}
// update totalBalance with current balance
modifier update() {
_;
_update();
}
}
// File: contracts\BStorage.sol
pragma solidity =0.5.16;
contract BStorage {
address public collateral;
mapping (address => mapping (address => uint256)) public borrowAllowance;
struct BorrowSnapshot {
uint112 principal; // amount in underlying when the borrow was last updated
uint112 interestIndex; // borrow index when borrow was last updated
}
mapping(uint256 => BorrowSnapshot) internal borrowBalances;
// use one memory slot
uint112 public borrowIndex = 1e18;
uint112 public totalBorrows;
uint32 public accrualTimestamp = uint32(block.timestamp % 2**32);
uint public exchangeRateLast;
// use one memory slot
uint48 public borrowRate;
uint48 public kinkBorrowRate = 6.3419584e9; //20% per year
uint32 public rateUpdateTimestamp = uint32(block.timestamp % 2**32);
uint public reserveFactor = 0.10e18; //10%
uint public kinkUtilizationRate = 0.75e18; //75%
uint public adjustSpeed = 5.787037e12; //50% per day
uint public debtCeiling = uint(-1);
function safe112(uint n) internal pure returns (uint112) {
require(n < 2**112, "Impermax: SAFE112");
return uint112(n);
}
}
// File: contracts\BAllowance.sol
pragma solidity =0.5.16;
contract BAllowance is PoolToken, BStorage {
event BorrowApproval(address indexed owner, address indexed spender, uint256 value);
function _borrowApprove(address owner, address spender, uint256 value) private {
borrowAllowance[owner][spender] = value;
emit BorrowApproval(owner, spender, value);
}
function borrowApprove(address spender, uint256 value) external returns (bool) {
_borrowApprove(msg.sender, spender, value);
return true;
}
function _checkBorrowAllowance(address owner, address spender, uint256 value) internal {
if (spender == owner) return;
uint _borrowAllowance = borrowAllowance[owner][spender];
if (_borrowAllowance == uint256(-1)) return;
require(_borrowAllowance >= value, "ImpermaxV3Borrowable: BORROW_NOT_ALLOWED");
borrowAllowance[owner][spender] = _borrowAllowance - value;
}
// keccak256("BorrowPermit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public constant BORROW_PERMIT_TYPEHASH = 0xf6d86ed606f871fa1a557ac0ba607adce07767acf53f492fb215a1a4db4aea6f;
function borrowPermit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
_checkSignature(owner, spender, value, deadline, v, r, s, BORROW_PERMIT_TYPEHASH);
_borrowApprove(owner, spender, value);
}
}
// File: contracts\BInterestRateModel.sol
pragma solidity =0.5.16;
contract BInterestRateModel is PoolToken, BStorage {
// When utilization is 100% borrowRate is kinkBorrowRate * KINK_MULTIPLIER
// kinkBorrowRate relative adjustment per second belongs to [1-adjustSpeed, 1+adjustSpeed*(KINK_MULTIPLIER-1)]
uint public constant KINK_MULTIPLIER = 2;
uint public constant KINK_BORROW_RATE_MAX = 792.744800e9; //2500% per year
uint public constant KINK_BORROW_RATE_MIN = 0.31709792e9; //1% per year
event AccrueInterest(uint interestAccumulated, uint borrowIndex, uint totalBorrows);
event CalculateKinkBorrowRate(uint kinkBorrowRate);
event CalculateBorrowRate(uint borrowRate);
function _calculateBorrowRate() internal {
uint _kinkUtilizationRate = kinkUtilizationRate;
uint _adjustSpeed = adjustSpeed;
uint _borrowRate = borrowRate;
uint _kinkBorrowRate = kinkBorrowRate;
uint32 _rateUpdateTimestamp = rateUpdateTimestamp;
// update kinkBorrowRate using previous borrowRate
uint32 timeElapsed = getBlockTimestamp() - _rateUpdateTimestamp; // underflow is desired
if(timeElapsed > 0) {
rateUpdateTimestamp = getBlockTimestamp();
uint adjustFactor;
if (_borrowRate < _kinkBorrowRate) {
// never overflows, _kinkBorrowRate is never 0
uint tmp = (_kinkBorrowRate - _borrowRate) * 1e18 / _kinkBorrowRate * _adjustSpeed * timeElapsed / 1e18;
adjustFactor = tmp > 1e18 ? 0 : 1e18 - tmp;
} else {
// never overflows, _kinkBorrowRate is never 0
uint tmp = (_borrowRate - _kinkBorrowRate) * 1e18 / _kinkBorrowRate * _adjustSpeed * timeElapsed / 1e18;
adjustFactor = tmp + 1e18;
}
// never overflows
_kinkBorrowRate = _kinkBorrowRate * adjustFactor / 1e18;
if(_kinkBorrowRate > KINK_BORROW_RATE_MAX) _kinkBorrowRate = KINK_BORROW_RATE_MAX;
if(_kinkBorrowRate < KINK_BORROW_RATE_MIN) _kinkBorrowRate = KINK_BORROW_RATE_MIN;
kinkBorrowRate = uint48(_kinkBorrowRate);
emit CalculateKinkBorrowRate(_kinkBorrowRate);
}
uint _utilizationRate;
{ // avoid stack to deep
uint _totalBorrows = totalBorrows; // gas savings
uint _actualBalance = totalBalance.add(_totalBorrows);
_utilizationRate = (_actualBalance == 0) ? 0 : _totalBorrows * 1e18 / _actualBalance;
}
// update borrowRate using the new kinkBorrowRate
if(_utilizationRate <= _kinkUtilizationRate) {
// never overflows, _kinkUtilizationRate is never 0
_borrowRate = _kinkBorrowRate * _utilizationRate / _kinkUtilizationRate;
} else {
// never overflows, _kinkUtilizationRate is always < 1e18
uint overUtilization = (_utilizationRate - _kinkUtilizationRate) * 1e18 / (1e18 - _kinkUtilizationRate);
// never overflows
_borrowRate = ((KINK_MULTIPLIER - 1) * overUtilization + 1e18) * _kinkBorrowRate / 1e18;
}
borrowRate = uint48(_borrowRate);
emit CalculateBorrowRate(_borrowRate);
}
// applies accrued interest to total borrows and reserves
function accrueInterest() public {
uint _borrowIndex = borrowIndex;
uint _totalBorrows = totalBorrows;
uint32 _accrualTimestamp = accrualTimestamp;
uint32 blockTimestamp = getBlockTimestamp();
if (_accrualTimestamp == blockTimestamp) return;
uint32 timeElapsed = blockTimestamp - _accrualTimestamp; // underflow is desired
accrualTimestamp = blockTimestamp;
uint interestFactor = uint(borrowRate).mul(timeElapsed);
uint interestAccumulated = interestFactor.mul(_totalBorrows).div(1e18);
_totalBorrows = _totalBorrows.add( interestAccumulated );
_borrowIndex = _borrowIndex.add( interestFactor.mul(_borrowIndex).div(1e18) );
borrowIndex = safe112(_borrowIndex);
totalBorrows = safe112(_totalBorrows);
emit AccrueInterest(interestAccumulated, _borrowIndex, _totalBorrows);
}
function getBlockTimestamp() public view returns (uint32) {
return uint32(block.timestamp % 2**32);
}
}
// File: contracts\interfaces\IFactory.sol
pragma solidity >=0.5.0;
interface IFactory {
event LendingPoolInitialized(address indexed nftlp, address indexed token0, address indexed token1,
address collateral, address borrowable0, address borrowable1, uint lendingPoolId);
event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);
event NewAdmin(address oldAdmin, address newAdmin);
event NewReservesPendingAdmin(address oldReservesPendingAdmin, address newReservesPendingAdmin);
event NewReservesAdmin(address oldReservesAdmin, address newReservesAdmin);
event NewReservesManager(address oldReservesManager, address newReservesManager);
function admin() external view returns (address);
function pendingAdmin() external view returns (address);
function reservesAdmin() external view returns (address);
function reservesPendingAdmin() external view returns (address);
function reservesManager() external view returns (address);
function getLendingPool(address nftlp) external view returns (
bool initialized,
uint24 lendingPoolId,
address collateral,
address borrowable0,
address borrowable1
);
function allLendingPools(uint) external view returns (address nftlp);
function allLendingPoolsLength() external view returns (uint);
function bDeployer() external view returns (address);
function cDeployer() external view returns (address);
function createCollateral(address nftlp) external returns (address collateral);
function createBorrowable0(address nftlp) external returns (address borrowable0);
function createBorrowable1(address nftlp) external returns (address borrowable1);
function initializeLendingPool(address nftlp) external;
function _setPendingAdmin(address newPendingAdmin) external;
function _acceptAdmin() external;
function _setReservesPendingAdmin(address newPendingAdmin) external;
function _acceptReservesAdmin() external;
function _setReservesManager(address newReservesManager) external;
}
// File: contracts\BSetter.sol
pragma solidity =0.5.16;
contract BSetter is PoolToken, BStorage {
uint public constant RESERVE_FACTOR_MAX = 0.20e18; //20%
uint public constant KINK_UR_MIN = 0.50e18; //50%
uint public constant KINK_UR_MAX = 0.99e18; //99%
uint public constant ADJUST_SPEED_MIN = 0.05787037e12; //0.5% per day
uint public constant ADJUST_SPEED_MAX = 57.87037e12; //500% per day
event NewReserveFactor(uint newReserveFactor);
event NewKinkUtilizationRate(uint newKinkUtilizationRate);
event NewAdjustSpeed(uint newAdjustSpeed);
event NewDebtCeiling(uint newDebtCeiling);
// called once by the factory at time of deployment
function _initialize (
string calldata _name,
string calldata _symbol,
address _underlying,
address _collateral
) external {
require(msg.sender == factory, "ImpermaxV3Borrowable: UNAUTHORIZED"); // sufficient check
_setName(_name, _symbol);
underlying = _underlying;
collateral = _collateral;
exchangeRateLast = initialExchangeRate;
}
function _setReserveFactor(uint newReserveFactor) external nonReentrant onlyAdmin {
_checkSetting(newReserveFactor, 0, RESERVE_FACTOR_MAX);
reserveFactor = newReserveFactor;
emit NewReserveFactor(newReserveFactor);
}
function _setKinkUtilizationRate(uint newKinkUtilizationRate) external nonReentrant onlyAdmin {
_checkSetting(newKinkUtilizationRate, KINK_UR_MIN, KINK_UR_MAX);
kinkUtilizationRate = newKinkUtilizationRate;
emit NewKinkUtilizationRate(newKinkUtilizationRate);
}
function _setAdjustSpeed(uint newAdjustSpeed) external nonReentrant onlyAdmin {
_checkSetting(newAdjustSpeed, ADJUST_SPEED_MIN, ADJUST_SPEED_MAX);
adjustSpeed = newAdjustSpeed;
emit NewAdjustSpeed(newAdjustSpeed);
}
function _setDebtCeiling(uint newDebtCeiling) external nonReentrant onlyAdmin {
debtCeiling = newDebtCeiling;
emit NewDebtCeiling(newDebtCeiling);
}
function _checkSetting(uint parameter, uint min, uint max) internal view {
require(parameter >= min, "ImpermaxV3Borrowable: INVALID_SETTING");
require(parameter <= max, "ImpermaxV3Borrowable: INVALID_SETTING");
}
modifier onlyAdmin() {
require(msg.sender == IFactory(factory).admin(), "ImpermaxV3Borrowable: UNAUTHORIZED");
_;
}
}
// File: contracts\interfaces\IBorrowable.sol
pragma solidity >=0.5.0;
interface IBorrowable {
/*** Impermax ERC20 ***/
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
/*** Pool Token ***/
event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens);
event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens);
event Sync(uint totalBalance);
function underlying() external view returns (address);
function factory() external view returns (address);
function totalBalance() external view returns (uint);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function exchangeRate() external returns (uint);
function mint(address minter) external returns (uint mintTokens);
function redeem(address redeemer) external returns (uint redeemAmount);
function skim(address to) external;
function sync() external;
function _setFactory() external;
/*** Borrowable ***/
event BorrowApproval(address indexed owner, address indexed spender, uint value);
event Borrow(address indexed sender, uint256 indexed tokenId, address indexed receiver, uint borrowAmount, uint repayAmount, uint accountBorrowsPrior, uint accountBorrows, uint totalBorrows);
event Liquidate(address indexed sender, uint256 indexed tokenId, address indexed liquidator, uint seizeTokenId, uint repayAmount, uint accountBorrowsPrior, uint accountBorrows, uint totalBorrows);
event RestructureDebt(uint256 indexed tokenId, uint reduceToRatio, uint repayAmount, uint accountBorrowsPrior, uint accountBorrows, uint totalBorrows);
function collateral() external view returns (address);
function reserveFactor() external view returns (uint);
function exchangeRateLast() external view returns (uint);
function borrowIndex() external view returns (uint);
function totalBorrows() external view returns (uint);
function borrowAllowance(address owner, address spender) external view returns (uint);
function borrowBalance(uint tokenId) external view returns (uint);
function currentBorrowBalance(uint tokenId) external returns (uint);
function BORROW_PERMIT_TYPEHASH() external pure returns (bytes32);
function borrowApprove(address spender, uint256 value) external returns (bool);
function borrowPermit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
function borrow(uint256 tokenId, address receiver, uint borrowAmount, bytes calldata data) external;
function liquidate(uint256 tokenId, uint repayAmount, address liquidator, bytes calldata data) external returns (uint seizeTokenId);
function restructureDebt(uint256 tokenId, uint256 reduceToRatio) external;
/*** Borrowable Interest Rate Model ***/
event AccrueInterest(uint interestAccumulated, uint borrowIndex, uint totalBorrows);
event CalculateKinkBorrowRate(uint kinkBorrowRate);
event CalculateBorrowRate(uint borrowRate);
function KINK_BORROW_RATE_MAX() external pure returns (uint);
function KINK_BORROW_RATE_MIN() external pure returns (uint);
function KINK_MULTIPLIER() external pure returns (uint);
function borrowRate() external view returns (uint);
function kinkBorrowRate() external view returns (uint);
function kinkUtilizationRate() external view returns (uint);
function adjustSpeed() external view returns (uint);
function rateUpdateTimestamp() external view returns (uint32);
function accrualTimestamp() external view returns (uint32);
function accrueInterest() external;
/*** Borrowable Setter ***/
event NewReserveFactor(uint newReserveFactor);
event NewKinkUtilizationRate(uint newKinkUtilizationRate);
event NewAdjustSpeed(uint newAdjustSpeed);
event NewDebtCeiling(uint newDebtCeiling);
function RESERVE_FACTOR_MAX() external pure returns (uint);
function KINK_UR_MIN() external pure returns (uint);
function KINK_UR_MAX() external pure returns (uint);
function ADJUST_SPEED_MIN() external pure returns (uint);
function ADJUST_SPEED_MAX() external pure returns (uint);
function _initialize (
string calldata _name,
string calldata _symbol,
address _underlying,
address _collateral
) external;
function _setReserveFactor(uint newReserveFactor) external;
function _setKinkUtilizationRate(uint newKinkUtilizationRate) external;
function _setAdjustSpeed(uint newAdjustSpeed) external;
}
// File: contracts\interfaces\ICollateral.sol
pragma solidity >=0.5.0;
interface ICollateral {
/* ImpermaxERC721 */
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool approved) external;
function permit(address spender, uint tokenId, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
/* Collateral */
event Mint(address indexed to, uint tokenId);
event Redeem(address indexed to, uint tokenId, uint percentage, uint redeemTokenId);
event Seize(address indexed to, uint tokenId, uint percentage, uint redeemTokenId);
event RestructureBadDebt(uint tokenId, uint postLiquidationCollateralRatio);
function underlying() external view returns (address);
function factory() external view returns (address);
function borrowable0() external view returns (address);
function borrowable1() external view returns (address);
function safetyMarginSqrt() external view returns (uint);
function liquidationIncentive() external view returns (uint);
function liquidationFee() external view returns (uint);
function liquidationPenalty() external view returns (uint);
function mint(address to, uint256 tokenId) external;
function redeem(address to, uint256 tokenId, uint256 percentage, bytes calldata data) external returns (uint redeemTokenId);
function redeem(address to, uint256 tokenId, uint256 percentage) external returns (uint redeemTokenId);
function isLiquidatable(uint tokenId) external returns (bool);
function isUnderwater(uint tokenId) external returns (bool);
function canBorrow(uint tokenId, address borrowable, uint accountBorrows) external returns (bool);
function restructureBadDebt(uint tokenId) external;
function seize(uint tokenId, uint repayAmount, address liquidator, bytes calldata data) external returns (uint seizeTokenId);
/* CSetter */
event NewSafetyMargin(uint newSafetyMarginSqrt);
event NewLiquidationIncentive(uint newLiquidationIncentive);
event NewLiquidationFee(uint newLiquidationFee);
function SAFETY_MARGIN_SQRT_MIN() external pure returns (uint);
function SAFETY_MARGIN_SQRT_MAX() external pure returns (uint);
function LIQUIDATION_INCENTIVE_MIN() external pure returns (uint);
function LIQUIDATION_INCENTIVE_MAX() external pure returns (uint);
function LIQUIDATION_FEE_MAX() external pure returns (uint);
function _setFactory() external;
function _initialize (
string calldata _name,
string calldata _symbol,
address _underlying,
address _borrowable0,
address _borrowable1
) external;
function _setSafetyMarginSqrt(uint newSafetyMarginSqrt) external;
function _setLiquidationIncentive(uint newLiquidationIncentive) external;
function _setLiquidationFee(uint newLiquidationFee) external;
}
// File: contracts\interfaces\IImpermaxCallee.sol
pragma solidity >=0.5.0;
interface IImpermaxCallee {
function impermaxV3Borrow(address sender, uint256 tokenId, uint borrowAmount, bytes calldata data) external;
function impermaxV3Redeem(address sender, uint256 tokenId, uint256 redeemTokenId, bytes calldata data) external;
}
// File: contracts\interfaces\IERC721.sol
pragma solidity >=0.5.0;
interface IERC721 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function nonces(uint256 tokenId) external view returns (uint256);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool approved) external;
function permit(address spender, uint tokenId, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}
// File: contracts\libraries\Math.sol
pragma solidity =0.5.16;
// a library for performing various math operations
// forked from: https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/libraries/Math.sol
library Math {
function min(uint x, uint y) internal pure returns (uint z) {
z = x < y ? x : y;
}
function max(uint x, uint y) internal pure returns (uint z) {
z = x > y ? x : y;
}
// babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
}
// File: contracts\ImpermaxV3Borrowable.sol
pragma solidity =0.5.16;
contract ImpermaxV3Borrowable is IBorrowable, PoolToken, BStorage, BSetter, BInterestRateModel, BAllowance {
constructor() public {}
/*** PoolToken ***/
function _update() internal {
super._update();
_calculateBorrowRate();
}
function _mintReserves(uint _exchangeRate, uint _totalSupply) internal returns (uint) {
uint _exchangeRateLast = exchangeRateLast;
if (_exchangeRate > _exchangeRateLast) {
uint _exchangeRateNew = _exchangeRate.sub( _exchangeRate.sub(_exchangeRateLast).mul(reserveFactor).div(1e18) );
uint liquidity = _totalSupply.mul(_exchangeRate).div(_exchangeRateNew).sub(_totalSupply);
if (liquidity > 0) {
address reservesManager = IFactory(factory).reservesManager();
_mint(reservesManager, liquidity);
}
exchangeRateLast = _exchangeRateNew;
return _exchangeRateNew;
}
else return _exchangeRate;
}
function exchangeRate() public accrue returns (uint) {
uint _totalSupply = totalSupply;
uint _actualBalance = totalBalance.add(totalBorrows);
if (_totalSupply == 0 || _actualBalance == 0) return initialExchangeRate;
uint _exchangeRate = _actualBalance.mul(1e18).div(_totalSupply);
return _mintReserves(_exchangeRate, _totalSupply);
}
// force totalBalance to match real balance
function sync() external nonReentrant update accrue {}
/*** Borrowable ***/
// this is the stored borrow balance; the current borrow balance may be slightly higher
function borrowBalance(uint256 tokenId) public view returns (uint) {
BorrowSnapshot memory borrowSnapshot = borrowBalances[tokenId];
if (borrowSnapshot.interestIndex == 0) return 0; // not initialized
return uint(borrowSnapshot.principal).mul(borrowIndex).div(borrowSnapshot.interestIndex);
}
function currentBorrowBalance(uint256 tokenId) external accrue returns (uint) {
return borrowBalance(tokenId);
}
function _updateBorrow(uint256 tokenId, uint borrowAmount, uint repayAmount) private returns (uint accountBorrowsPrior, uint accountBorrows, uint _totalBorrows) {
accountBorrowsPrior = borrowBalance(tokenId);
if (borrowAmount == repayAmount) return (accountBorrowsPrior, accountBorrowsPrior, totalBorrows);
uint112 _borrowIndex = borrowIndex;
if (borrowAmount > repayAmount) {
BorrowSnapshot storage borrowSnapshot = borrowBalances[tokenId];
uint increaseAmount = borrowAmount - repayAmount;
accountBorrows = accountBorrowsPrior.add(increaseAmount);
borrowSnapshot.principal = safe112(accountBorrows);
borrowSnapshot.interestIndex = _borrowIndex;
_totalBorrows = uint(totalBorrows).add(increaseAmount);
totalBorrows = safe112(_totalBorrows);
require(_totalBorrows <= debtCeiling, "ImpermaxV3Borrowable: TOTAL_BORROWS_ABOVE_DEBT_CEILING");
}
else {
BorrowSnapshot storage borrowSnapshot = borrowBalances[tokenId];
uint decreaseAmount = repayAmount - borrowAmount;
accountBorrows = accountBorrowsPrior > decreaseAmount ? accountBorrowsPrior - decreaseAmount : 0;
borrowSnapshot.principal = safe112(accountBorrows);
if(accountBorrows == 0) {
borrowSnapshot.interestIndex = 0;
} else {
borrowSnapshot.interestIndex = _borrowIndex;
}
uint actualDecreaseAmount = accountBorrowsPrior.sub(accountBorrows);
_totalBorrows = totalBorrows; // gas savings
_totalBorrows = _totalBorrows > actualDecreaseAmount ? _totalBorrows - actualDecreaseAmount : 0;
totalBorrows = safe112(_totalBorrows);
}
}
// this low-level function should be called from another contract
function borrow(uint256 tokenId, address receiver, uint borrowAmount, bytes calldata data) external nonReentrant update accrue {
uint _totalBalance = totalBalance;
require(borrowAmount <= _totalBalance, "ImpermaxV3Borrowable: INSUFFICIENT_CASH");
if (borrowAmount > 0) {
address borrower = IERC721(collateral).ownerOf(tokenId);
_checkBorrowAllowance(borrower, msg.sender, borrowAmount);
}
// optimistically transfer funds
if (borrowAmount > 0) _safeTransfer(receiver, borrowAmount);
if (data.length > 0) IImpermaxCallee(receiver).impermaxV3Borrow(msg.sender, tokenId, borrowAmount, data);
uint balance = IERC20(underlying).balanceOf(address(this));
uint repayAmount = balance.add(borrowAmount).sub(_totalBalance);
(uint accountBorrowsPrior, uint accountBorrows, uint _totalBorrows) = _updateBorrow(tokenId, borrowAmount, repayAmount);
if(borrowAmount > repayAmount) require(
ICollateral(collateral).canBorrow(tokenId, address(this), accountBorrows),
"ImpermaxV3Borrowable: INSUFFICIENT_LIQUIDITY"
);
emit Borrow(msg.sender, tokenId, receiver, borrowAmount, repayAmount, accountBorrowsPrior, accountBorrows, _totalBorrows);
}
// this low-level function should be called from another contract
function liquidate(uint256 tokenId, uint repayAmount, address liquidator, bytes calldata data) external nonReentrant update accrue returns (uint seizeTokenId) {
repayAmount = Math.min(repayAmount, borrowBalance(tokenId));
seizeTokenId = ICollateral(collateral).seize(tokenId, repayAmount, liquidator, data);
uint balance = IERC20(underlying).balanceOf(address(this));
require(balance.sub(totalBalance) >= repayAmount, "ImpermaxV3Borrowable: INSUFFICIENT_ACTUAL_REPAY");
(uint accountBorrowsPrior, uint accountBorrows, uint _totalBorrows) = _updateBorrow(tokenId, 0, repayAmount);
emit Liquidate(msg.sender, tokenId, liquidator, seizeTokenId, repayAmount, accountBorrowsPrior, accountBorrows, _totalBorrows);
}
// this function must be called from collateral
function restructureDebt(uint tokenId, uint reduceToRatio) public nonReentrant update accrue {
require(msg.sender == collateral, "ImpermaxV3Borrowable: UNAUTHORIZED");
require(reduceToRatio < 1e18, "ImpermaxV3Borrowable: NOT_UNDERWATER");
uint _borrowBalance = borrowBalance(tokenId);
if (_borrowBalance == 0) return;
uint repayAmount = _borrowBalance.sub(_borrowBalance.mul(reduceToRatio).div(1e18));
(uint accountBorrowsPrior, uint accountBorrows, uint _totalBorrows) = _updateBorrow(tokenId, 0, repayAmount);
emit RestructureDebt(tokenId, reduceToRatio, repayAmount, accountBorrowsPrior, accountBorrows, _totalBorrows);
}
modifier accrue() {
accrueInterest();
_;
}
}
// File: contracts\interfaces\IBDeployer.sol
pragma solidity >=0.5.0;
interface IBDeployer {
function deployBorrowable(address nftlp, uint8 index) external returns (address borrowable);
}
// File: contracts\BDeployer.sol
pragma solidity =0.5.16;
/*
* This contract is used by the Factory to deploy Borrowable(s)
* The bytecode would be too long to fit in the Factory
*/
contract BDeployer is IBDeployer {
constructor () public {}
function deployBorrowable(address nftlp, uint8 index) external returns (address borrowable) {
bytes memory bytecode = type(ImpermaxV3Borrowable).creationCode;
bytes32 salt = keccak256(abi.encodePacked(msg.sender, nftlp, index));
assembly {
borrowable := create2(0, add(bytecode, 32), mload(bytecode), salt)
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"interestAccumulated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"AccrueInterest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrowsPrior","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrows","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"Borrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"BorrowApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"borrowRate","type":"uint256"}],"name":"CalculateBorrowRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"kinkBorrowRate","type":"uint256"}],"name":"CalculateKinkBorrowRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"uint256","name":"seizeTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrowsPrior","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrows","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"Liquidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTokens","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAdjustSpeed","type":"uint256"}],"name":"NewAdjustSpeed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDebtCeiling","type":"uint256"}],"name":"NewDebtCeiling","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newKinkUtilizationRate","type":"uint256"}],"name":"NewKinkUtilizationRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newReserveFactor","type":"uint256"}],"name":"NewReserveFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reduceToRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrowsPrior","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrows","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"RestructureDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalBalance","type":"uint256"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"ADJUST_SPEED_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ADJUST_SPEED_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BORROW_PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"KINK_BORROW_RATE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"KINK_BORROW_RATE_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"KINK_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"KINK_UR_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"KINK_UR_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RESERVE_FACTOR_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address","name":"_collateral","type":"address"}],"name":"_initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newAdjustSpeed","type":"uint256"}],"name":"_setAdjustSpeed","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newDebtCeiling","type":"uint256"}],"name":"_setDebtCeiling","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"_setFactory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newKinkUtilizationRate","type":"uint256"}],"name":"_setKinkUtilizationRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newReserveFactor","type":"uint256"}],"name":"_setReserveFactor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"accrualTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"accrueInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"adjustSpeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"borrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"borrowAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"borrowApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"borrowBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"borrowIndex","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"borrowPermit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"borrowRate","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collateral","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"currentBorrowBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"debtCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"exchangeRateLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBlockTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kinkBorrowRate","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kinkUtilizationRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repayAmount","type":"uint256"},{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"seizeTokenId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"mintTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rateUpdateTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"redeemer","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"redeemAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reserveFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"reduceToRatio","type":"uint256"}],"name":"restructureDebt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sync","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalBorrows","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526002805460ff199081166012908117909255600b80549091166001179055600e80546001600160701b031916670de0b6b3a7640000176001600160e01b0316600160e01b4263ffffffff16908102919091179091556010805465ffffffffffff60301b19166a017a029b000000000000001763ffffffff60601b19166c0100000000000000000000000090920291909117905567016345785d8a0000601155670a688906bd8b000090556505436648e1406013556000196014553480156100ca57600080fd5b50614ad2806100da6000396000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c80636f307dc3116101e9578063b95b92a31161010f578063d505accf116100ad578063e12b63061161007c578063e12b630614610bbe578063e1c84ea414610bc6578063fca7820b14610bce578063fff6cae914610beb57610399565b8063d505accf14610b15578063d8dfeb4514610b73578063dd62ed3e14610b7b578063e076600014610bb657610399565b8063be340e32116100e9578063be340e3214610af5578063c45a015514610afd578063c72f3fbb14610b05578063c914b43714610b0d57610399565b8063b95b92a314610ab2578063ba9a7a5614610aba578063bc25cf7714610ac257610399565b806395a2251f11610187578063a9059cbb11610156578063a9059cbb14610a4c578063aa5af0fd14610a85578063ad7a672f14610a8d578063b388f73914610a9557610399565b806395a2251f146109ab57806395d89b41146109de5780639e79b55c146109e6578063a6afed9514610a4457610399565b80637ecebe00116101c35780637ecebe00146108ff57806391b4274514610932578063926d845b146109555780639292b0321461098e57610399565b80636f307dc31461087a57806370a08231146108ab578063796b89b9146108de57610399565b806330adf81f116102ce578063452ae95f1161026c578063685440651161023b57806368544065146107245780636a030c111461072c5780636a6278421461080c5780636bd76d241461083f57610399565b8063452ae95f146106e157806347bd3718146106e95780634a5d316c146107145780635b2b9d1a1461071c57610399565b8063380e2a8b116102a8578063380e2a8b14610691578063386a6579146106ae5780633ba0b9a9146106d15780634322b714146106d957610399565b806330adf81f14610663578063313ce5671461066b5780633644e5151461068957610399565b80631aebf12f1161033b578063253c24f311610315578063253c24f31461059d57806327549a0b146105a5578063299d377b146105c25780632d5231d31461065b57610399565b80631aebf12f1461054a5780632374e8a91461055257806323b872dd1461055a57610399565b8063095ea7b311610377578063095ea7b31461043d57806315f950fa1461048a5780631613d5961461052557806318160ddd1461054257610399565b806301f8c1c81461039e57806306fdde03146103b8578063075f4e7f14610435575b600080fd5b6103a6610bf3565b60408051918252519081900360200190f35b6103c0610c17565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fa5781810151838201526020016103e2565b50505050905090810190601f1680156104275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103a6610cc3565b6104766004803603604081101561045357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ccc565b604080519115158252519081900360200190f35b610523600480360360808110156104a057600080fd5b81359173ffffffffffffffffffffffffffffffffffffffff60208201351691604082013591908101906080810160608201356401000000008111156104e457600080fd5b8201836020820111156104f657600080fd5b8035906020019184600183028401116401000000008311171561051857600080fd5b509092509050610ce3565b005b6105236004803603602081101561053b57600080fd5b503561121c565b6103a661141f565b6103a6611425565b6103a661142b565b6104766004803603606081101561057057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135611437565b6103a6611530565b610523600480360360208110156105bb57600080fd5b503561153a565b6103a6600480360360808110156105d857600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff604083013516919081019060808101606082013564010000000081111561061c57600080fd5b82018360208201111561062e57600080fd5b8035906020019184600183028401116401000000008311171561065057600080fd5b509092509050611753565b6103a6611acf565b6103a6611ad5565b610673611af9565b6040805160ff9092168252519081900360200190f35b6103a6611b02565b6103a6600480360360208110156106a757600080fd5b5035611b08565b610523600480360360408110156106c457600080fd5b5080359060200135611b23565b6103a6611d93565b6103a6611e2c565b6103a6611e32565b6106f1611e3b565b604080516dffffffffffffffffffffffffffff9092168252519081900360200190f35b610523611e63565b6103a6611f14565b6103a6611f19565b6105236004803603608081101561074257600080fd5b81019060208101813564010000000081111561075d57600080fd5b82018360208201111561076f57600080fd5b8035906020019184600183028401116401000000008311171561079157600080fd5b9193909290916020810190356401000000008111156107af57600080fd5b8201836020820111156107c157600080fd5b803590602001918460018302840111640100000000831117156107e357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611f25565b6103a66004803603602081101561082257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612090565b6103a66004803603604081101561085557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661233e565b61088261235b565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103a6600480360360208110156108c157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612377565b6108e6612389565b6040805163ffffffff9092168252519081900360200190f35b6103a66004803603602081101561091557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612393565b61093a6123a5565b6040805165ffffffffffff9092168252519081900360200190f35b6104766004803603604081101561096b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356123bd565b610523600480360360208110156109a457600080fd5b50356123ca565b6103a6600480360360208110156109c157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125e8565b6103c061280c565b610523600480360360e08110156109fc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135612884565b6105236128c8565b61047660048036036040811015610a6257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b07565b6106f1612b14565b6103a6612b2a565b6103a660048036036020811015610aab57600080fd5b5035612b30565b6108e6612bcd565b6103a6612bf9565b61052360048036036020811015610ad857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612bff565b6103a6612d82565b610882612d88565b6103a6612da4565b61093a612db0565b610523600480360360e0811015610b2b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135612dbe565b610882612df9565b6103a660048036036040811015610b9157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612e1a565b6103a6612e37565b6108e6612e3f565b6103a6612e5b565b61052360048036036020811015610be457600080fd5b5035612e61565b610523613078565b7ff6d86ed606f871fa1a557ac0ba607adce07767acf53f492fb215a1a4db4aea6f81565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610cbb5780601f10610c9057610100808354040283529160200191610cbb565b820191906000526020600020905b815481529060010190602001808311610c9e57829003601f168201915b505050505081565b640d7957c4d081565b6000610cd933848461314e565b5060015b92915050565b600b5460ff16610d5457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610d846128c8565b600a5480841115610de0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806149df6027913960400191505060405180910390fd5b8315610e9857600b54604080517f6352211e000000000000000000000000000000000000000000000000000000008152600481018990529051600092610100900473ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b158015610e5d57600080fd5b505afa158015610e71573d6000803e3d6000fd5b505050506040513d6020811015610e8757600080fd5b50519050610e968133876131bd565b505b8315610ea857610ea885856132ee565b8115610f8a578473ffffffffffffffffffffffffffffffffffffffff16634c85e02933888787876040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050505b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d602081101561102557600080fd5b50519050600061104b8361103f848963ffffffff61357e16565b9063ffffffff6135f216565b9050600080600061105d8b8a86613634565b9250925092508389111561117157600b54604080517f27a0d11a000000000000000000000000000000000000000000000000000000008152600481018e905230602482015260448101859052905161010090920473ffffffffffffffffffffffffffffffffffffffff16916327a0d11a916064808201926020929091908290030181600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b505050506040513d602081101561111a57600080fd5b5051611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061491b602c913960400191505060405180910390fd5b604080518a8152602081018690528082018590526060810184905260808101839052905173ffffffffffffffffffffffffffffffffffffffff8c16918d9133917f146f75b60ce49b133863eae4193e997edc879111a08642fd5108f9784aef138f919081900360a00190a45050505050506111ea613962565b5050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050565b600b5460ff1661128d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600954604080517ff851a440000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163f851a44091600480820192602092909190829003018186803b15801561132057600080fd5b505afa158015611334573d6000803e3d6000fd5b505050506040513d602081101561134a57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1633146113b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b60148190556040805182815290517f9e88375210357aa5dbeb756c2deee5a1a487e6dcd9fa8f444eda3bc7df41a37b9181900360200190a150600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60035481565b60125481565b6706f05b59d3b2000081565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461151b576114e982604051806060016040528060238152602001614a066023913973ffffffffffffffffffffffffffffffffffffffff87166000908152600560209081526040808320338452909152902054919063ffffffff61397216565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b611526848484613a23565b5060019392505050565b6534a1fed8cc8081565b600b5460ff166115ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600954604080517ff851a440000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163f851a44091600480820192602092909190829003018186803b15801561163e57600080fd5b505afa158015611652573d6000803e3d6000fd5b505050506040513d602081101561166857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1633146116d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b6116ed81640d7957c4d06534a1fed8cc80613b38565b60138190556040805182815290517f1396dfcdb64fb7eb77fb84966f27b81afe14aa70b6e966c68d74af3302a9fe909181900360200190a150600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460009060ff166117c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556117f76128c8565b6118098561180488612b30565b613bea565b600b546040517f7fd3ac4f000000000000000000000000000000000000000000000000000000008152600481018981526024820184905273ffffffffffffffffffffffffffffffffffffffff88811660448401526080606484019081526084840188905294995061010090930490921692637fd3ac4f928a928a928a928a928a929060a401848480828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b1580156118cd57600080fd5b505af11580156118e1573d6000803e3d6000fd5b505050506040513d60208110156118f757600080fd5b5051600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561197057600080fd5b505afa158015611984573d6000803e3d6000fd5b505050506040513d602081101561199a57600080fd5b5051600a5490915086906119b590839063ffffffff6135f216565b1015611a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614a4d602f913960400191505060405180910390fd5b6000806000611a1d8a60008b613634565b60408051898152602081018e905280820185905260608101849052608081018390529051939650919450925073ffffffffffffffffffffffffffffffffffffffff8a16918c9133917f0b7a7a59dfdfb7e213d06e4747a57bc8d9debf7ac41adfb50d56a8b503fec3559181900360a00190a450505050611a9b613962565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905595945050505050565b60135481565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b6000611b126128c8565b611b1b82612b30565b90505b919050565b600b5460ff16611b9457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611bc46128c8565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff163314611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b670de0b6b3a76400008110611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a296024913960400191505060405180910390fd5b6000611ca483612b30565b905080611cb15750611d5c565b6000611ceb611cde670de0b6b3a7640000611cd2858763ffffffff613c0016565b9063ffffffff613c7316565b839063ffffffff6135f216565b90506000806000611cfe87600086613634565b604080518a81526020810189905280820185905260608101849052608081018390529051939650919450925088917f965da1d1e29951d89d7c1c523c77aeeb7aeae975d46af1f25e6491d9a6aac4fc9181900360a00190a250505050505b611d64613962565b5050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000611d9d6128c8565b600354600e54600a54600091611dd591906e01000000000000000000000000000090046dffffffffffffffffffffffffffff1661357e565b9050811580611de2575080155b15611df957670de0b6b3a764000092505050611e29565b6000611e1783611cd284670de0b6b3a764000063ffffffff613c0016565b9050611e238184613cb5565b93505050505b90565b60115481565b64b89345af0081565b600e546e01000000000000000000000000000090046dffffffffffffffffffffffffffff1681565b60095473ffffffffffffffffffffffffffffffffffffffff1615611ee857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f506f6f6c546f6b656e3a20464143544f52595f414c52454144595f5345540000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b600281565b670dbd2fc137a3000081565b60095473ffffffffffffffffffffffffffffffffffffffff163314611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b61200886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881529250889150879081908401838280828437600092019190915250613de792505050565b6008805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055600b805491909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9091161790555050670de0b6b3a7640000600f555050565b600b5460009060ff1661210457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561219d57600080fd5b505afa1580156121b1573d6000803e3d6000fd5b505050506040513d60208110156121c757600080fd5b5051600a549091506000906121e390839063ffffffff6135f216565b90506122086121f0611d93565b611cd283670de0b6b3a764000063ffffffff613c0016565b92506003546000141561223657612227836103e863ffffffff6135f216565b925061223660006103e8613ecb565b600083116122a557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f506f6f6c546f6b656e3a204d494e545f414d4f554e545f5a45524f0000000000604482015290519081900360640190fd5b6122af8484613ecb565b6040805182815260208101859052815173ffffffffffffffffffffffffffffffffffffffff87169233927f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee929081900390910190a3505061230e613962565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b600c60209081526000928352604080842090915290825290205481565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b63ffffffff421690565b60076020526000908152604090205481565b6010546601000000000000900465ffffffffffff1681565b6000610cd9338484613f7c565b600b5460ff1661243b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600954604080517ff851a440000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163f851a44091600480820192602092909190829003018186803b1580156124ce57600080fd5b505afa1580156124e2573d6000803e3d6000fd5b505050506040513d60208110156124f857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff163314612567576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b612582816706f05b59d3b20000670dbd2fc137a30000613b38565b60128190556040805182815290517f7a550b1995ff63260fb313f12024e66e73bad425372e5af6b1e04cb3799ef38c9181900360200190a150600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460009060ff1661265c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055306000908152600460205260409020546126b8670de0b6b3a7640000611cd26126ab611d93565b849063ffffffff613c0016565b91506000821161272957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f506f6f6c546f6b656e3a2052454445454d5f414d4f554e545f5a45524f000000604482015290519081900360640190fd5b600a5482111561279a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f506f6f6c546f6b656e3a20494e53554646494349454e545f4341534800000000604482015290519081900360640190fd5b6127a43082613feb565b6127ae83836132ee565b6040805183815260208101839052815173ffffffffffffffffffffffffffffffffffffffff86169233927f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc929081900390910190a35061230e613962565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610cbb5780601f10610c9057610100808354040283529160200191610cbb565b6128b4878787878787877ff6d86ed606f871fa1a557ac0ba607adce07767acf53f492fb215a1a4db4aea6f6140af565b6128bf878787613f7c565b50505050505050565b600e546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000008104909116907c0100000000000000000000000000000000000000000000000000000000900463ffffffff166000612924612389565b90508063ffffffff168263ffffffff1614156129435750505050612b05565b600e805463ffffffff8084167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117909155601054838303916000916129b89165ffffffffffff9091169080851690613c0016565b905060006129d8670de0b6b3a7640000611cd2848963ffffffff613c0016565b90506129ea868263ffffffff61357e16565b9550612a18612a0b670de0b6b3a7640000611cd2858b63ffffffff613c0016565b889063ffffffff61357e16565b9650612a2387614352565b600e80547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff92909216919091179055612a6b86614352565b600e80546dffffffffffffffffffffffffffff929092166e010000000000000000000000000000027fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff909216919091179055604080518281526020810189905280820188905290517f875352fb3fadeb8c0be7cbbe8ff761b308fa7033470cd0287f02f3436fd76cb99181900360600190a1505050505050505b565b6000610cd9338484613a23565b600e546dffffffffffffffffffffffffffff1681565b600a5481565b6000612b3a614817565b506000828152600d60209081526040918290208251808401909352546dffffffffffffffffffffffffffff80821684526e01000000000000000000000000000090910416908201819052612b92576000915050611b1e565b6020810151600e548251612bc6926dffffffffffffffffffffffffffff90811692611cd2928216911663ffffffff613c0016565b9392505050565b600e547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1681565b6103e881565b600b5460ff16612c7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a54600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051612d54938593612d4f93919273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b158015612d1757600080fd5b505afa158015612d2b573d6000803e3d6000fd5b505050506040513d6020811015612d4157600080fd5b50519063ffffffff6135f216565b6132ee565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600f5481565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b6702c68af0bb14000081565b60105465ffffffffffff1681565b612dee878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96140af565b6128bf87878761314e565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600560209081526000928352604080842090915290825290205481565b6312e687c081565b6010546c01000000000000000000000000900463ffffffff1681565b60145481565b600b5460ff16612ed257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600954604080517ff851a440000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163f851a44091600480820192602092909190829003018186803b158015612f6557600080fd5b505afa158015612f79573d6000803e3d6000fd5b505050506040513d6020811015612f8f57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff163314612ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b6130128160006702c68af0bb140000613b38565b60118190556040805182815290517f9d9cd27245b4e6b06dcf523ac57b6e851b934e199eee376313f906e94bfbfd559181900360200190a150600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff166130e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556131196128c8565b613121613962565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131f6576132e9565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600c60209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81141561325757506132e9565b818110156132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148bd6028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600c602090815260408083209387168352929052209082900390555b505050565b60085473ffffffffffffffffffffffffffffffffffffffff1661337257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f506f6f6c546f6b656e3a204e4f545f494e495449414c495a4544000000000000604482015290519081900360640190fd5b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff86811660248301526044808301879052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009560609594169382918083835b6020831061347857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161343b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146134da576040519150601f19603f3d011682016040523d82523d6000602084013e6134df565b606091505b509150915081801561350d57508051158061350d575080806020019051602081101561350a57600080fd5b50515b61357857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f506f6f6c546f6b656e3a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b50505050565b600082820183811015612bc657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000612bc683836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250613972565b600080600061364286612b30565b92508385141561367a575050600e5481906e01000000000000000000000000000090046dffffffffffffffffffffffffffff16613959565b600e546dffffffffffffffffffffffffffff16848611156137e6576000878152600d602052604090208587036136b6868263ffffffff61357e16565b94506136c185614352565b82547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff918216177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000008583168102919091178455600e5461374692919004168261357e565b935061375184614352565b600e806101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055506014548411156137df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806148e56036913960400191505060405180910390fd5b5050613957565b6000878152600d60205260409020868603808611613805576000613809565b8086035b945061381485614352565b82547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff919091161782558461387e5781547fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff1682556138c8565b81547fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000006dffffffffffffffffffffffffffff8516021782555b60006138da878763ffffffff6135f216565b600e546e01000000000000000000000000000090046dffffffffffffffffffffffffffff1695509050808511613911576000613915565b8085035b945061392085614352565b600e806101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055505050505b505b93509350939050565b61396a6143d5565b612b056144ab565b60008184841115613a1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139e05781810151838201526020016139c8565b50505050905090810190601f168015613a0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60408051808201825260208082527f496d7065726d617845524332303a205452414e534645525f544f4f5f484947488183015273ffffffffffffffffffffffffffffffffffffffff8616600090815260049091529190912054613a8d91839063ffffffff61397216565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600460205260408082209390935590841681522054613acf908263ffffffff61357e16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b81831015613b91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149ba6025913960400191505060405180910390fd5b808311156132e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149ba6025913960400191505060405180910390fd5b6000818310613bf95781612bc6565b5090919050565b600082613c0f57506000610cdd565b82820282848281613c1c57fe5b0414612bc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149996021913960400191505060405180910390fd5b6000612bc683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614798565b600f5460009080841115613dde576000613d06613cf9670de0b6b3a7640000611cd2601154613ced878b6135f290919063ffffffff16565b9063ffffffff613c0016565b869063ffffffff6135f216565b90506000613d228561103f84611cd2838b63ffffffff613c0016565b90508015613dcf57600954604080517f345ef941000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163345ef941916004808301926020929190829003018186803b158015613d9557600080fd5b505afa158015613da9573d6000803e3d6000fd5b505050506040513d6020811015613dbf57600080fd5b50519050613dcd8183613ecb565b505b50600f8190559150610cdd9050565b83915050610cdd565b8151613dfa90600090602085019061482e565b508051613e0e90600190602084019061482e565b50604051469080605261494782396040805191829003605201822086516020978801208383018352600184527f310000000000000000000000000000000000000000000000000000000000000093880193909352815180880191909152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c090910190925250805192019190912060065550565b600354613ede908263ffffffff61357e16565b60035573ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054613f17908263ffffffff61357e16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526004602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600c6020908152604080832094871680845294825291829020859055815185815291517fc3c1215b41d54142382d54a05fb991007165ae91bcb1879bac8b290d9111aaf49281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054614021908263ffffffff6135f216565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602052604090205560035461405a908263ffffffff6135f216565b60035560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b4285101561411e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496d7065726d617845524332303a204558504952454400000000000000000000604482015290519081900360640190fd5b60065473ffffffffffffffffffffffffffffffffffffffff808a1660008181526007602090815260408083208054600180820190925582518085018a905280840196909652958e166060860152608085018d905260a085019590955260c08085018c90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff8a166101828501526101a284018990526101c28401889052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015614260573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906142db57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61434657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f496d7065726d617845524332303a20494e56414c49445f5349474e4154555245604482015290519081900360640190fd5b50505050505050505050565b60006e01000000000000000000000000000082106143d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496d7065726d61783a2053414645313132000000000000000000000000000000604482015290519081900360640190fd5b5090565b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561444657600080fd5b505afa15801561445a573d6000803e3d6000fd5b505050506040513d602081101561447057600080fd5b5051600a81905560408051918252517f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf49181900360200190a1565b60125460135460105465ffffffffffff8082169166010000000000008104909116906c01000000000000000000000000900463ffffffff166000816144ee612389565b03905063ffffffff81161561467957614505612389565b6010600c6101000a81548163ffffffff021916908363ffffffff16021790555060008385101561458e576000670de0b6b3a76400008363ffffffff168887898903670de0b6b3a7640000028161455757fe5b0402028161456157fe5b049050670de0b6b3a764000081116145835780670de0b6b3a764000003614586565b60005b9150506145cf565b6000670de0b6b3a76400008363ffffffff168887888a03670de0b6b3a764000002816145b657fe5b040202816145c057fe5b04670de0b6b3a7640000019150505b670de0b6b3a764000084820204935064b89345af008411156145f45764b89345af0093505b6312e687c0841015614608576312e687c093505b601080547fffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff16660100000000000065ffffffffffff8716021790556040805185815290517f713a98ffb7d769b8e33e2ee945ebb6acb7f397532688164d3ce1081f903c77bc916020908290030190a1505b600e54600a546000916e01000000000000000000000000000090046dffffffffffffffffffffffffffff169082906146b1908361357e565b905080156146d2578082670de0b6b3a764000002816146cc57fe5b046146d5565b60005b925050508681116146f35786818502816146eb57fe5b049450614729565b600087670de0b6b3a764000003888303670de0b6b3a7640000028161471457fe5b670de0b6b3a764000091900481018602049550505b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff87161790556040805186815290517f338541dc9083f6af6715482fb419e1483c1ae9097764fd68a5dc98109bd5a788916020908290030190a150505050505050565b60008183614801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156139e05781810151838201526020016139c8565b50600083858161480d57fe5b0495945050505050565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061486f57805160ff191683800117855561489c565b8280016001018555821561489c579182015b8281111561489c578251825591602001919060010190614881565b506143d192611e299250905b808211156143d157600081556001016148a856fe496d7065726d61785633426f72726f7761626c653a20424f52524f575f4e4f545f414c4c4f574544496d7065726d61785633426f72726f7761626c653a20544f54414c5f424f52524f57535f41424f56455f444542545f4345494c494e47496d7065726d61785633426f72726f7761626c653a20494e53554646494349454e545f4c4951554944495459454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496d7065726d61785633426f72726f7761626c653a20494e56414c49445f53455454494e47496d7065726d61785633426f72726f7761626c653a20494e53554646494349454e545f43415348496d7065726d617845524332303a205452414e534645525f4e4f545f414c4c4f574544496d7065726d61785633426f72726f7761626c653a204e4f545f554e4445525741544552496d7065726d61785633426f72726f7761626c653a20494e53554646494349454e545f41435455414c5f5245504159496d7065726d61785633426f72726f7761626c653a20554e415554484f52495a4544a265627a7a7231582089bfd9c429965dec8728e4a0cd67a1d3453eb1469aab5f46a502ff5512e0de0664736f6c63430005100032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103995760003560e01c80636f307dc3116101e9578063b95b92a31161010f578063d505accf116100ad578063e12b63061161007c578063e12b630614610bbe578063e1c84ea414610bc6578063fca7820b14610bce578063fff6cae914610beb57610399565b8063d505accf14610b15578063d8dfeb4514610b73578063dd62ed3e14610b7b578063e076600014610bb657610399565b8063be340e32116100e9578063be340e3214610af5578063c45a015514610afd578063c72f3fbb14610b05578063c914b43714610b0d57610399565b8063b95b92a314610ab2578063ba9a7a5614610aba578063bc25cf7714610ac257610399565b806395a2251f11610187578063a9059cbb11610156578063a9059cbb14610a4c578063aa5af0fd14610a85578063ad7a672f14610a8d578063b388f73914610a9557610399565b806395a2251f146109ab57806395d89b41146109de5780639e79b55c146109e6578063a6afed9514610a4457610399565b80637ecebe00116101c35780637ecebe00146108ff57806391b4274514610932578063926d845b146109555780639292b0321461098e57610399565b80636f307dc31461087a57806370a08231146108ab578063796b89b9146108de57610399565b806330adf81f116102ce578063452ae95f1161026c578063685440651161023b57806368544065146107245780636a030c111461072c5780636a6278421461080c5780636bd76d241461083f57610399565b8063452ae95f146106e157806347bd3718146106e95780634a5d316c146107145780635b2b9d1a1461071c57610399565b8063380e2a8b116102a8578063380e2a8b14610691578063386a6579146106ae5780633ba0b9a9146106d15780634322b714146106d957610399565b806330adf81f14610663578063313ce5671461066b5780633644e5151461068957610399565b80631aebf12f1161033b578063253c24f311610315578063253c24f31461059d57806327549a0b146105a5578063299d377b146105c25780632d5231d31461065b57610399565b80631aebf12f1461054a5780632374e8a91461055257806323b872dd1461055a57610399565b8063095ea7b311610377578063095ea7b31461043d57806315f950fa1461048a5780631613d5961461052557806318160ddd1461054257610399565b806301f8c1c81461039e57806306fdde03146103b8578063075f4e7f14610435575b600080fd5b6103a6610bf3565b60408051918252519081900360200190f35b6103c0610c17565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fa5781810151838201526020016103e2565b50505050905090810190601f1680156104275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103a6610cc3565b6104766004803603604081101561045357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ccc565b604080519115158252519081900360200190f35b610523600480360360808110156104a057600080fd5b81359173ffffffffffffffffffffffffffffffffffffffff60208201351691604082013591908101906080810160608201356401000000008111156104e457600080fd5b8201836020820111156104f657600080fd5b8035906020019184600183028401116401000000008311171561051857600080fd5b509092509050610ce3565b005b6105236004803603602081101561053b57600080fd5b503561121c565b6103a661141f565b6103a6611425565b6103a661142b565b6104766004803603606081101561057057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135611437565b6103a6611530565b610523600480360360208110156105bb57600080fd5b503561153a565b6103a6600480360360808110156105d857600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff604083013516919081019060808101606082013564010000000081111561061c57600080fd5b82018360208201111561062e57600080fd5b8035906020019184600183028401116401000000008311171561065057600080fd5b509092509050611753565b6103a6611acf565b6103a6611ad5565b610673611af9565b6040805160ff9092168252519081900360200190f35b6103a6611b02565b6103a6600480360360208110156106a757600080fd5b5035611b08565b610523600480360360408110156106c457600080fd5b5080359060200135611b23565b6103a6611d93565b6103a6611e2c565b6103a6611e32565b6106f1611e3b565b604080516dffffffffffffffffffffffffffff9092168252519081900360200190f35b610523611e63565b6103a6611f14565b6103a6611f19565b6105236004803603608081101561074257600080fd5b81019060208101813564010000000081111561075d57600080fd5b82018360208201111561076f57600080fd5b8035906020019184600183028401116401000000008311171561079157600080fd5b9193909290916020810190356401000000008111156107af57600080fd5b8201836020820111156107c157600080fd5b803590602001918460018302840111640100000000831117156107e357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611f25565b6103a66004803603602081101561082257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612090565b6103a66004803603604081101561085557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661233e565b61088261235b565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103a6600480360360208110156108c157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612377565b6108e6612389565b6040805163ffffffff9092168252519081900360200190f35b6103a66004803603602081101561091557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612393565b61093a6123a5565b6040805165ffffffffffff9092168252519081900360200190f35b6104766004803603604081101561096b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356123bd565b610523600480360360208110156109a457600080fd5b50356123ca565b6103a6600480360360208110156109c157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125e8565b6103c061280c565b610523600480360360e08110156109fc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135612884565b6105236128c8565b61047660048036036040811015610a6257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b07565b6106f1612b14565b6103a6612b2a565b6103a660048036036020811015610aab57600080fd5b5035612b30565b6108e6612bcd565b6103a6612bf9565b61052360048036036020811015610ad857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612bff565b6103a6612d82565b610882612d88565b6103a6612da4565b61093a612db0565b610523600480360360e0811015610b2b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135612dbe565b610882612df9565b6103a660048036036040811015610b9157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612e1a565b6103a6612e37565b6108e6612e3f565b6103a6612e5b565b61052360048036036020811015610be457600080fd5b5035612e61565b610523613078565b7ff6d86ed606f871fa1a557ac0ba607adce07767acf53f492fb215a1a4db4aea6f81565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610cbb5780601f10610c9057610100808354040283529160200191610cbb565b820191906000526020600020905b815481529060010190602001808311610c9e57829003601f168201915b505050505081565b640d7957c4d081565b6000610cd933848461314e565b5060015b92915050565b600b5460ff16610d5457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610d846128c8565b600a5480841115610de0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806149df6027913960400191505060405180910390fd5b8315610e9857600b54604080517f6352211e000000000000000000000000000000000000000000000000000000008152600481018990529051600092610100900473ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b158015610e5d57600080fd5b505afa158015610e71573d6000803e3d6000fd5b505050506040513d6020811015610e8757600080fd5b50519050610e968133876131bd565b505b8315610ea857610ea885856132ee565b8115610f8a578473ffffffffffffffffffffffffffffffffffffffff16634c85e02933888787876040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050505b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d602081101561102557600080fd5b50519050600061104b8361103f848963ffffffff61357e16565b9063ffffffff6135f216565b9050600080600061105d8b8a86613634565b9250925092508389111561117157600b54604080517f27a0d11a000000000000000000000000000000000000000000000000000000008152600481018e905230602482015260448101859052905161010090920473ffffffffffffffffffffffffffffffffffffffff16916327a0d11a916064808201926020929091908290030181600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b505050506040513d602081101561111a57600080fd5b5051611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061491b602c913960400191505060405180910390fd5b604080518a8152602081018690528082018590526060810184905260808101839052905173ffffffffffffffffffffffffffffffffffffffff8c16918d9133917f146f75b60ce49b133863eae4193e997edc879111a08642fd5108f9784aef138f919081900360a00190a45050505050506111ea613962565b5050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050565b600b5460ff1661128d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600954604080517ff851a440000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163f851a44091600480820192602092909190829003018186803b15801561132057600080fd5b505afa158015611334573d6000803e3d6000fd5b505050506040513d602081101561134a57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1633146113b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b60148190556040805182815290517f9e88375210357aa5dbeb756c2deee5a1a487e6dcd9fa8f444eda3bc7df41a37b9181900360200190a150600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60035481565b60125481565b6706f05b59d3b2000081565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461151b576114e982604051806060016040528060238152602001614a066023913973ffffffffffffffffffffffffffffffffffffffff87166000908152600560209081526040808320338452909152902054919063ffffffff61397216565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b611526848484613a23565b5060019392505050565b6534a1fed8cc8081565b600b5460ff166115ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600954604080517ff851a440000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163f851a44091600480820192602092909190829003018186803b15801561163e57600080fd5b505afa158015611652573d6000803e3d6000fd5b505050506040513d602081101561166857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1633146116d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b6116ed81640d7957c4d06534a1fed8cc80613b38565b60138190556040805182815290517f1396dfcdb64fb7eb77fb84966f27b81afe14aa70b6e966c68d74af3302a9fe909181900360200190a150600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460009060ff166117c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556117f76128c8565b6118098561180488612b30565b613bea565b600b546040517f7fd3ac4f000000000000000000000000000000000000000000000000000000008152600481018981526024820184905273ffffffffffffffffffffffffffffffffffffffff88811660448401526080606484019081526084840188905294995061010090930490921692637fd3ac4f928a928a928a928a928a929060a401848480828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b1580156118cd57600080fd5b505af11580156118e1573d6000803e3d6000fd5b505050506040513d60208110156118f757600080fd5b5051600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561197057600080fd5b505afa158015611984573d6000803e3d6000fd5b505050506040513d602081101561199a57600080fd5b5051600a5490915086906119b590839063ffffffff6135f216565b1015611a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614a4d602f913960400191505060405180910390fd5b6000806000611a1d8a60008b613634565b60408051898152602081018e905280820185905260608101849052608081018390529051939650919450925073ffffffffffffffffffffffffffffffffffffffff8a16918c9133917f0b7a7a59dfdfb7e213d06e4747a57bc8d9debf7ac41adfb50d56a8b503fec3559181900360a00190a450505050611a9b613962565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905595945050505050565b60135481565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b6000611b126128c8565b611b1b82612b30565b90505b919050565b600b5460ff16611b9457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611bc46128c8565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff163314611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b670de0b6b3a76400008110611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a296024913960400191505060405180910390fd5b6000611ca483612b30565b905080611cb15750611d5c565b6000611ceb611cde670de0b6b3a7640000611cd2858763ffffffff613c0016565b9063ffffffff613c7316565b839063ffffffff6135f216565b90506000806000611cfe87600086613634565b604080518a81526020810189905280820185905260608101849052608081018390529051939650919450925088917f965da1d1e29951d89d7c1c523c77aeeb7aeae975d46af1f25e6491d9a6aac4fc9181900360a00190a250505050505b611d64613962565b5050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000611d9d6128c8565b600354600e54600a54600091611dd591906e01000000000000000000000000000090046dffffffffffffffffffffffffffff1661357e565b9050811580611de2575080155b15611df957670de0b6b3a764000092505050611e29565b6000611e1783611cd284670de0b6b3a764000063ffffffff613c0016565b9050611e238184613cb5565b93505050505b90565b60115481565b64b89345af0081565b600e546e01000000000000000000000000000090046dffffffffffffffffffffffffffff1681565b60095473ffffffffffffffffffffffffffffffffffffffff1615611ee857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f506f6f6c546f6b656e3a20464143544f52595f414c52454144595f5345540000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b600281565b670dbd2fc137a3000081565b60095473ffffffffffffffffffffffffffffffffffffffff163314611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b61200886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881529250889150879081908401838280828437600092019190915250613de792505050565b6008805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055600b805491909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9091161790555050670de0b6b3a7640000600f555050565b600b5460009060ff1661210457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561219d57600080fd5b505afa1580156121b1573d6000803e3d6000fd5b505050506040513d60208110156121c757600080fd5b5051600a549091506000906121e390839063ffffffff6135f216565b90506122086121f0611d93565b611cd283670de0b6b3a764000063ffffffff613c0016565b92506003546000141561223657612227836103e863ffffffff6135f216565b925061223660006103e8613ecb565b600083116122a557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f506f6f6c546f6b656e3a204d494e545f414d4f554e545f5a45524f0000000000604482015290519081900360640190fd5b6122af8484613ecb565b6040805182815260208101859052815173ffffffffffffffffffffffffffffffffffffffff87169233927f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee929081900390910190a3505061230e613962565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b600c60209081526000928352604080842090915290825290205481565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b63ffffffff421690565b60076020526000908152604090205481565b6010546601000000000000900465ffffffffffff1681565b6000610cd9338484613f7c565b600b5460ff1661243b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600954604080517ff851a440000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163f851a44091600480820192602092909190829003018186803b1580156124ce57600080fd5b505afa1580156124e2573d6000803e3d6000fd5b505050506040513d60208110156124f857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff163314612567576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b612582816706f05b59d3b20000670dbd2fc137a30000613b38565b60128190556040805182815290517f7a550b1995ff63260fb313f12024e66e73bad425372e5af6b1e04cb3799ef38c9181900360200190a150600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460009060ff1661265c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055306000908152600460205260409020546126b8670de0b6b3a7640000611cd26126ab611d93565b849063ffffffff613c0016565b91506000821161272957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f506f6f6c546f6b656e3a2052454445454d5f414d4f554e545f5a45524f000000604482015290519081900360640190fd5b600a5482111561279a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f506f6f6c546f6b656e3a20494e53554646494349454e545f4341534800000000604482015290519081900360640190fd5b6127a43082613feb565b6127ae83836132ee565b6040805183815260208101839052815173ffffffffffffffffffffffffffffffffffffffff86169233927f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc929081900390910190a35061230e613962565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610cbb5780601f10610c9057610100808354040283529160200191610cbb565b6128b4878787878787877ff6d86ed606f871fa1a557ac0ba607adce07767acf53f492fb215a1a4db4aea6f6140af565b6128bf878787613f7c565b50505050505050565b600e546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000008104909116907c0100000000000000000000000000000000000000000000000000000000900463ffffffff166000612924612389565b90508063ffffffff168263ffffffff1614156129435750505050612b05565b600e805463ffffffff8084167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117909155601054838303916000916129b89165ffffffffffff9091169080851690613c0016565b905060006129d8670de0b6b3a7640000611cd2848963ffffffff613c0016565b90506129ea868263ffffffff61357e16565b9550612a18612a0b670de0b6b3a7640000611cd2858b63ffffffff613c0016565b889063ffffffff61357e16565b9650612a2387614352565b600e80547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff92909216919091179055612a6b86614352565b600e80546dffffffffffffffffffffffffffff929092166e010000000000000000000000000000027fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff909216919091179055604080518281526020810189905280820188905290517f875352fb3fadeb8c0be7cbbe8ff761b308fa7033470cd0287f02f3436fd76cb99181900360600190a1505050505050505b565b6000610cd9338484613a23565b600e546dffffffffffffffffffffffffffff1681565b600a5481565b6000612b3a614817565b506000828152600d60209081526040918290208251808401909352546dffffffffffffffffffffffffffff80821684526e01000000000000000000000000000090910416908201819052612b92576000915050611b1e565b6020810151600e548251612bc6926dffffffffffffffffffffffffffff90811692611cd2928216911663ffffffff613c0016565b9392505050565b600e547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1681565b6103e881565b600b5460ff16612c7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a54600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051612d54938593612d4f93919273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b158015612d1757600080fd5b505afa158015612d2b573d6000803e3d6000fd5b505050506040513d6020811015612d4157600080fd5b50519063ffffffff6135f216565b6132ee565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600f5481565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b6702c68af0bb14000081565b60105465ffffffffffff1681565b612dee878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96140af565b6128bf87878761314e565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600560209081526000928352604080842090915290825290205481565b6312e687c081565b6010546c01000000000000000000000000900463ffffffff1681565b60145481565b600b5460ff16612ed257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600954604080517ff851a440000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169163f851a44091600480820192602092909190829003018186803b158015612f6557600080fd5b505afa158015612f79573d6000803e3d6000fd5b505050506040513d6020811015612f8f57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff163314612ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a7c6022913960400191505060405180910390fd5b6130128160006702c68af0bb140000613b38565b60118190556040805182815290517f9d9cd27245b4e6b06dcf523ac57b6e851b934e199eee376313f906e94bfbfd559181900360200190a150600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff166130e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f506f6f6c546f6b656e3a205245454e5445524544000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556131196128c8565b613121613962565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131f6576132e9565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600c60209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81141561325757506132e9565b818110156132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148bd6028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600c602090815260408083209387168352929052209082900390555b505050565b60085473ffffffffffffffffffffffffffffffffffffffff1661337257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f506f6f6c546f6b656e3a204e4f545f494e495449414c495a4544000000000000604482015290519081900360640190fd5b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff86811660248301526044808301879052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009560609594169382918083835b6020831061347857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161343b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146134da576040519150601f19603f3d011682016040523d82523d6000602084013e6134df565b606091505b509150915081801561350d57508051158061350d575080806020019051602081101561350a57600080fd5b50515b61357857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f506f6f6c546f6b656e3a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b50505050565b600082820183811015612bc657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000612bc683836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250613972565b600080600061364286612b30565b92508385141561367a575050600e5481906e01000000000000000000000000000090046dffffffffffffffffffffffffffff16613959565b600e546dffffffffffffffffffffffffffff16848611156137e6576000878152600d602052604090208587036136b6868263ffffffff61357e16565b94506136c185614352565b82547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff918216177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000008583168102919091178455600e5461374692919004168261357e565b935061375184614352565b600e806101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055506014548411156137df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806148e56036913960400191505060405180910390fd5b5050613957565b6000878152600d60205260409020868603808611613805576000613809565b8086035b945061381485614352565b82547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff919091161782558461387e5781547fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff1682556138c8565b81547fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000006dffffffffffffffffffffffffffff8516021782555b60006138da878763ffffffff6135f216565b600e546e01000000000000000000000000000090046dffffffffffffffffffffffffffff1695509050808511613911576000613915565b8085035b945061392085614352565b600e806101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055505050505b505b93509350939050565b61396a6143d5565b612b056144ab565b60008184841115613a1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139e05781810151838201526020016139c8565b50505050905090810190601f168015613a0d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60408051808201825260208082527f496d7065726d617845524332303a205452414e534645525f544f4f5f484947488183015273ffffffffffffffffffffffffffffffffffffffff8616600090815260049091529190912054613a8d91839063ffffffff61397216565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600460205260408082209390935590841681522054613acf908263ffffffff61357e16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b81831015613b91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149ba6025913960400191505060405180910390fd5b808311156132e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149ba6025913960400191505060405180910390fd5b6000818310613bf95781612bc6565b5090919050565b600082613c0f57506000610cdd565b82820282848281613c1c57fe5b0414612bc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149996021913960400191505060405180910390fd5b6000612bc683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614798565b600f5460009080841115613dde576000613d06613cf9670de0b6b3a7640000611cd2601154613ced878b6135f290919063ffffffff16565b9063ffffffff613c0016565b869063ffffffff6135f216565b90506000613d228561103f84611cd2838b63ffffffff613c0016565b90508015613dcf57600954604080517f345ef941000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163345ef941916004808301926020929190829003018186803b158015613d9557600080fd5b505afa158015613da9573d6000803e3d6000fd5b505050506040513d6020811015613dbf57600080fd5b50519050613dcd8183613ecb565b505b50600f8190559150610cdd9050565b83915050610cdd565b8151613dfa90600090602085019061482e565b508051613e0e90600190602084019061482e565b50604051469080605261494782396040805191829003605201822086516020978801208383018352600184527f310000000000000000000000000000000000000000000000000000000000000093880193909352815180880191909152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c090910190925250805192019190912060065550565b600354613ede908263ffffffff61357e16565b60035573ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054613f17908263ffffffff61357e16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526004602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600c6020908152604080832094871680845294825291829020859055815185815291517fc3c1215b41d54142382d54a05fb991007165ae91bcb1879bac8b290d9111aaf49281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054614021908263ffffffff6135f216565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602052604090205560035461405a908263ffffffff6135f216565b60035560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b4285101561411e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496d7065726d617845524332303a204558504952454400000000000000000000604482015290519081900360640190fd5b60065473ffffffffffffffffffffffffffffffffffffffff808a1660008181526007602090815260408083208054600180820190925582518085018a905280840196909652958e166060860152608085018d905260a085019590955260c08085018c90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff8a166101828501526101a284018990526101c28401889052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015614260573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906142db57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61434657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f496d7065726d617845524332303a20494e56414c49445f5349474e4154555245604482015290519081900360640190fd5b50505050505050505050565b60006e01000000000000000000000000000082106143d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496d7065726d61783a2053414645313132000000000000000000000000000000604482015290519081900360640190fd5b5090565b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561444657600080fd5b505afa15801561445a573d6000803e3d6000fd5b505050506040513d602081101561447057600080fd5b5051600a81905560408051918252517f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf49181900360200190a1565b60125460135460105465ffffffffffff8082169166010000000000008104909116906c01000000000000000000000000900463ffffffff166000816144ee612389565b03905063ffffffff81161561467957614505612389565b6010600c6101000a81548163ffffffff021916908363ffffffff16021790555060008385101561458e576000670de0b6b3a76400008363ffffffff168887898903670de0b6b3a7640000028161455757fe5b0402028161456157fe5b049050670de0b6b3a764000081116145835780670de0b6b3a764000003614586565b60005b9150506145cf565b6000670de0b6b3a76400008363ffffffff168887888a03670de0b6b3a764000002816145b657fe5b040202816145c057fe5b04670de0b6b3a7640000019150505b670de0b6b3a764000084820204935064b89345af008411156145f45764b89345af0093505b6312e687c0841015614608576312e687c093505b601080547fffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff16660100000000000065ffffffffffff8716021790556040805185815290517f713a98ffb7d769b8e33e2ee945ebb6acb7f397532688164d3ce1081f903c77bc916020908290030190a1505b600e54600a546000916e01000000000000000000000000000090046dffffffffffffffffffffffffffff169082906146b1908361357e565b905080156146d2578082670de0b6b3a764000002816146cc57fe5b046146d5565b60005b925050508681116146f35786818502816146eb57fe5b049450614729565b600087670de0b6b3a764000003888303670de0b6b3a7640000028161471457fe5b670de0b6b3a764000091900481018602049550505b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff87161790556040805186815290517f338541dc9083f6af6715482fb419e1483c1ae9097764fd68a5dc98109bd5a788916020908290030190a150505050505050565b60008183614801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156139e05781810151838201526020016139c8565b50600083858161480d57fe5b0495945050505050565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061486f57805160ff191683800117855561489c565b8280016001018555821561489c579182015b8281111561489c578251825591602001919060010190614881565b506143d192611e299250905b808211156143d157600081556001016148a856fe496d7065726d61785633426f72726f7761626c653a20424f52524f575f4e4f545f414c4c4f574544496d7065726d61785633426f72726f7761626c653a20544f54414c5f424f52524f57535f41424f56455f444542545f4345494c494e47496d7065726d61785633426f72726f7761626c653a20494e53554646494349454e545f4c4951554944495459454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496d7065726d61785633426f72726f7761626c653a20494e56414c49445f53455454494e47496d7065726d61785633426f72726f7761626c653a20494e53554646494349454e545f43415348496d7065726d617845524332303a205452414e534645525f4e4f545f414c4c4f574544496d7065726d61785633426f72726f7761626c653a204e4f545f554e4445525741544552496d7065726d61785633426f72726f7761626c653a20494e53554646494349454e545f41435455414c5f5245504159496d7065726d61785633426f72726f7761626c653a20554e415554484f52495a4544a265627a7a7231582089bfd9c429965dec8728e4a0cd67a1d3453eb1469aab5f46a502ff5512e0de0664736f6c63430005100032
Deployed Bytecode Sourcemap
39207:6357:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39207:6357:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18580:115;;;:::i;:::-;;;;;;;;;;;;;;;;7664:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7664:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25207:53;;;:::i;9199:132::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9199:132:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42779:1201;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;42779:1201:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;42779:1201:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42779:1201:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;42779:1201:0;;-1:-1:-1;42779:1201:0;-1:-1:-1;42779:1201:0;:::i;:::-;;26721:156;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26721:156:0;;:::i;7740:23::-;;;:::i;17252:41::-;;;:::i;25103:42::-;;;:::i;9465:304::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9465:304:0;;;;;;;;;;;;;;;;;;:::i;25279:51::-;;;:::i;26490:226::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26490:226:0;;:::i;44053:741::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;44053:741:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;44053:741:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44053:741:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;44053:741:0;;-1:-1:-1;44053:741:0;-1:-1:-1;44053:741:0;:::i;17303:37::-;;;:::i;10456:108::-;;;:::i;7710:26::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7880:31;;;:::i;40986:117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40986:117:0;;:::i;44850:654::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44850:654:0;;;;;;;:::i;40102:350::-;;;:::i;17207:35::-;;;:::i;19322:56::-;;;:::i;16882:27::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13402:131;;;:::i;19278:40::-;;;:::i;25155:42::-;;;:::i;25608:367::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;25608:367:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;25608:367:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25608:367:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25608:367:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;25608:367:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25608:367:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25608:367:0;;-1:-1:-1;25608:367:0;-1:-1:-1;25608:367:0;;;;;;;;;;;:::i;14054:592::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14054:592:0;;;;:::i;16495:72::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16495:72:0;;;;;;;;;;;:::i;12973:25::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7767:41;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7767:41:0;;;;:::i;22804:106::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7915:38;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7915:38:0;;;;:::i;17073:42::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17935:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17935:147:0;;;;;;;;;:::i;26213:272::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26213:272:0;;:::i;14719:495::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14719:495:0;;;;:::i;7686:20::-;;;:::i;18699:254::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;18699:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21969:828::-;;;:::i;9336:124::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9336:124:0;;;;;;;;;:::i;16845:33::-;;;:::i;13028:24::-;;;:::i;40680:303::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40680:303:0;;:::i;16913:64::-;;;:::i;13056:45::-;;;:::i;15265:138::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15265:138:0;;;;:::i;16984:28::-;;;:::i;13002:22::-;;;:::i;25044:49::-;;;:::i;17045:24::-;;;:::i;10568:235::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;10568:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16464:25::-;;;:::i;7812:61::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7812:61:0;;;;;;;;;;;:::i;19399:56::-;;;:::i;17134:67::-;;;:::i;17358:34::-;;;:::i;25981:227::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25981:227:0;;:::i;40504:54::-;;;:::i;18580:115::-;18629:66;18580:115;:::o;7664:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25207:53::-;25247:13;25207:53;:::o;9199:132::-;9263:4;9274:36;9283:10;9295:7;9304:5;9274:8;:36::i;:::-;-1:-1:-1;9322:4:0;9199:132;;;;;:::o;42779:1201::-;16181:11;;;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;45534:16;:14;:16::i;:::-;42932:12;;42957:29;;;;42949:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43043:16;;43039:152;;43094:10;;43086:36;;;;;;;;;;;;;;-1:-1:-1;;43094:10:0;;;;;;43086:27;;:36;;;;;;;;;;;;;;43094:10;43086:36;;;5:2:-1;;;;30:1;27;20:12;5:2;43086:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43086:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43086:36:0;;-1:-1:-1;43128:57:0;43086:36;43160:10;43172:12;43128:21;:57::i;:::-;43039:152;;43239:16;;43235:59;;43257:37;43271:8;43281:12;43257:13;:37::i;:::-;43303:15;;43299:104;;43336:8;43320:42;;;43363:10;43375:7;43384:12;43398:4;;43320:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;43320:83:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43320:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43320:83:0;;;;43299:104;43430:10;;43423:43;;;;;;43460:4;43423:43;;;;;;43408:12;;43430:10;;;43423:28;;:43;;;;;;;;;;;;;;43430:10;43423:43;;;5:2:-1;;;;30:1;27;20:12;5:2;43423:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43423:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43423:43:0;;-1:-1:-1;43475:16:0;43494:44;43524:13;43494:25;43423:43;43506:12;43494:25;:11;:25;:::i;:::-;:29;:44;:29;:44;:::i;:::-;43475:63;;43544:24;43570:19;43591:18;43613:49;43627:7;43636:12;43650:11;43613:13;:49::i;:::-;43543:119;;;;;;43689:11;43674:12;:26;43671:174;;;43727:10;;43715:73;;;;;;;;;;;;43766:4;43715:73;;;;;;;;;;;;43727:10;;;;;;;43715:33;;:73;;;;;;;;;;;;;;;-1:-1:-1;43727:10:0;43715:73;;;5:2:-1;;;;30:1;27;20:12;5:2;43715:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43715:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43715:73:0;43702:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43859:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43878:7;;43866:10;;43859:116;;;;;;;;;;45555:1;;;;;;16356:9;:7;:9::i;:::-;-1:-1:-1;;16252:11:0;:18;;;;16266:4;16252:18;;;-1:-1:-1;;;42779:1201:0:o;26721:156::-;16181:11;;;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;27165:7;;27156:25;;;;;;;;27165:7;;;;;27156:23;;:25;;;;;;;;;;;;;;;27165:7;27156:25;;;5:2:-1;;;;30:1;27;20:12;5:2;27156:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27156:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27156:25:0;27142:39;;:10;:39;27134:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26804:11;:28;;;26842:30;;;;;;;;;;;;;;;;;-1:-1:-1;16252:11:0;:18;;;;16266:4;16252:18;;;26721:156::o;7740:23::-;;;;:::o;17252:41::-;;;;:::o;25103:42::-;25138:7;25103:42;:::o;9465:304::-;9558:15;;;9543:4;9558:15;;;:9;:15;;;;;;;;9574:10;9558:27;;;;;;;;9594:2;9558:39;9554:164;;9635:77;9667:5;9635:77;;;;;;;;;;;;;;;;;:15;;;;;;;:9;:15;;;;;;;;9651:10;9635:27;;;;;;;;;:77;;:31;:77;:::i;:::-;9605:15;;;;;;;:9;:15;;;;;;;;9621:10;9605:27;;;;;;;:107;9554:164;9722:26;9732:4;9738:2;9742:5;9722:9;:26::i;:::-;-1:-1:-1;9760:4:0;9465:304;;;;;:::o;25279:51::-;25319:11;25279:51;:::o;26490:226::-;16181:11;;;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;27165:7;;27156:25;;;;;;;;27165:7;;;;;27156:23;;:25;;;;;;;;;;;;;;;27165:7;27156:25;;;5:2:-1;;;;30:1;27;20:12;5:2;27156:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27156:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27156:25:0;27142:39;;:10;:39;27134:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26573:65;26587:14;25247:13;25319:11;26573:13;:65::i;:::-;26643:11;:28;;;26681:30;;;;;;;;;;;;;;;;;-1:-1:-1;16252:11:0;:18;;;;16266:4;16252:18;;;26490:226::o;44053:741::-;16181:11;;44193:17;;16181:11;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;45534:16;:14;:16::i;:::-;44231:45;44240:11;44253:22;44267:7;44253:13;:22::i;:::-;44231:8;:45::i;:::-;44308:10;;44296:69;;;;;;;;;;;;;;;;;44308:10;44296:69;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44308:10:0;;;;;;;;44296:29;;:69;;;;;;44360:4;;44296:69;;;;;44360:4;44296:69;;44360:4;44296:69;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;44296:69:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44296:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44296:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44296:69:0;44396:10;;44389:43;;;;;;44426:4;44389:43;;;;;;44296:69;;-1:-1:-1;44374:12:0;;44396:10;;;;;44389:28;;:43;;;;;44296:69;;44389:43;;;;;;;;44396:10;44389:43;;;5:2:-1;;;;30:1;27;20:12;5:2;44389:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44389:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44389:43:0;44457:12;;44389:43;;-1:-1:-1;44474:11:0;;44445:25;;44389:43;;44445:25;:11;:25;:::i;:::-;:40;;44437:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44547:24;44573:19;44594:18;44616:38;44630:7;44639:1;44642:11;44616:13;:38::i;:::-;44668:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44546:108;;-1:-1:-1;44546:108:0;;-1:-1:-1;44546:108:0;-1:-1:-1;44668:121:0;;;;44690:7;;44678:10;;44668:121;;;;;;;;;45555:1;;;;16356:9;:7;:9::i;:::-;16252:11;:18;;;;16266:4;16252:18;;;44053:741;;-1:-1:-1;;;;;44053:741:0:o;17303:37::-;;;;:::o;10456:108::-;10498:66;10456:108;:::o;7710:26::-;;;;;;:::o;7880:31::-;;;;:::o;40986:117::-;41058:4;45534:16;:14;:16::i;:::-;41076:22;41090:7;41076:13;:22::i;:::-;41069:29;;45555:1;40986:117;;;:::o;44850:654::-;16181:11;;;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;45534:16;:14;:16::i;:::-;44970:10;;;;;;;44956;:24;44948:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45048:4;45032:13;:20;45024:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45101:19;45123:22;45137:7;45123:13;:22::i;:::-;45101:44;-1:-1:-1;45154:19:0;45150:32;;45175:7;;;45150:32;45186:16;45205:63;45224:43;45262:4;45224:33;:14;45243:13;45224:33;:18;:33;:::i;:::-;:37;:43;:37;:43;:::i;:::-;45205:14;;:63;:18;:63;:::i;:::-;45186:82;;45274:24;45300:19;45321:18;45343:38;45357:7;45366:1;45369:11;45343:13;:38::i;:::-;45395:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45273:108;;-1:-1:-1;45273:108:0;;-1:-1:-1;45273:108:0;-1:-1:-1;45411:7:0;;45395:104;;;;;;;;;45555:1;;;;;;16356:9;:7;:9::i;:::-;-1:-1:-1;;16252:11:0;:18;;;;16266:4;16252:18;;;44850:654::o;40102:350::-;40149:4;45534:16;:14;:16::i;:::-;40180:11;;40235:12;;40218;;40160:17;;40218:30;;:12;40235;;;;;40218:16;:30::i;:::-;40196:52;-1:-1:-1;40257:17:0;;;:40;;-1:-1:-1;40278:19:0;;40257:40;40253:72;;;12965:4;40299:26;;;;;;40253:72;40330:18;40351:42;40380:12;40351:24;:14;40370:4;40351:24;:18;:24;:::i;:42::-;40330:63;;40405:42;40419:13;40434:12;40405:13;:42::i;:::-;40398:49;;;;;45555:1;40102:350;:::o;17207:35::-;;;;:::o;19322:56::-;19366:12;19322:56;:::o;16882:27::-;;;;;;;;;:::o;13402:131::-;13447:7;;:21;:7;:21;13439:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13508:7;:20;;;;13518:10;13508:20;;;13402:131::o;19278:40::-;19317:1;19278:40;:::o;25155:42::-;25190:7;25155:42;:::o;25608:367::-;25774:7;;;;25760:10;:21;25752:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25845:24;25854:5;;25845:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;25845:24:0;;;;137:4:-1;25845:24:0;;;;;;;;;;;;;;;;;;-1:-1:-1;25861:7:0;;-1:-1:-1;25861:7:0;;;;25845:24;;25861:7;;;;25845:24;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;25845:8:0;;-1:-1:-1;;;25845:24:0:i;:::-;25874:10;:24;;;;;;;;;;;;;25903:10;:24;;;;;;25874;25903;;;;;;;;-1:-1:-1;;12965:4:0;25932:16;:38;-1:-1:-1;;25608:367:0:o;14054:592::-;16181:11;;14122:15;;16181:11;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;14166:10;;14159:43;;;;;;14196:4;14159:43;;;;;;16236:5;;14166:10;;;14159:28;;:43;;;;;;;;;;;;;;14166:10;14159:43;;;5:2:-1;;;;30:1;27;20:12;5:2;14159:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14159:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14159:43:0;14237:12;;14159:43;;-1:-1:-1;14207:15:0;;14225:25;;14159:43;;14225:25;:11;:25;:::i;:::-;14207:43;;14268:40;14293:14;:12;:14::i;:::-;14268:20;:10;14283:4;14268:20;:14;:20;:::i;:40::-;14255:53;;14318:11;;14333:1;14318:16;14315:180;;;14414:33;:10;13097:4;14414:33;:14;:33;:::i;:::-;14401:46;;14453:36;14467:1;13097:4;14453:5;:36::i;:::-;14520:1;14507:10;:14;14499:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14558:25;14564:6;14572:10;14558:5;:25::i;:::-;14593:48;;;;;;;;;;;;;;;;;;14598:10;;14593:48;;;;;;;;;;;16350:1;;16356:9;:7;:9::i;:::-;16252:11;:18;;;;16266:4;16252:18;;;14054:592;;-1:-1:-1;14054:592:0:o;16495:72::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;12973:25::-;;;;;;:::o;7767:41::-;;;;;;;;;;;;;:::o;22804:106::-;22881:23;:15;:23;;22804:106::o;7915:38::-;;;;;;;;;;;;;:::o;17073:42::-;;;;;;;;;:::o;17935:147::-;18008:4;18019:42;18034:10;18046:7;18055:5;18019:14;:42::i;26213:272::-;16181:11;;;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;27165:7;;27156:25;;;;;;;;27165:7;;;;;27156:23;;:25;;;;;;;;;;;;;;;27165:7;27156:25;;;5:2:-1;;;;30:1;27;20:12;5:2;27156:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27156:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27156:25:0;27142:39;;:10;:39;27134:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26312:63;26326:22;25138:7;25190;26312:13;:63::i;:::-;26380:19;:44;;;26434:46;;;;;;;;;;;;;;;;;-1:-1:-1;16252:11:0;:18;;;;16266:4;16252:18;;;26213:272::o;14719:495::-;16181:11;;14791:17;;16181:11;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;14853:4;16236:5;14835:24;;;:9;:24;;;;;;14879:42;14916:4;14879:32;14896:14;:12;:14::i;:::-;14879:12;;:32;:16;:32;:::i;:42::-;14864:57;;14951:1;14936:12;:16;14928:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15015:12;;14999;:28;;14991:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15065:34;15079:4;15086:12;15065:5;:34::i;:::-;15104:37;15118:8;15128:12;15104:13;:37::i;:::-;15151:56;;;;;;;;;;;;;;;;;;15158:10;;15151:56;;;;;;;;;;;16350:1;16356:9;:7;:9::i;7686:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18699:254;18825:81;18841:5;18848:7;18857:5;18864:8;18874:1;18877;18880;18629:66;18825:15;:81::i;:::-;18911:37;18926:5;18933:7;18942:5;18911:14;:37::i;:::-;18699:254;;;;;;;:::o;21969:828::-;22027:11;;;;;;;22064:12;;;;;;;22108:16;;;;;22007:17;22157:19;:17;:19::i;:::-;22133:43;;22206:14;22185:35;;:17;:35;;;22181:48;;;22222:7;;;;;;22181:48;22317:16;:33;;;;;;;;;;;;;;;;;;;22386:10;;22254:34;;;;22233:18;;22381:33;;22386:10;;;;;22381:33;;;;:20;:33;:::i;:::-;22359:55;-1:-1:-1;22420:24:0;22447:43;22485:4;22447:33;22359:55;22466:13;22447:33;:18;:33;:::i;:43::-;22420:70;-1:-1:-1;22511:40:0;:13;22420:70;22511:40;:17;:40;:::i;:::-;22495:56;-1:-1:-1;22571:62:0;22589:42;22626:4;22589:32;:14;22608:12;22589:32;:18;:32;:::i;:42::-;22571:12;;:62;:16;:62;:::i;:::-;22556:77;;22655:21;22663:12;22655:7;:21::i;:::-;22641:11;:35;;;;;;;;;;;;;;;22696:22;22704:13;22696:7;:22::i;:::-;22681:12;:37;;;;;;;;;;;;;;;;;;;22728:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21969:828;;;;;;;;:::o;9336:124::-;9396:4;9407:32;9417:10;9429:2;9433:5;9407:9;:32::i;16845:33::-;;;;;;:::o;13028:24::-;;;;:::o;40680:303::-;40741:4;40752:36;;:::i;:::-;-1:-1:-1;40791:23:0;;;;:14;:23;;;;;;;;;40752:62;;;;;;;;;;;;;;;;;;;;;;;;;;40819:47;;40865:1;40858:8;;;;;40819:47;40949:28;;;;40932:11;;40902:24;;40897:81;;;;;;;:47;;:30;;;40932:11;40897:47;:34;:47;:::i;:81::-;40890:88;40680:303;-1:-1:-1;;;40680:303:0:o;16913:64::-;;;;;;;;;:::o;13056:45::-;13097:4;13056:45;:::o;15265:138::-;16181:11;;;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;15384:12;;15343:10;;15336:43;;;;;;15373:4;15336:43;;;;;;15318:80;;15332:2;;15336:61;;15384:12;;15343:10;;;;;15336:28;;:43;;;;;;;;;;;;;;15343:10;15336:43;;;5:2:-1;;;;30:1;27;20:12;5:2;15336:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15336:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15336:43:0;;:61;:47;:61;:::i;:::-;15318:13;:80::i;:::-;-1:-1:-1;16252:11:0;:18;;;;16266:4;16252:18;;;15265:138::o;16984:28::-;;;;:::o;13002:22::-;;;;;;:::o;25044:49::-;25086:7;25044:49;:::o;17045:24::-;;;;;;:::o;10568:235::-;10688:74;10704:5;10711:7;10720:5;10727:8;10737:1;10740;10743;10498:66;10688:15;:74::i;:::-;10767:31;10776:5;10783:7;10792:5;10767:8;:31::i;16464:25::-;;;;;;;;;:::o;7812:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;19399:56::-;19443:12;19399:56;:::o;17134:67::-;;;;;;;;;:::o;17358:34::-;;;;:::o;25981:227::-;16181:11;;;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;27165:7;;27156:25;;;;;;;;27165:7;;;;;27156:23;;:25;;;;;;;;;;;;;;;27165:7;27156:25;;;5:2:-1;;;;30:1;27;20:12;5:2;27156:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27156:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27156:25:0;27142:39;;:10;:39;27134:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26068:54;26082:16;26100:1;25086:7;26068:13;:54::i;:::-;26127:13;:32;;;26169:34;;;;;;;;;;;;;;;;;-1:-1:-1;16252:11:0;:18;;;;16266:4;16252:18;;;25981:227::o;40504:54::-;16181:11;;;;16173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:11;:19;;;;;;45534:16;:14;:16::i;:::-;16356:9;:7;:9::i;:::-;16252:11;:18;;;;16266:4;16252:18;;;40504:54::o;8799:154::-;8874:16;;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;8917:31;;;;;;;;;;;;;;;;;8799:154;;;:::o;18088:379::-;18195:5;18184:16;;:7;:16;;;18180:29;;;18202:7;;18180:29;18237:22;;;;18213:21;18237:22;;;:15;:22;;;;;;;;:31;;;;;;;;;;18305:2;18277:31;;18273:44;;;18310:7;;;18273:44;18349:5;18329:16;:25;;18321:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18404:22;;;;;;;;:15;:22;;;;;;;;:31;;;;;;;;;18438:24;;;;18404:58;;18088:379;;;;:::o;15699:333::-;15769:10;;:24;:10;15761:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15865:10;;15659:34;;;;;;;;;;;;;;;;;15881:44;;15865:10;15881:44;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15881:44:0;;;;;;25:18:-1;;;61:17;;15881:44:0;182:15:-1;15881:44:0;179:29:-1;160:49;;15865:61:0;;;;15830:12;;15844:17;;15865:10;;;:61;;;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15865:61:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15829:97:0;;;;15939:7;:57;;;;-1:-1:-1;15951:11:0;;:16;;:44;;;15982:4;15971:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15971:24:0;15951:44;15931:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15699:333;;;;:::o;1031:181::-;1089:7;1121:5;;;1145:6;;;;1137:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1924:137;1982:7;2009:44;2013:1;2016;2009:44;;;;;;;;;;;;;;;;;:3;:44::i;41109:1596::-;41203:24;41229:19;41250:18;41297:22;41311:7;41297:13;:22::i;:::-;41275:44;;41344:11;41328:12;:27;41324:96;;;-1:-1:-1;;41407:12:0;;41365:19;;41407:12;;;;;41357:63;;41324:96;41448:11;;;;41468:26;;;41464:1237;;;41502:37;41542:23;;;:14;:23;;;;;41593:26;;;41642:39;:19;41593:26;41642:39;:23;:39;:::i;:::-;41625:56;;41714:23;41722:14;41714:7;:23::i;:::-;41687:50;;;;;;;;;41743:43;;;;;;;;;;;;;;:28;41813:12;41808:38;;41813:12;;;;41831:14;41808:22;:38::i;:::-;41792:54;;41867:22;41875:13;41867:7;:22::i;:::-;41852:12;;:37;;;;;;;;;;;;;;;;;;41920:11;;41903:13;:28;;41895:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41464:1237;;;;;42011:37;42051:23;;;:14;:23;;;;;42102:26;;;42153:36;;;:79;;42231:1;42153:79;;;42214:14;42192:19;:36;42153:79;42136:96;;42265:23;42273:14;42265:7;:23::i;:::-;42238:50;;;;;;;;;;;;42297:19;42294:133;;42325:32;;;;;;42294:133;;;42377:43;;;;;;;;;;;;42294:133;42432:25;42460:39;:19;42484:14;42460:39;:23;:39;:::i;:::-;42521:12;;;;;;;;-1:-1:-1;42432:67:0;-1:-1:-1;42570:36:0;;;:79;;42648:1;42570:79;;;42625:20;42609:13;:36;42570:79;42554:95;;42670:22;42678:13;42670:7;:22::i;:::-;42655:12;;:37;;;;;;;;;;;;;;;;;;41464:1237;;;;41109:1596;;;;;;;;;:::o;39375:80::-;39408:15;:13;:15::i;:::-;39428:22;:20;:22::i;2350:192::-;2436:7;2472:12;2464:6;;;;2456:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2456:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2508:5:0;;;2350:192::o;8958:236::-;9047:62;;;;;;;;;;;;;;;;;:15;;;-1:-1:-1;9047:15:0;;;:9;:15;;;;;;;;:62;;9067:5;;9047:62;:19;:62;:::i;:::-;9029:15;;;;;;;;:9;:15;;;;;;:80;;;;9130:13;;;;;;;:24;;9148:5;9130:24;:17;:24;:::i;:::-;9114:13;;;;;;;;:9;:13;;;;;;;;;:40;;;;9164:25;;;;;;;9114:13;;9164:25;;;;;;;;;;;;;8958:236;;;:::o;26883:220::-;26982:3;26969:9;:16;;26961:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27053:3;27040:9;:16;;27032:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38505:96;38557:6;38584:1;38580;:5;:13;;38592:1;38580:13;;;-1:-1:-1;38588:1:0;;38576:17;-1:-1:-1;38505:96:0:o;2785:471::-;2843:7;3088:6;3084:47;;-1:-1:-1;3118:1:0;3111:8;;3084:47;3155:5;;;3159:1;3155;:5;:1;3179:5;;;;;:10;3171:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4443:132;4501:7;4528:39;4532:1;4535;4528:39;;;;;;;;;;;;;;;;;:3;:39::i;39461:635::-;39577:16;;39541:4;;39602:33;;;39598:493;;;39643:21;39667:86;39686:65;39746:4;39686:55;39727:13;;39686:36;39704:17;39686:13;:17;;:36;;;;:::i;:::-;:40;:55;:40;:55;:::i;:65::-;39667:13;;:86;:17;:86;:::i;:::-;39643:110;-1:-1:-1;39759:14:0;39776:71;39834:12;39776:53;39643:110;39776:31;39834:12;39793:13;39776:31;:16;:31;:::i;:71::-;39759:88;-1:-1:-1;39857:13:0;;39853:134;;39914:7;;39905:35;;;;;;;;39879:23;;39914:7;;;39905:33;;:35;;;;;;;;;;;;;;39914:7;39905:35;;;5:2:-1;;;;30:1;27;20:12;5:2;39905:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39905:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39905:35:0;;-1:-1:-1;39947:33:0;39905:35;39970:9;39947:5;:33::i;:::-;39853:134;;-1:-1:-1;39992:16:0;:35;;;40011:16;-1:-1:-1;40033:23:0;;-1:-1:-1;40033:23:0;39598:493;40078:13;40071:20;;;;;7989:427;8065:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;8082:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;8213:95:0;;8146:7;;8213:95;;;;;;;;;;;;;;;;8315:23;;;;;;;8355:10;;;;;;;;;;;;;;;;8196:210;;;;;;;;;;;;;;;;8345:21;8196:210;;;;;;;;;;;8395:4;8196:210;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8196:210:0;;;;;;;-1:-1:-1;8181:230:0;;;;;;;;8162:16;:249;-1:-1:-1;7989:427:0:o;8421:180::-;8488:11;;:22;;8504:5;8488:22;:15;:22;:::i;:::-;8474:11;:36;8531:13;;;;;;;:9;:13;;;;;;:24;;8549:5;8531:24;:17;:24;:::i;:::-;8515:13;;;;;;;:9;:13;;;;;;;;:40;;;;8565:31;;;;;;;8515:13;;;;8565:31;;;;;;;;;;8421:180;;:::o;17754:175::-;17838:22;;;;;;;;:15;:22;;;;;;;;:31;;;;;;;;;;;;;:39;;;17887:37;;;;;;;;;;;;;;;;;17754:175;;;:::o;8606:188::-;8679:15;;;;;;;:9;:15;;;;;;:26;;8699:5;8679:26;:19;:26;:::i;:::-;8661:15;;;;;;;:9;:15;;;;;:44;8724:11;;:22;;8740:5;8724:22;:15;:22;:::i;:::-;8710:11;:36;8756:33;;;;;;;;8779:1;;8756:33;;;;;;;;;;;;;8606:188;;:::o;9775:574::-;9942:15;9930:8;:27;;9922:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10061:16;;10138:13;;;;9989:14;10138:13;;;:6;:13;;;;;;;;:15;;;;;;;;;10094:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10094:70:0;;;;;10084:81;;;;;;10021:150;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10021:150:0;;;;;;10006:170;;;;;;;;;10208:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9989:14;;10138:15;10208:26;;;;;-1:-1:-1;10208:26:0;;;;;;;;;;10138:15;10208:26;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;10208:26:0;;;;;;-1:-1:-1;;10247:30:0;;;;;;;:59;;;10301:5;10281:25;;:16;:25;;;10247:59;10239:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9775:574;;;;;;;;;;:::o;17401:144::-;17449:7;17481:6;17477:1;:10;17469:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17535:1:0;17401:144::o;13564:124::-;13619:10;;13612:43;;;;;;13649:4;13612:43;;;;;;13619:10;;;;;13612:28;;:43;;;;;;;;;;;;;;;13619:10;13612:43;;;5:2:-1;;;;30:1;27;20:12;5:2;13612:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13612:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13612:43:0;13597:12;:58;;;13665:18;;;;;;;;;;;;13612:43;13665:18;;;13564:124::o;19666:2237::-;19740:19;;19786:11;;19821:10;;;;;;;19860:14;;;;;;;19909:19;;;;;19712:25;19909:19;20013;:17;:19::i;:::-;:42;;-1:-1:-1;20087:15:0;;;;20084:928;;20132:19;:17;:19::i;:::-;20110;;:41;;;;;;;;;;;;;;;;;;20157:17;20203:15;20189:11;:29;20185:460;;;20279:8;20378:4;20364:11;20290:85;;20349:12;20331:15;20309:11;20291:15;:29;20324:4;20290:38;:56;;;;;;:71;:85;:92;;;;;;20279:103;;20410:4;20404:3;:10;:27;;20428:3;20421:4;:10;20404:27;;;20417:1;20404:27;20389:42;;20185:460;;;;20503:8;20602:4;20588:11;20514:85;;20573:12;20555:15;20529;20515:11;:29;20548:4;20514:38;:56;;;;;;:71;:85;:92;;;;;;20634:4;20628:10;;-1:-1:-1;;20185:460:0;20729:4;20696:30;;;:37;20678:55;;19366:12;20742:15;:38;20739:81;;;19366:12;20782:38;;20739:81;19443:12;20829:15;:38;20826:81;;;19443:12;20869:38;;20826:81;20915:14;:40;;;;;;;;;;;;20966;;;;;;;;;;;;;;;;;;20084:928;;21095:12;;21149;;21020:21;;21095:12;;;;;;21020:21;;21149:31;;21095:12;21149:16;:31::i;:::-;21127:53;-1:-1:-1;21205:19:0;;21204:65;;21255:14;21232:13;21248:4;21232:20;:37;;;;;;21204:65;;;21228:1;21204:65;21185:84;;19666:2237;;21360:20;21340:16;:40;21337:483;;21495:20;21476:16;21458:15;:34;:57;;;;;;21444:71;;21337:483;;;21595:20;21677;21670:4;:27;21638:20;21619:16;:39;21662:4;21618:48;:80;;;;;21810:4;21618:80;;;21742:46;;21741:66;;:73;;-1:-1:-1;;21337:483:0;21824:10;:32;;;;;;;;;;21866;;;;;;;;;;;;;;;;;;19666:2237;;;;;;;:::o;5063:345::-;5149:7;5251:12;5244:5;5236:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;5236:28:0;;5275:9;5291:1;5287;:5;;;;;;;5063:345;-1:-1:-1;;;;;5063:345:0:o;39207:6357::-;;;;;;;;;;-1:-1:-1;39207:6357:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39207:6357:0;;;;-1:-1:-1;39207:6357:0;;;;;;;;;;;;;;
Swarm Source
bzzr://89bfd9c429965dec8728e4a0cd67a1d3453eb1469aab5f46a502ff5512e0de06
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$7.27
Net Worth in ETH
0.002536
Token Allocations
USDC
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| UNI | 100.00% | $0.999619 | 7.2758 | $7.27 |
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.