Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
xBNT
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-29 */ // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @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 subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ 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 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: @openzeppelin/contracts-ethereum-package/contracts/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol pragma solidity ^0.6.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract PausableUpgradeSafe is Initializable, ContextUpgradeSafe { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20MinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20UpgradeSafe is Initializable, ContextUpgradeSafe, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name, symbol); } function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[44] private __gap; } // File: contracts/interface/IContractRegistry.sol pragma solidity >=0.6.0; interface IContractRegistry { function addressOf(bytes32 contractName) external view returns(address); } // File: contracts/interface/IBancorGovernance.sol pragma solidity >=0.6.0; interface IBancorGovernance { function voteFor(uint256 _id) external; function voteAgainst(uint256 _id) external; function stake(uint256 _amount) external; function unstake(uint256 _amount) external; } // File: contracts/interface/IStakingRewards.sol pragma solidity >=0.6.0; interface IDSToken { } interface IStakingRewards { // claims all rewards from providing address function claimRewards() external returns (uint256); // returns pending rewards from providing address function pendingRewards(address provider) external view returns (uint256); // returns all staked rewards and the ID of the new position function stakeRewards(uint256 maxAmount, IDSToken poolToken) external returns (uint256, uint256); } // File: contracts/interface/ILiquidityProtection.sol pragma solidity >=0.6.0; interface IConverterAnchor { } interface ILiquidityProtection { function addLiquidity( IConverterAnchor _poolAnchor, IERC20 _reserveToken, uint256 _amount ) external payable returns(uint); // returns id of deposit function removeLiquidity(uint256 _id, uint32 _portion) external; function removeLiquidityReturn( uint256 _id, uint32 _portion, uint256 _removeTimestamp ) external view returns (uint256, uint256, uint256); // returns amount in the reserve token // returns actual return amount in the reserve token // returns compensation in the network token // call 24 hours after removing liquidity function claimBalance(uint256 _startIndex, uint256 _endIndex) external; } // File: contracts/interface/ILiquidityProvider.sol pragma solidity 0.6.2; interface ILiquidityProvider { function initializeAndAddLiquidity( IContractRegistry _contractRegistry, address _xbntContract, IERC20 _bnt, IERC20 _vbnt, address _poolAnchor, uint256 _amount ) external returns(uint); function removeLiquidity(uint256 _id) external; function claimRewards() external returns(uint256); function claimBalance() external; function claimRewardsAndRemoveLiquidity() external returns(uint256); function claimAndRestake(address _poolToken) external returns(uint256, uint256); function pendingRewards() external view returns(uint256); } // File: contracts/interface/IxBNT.sol pragma solidity 0.6.2; interface IxBNT { function getProxyAddressDepositIds(address proxyAddress) external view returns(uint256[] memory); } // File: contracts/helpers/LiquidityProvider.sol pragma solidity 0.6.2; contract LiquidityProvider { bool private initialized; IContractRegistry private contractRegistry; IERC20 private bnt; IERC20 private vbnt; address private xbnt; uint256 public nextDepositIndexToClaimBalance; function initializeAndAddLiquidity( IContractRegistry _contractRegistry, address _xbnt, IERC20 _bnt, IERC20 _vbnt, address _poolToken, uint256 _amount ) external returns(uint256) { require(msg.sender == _xbnt, "Invalid caller"); require(!initialized, "Already initialized"); initialized = true; contractRegistry = _contractRegistry; xbnt = _xbnt; bnt = _bnt; vbnt = _vbnt; return _addLiquidity(_poolToken, _amount); } function _addLiquidity( address _poolToken, uint256 _amount ) private returns(uint256 id) { ILiquidityProtection lp = getLiquidityProtectionContract(); bnt.approve(address(lp), uint(-1)); id = lp.addLiquidity(IConverterAnchor(_poolToken), bnt, _amount); _retrieveVbntBalance(); } /* * @notice Restake this proxy's rewards */ function claimAndRestake(address _poolToken) external onlyXbntContract returns(uint256 newDepositId, uint256 restakedBal){ (, newDepositId) = getStakingRewardsContract().stakeRewards(uint(-1), IDSToken(_poolToken)); restakedBal = _retrieveVbntBalance(); } function claimRewards() external onlyXbntContract returns(uint256 rewardsAmount){ rewardsAmount = _claimRewards(); } function _claimRewards() private returns(uint256 rewards){ rewards = getStakingRewardsContract().claimRewards(); _retrieveBntBalance(); } function _removeLiquidity(ILiquidityProtection _lp, uint256 _id) private { _lp.removeLiquidity(_id, 1000000); // full PPM resolution } /* * @notice Initiate final exit from this proxy */ function claimRewardsAndRemoveLiquidity() external onlyXbntContract returns(uint256 rewards) { rewards = _claimRewards(); uint256[] memory depositIds = getDepositIds(); ILiquidityProtection lp = getLiquidityProtectionContract(); vbnt.approve(address(lp), uint(-1)); for(uint256 i = 0; i < depositIds.length; i++){ _removeLiquidity(lp, depositIds[i]); } } /* * @notice Called 24 hours after `claimRewardsAndRemoveLiquidity` */ function claimBalance() external onlyXbntContract { getLiquidityProtectionContract().claimBalance(0, getDepositIds().length); _retrieveBntBalance(); } function _retrieveBntBalance() private { bnt.transfer(xbnt, bnt.balanceOf(address(this))); } function _retrieveVbntBalance() private returns(uint256 vbntBal) { vbntBal = vbnt.balanceOf(address(this)); vbnt.transfer(xbnt, vbntBal); } function pendingRewards() external view returns(uint){ return getStakingRewardsContract().pendingRewards(address(this)); } function getStakingRewardsContract() private view returns(IStakingRewards){ return IStakingRewards(contractRegistry.addressOf("StakingRewards")); } function getLiquidityProtectionContract() private view returns(ILiquidityProtection){ return ILiquidityProtection(contractRegistry.addressOf("LiquidityProtection")); } function getDepositIds() private view returns(uint256[] memory){ return IxBNT(xbnt).getProxyAddressDepositIds(address(this)); } modifier onlyXbntContract { require(msg.sender == xbnt, "Invalid caller"); _; } } // File: contracts/interface/IMinimalProxyFactory.sol pragma solidity ^0.6.0; interface IMinimalProxyFactory { function deploy(uint256 salt, address implementation) external returns(address proxyAddress); } // File: contracts/interface/IDelegateRegistry.sol pragma solidity 0.6.2; interface IDelegateRegistry { function setDelegate(bytes32 id, address delegate) external; } // File: contracts/xBNT.sol pragma solidity 0.6.2; interface IBancorNetwork { function convertByPath( address[] calldata _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee ) external payable returns (uint256); function rateByPath(address[] calldata _path, uint256 _amount) external view returns (uint256); function conversionPath(IERC20 _sourceToken, IERC20 _targetToken) external view returns (address[] memory); } contract xBNT is ERC20UpgradeSafe, OwnableUpgradeSafe, PausableUpgradeSafe { using SafeMath for uint256; IERC20 private bnt; IERC20 private vbnt; IContractRegistry private contractRegistry; IBancorGovernance internal bancorGovernance; IMinimalProxyFactory private proxyFactory; bytes32 private constant bancorNetworkName = 'BancorNetwork'; bytes32 private constant stakingRewardsName = 'StakingRewards'; bytes32 private constant liquidityProtectionName = 'LiquidityProtection'; uint32 private constant PPM = 1000000; uint256 private constant DEC_18 = 1e18; uint256 private constant BUFFER_TARGET = 20; // 5% uint256 private constant MAX_UINT = 2**256 - 1; uint256 private constant WAITING_PERIOD = 2 days; uint256 private constant INITIAL_SUPPLY_MULTIPLIER = 10; uint256 private constant LIQUIDATION_TIME_PERIOD = 4 weeks; uint256 private lpImplementationChangedTimestamp; uint256 private governanceAddressChangedTimestamp; uint256 public adminActiveTimestamp; uint256 public lowestActiveProxyIndex; uint256 public nextProxyIndex; uint256 public totalAllocatedNav; uint256 public pendingRewardsContributionToNav; uint256 public withdrawableBntFees; address private manager; address private manager2; address internal liquidityProviderImplementation; address private queuedLiquidityProviderImplementation; address private queuedGovernanceAddress; address private constant ZERO_ADDRESS = address(0); struct FeeDivisors { uint256 mintFee; uint256 burnFee; uint256 claimFee; } FeeDivisors public feeDivisors; struct Deposit { address proxyAddress; uint256 depositId; uint256 initialContribution; uint256 latestContributionToNav; } mapping(uint256 => Deposit) public depositIdToDeposit; struct ProxyData { uint256[] depositIds; uint256 pendingRewardsContributionToNav; uint256 deployedBnt; } mapping(address => ProxyData) private proxyAddressToData; mapping(uint256 => address) public proxyIndexToAddress; event AddLiquidity( address poolToken, uint256 amount, uint256 depositId, uint256 proxyIndex, uint256 timestamp ); event ClaimRestake( uint256 proxyIndex, uint256 amount, uint256 depositId, uint256 timestamp ); event ClaimRemove(uint256 proxyIndex, uint256 rewardsClaimed); event ClaimRewards(uint256 proxyIndex, uint256 rewardsClaimed); event ClaimBalance(uint256 proxyIndex); event RewardsNavUpdated( uint256 previousRewardsNav, uint256 newRewardsNav, uint256 timestamp ); event KeyAddressChange(); function initialize( IERC20 _bnt, IERC20 _vbnt, IContractRegistry _contractRegistry, IBancorGovernance _bancorGovernance, IMinimalProxyFactory _proxyFactory, address _liquidityProviderImplementation, uint256 _mintFeeDivisor, uint256 _burnFeeDivisor, uint256 _claimFeeDivisor, string memory _symbol ) public initializer { __ERC20_init('xBNT', _symbol); __Ownable_init(); __Pausable_init(); bnt = _bnt; vbnt = _vbnt; contractRegistry = _contractRegistry; bancorGovernance = _bancorGovernance; proxyFactory = _proxyFactory; liquidityProviderImplementation = _liquidityProviderImplementation; _setFeeDivisors(_mintFeeDivisor, _burnFeeDivisor, _claimFeeDivisor); _updateAdminActiveTimestamp(); } /* ========================================================================================= */ /* User-Facing */ /* ========================================================================================= */ /* * @notice Mint xBNT using ETH * @param path: BancorNetwork trade path * @param minReturn: BancorNetwork trade minReturn */ function mint(address[] calldata path, uint256 minReturn) external payable whenNotPaused { require(msg.value > 0, 'Must send ETH'); uint256 incrementalBnt = IBancorNetwork(contractRegistry.addressOf(bancorNetworkName)) .convertByPath{value: msg.value}( path, msg.value, minReturn, ZERO_ADDRESS, ZERO_ADDRESS, 0 ); _mintInternal(incrementalBnt); } /* * @notice Mint xBNT using BNT * @notice Must run approval first * @param bntAmount: BNT amount */ function mintWithToken(uint256 bntAmount) external whenNotPaused { require(bntAmount > 0, 'Must send BNT'); bnt.transferFrom(msg.sender, address(this), bntAmount); _mintInternal(bntAmount); } function _mintInternal(uint256 _incrementalBnt) private { uint256 fee = _calculateAndIncrementFee(_incrementalBnt, feeDivisors.mintFee); uint256 mintAmount = calculateMintAmount(_incrementalBnt.sub(fee), totalSupply()); super._mint(msg.sender, mintAmount); } function calculateMintAmount(uint256 incrementalBnt, uint256 totalSupply) public view returns (uint256 mintAmount) { if (totalSupply == 0) return incrementalBnt.mul(INITIAL_SUPPLY_MULTIPLIER); mintAmount = (incrementalBnt).mul(totalSupply).div( getNav().sub(incrementalBnt) ); } /* * @notice Burn xBNT * @notice Will fail if pro rata BNT is more than buffer balance * @param redeemAmount: xBNT to burn * @param redeemForEth: Redeem for ETH or BNT * @param path: If redeem for ETH, BancorNetwork path * @param minReturn: If redeem for ETH, BancorNetwork minReturn */ function burn( uint256 redeemAmount, bool redeemForEth, address[] memory path, uint256 minReturn ) public { require(redeemAmount > 0, 'Must send xBNT'); uint256 bufferBalance = getBufferBalance(); uint256 proRataBnt = getNav().mul(redeemAmount).div(totalSupply()); require( proRataBnt <= bufferBalance, 'Burn exceeds available liquidity' ); super._burn(msg.sender, redeemAmount); uint256 fee = _calculateAndIncrementFee(proRataBnt, feeDivisors.burnFee); if (redeemForEth) { address bancorNetworkAddress = contractRegistry.addressOf(bancorNetworkName); _approveIfNecessary(bnt, bancorNetworkAddress); // in case registry addr has changed uint256 ethRedemption = IBancorNetwork(bancorNetworkAddress).convertByPath( path, proRataBnt.sub(fee), minReturn, ZERO_ADDRESS, ZERO_ADDRESS, 0 ); (bool success, ) = msg.sender.call.value(ethRedemption)(''); require(success, 'Transfer failed'); } else { bnt.transfer(msg.sender, proRataBnt.sub(fee)); } } /* ========================================================================================= */ /* Liquidity Provision */ /* ========================================================================================= */ /* * @notice Makes BNT deposit on Bancor * @notice Deploys new proxy * @notice Allocates buffer BNT to allocated NAV * @param _poolAnchor: Address of liquidity pool * @param _amount: BNT amount */ function addLiquidity(IConverterAnchor _poolAnchor, uint256 _amount) external onlyOwnerOrManager { uint256 salt = uint256(keccak256(abi.encodePacked(nextProxyIndex, _amount))); address liquidityProviderProxy = proxyFactory.deploy(salt, liquidityProviderImplementation); bnt.transfer(liquidityProviderProxy, _amount); uint256 depositId = ILiquidityProvider(liquidityProviderProxy) .initializeAndAddLiquidity( contractRegistry, address(this), bnt, vbnt, address(_poolAnchor), _amount ); Deposit memory newDeposit = Deposit({ proxyAddress: liquidityProviderProxy, depositId: depositId, initialContribution: _amount, latestContributionToNav: _amount }); emit AddLiquidity( address(_poolAnchor), _amount, depositId, nextProxyIndex, block.timestamp ); depositIdToDeposit[depositId] = newDeposit; ProxyData storage proxyData = proxyAddressToData[liquidityProviderProxy]; proxyData.depositIds.push(depositId); proxyData.deployedBnt = _amount; proxyIndexToAddress[nextProxyIndex] = liquidityProviderProxy; nextProxyIndex++; totalAllocatedNav = totalAllocatedNav.add(_amount); _stake(_amount); _updateAdminActiveTimestamp(); } /* * @notice Restakes rewards from current deposit into new deposit * @notice Deploys capital to same proxy as current deposit * @notice Allocates from rewards NAV to allocated NAV * @param proxyIndex: Proxy index * @param poolToken: Pool to restake rewards to */ function claimAndRestake(uint256 proxyIndex, address poolToken) external onlyOwnerOrManager { address proxyAddress = proxyIndexToAddress[proxyIndex]; ProxyData storage proxyData = proxyAddressToData[proxyAddress]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); (uint256 newDepositId, uint256 restakedBal) = lpProxy.claimAndRestake(poolToken); // fee effectively deducted from buffer balance // because full rewards are restaked without cycling through xBNT _calculateAndIncrementFee(restakedBal, feeDivisors.claimFee); proxyData.depositIds.push(newDepositId); proxyData.deployedBnt = proxyData.deployedBnt.add(restakedBal); // zero out restaked rewards pendingRewardsContributionToNav = pendingRewardsContributionToNav.sub( proxyData.pendingRewardsContributionToNav ); proxyData.pendingRewardsContributionToNav = 0; // add restaked rewards back to nav totalAllocatedNav = totalAllocatedNav.add(restakedBal); depositIdToDeposit[newDepositId] = Deposit({ proxyAddress: proxyAddress, depositId: newDepositId, initialContribution: restakedBal, latestContributionToNav: restakedBal }); emit ClaimRestake( proxyIndex, restakedBal, newDepositId, block.timestamp ); _stake(restakedBal); _updateAdminActiveTimestamp(); } /* * @notice Iterates through proxies to calculate current available rewards * @notice Must be called daily or more to stay current with NAV * @notice We specify begin/end indices in case num proxies approaches gas limit * @param beginProxyIndexIterator: proxyIndex to begin iteration * @param endProxyIndexIterator: proxyIndex to end iteration */ function updatePendingRewardsContributionToNav( uint256 beginProxyIndexIterator, uint256 endProxyIndexIterator ) external { require( beginProxyIndexIterator >= lowestActiveProxyIndex, 'Invalid index' ); require(endProxyIndexIterator <= nextProxyIndex, 'Invalid index'); IStakingRewards stakingRewards = getStakingRewardsContract(); uint256 updatedPendingRewardsContributionToNav; for (uint256 i = lowestActiveProxyIndex; i < nextProxyIndex; i++) { address proxyAddress = proxyIndexToAddress[i]; uint256 newContributionToRewardsNav = stakingRewards.pendingRewards(proxyAddress); proxyAddressToData[proxyAddress] .pendingRewardsContributionToNav = newContributionToRewardsNav; updatedPendingRewardsContributionToNav = updatedPendingRewardsContributionToNav .add(newContributionToRewardsNav); } emit RewardsNavUpdated( pendingRewardsContributionToNav, updatedPendingRewardsContributionToNav, block.timestamp ); pendingRewardsContributionToNav = updatedPendingRewardsContributionToNav; } /* * @notice Updates NAV for value of deposits * @notice Needs to be called weekly at least * @notice Due to IL protection, allocated NAV is assumed to be the greater of value * of initial deposit or removeLiquidityReturn * @notice We specify begin/end indices in case num deposits approaches gas limit * @param beginProxyIndexIterator: proxyIndex to begin iteration * @param endProxyIndexIterator: proxyIndex to end iteration */ function updateTotalAllocatedNav( uint256 beginProxyIndexIterator, uint256 endProxyIndexIterator ) external { require( beginProxyIndexIterator >= lowestActiveProxyIndex, 'Invalid index' ); require(endProxyIndexIterator <= nextProxyIndex, 'Invalid index'); ILiquidityProtection lp = getLiquidityProtectionContract(); uint256[] memory depositIds; uint256 newContributionToAllocatedNav; for ( uint256 i = beginProxyIndexIterator; i < endProxyIndexIterator; i++ ) { depositIds = proxyAddressToData[proxyIndexToAddress[i]].depositIds; for (uint256 j = 0; j < depositIds.length; j++) { (newContributionToAllocatedNav, , ) = lp.removeLiquidityReturn( depositIds[j], PPM, block.timestamp.add(100 days) ); Deposit storage deposit = depositIdToDeposit[depositIds[j]]; // we do this check here only modifying state if contribution is higher // than previous, implicitly capturing Bancor's IL protection framework if ( newContributionToAllocatedNav > deposit.latestContributionToNav ) { totalAllocatedNav = totalAllocatedNav .sub(deposit.latestContributionToNav) .add(newContributionToAllocatedNav); deposit .latestContributionToNav = newContributionToAllocatedNav; } } } } /* * @notice Removes all deposits from proxy at lowestActiveProxyIndex */ function claimRewardsAndRemoveLiquidity() external onlyOwnerOrManager { _claimRewardsAndRemoveLiquidity(); _updateAdminActiveTimestamp(); } function emergencyClaimAndRemove() external liquidationTimeElapsed { _claimRewardsAndRemoveLiquidity(); } function _claimRewardsAndRemoveLiquidity() private { address proxyAddress = proxyIndexToAddress[lowestActiveProxyIndex]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); ProxyData storage proxyData = proxyAddressToData[proxyAddress]; // rewards nav reallocated implicitly to buffer balance pendingRewardsContributionToNav = pendingRewardsContributionToNav.sub( proxyData.pendingRewardsContributionToNav ); proxyData.pendingRewardsContributionToNav = 0; _unstake(proxyData.deployedBnt); vbnt.transfer(proxyAddress, proxyData.deployedBnt); uint256 rewardsClaimed = lpProxy.claimRewardsAndRemoveLiquidity(); _calculateAndIncrementFee(rewardsClaimed, feeDivisors.claimFee); emit ClaimRemove(lowestActiveProxyIndex, rewardsClaimed); // we don't deduct totalAllocatedNav yet because we need to wait // 24 hours to `claimBalance`. Only rewards are immediately retrieved lowestActiveProxyIndex++; _updateAdminActiveTimestamp(); } /* * @notice Second step in removal process * @notice Claims deposits balance 24 hrs after `claimRewardsAndRemoveLiquidity` called * @param proxyIndex: proxyIndex */ function claimBalance(uint256 proxyIndex) external onlyOwnerOrManager { _claimBalance(proxyIndex); _updateAdminActiveTimestamp(); } function emergencyClaimBalance(uint256 proxyIndex) external liquidationTimeElapsed { _claimBalance(proxyIndex); } function _claimBalance(uint256 _proxyIndex) private { address proxyAddress = proxyIndexToAddress[_proxyIndex]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); lpProxy.claimBalance(); uint256 contributionToTotalAllocatedNav; ProxyData memory proxyData = proxyAddressToData[proxyAddress]; uint256[] memory depositIds = proxyData.depositIds; for (uint256 i = 0; i < depositIds.length; i++) { contributionToTotalAllocatedNav = contributionToTotalAllocatedNav .add(depositIdToDeposit[depositIds[i]].latestContributionToNav); } emit ClaimBalance(_proxyIndex); // allocatedNav now becomes bnt buffer balance totalAllocatedNav = totalAllocatedNav.sub( contributionToTotalAllocatedNav ); } /* * @notice Claims rewards from a proxy without restaking * @notice Will reset rewards multiplier - use sparingly when buffer balance needed */ function claimRewards(uint256 proxyIndex) external onlyOwnerOrManager { address proxyAddress = proxyIndexToAddress[lowestActiveProxyIndex]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); uint256 proxyContributionToRewardsNav = getProxyAddressRewardsContributionToNav(proxyAddress); pendingRewardsContributionToNav = pendingRewardsContributionToNav.sub( proxyContributionToRewardsNav ); proxyAddressToData[proxyAddress].pendingRewardsContributionToNav = 0; uint256 rewards = lpProxy.claimRewards(); _calculateAndIncrementFee(rewards, feeDivisors.claimFee); emit ClaimRewards(proxyIndex, rewards); } function getLiquidityProtectionContract() public view returns (ILiquidityProtection) { return ILiquidityProtection( contractRegistry.addressOf(liquidityProtectionName) ); } function getStakingRewardsContract() public view returns (IStakingRewards) { return IStakingRewards(contractRegistry.addressOf(stakingRewardsName)); } /* ========================================================================================= */ /* Utils */ /* ========================================================================================= */ function getProxyAddressDepositIds(address proxyAddress) public view returns (uint256[] memory) { return proxyAddressToData[proxyAddress].depositIds; } function getProxyAddressRewardsContributionToNav(address proxyAddress) public view returns (uint256) { return proxyAddressToData[proxyAddress].pendingRewardsContributionToNav; } function changeLiquidityProviderImplementation(address newImplementation) external onlyOwner { queuedLiquidityProviderImplementation = newImplementation; lpImplementationChangedTimestamp = block.timestamp; emit KeyAddressChange(); } function confirmLiquidityProviderImplementationChange() external onlyOwner { require( block.timestamp > lpImplementationChangedTimestamp.add(WAITING_PERIOD), 'Too soon' ); liquidityProviderImplementation = queuedLiquidityProviderImplementation; } function changeGovernanceAddress(address newAddress) external onlyOwner { queuedGovernanceAddress = newAddress; governanceAddressChangedTimestamp = block.timestamp; emit KeyAddressChange(); } function confirmGovernanceAddressChange() external onlyOwner { require( block.timestamp > governanceAddressChangedTimestamp.add(WAITING_PERIOD), 'Too soon' ); bancorGovernance = IBancorGovernance(queuedGovernanceAddress); } /* ========================================================================================= */ /* Governance */ /* ========================================================================================= */ // we should probably have a setter in case bancor gov address changes function _stake(uint256 _amount) private { bancorGovernance.stake(_amount); } function _unstake(uint256 _amount) private { bancorGovernance.unstake(_amount); } /* ========================================================================================= */ /* NAV */ /* ========================================================================================= */ function getTargetBufferBalance() public view returns (uint256) { return getNav().div(BUFFER_TARGET); } function getNav() public view returns (uint256) { return totalAllocatedNav.add(getRewardsContributionToNav()).add( getBufferBalance() ); } function getRewardsContributionToNav() public view returns (uint256) { uint256 unassessedFees = pendingRewardsContributionToNav.div(feeDivisors.claimFee); return pendingRewardsContributionToNav.sub(unassessedFees); } function getBufferBalance() public view returns (uint256) { uint256 bntBal = bnt.balanceOf(address(this)); if (bntBal < withdrawableBntFees) return 0; return bntBal.sub(withdrawableBntFees); } function _calculateFee(uint256 _value, uint256 _feeDivisor) internal pure returns (uint256 fee) { if (_feeDivisor > 0 && _value > 0) { fee = _value.div(_feeDivisor); } } function _incrementWithdrawableBntFees(uint256 _feeAmount) private { withdrawableBntFees = withdrawableBntFees.add(_feeAmount); } function _calculateAndIncrementFee(uint256 _value, uint256 _feeDivisor) private returns (uint256 fee) { fee = _calculateFee(_value, _feeDivisor); _incrementWithdrawableBntFees(fee); } function setDelegate( address delegateRegistry, bytes32 id, address delegate ) external onlyOwnerOrManager { IDelegateRegistry(delegateRegistry).setDelegate(id, delegate); } /* ========================================================================================= */ /* Utils */ /* ========================================================================================= */ function _approveIfNecessary(IERC20 _token, address _toApprove) private { if (_token.allowance(address(this), _toApprove) == 0) { _token.approve(_toApprove, uint256(-1)); } } function getBancorNetworkContract() public view returns (IBancorNetwork) { return IBancorNetwork(contractRegistry.addressOf(bancorNetworkName)); } function approveVbnt(address _toApprove) external onlyOwnerOrManager { vbnt.approve(_toApprove, MAX_UINT); } function pauseContract() external onlyOwnerOrManager { _pause(); } function unpauseContract() external onlyOwnerOrManager { _unpause(); } modifier onlyOwnerOrManager { require( msg.sender == owner() || msg.sender == manager, 'Non-admin caller' ); _; } modifier liquidationTimeElapsed { require( adminActiveTimestamp.add(LIQUIDATION_TIME_PERIOD) < block.timestamp, 'Liquidation time not elapsed' ); _; } /* * @notice manager == alternative admin caller to owner */ function setManager(address _manager) external onlyOwner { manager = _manager; } /* * @notice manager2 == alternative admin caller to owner */ function setManager2(address _manager2) external onlyOwner { manager2 = _manager2; } /* * @notice Inverse of fee i.e., a fee divisor of 100 == 1% * @notice Three fee types * @dev Mint fee 0 or <= 2% * @dev Burn fee 0 or <= 1% * @dev Claim fee 0 <= 4% */ function setFeeDivisors( uint256 mintFeeDivisor, uint256 burnFeeDivisor, uint256 claimFeeDivisor ) external onlyOwner { _setFeeDivisors(mintFeeDivisor, burnFeeDivisor, claimFeeDivisor); } function _setFeeDivisors( uint256 _mintFeeDivisor, uint256 _burnFeeDivisor, uint256 _claimFeeDivisor ) private { require(_mintFeeDivisor == 0 || _mintFeeDivisor >= 50, 'Invalid fee'); require(_burnFeeDivisor == 0 || _burnFeeDivisor >= 100, 'Invalid fee'); require(_claimFeeDivisor >= 25, 'Invalid fee'); feeDivisors.mintFee = _mintFeeDivisor; feeDivisors.burnFee = _burnFeeDivisor; feeDivisors.claimFee = _claimFeeDivisor; } /* * @notice Records admin activity * @notice If not certified for a period exceeding LIQUIDATION_TIME_PERIOD, * emergencyCooldown and emergencyRedeem become available to non-admin caller */ function _updateAdminActiveTimestamp() private { adminActiveTimestamp = block.timestamp; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"poolToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddLiquidity","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":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"ClaimBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsClaimed","type":"uint256"}],"name":"ClaimRemove","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimRestake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsClaimed","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[],"name":"KeyAddressChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousRewardsNav","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardsNav","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RewardsNavUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"contract IConverterAnchor","name":"_poolAnchor","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminActiveTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toApprove","type":"address"}],"name":"approveVbnt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"internalType":"bool","name":"redeemForEth","type":"bool"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"minReturn","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"incrementalBnt","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"calculateMintAmount","outputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"changeGovernanceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"changeLiquidityProviderImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"internalType":"address","name":"poolToken","type":"address"}],"name":"claimAndRestake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"claimBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardsAndRemoveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmGovernanceAddressChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmLiquidityProviderImplementationChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositIdToDeposit","outputs":[{"internalType":"address","name":"proxyAddress","type":"address"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"uint256","name":"initialContribution","type":"uint256"},{"internalType":"uint256","name":"latestContributionToNav","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyClaimAndRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"emergencyClaimBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDivisors","outputs":[{"internalType":"uint256","name":"mintFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"claimFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBancorNetworkContract","outputs":[{"internalType":"contract IBancorNetwork","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBufferBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityProtectionContract","outputs":[{"internalType":"contract ILiquidityProtection","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"getProxyAddressDepositIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"getProxyAddressRewardsContributionToNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsContributionToNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingRewardsContract","outputs":[{"internalType":"contract IStakingRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTargetBufferBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_bnt","type":"address"},{"internalType":"contract IERC20","name":"_vbnt","type":"address"},{"internalType":"contract IContractRegistry","name":"_contractRegistry","type":"address"},{"internalType":"contract IBancorGovernance","name":"_bancorGovernance","type":"address"},{"internalType":"contract IMinimalProxyFactory","name":"_proxyFactory","type":"address"},{"internalType":"address","name":"_liquidityProviderImplementation","type":"address"},{"internalType":"uint256","name":"_mintFeeDivisor","type":"uint256"},{"internalType":"uint256","name":"_burnFeeDivisor","type":"uint256"},{"internalType":"uint256","name":"_claimFeeDivisor","type":"uint256"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lowestActiveProxyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"minReturn","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bntAmount","type":"uint256"}],"name":"mintWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProxyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRewardsContributionToNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proxyIndexToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegateRegistry","type":"address"},{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"address","name":"delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintFeeDivisor","type":"uint256"},{"internalType":"uint256","name":"burnFeeDivisor","type":"uint256"},{"internalType":"uint256","name":"claimFeeDivisor","type":"uint256"}],"name":"setFeeDivisors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager2","type":"address"}],"name":"setManager2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocatedNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"beginProxyIndexIterator","type":"uint256"},{"internalType":"uint256","name":"endProxyIndexIterator","type":"uint256"}],"name":"updatePendingRewardsContributionToNav","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"beginProxyIndexIterator","type":"uint256"},{"internalType":"uint256","name":"endProxyIndexIterator","type":"uint256"}],"name":"updateTotalAllocatedNav","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawableBntFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614b0f806100206000396000f3fe6080604052600436106103815760003560e01c80638bea72fb116101d1578063b5a0425711610102578063dd62ed3e116100a0578063e9484f8b1161006f578063e9484f8b14610e01578063e9fad39614610e34578063ea66696c14610e5e578063f2fde38b14610ece57610381565b8063dd62ed3e14610d51578063e1a0f07214610d8c578063e7654b3c14610db6578063e942e48414610dec57610381565b8063d5108057116100dc578063d510805714610ce2578063d9bb717014610cf7578063dada981914610d27578063dc24fc0714610d3c57610381565b8063b5a0425714610bb6578063c06e49be14610bef578063d0ebdbe714610caf57610381565b80639db759621161016f578063a9059cbb11610149578063a9059cbb14610b0e578063afdb3df614610b47578063b33712c514610b77578063b3eaff8b14610b8c57610381565b80639db7596214610a96578063a2d48da514610aab578063a457c2d714610ad557610381565b80639154d77c116101ab5780639154d77c14610a09578063940f61b614610a1e5780639440334f14610a5157806395d89b4114610a8157610381565b80638bea72fb1461093e5780638da5cb5b146109715780639068e2111461098657610381565b8063439766ce116102b6578063629c577e116102545780637c3651ae116102235780637c3651ae146108cc578063803c64bb146108e157806380bac4681461091457806386d1c5ff1461092957610381565b8063629c577e1461083c57806362fdfced1461086f57806370a0823114610884578063715018a6146108b757610381565b8063566887001161029057806356688700146106d657806358927bc41461070f5780635c975abb1461072457806360e0ce881461073957610381565b8063439766ce146106525780634ceac4db1461066757806351bb4257146106c157610381565b806323b872dd11610323578063313ce567116102fd578063313ce567146105c457806332d6a2f2146105ef5780633552c62f14610604578063395093511461061957610381565b806323b872dd1461053b57806326da9fb61461057e57806330d7aa841461059357610381565b8063095ea7b31161035f578063095ea7b3146104885780630962ef79146104d55780631373c1a6146104ff57806318160ddd1461052657610381565b806303b17808146103865780630636769e146103cb57806306fdde03146103fe575b600080fd5b34801561039257600080fd5b506103c9600480360360608110156103a957600080fd5b506001600160a01b03813581169160208101359160409091013516610f01565b005b3480156103d757600080fd5b506103c9600480360360208110156103ee57600080fd5b50356001600160a01b0316610ff4565b34801561040a57600080fd5b50610413611099565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044d578181015183820152602001610435565b50505050905090810190601f16801561047a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049457600080fd5b506104c1600480360360408110156104ab57600080fd5b506001600160a01b038135169060200135611130565b604080519115158252519081900360200190f35b3480156104e157600080fd5b506103c9600480360360208110156104f857600080fd5b503561114e565b34801561050b57600080fd5b506105146112e3565b60408051918252519081900360200190f35b34801561053257600080fd5b50610514611303565b34801561054757600080fd5b506104c16004803603606081101561055e57600080fd5b506001600160a01b03813581169160208101359091169060400135611309565b34801561058a57600080fd5b50610514611396565b34801561059f57600080fd5b506105a861139d565b604080516001600160a01b039092168252519081900360200190f35b3480156105d057600080fd5b506105d961142f565b6040805160ff9092168252519081900360200190f35b3480156105fb57600080fd5b506103c9611438565b34801561061057600080fd5b5061051461150b565b34801561062557600080fd5b506104c16004803603604081101561063c57600080fd5b506001600160a01b03813516906020013561153f565b34801561065e57600080fd5b506103c9611593565b34801561067357600080fd5b506106916004803603602081101561068a57600080fd5b5035611613565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b3480156106cd57600080fd5b50610514611645565b3480156106e257600080fd5b506103c9600480360360408110156106f957600080fd5b506001600160a01b03813516906020013561164c565b34801561071b57600080fd5b506105a86119f0565b34801561073057600080fd5b506104c1611a4b565b34801561074557600080fd5b506103c9600480360361014081101561075d57600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135811692608081013582169260a08201359092169160c08201359160e081013591610100820135919081019061014081016101208201356401000000008111156107c757600080fd5b8201836020820111156107d957600080fd5b803590602001918460018302840111640100000000831117156107fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a54945050505050565b34801561084857600080fd5b50610851611bac565b60408051938452602084019290925282820152519081900360600190f35b34801561087b57600080fd5b506103c9611bbb565b34801561089057600080fd5b50610514600480360360208110156108a757600080fd5b50356001600160a01b0316611c8d565b3480156108c357600080fd5b506103c9611ca8565b3480156108d857600080fd5b50610514611d4a565b3480156108ed57600080fd5b506105146004803603602081101561090457600080fd5b50356001600160a01b0316611d83565b34801561092057600080fd5b50610514611da2565b34801561093557600080fd5b506103c9611da9565b34801561094a57600080fd5b506103c96004803603602081101561096157600080fd5b50356001600160a01b0316611e2f565b34801561097d57600080fd5b506105a8611eaa565b34801561099257600080fd5b506109b9600480360360208110156109a957600080fd5b50356001600160a01b0316611eb9565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156109f55781810151838201526020016109dd565b505050509050019250505060405180910390f35b348015610a1557600080fd5b50610514611f26565b348015610a2a57600080fd5b506103c960048036036020811015610a4157600080fd5b50356001600160a01b0316611f2d565b348015610a5d57600080fd5b506103c960048036036040811015610a7457600080fd5b5080359060200135612029565b348015610a8d57600080fd5b5061041361228a565b348015610aa257600080fd5b506105146122eb565b348015610ab757600080fd5b506105a860048036036020811015610ace57600080fd5b50356122f2565b348015610ae157600080fd5b506104c160048036036040811015610af857600080fd5b506001600160a01b03813516906020013561230e565b348015610b1a57600080fd5b506104c160048036036040811015610b3157600080fd5b506001600160a01b03813516906020013561237c565b348015610b5357600080fd5b506103c960048036036040811015610b6a57600080fd5b5080359060200135612390565b348015610b8357600080fd5b506103c9612552565b348015610b9857600080fd5b506103c960048036036020811015610baf57600080fd5b50356125d0565b348015610bc257600080fd5b506103c960048036036040811015610bd957600080fd5b50803590602001356001600160a01b03166126f3565b348015610bfb57600080fd5b506103c960048036036080811015610c1257600080fd5b8135916020810135151591810190606081016040820135640100000000811115610c3b57600080fd5b820183602082011115610c4d57600080fd5b80359060200191846020830284011164010000000083111715610c6f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061293f915050565b348015610cbb57600080fd5b506103c960048036036020811015610cd257600080fd5b50356001600160a01b0316612d20565b348015610cee57600080fd5b50610514612d9b565b348015610d0357600080fd5b5061051460048036036040811015610d1a57600080fd5b5080359060200135612da2565b348015610d3357600080fd5b506103c9612df3565b348015610d4857600080fd5b50610514612e66565b348015610d5d57600080fd5b5061051460048036036040811015610d7457600080fd5b506001600160a01b0381358116916020013516612f0f565b348015610d9857600080fd5b506103c960048036036020811015610daf57600080fd5b5035612f3a565b348015610dc257600080fd5b506103c960048036036060811015610dd957600080fd5b5080359060208101359060400135612fae565b348015610df857600080fd5b506105a8613011565b348015610e0d57600080fd5b506103c960048036036020811015610e2457600080fd5b50356001600160a01b031661306d565b348015610e4057600080fd5b506103c960048036036020811015610e5757600080fd5b5035613112565b6103c960048036036040811015610e7457600080fd5b810190602081018135640100000000811115610e8f57600080fd5b820183602082011115610ea157600080fd5b80359060200191846020830284011164010000000083111715610ec357600080fd5b919350915035613199565b348015610eda57600080fd5b506103c960048036036020811015610ef157600080fd5b50356001600160a01b0316613399565b610f09611eaa565b6001600160a01b0316336001600160a01b03161480610f335750610108546001600160a01b031633145b610f77576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b826001600160a01b031663bd86e50883836040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b50505050505050565b610ffc613492565b6097546001600160a01b0390811691161461104c576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010c80546001600160a01b0319166001600160a01b03831617905542610101556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111255780601f106110fa57610100808354040283529160200191611125565b820191906000526020600020905b81548152906001019060200180831161110857829003601f168201915b505050505090505b90565b600061114461113d613492565b8484613496565b5060015b92915050565b611156611eaa565b6001600160a01b0316336001600160a01b031614806111805750610108546001600160a01b031633145b6111c4576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354600090815261011260205260408120546001600160a01b03169081906111ed82611d83565b61010654909150611204908263ffffffff61358216565b610106556001600160a01b03808416600090815261011160209081526040808320600101839055805163372500ab60e01b81529051929386169263372500ab9260048084019391929182900301818787803b15801561126257600080fd5b505af1158015611276573d6000803e3d6000fd5b505050506040513d602081101561128c57600080fd5b505161010f549091506112a09082906135c4565b50604080518681526020810183905281517f8b0944629ca33aba8dd5f33f7f8220efe77a2d5548a1651362c856c5ea586a65929181900390910190a15050505050565b60006112fe60146112f261150b565b9063ffffffff6135db16565b905090565b60675490565b600061131684848461361d565b61138c84611322613492565b611387856040518060600160405280602881526020016149d5602891396001600160a01b038a16600090815260666020526040812090611360613492565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61378616565b613496565b5060019392505050565b6101035481565b60fd5460408051632ecd14d360e21b8152722634b8bab4b234ba3ca83937ba32b1ba34b7b760691b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113fe57600080fd5b505afa158015611412573d6000803e3d6000fd5b505050506040513d602081101561142857600080fd5b5051905090565b606a5460ff1690565b611440613492565b6097546001600160a01b03908116911614611490576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b610100546114a7906202a30063ffffffff61381d16565b42116114e5576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010b5461010a80546001600160a01b0319166001600160a01b03909216919091179055565b60006112fe611518612e66565b611533611523611d4a565b610105549063ffffffff61381d16565b9063ffffffff61381d16565b600061114461154c613492565b84611387856066600061155d613492565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61381d16565b61159b611eaa565b6001600160a01b0316336001600160a01b031614806115c55750610108546001600160a01b031633145b611609576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611611613877565b565b6101106020526000908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b6101075481565b611654611eaa565b6001600160a01b0316336001600160a01b0316148061167e5750610108546001600160a01b031633145b6116c2576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010454604080516020808201939093528082018490528151808203830181526060820180845281519185019190912060ff5461010a5463df02995d60e01b909352606484018290526001600160a01b03928316608485015293519094600094929092169263df02995d9260a480830193919282900301818787803b15801561174a57600080fd5b505af115801561175e573d6000803e3d6000fd5b505050506040513d602081101561177457600080fd5b505160fb546040805163a9059cbb60e01b81526001600160a01b03808516600483015260248201889052915193945091169163a9059cbb916044808201926020929091908290030181600087803b1580156117ce57600080fd5b505af11580156117e2573d6000803e3d6000fd5b505050506040513d60208110156117f857600080fd5b505060fd5460fb5460fc546040805163410ace9360e01b81526001600160a01b03948516600482015230602482015292841660448401529083166064830152868316608483015260a482018690525160009284169163410ace939160c480830192602092919082900301818787803b15801561187357600080fd5b505af1158015611887573d6000803e3d6000fd5b505050506040513d602081101561189d57600080fd5b505190506118a9614816565b5060408051608080820183526001600160a01b038086168352602080840186905283850189905260608085018a9052610104548651938c1684529183018a90528286018790528201524291810191909152915190917fd92dda7384b5f0fa573be9bbf63d63ac81a5bbb08ebc31f00c0f066e50239609919081900360a00190a1600082815261011060209081526040808320845181546001600160a01b039182166001600160a01b031991821617835584870151600180850191909155848801516002808601919091556060890151600390950194909455918916808752610111865284872080548085018255818952878920018a90559384018c9055610104805488526101129096529390952080549095169092179093558154019055610105546119db908763ffffffff61381d16565b610105556119e886613915565b610feb61397d565b60fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113fe57600080fd5b60c95460ff1690565b600054610100900460ff1680611a6d5750611a6d613984565b80611a7b575060005460ff16155b611ab65760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015611ae1576000805460ff1961ff0019909116610100171660011790555b611b07604051806040016040528060048152602001631e10939560e21b8152508361398a565b611b0f613a3f565b611b17613af0565b60fb80546001600160a01b03199081166001600160a01b038e81169190911790925560fc805482168d841617905560fd805482168c841617905560fe805482168b841617905560ff805482168a841617905561010a8054909116918816919091179055611b85858585613b8d565b611b8d61397d565b8015611b9f576000805461ff00191690555b5050505050505050505050565b61010d5461010e5461010f5483565b611bc3613492565b6097546001600160a01b03908116911614611c13576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010154611c2a906202a30063ffffffff61381d16565b4211611c68576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010c5460fe80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b031660009081526065602052604090205490565b611cb0613492565b6097546001600160a01b03908116911614611d00576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b61010f54610106546000918291611d669163ffffffff6135db16565b61010654909150611d7d908263ffffffff61358216565b91505090565b6001600160a01b03166000908152610111602052604090206001015490565b6101065481565b611db1611eaa565b6001600160a01b0316336001600160a01b03161480611ddb5750610108546001600160a01b031633145b611e1f576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611e27613c7c565b61161161397d565b611e37613492565b6097546001600160a01b03908116911614611e87576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010980546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031690565b6001600160a01b03811660009081526101116020908152604091829020805483518184028101840190945280845260609392830182828015611f1a57602002820191906000526020600020905b815481526020019060010190808311611f06575b50505050509050919050565b6101025481565b611f35611eaa565b6001600160a01b0316336001600160a01b03161480611f5f5750610108546001600160a01b031633145b611fa3576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60fc546040805163095ea7b360e01b81526001600160a01b03848116600483015260001960248301529151919092169163095ea7b39160448083019260209291908290030181600087803b158015611ffa57600080fd5b505af115801561200e573d6000803e3d6000fd5b505050506040513d602081101561202457600080fd5b505050565b61010354821015612071576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b610104548111156120b9576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b60006120c361139d565b905060606000845b8481101561228257600081815261011260209081526040808320546001600160a01b031683526101118252918290208054835181840281018401909452808452909183018282801561213c57602002820191906000526020600020905b815481526020019060010190808311612128575b50939650600093505050505b835181101561227957846001600160a01b0316636d533e9b85838151811061216c57fe5b6020026020010151620f424061218e6283d6004261381d90919063ffffffff16565b6040518463ffffffff1660e01b8152600401808481526020018363ffffffff1663ffffffff168152602001828152602001935050505060606040518083038186803b1580156121dc57600080fd5b505afa1580156121f0573d6000803e3d6000fd5b505050506040513d606081101561220657600080fd5b5051845190935060009061011090829087908590811061222257fe5b6020026020010151815260200190815260200160002090508060030154841115612270576122648461153383600301546101055461358290919063ffffffff16565b61010555600381018490555b50600101612148565b506001016120cb565b505050505050565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111255780601f106110fa57610100808354040283529160200191611125565b6101045481565b610112602052600090815260409020546001600160a01b031681565b600061114461231b613492565b8461138785604051806060016040528060258152602001614ab56025913960666000612345613492565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61378616565b6000611144612389613492565b848461361d565b610103548210156123d8576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b61010454811115612420576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b600061242a613011565b610103549091506000905b61010454811015612506576000818152610112602090815260408083205481516318ebd13160e11b81526001600160a01b03918216600482018190529251929493918816926331d7a26292602480840193919291829003018186803b15801561249d57600080fd5b505afa1580156124b1573d6000803e3d6000fd5b505050506040513d60208110156124c757600080fd5b50516001600160a01b03831660009081526101116020526040902060010181905590506124fa848263ffffffff61381d16565b93505050600101612435565b506101065460408051918252602082018390524282820152517fdb6384c96bf21119d48fbb5985f4f9b3dcd153386eba0ffcb2b8b4c69fd9aa409181900360600190a161010655505050565b61255a611eaa565b6001600160a01b0316336001600160a01b031614806125845750610108546001600160a01b031633145b6125c8576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611611613e39565b60c95460ff161561261b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60008111612660576040805162461bcd60e51b815260206004820152600d60248201526c135d5cdd081cd95b9908109395609a1b604482015290519081900360640190fd5b60fb54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156126ba57600080fd5b505af11580156126ce573d6000803e3d6000fd5b505050506040513d60208110156126e457600080fd5b506126f0905081613eba565b50565b6126fb611eaa565b6001600160a01b0316336001600160a01b031614806127255750610108546001600160a01b031633145b612769576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b600082815261011260209081526040808320546001600160a01b03908116808552610111909352818420825163a04d481360e01b81529186166004830152825193949093859391928392859263a04d481392602480820193929182900301818787803b1580156127d857600080fd5b505af11580156127ec573d6000803e3d6000fd5b505050506040513d604081101561280257600080fd5b50805160209091015161010f54919350915061281f9082906135c4565b50835460018101855560008581526020902001829055600284015461284a908263ffffffff61381d16565b60028501556001840154610106546128679163ffffffff61358216565b610106556000600185015561010554612886908263ffffffff61381d16565b6101055560408051608080820183526001600160a01b0388811683526020808401878152848601878152606080870189815260008b81526101108652899020975188546001600160a01b031916961695909517875591516001870155516002860155915160039094019390935583518b8152928301859052828401869052429083015291517f9737e7b0050fbe768c31b5c3d88bbcb6fe5e72237a4b8f3d60864d9110e4d397929181900390910190a16119e881613915565b60008411612985576040805162461bcd60e51b815260206004820152600e60248201526d135d5cdd081cd95b99081e10939560921b604482015290519081900360640190fd5b600061298f612e66565b905060006129b661299e611303565b6112f2886129aa61150b565b9063ffffffff613efc16565b905081811115612a0d576040805162461bcd60e51b815260206004820181905260248201527f4275726e206578636565647320617661696c61626c65206c6971756964697479604482015290519081900360640190fd5b612a173387613f55565b6000612a298261010d600101546135c4565b90508515612c7a5760fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b505160fb54909150612ad1906001600160a01b03168261405d565b60006001600160a01b03821663b77d239b88612af3878763ffffffff61358216565b8960008060006040518763ffffffff1660e01b81526004018080602001878152602001868152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001838152602001828103825288818151815260200191508051906020019060200280838360005b83811015612b8a578181015183820152602001612b72565b50505050905001975050505050505050602060405180830381600087803b158015612bb457600080fd5b505af1158015612bc8573d6000803e3d6000fd5b505050506040513d6020811015612bde57600080fd5b5051604051909150600090339083908381818185875af1925050503d8060008114612c25576040519150601f19603f3d011682016040523d82523d6000602084013e612c2a565b606091505b5050905080612c72576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b505050610feb565b60fb546001600160a01b031663a9059cbb33612c9c858563ffffffff61358216565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ceb57600080fd5b505af1158015612cff573d6000803e3d6000fd5b505050506040513d6020811015612d1557600080fd5b505050505050505050565b612d28613492565b6097546001600160a01b03908116911614612d78576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010880546001600160a01b0319166001600160a01b0392909216919091179055565b6101055481565b600081612dc157612dba83600a63ffffffff613efc16565b9050611148565b612dec612ddc84612dd061150b565b9063ffffffff61358216565b6112f2858563ffffffff613efc16565b9392505050565b610102544290612e0c906224ea0063ffffffff61381d16565b10612e5e576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b611611613c7c565b60fb54604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015612eb657600080fd5b505afa158015612eca573d6000803e3d6000fd5b505050506040513d6020811015612ee057600080fd5b505161010754909150811015612efa57600091505061112d565b61010754611d7d90829063ffffffff61358216565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b610102544290612f53906224ea0063ffffffff61381d16565b10612fa5576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b6126f08161415f565b612fb6613492565b6097546001600160a01b03908116911614613006576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b612024838383613b8d565b60fd5460408051632ecd14d360e21b81526d5374616b696e675265776172647360901b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113fe57600080fd5b613075613492565b6097546001600160a01b039081169116146130c5576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010b80546001600160a01b0319166001600160a01b03831617905542610100556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b61311a611eaa565b6001600160a01b0316336001600160a01b031614806131445750610108546001600160a01b031633145b613188576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b6131918161415f565b6126f061397d565b60c95460ff16156131e4576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60003411613229576040805162461bcd60e51b815260206004820152600d60248201526c09aeae6e840e6cadcc8408aa89609b1b604482015290519081900360640190fd5b60fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561328457600080fd5b505afa158015613298573d6000803e3d6000fd5b505050506040513d60208110156132ae57600080fd5b505160405163b77d239b60e01b81523460248201819052604482018590526000606483018190526084830181905260a4830181905260c06004840190815260c484018890526001600160a01b039094169363b77d239b938992899285928a92918291829190819060e4018960208a0280828437600081840152601f19601f820116905080830192505050985050505050505050506020604051808303818588803b15801561335b57600080fd5b505af115801561336f573d6000803e3d6000fd5b50505050506040513d602081101561338657600080fd5b5051905061339381613eba565b50505050565b6133a1613492565b6097546001600160a01b039081169116146133f1576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b6001600160a01b0381166134365760405162461bcd60e51b81526004018080602001828103825260268152602001806149466026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b0383166134db5760405162461bcd60e51b8152600401808060200182810382526024815260200180614a916024913960400191505060405180910390fd5b6001600160a01b0382166135205760405162461bcd60e51b815260040180806020018281038252602281526020018061496c6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000612dec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613786565b60006135d08383614309565b90506111488161432f565b6000612dec83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061434a565b6001600160a01b0383166136625760405162461bcd60e51b8152600401808060200182810382526025815260200180614a6c6025913960400191505060405180910390fd5b6001600160a01b0382166136a75760405162461bcd60e51b81526004018080602001828103825260238152602001806149016023913960400191505060405180910390fd5b6136b2838383612024565b6136f58160405180606001604052806026815260200161498e602691396001600160a01b038616600090815260656020526040902054919063ffffffff61378616565b6001600160a01b03808516600090815260656020526040808220939093559084168152205461372a908263ffffffff61381d16565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156138155760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137da5781810151838201526020016137c2565b50505050905090810190601f1680156138075780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612dec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60c95460ff16156138c2576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138f8613492565b604080516001600160a01b039092168252519081900360200190a1565b60fe546040805163534a7e1d60e11b81526004810184905290516001600160a01b039092169163a694fc3a9160248082019260009290919082900301818387803b15801561396257600080fd5b505af1158015613976573d6000803e3d6000fd5b5050505050565b4261010255565b303b1590565b600054610100900460ff16806139a357506139a3613984565b806139b1575060005460ff16155b6139ec5760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015613a17576000805460ff1961ff0019909116610100171660011790555b613a1f6143af565b613a29838361444f565b8015612024576000805461ff0019169055505050565b600054610100900460ff1680613a585750613a58613984565b80613a66575060005460ff16155b613aa15760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015613acc576000805460ff1961ff0019909116610100171660011790555b613ad46143af565b613adc614527565b80156126f0576000805461ff001916905550565b600054610100900460ff1680613b095750613b09613984565b80613b17575060005460ff16155b613b525760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015613b7d576000805460ff1961ff0019909116610100171660011790555b613b856143af565b613adc614620565b821580613b9b575060328310155b613bda576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b811580613be8575060648210155b613c27576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b6019811015613c6b576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b61010d9290925561010e5561010f55565b61010354600090815261011260209081526040808320546001600160a01b0316808452610111909252909120600181015461010654839291613cc4919063ffffffff61358216565b61010655600060018201556002810154613cdd906146cb565b60fc5460028201546040805163a9059cbb60e01b81526001600160a01b03878116600483015260248201939093529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015613d3957600080fd5b505af1158015613d4d573d6000803e3d6000fd5b505050506040513d6020811015613d6357600080fd5b5050604080516386d1c5ff60e01b815290516000916001600160a01b038516916386d1c5ff9160048082019260209290919082900301818787803b158015613daa57600080fd5b505af1158015613dbe573d6000803e3d6000fd5b505050506040513d6020811015613dd457600080fd5b505161010f54909150613de89082906135c4565b5061010354604080519182526020820183905280517f2493012c2b3f032daebde31221d2adb14631b760cd03040957e4ba73dc20b9719281900390910190a16101038054600101905561339361397d565b60c95460ff16613e87576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6138f8613492565b6000613ecc8261010d600001546135c4565b90506000613ef0613ee3848463ffffffff61358216565b613eeb611303565b612da2565b90506120243382614718565b600082613f0b57506000611148565b82820282848281613f1857fe5b0414612dec5760405162461bcd60e51b81526004018080602001828103825260218152602001806149b46021913960400191505060405180910390fd5b6001600160a01b038216613f9a5760405162461bcd60e51b8152600401808060200182810382526021815260200180614a4b6021913960400191505060405180910390fd5b613fa682600083612024565b613fe981604051806060016040528060228152602001614924602291396001600160a01b038516600090815260656020526040902054919063ffffffff61378616565b6001600160a01b038316600090815260656020526040902055606754614015908263ffffffff61358216565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b1580156140ad57600080fd5b505afa1580156140c1573d6000803e3d6000fd5b505050506040513d60208110156140d757600080fd5b505161415b576040805163095ea7b360e01b81526001600160a01b038381166004830152600019602483015291519184169163095ea7b3916044808201926020929091908290030181600087803b15801561413157600080fd5b505af1158015614145573d6000803e3d6000fd5b505050506040513d602081101561339357600080fd5b5050565b600081815261011260205260408082205481516318284de560e11b815291516001600160a01b0390911692839283926330509bca9260048084019391929182900301818387803b1580156141b257600080fd5b505af11580156141c6573d6000803e3d6000fd5b5050505060006141d4614847565b6001600160a01b038416600090815261011160209081526040918290208251815460809381028201840190945260608101848152909391928492849184018282801561423f57602002820191906000526020600020905b81548152602001906001019080831161422b575b505050918352505060018201546020820152600290910154604090910152805190915060005b81518110156142b5576142ab610110600084848151811061428257fe5b60200260200101518152602001908152602001600020600301548561381d90919063ffffffff16565b9350600101614265565b506040805187815290517f7fc547d30654f63b77c16f8a90f08290e8f69a076d8d5512d182b4ddbc198d039181900360200190a1610105546142fd908463ffffffff61358216565b61010555505050505050565b6000808211801561431a5750600083115b1561114857612dec838363ffffffff6135db16565b61010754614343908263ffffffff61381d16565b6101075550565b600081836143995760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156137da5781810151838201526020016137c2565b5060008385816143a557fe5b0495945050505050565b600054610100900460ff16806143c857506143c8613984565b806143d6575060005460ff16155b6144115760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015613adc576000805460ff1961ff00199091166101001716600117905580156126f0576000805461ff001916905550565b600054610100900460ff16806144685750614468613984565b80614476575060005460ff16155b6144b15760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff161580156144dc576000805460ff1961ff0019909116610100171660011790555b82516144ef906068906020860190614868565b508151614503906069906020850190614868565b50606a805460ff191660121790558015612024576000805461ff0019169055505050565b600054610100900460ff16806145405750614540613984565b8061454e575060005460ff16155b6145895760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff161580156145b4576000805460ff1961ff0019909116610100171660011790555b60006145be613492565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156126f0576000805461ff001916905550565b600054610100900460ff16806146395750614639613984565b80614647575060005460ff16155b6146825760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff161580156146ad576000805460ff1961ff0019909116610100171660011790555b60c9805460ff1916905580156126f0576000805461ff001916905550565b60fe54604080516305c2fbcf60e31b81526004810184905290516001600160a01b0390921691632e17de789160248082019260009290919082900301818387803b15801561396257600080fd5b6001600160a01b038216614773576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61477f60008383612024565b606754614792908263ffffffff61381d16565b6067556001600160a01b0382166000908152606560205260409020546147be908263ffffffff61381d16565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b60405180606001604052806060815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106148a957805160ff19168380011785556148d6565b828001600101855582156148d6579182015b828111156148d65782518255916020019190600101906148bb565b506148e29291506148e6565b5090565b61112d91905b808211156148e257600081556001016148ec56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e4bd2476bcdd59b0f73493b4ab3ed06d1ed1d47756bbc08ef49f3a90c11d424764736f6c63430006020033
Deployed Bytecode
0x6080604052600436106103815760003560e01c80638bea72fb116101d1578063b5a0425711610102578063dd62ed3e116100a0578063e9484f8b1161006f578063e9484f8b14610e01578063e9fad39614610e34578063ea66696c14610e5e578063f2fde38b14610ece57610381565b8063dd62ed3e14610d51578063e1a0f07214610d8c578063e7654b3c14610db6578063e942e48414610dec57610381565b8063d5108057116100dc578063d510805714610ce2578063d9bb717014610cf7578063dada981914610d27578063dc24fc0714610d3c57610381565b8063b5a0425714610bb6578063c06e49be14610bef578063d0ebdbe714610caf57610381565b80639db759621161016f578063a9059cbb11610149578063a9059cbb14610b0e578063afdb3df614610b47578063b33712c514610b77578063b3eaff8b14610b8c57610381565b80639db7596214610a96578063a2d48da514610aab578063a457c2d714610ad557610381565b80639154d77c116101ab5780639154d77c14610a09578063940f61b614610a1e5780639440334f14610a5157806395d89b4114610a8157610381565b80638bea72fb1461093e5780638da5cb5b146109715780639068e2111461098657610381565b8063439766ce116102b6578063629c577e116102545780637c3651ae116102235780637c3651ae146108cc578063803c64bb146108e157806380bac4681461091457806386d1c5ff1461092957610381565b8063629c577e1461083c57806362fdfced1461086f57806370a0823114610884578063715018a6146108b757610381565b8063566887001161029057806356688700146106d657806358927bc41461070f5780635c975abb1461072457806360e0ce881461073957610381565b8063439766ce146106525780634ceac4db1461066757806351bb4257146106c157610381565b806323b872dd11610323578063313ce567116102fd578063313ce567146105c457806332d6a2f2146105ef5780633552c62f14610604578063395093511461061957610381565b806323b872dd1461053b57806326da9fb61461057e57806330d7aa841461059357610381565b8063095ea7b31161035f578063095ea7b3146104885780630962ef79146104d55780631373c1a6146104ff57806318160ddd1461052657610381565b806303b17808146103865780630636769e146103cb57806306fdde03146103fe575b600080fd5b34801561039257600080fd5b506103c9600480360360608110156103a957600080fd5b506001600160a01b03813581169160208101359160409091013516610f01565b005b3480156103d757600080fd5b506103c9600480360360208110156103ee57600080fd5b50356001600160a01b0316610ff4565b34801561040a57600080fd5b50610413611099565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561044d578181015183820152602001610435565b50505050905090810190601f16801561047a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049457600080fd5b506104c1600480360360408110156104ab57600080fd5b506001600160a01b038135169060200135611130565b604080519115158252519081900360200190f35b3480156104e157600080fd5b506103c9600480360360208110156104f857600080fd5b503561114e565b34801561050b57600080fd5b506105146112e3565b60408051918252519081900360200190f35b34801561053257600080fd5b50610514611303565b34801561054757600080fd5b506104c16004803603606081101561055e57600080fd5b506001600160a01b03813581169160208101359091169060400135611309565b34801561058a57600080fd5b50610514611396565b34801561059f57600080fd5b506105a861139d565b604080516001600160a01b039092168252519081900360200190f35b3480156105d057600080fd5b506105d961142f565b6040805160ff9092168252519081900360200190f35b3480156105fb57600080fd5b506103c9611438565b34801561061057600080fd5b5061051461150b565b34801561062557600080fd5b506104c16004803603604081101561063c57600080fd5b506001600160a01b03813516906020013561153f565b34801561065e57600080fd5b506103c9611593565b34801561067357600080fd5b506106916004803603602081101561068a57600080fd5b5035611613565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b3480156106cd57600080fd5b50610514611645565b3480156106e257600080fd5b506103c9600480360360408110156106f957600080fd5b506001600160a01b03813516906020013561164c565b34801561071b57600080fd5b506105a86119f0565b34801561073057600080fd5b506104c1611a4b565b34801561074557600080fd5b506103c9600480360361014081101561075d57600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135811692608081013582169260a08201359092169160c08201359160e081013591610100820135919081019061014081016101208201356401000000008111156107c757600080fd5b8201836020820111156107d957600080fd5b803590602001918460018302840111640100000000831117156107fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a54945050505050565b34801561084857600080fd5b50610851611bac565b60408051938452602084019290925282820152519081900360600190f35b34801561087b57600080fd5b506103c9611bbb565b34801561089057600080fd5b50610514600480360360208110156108a757600080fd5b50356001600160a01b0316611c8d565b3480156108c357600080fd5b506103c9611ca8565b3480156108d857600080fd5b50610514611d4a565b3480156108ed57600080fd5b506105146004803603602081101561090457600080fd5b50356001600160a01b0316611d83565b34801561092057600080fd5b50610514611da2565b34801561093557600080fd5b506103c9611da9565b34801561094a57600080fd5b506103c96004803603602081101561096157600080fd5b50356001600160a01b0316611e2f565b34801561097d57600080fd5b506105a8611eaa565b34801561099257600080fd5b506109b9600480360360208110156109a957600080fd5b50356001600160a01b0316611eb9565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156109f55781810151838201526020016109dd565b505050509050019250505060405180910390f35b348015610a1557600080fd5b50610514611f26565b348015610a2a57600080fd5b506103c960048036036020811015610a4157600080fd5b50356001600160a01b0316611f2d565b348015610a5d57600080fd5b506103c960048036036040811015610a7457600080fd5b5080359060200135612029565b348015610a8d57600080fd5b5061041361228a565b348015610aa257600080fd5b506105146122eb565b348015610ab757600080fd5b506105a860048036036020811015610ace57600080fd5b50356122f2565b348015610ae157600080fd5b506104c160048036036040811015610af857600080fd5b506001600160a01b03813516906020013561230e565b348015610b1a57600080fd5b506104c160048036036040811015610b3157600080fd5b506001600160a01b03813516906020013561237c565b348015610b5357600080fd5b506103c960048036036040811015610b6a57600080fd5b5080359060200135612390565b348015610b8357600080fd5b506103c9612552565b348015610b9857600080fd5b506103c960048036036020811015610baf57600080fd5b50356125d0565b348015610bc257600080fd5b506103c960048036036040811015610bd957600080fd5b50803590602001356001600160a01b03166126f3565b348015610bfb57600080fd5b506103c960048036036080811015610c1257600080fd5b8135916020810135151591810190606081016040820135640100000000811115610c3b57600080fd5b820183602082011115610c4d57600080fd5b80359060200191846020830284011164010000000083111715610c6f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061293f915050565b348015610cbb57600080fd5b506103c960048036036020811015610cd257600080fd5b50356001600160a01b0316612d20565b348015610cee57600080fd5b50610514612d9b565b348015610d0357600080fd5b5061051460048036036040811015610d1a57600080fd5b5080359060200135612da2565b348015610d3357600080fd5b506103c9612df3565b348015610d4857600080fd5b50610514612e66565b348015610d5d57600080fd5b5061051460048036036040811015610d7457600080fd5b506001600160a01b0381358116916020013516612f0f565b348015610d9857600080fd5b506103c960048036036020811015610daf57600080fd5b5035612f3a565b348015610dc257600080fd5b506103c960048036036060811015610dd957600080fd5b5080359060208101359060400135612fae565b348015610df857600080fd5b506105a8613011565b348015610e0d57600080fd5b506103c960048036036020811015610e2457600080fd5b50356001600160a01b031661306d565b348015610e4057600080fd5b506103c960048036036020811015610e5757600080fd5b5035613112565b6103c960048036036040811015610e7457600080fd5b810190602081018135640100000000811115610e8f57600080fd5b820183602082011115610ea157600080fd5b80359060200191846020830284011164010000000083111715610ec357600080fd5b919350915035613199565b348015610eda57600080fd5b506103c960048036036020811015610ef157600080fd5b50356001600160a01b0316613399565b610f09611eaa565b6001600160a01b0316336001600160a01b03161480610f335750610108546001600160a01b031633145b610f77576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b826001600160a01b031663bd86e50883836040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b50505050505050565b610ffc613492565b6097546001600160a01b0390811691161461104c576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010c80546001600160a01b0319166001600160a01b03831617905542610101556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111255780601f106110fa57610100808354040283529160200191611125565b820191906000526020600020905b81548152906001019060200180831161110857829003601f168201915b505050505090505b90565b600061114461113d613492565b8484613496565b5060015b92915050565b611156611eaa565b6001600160a01b0316336001600160a01b031614806111805750610108546001600160a01b031633145b6111c4576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354600090815261011260205260408120546001600160a01b03169081906111ed82611d83565b61010654909150611204908263ffffffff61358216565b610106556001600160a01b03808416600090815261011160209081526040808320600101839055805163372500ab60e01b81529051929386169263372500ab9260048084019391929182900301818787803b15801561126257600080fd5b505af1158015611276573d6000803e3d6000fd5b505050506040513d602081101561128c57600080fd5b505161010f549091506112a09082906135c4565b50604080518681526020810183905281517f8b0944629ca33aba8dd5f33f7f8220efe77a2d5548a1651362c856c5ea586a65929181900390910190a15050505050565b60006112fe60146112f261150b565b9063ffffffff6135db16565b905090565b60675490565b600061131684848461361d565b61138c84611322613492565b611387856040518060600160405280602881526020016149d5602891396001600160a01b038a16600090815260666020526040812090611360613492565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61378616565b613496565b5060019392505050565b6101035481565b60fd5460408051632ecd14d360e21b8152722634b8bab4b234ba3ca83937ba32b1ba34b7b760691b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113fe57600080fd5b505afa158015611412573d6000803e3d6000fd5b505050506040513d602081101561142857600080fd5b5051905090565b606a5460ff1690565b611440613492565b6097546001600160a01b03908116911614611490576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b610100546114a7906202a30063ffffffff61381d16565b42116114e5576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010b5461010a80546001600160a01b0319166001600160a01b03909216919091179055565b60006112fe611518612e66565b611533611523611d4a565b610105549063ffffffff61381d16565b9063ffffffff61381d16565b600061114461154c613492565b84611387856066600061155d613492565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61381d16565b61159b611eaa565b6001600160a01b0316336001600160a01b031614806115c55750610108546001600160a01b031633145b611609576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611611613877565b565b6101106020526000908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b6101075481565b611654611eaa565b6001600160a01b0316336001600160a01b0316148061167e5750610108546001600160a01b031633145b6116c2576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010454604080516020808201939093528082018490528151808203830181526060820180845281519185019190912060ff5461010a5463df02995d60e01b909352606484018290526001600160a01b03928316608485015293519094600094929092169263df02995d9260a480830193919282900301818787803b15801561174a57600080fd5b505af115801561175e573d6000803e3d6000fd5b505050506040513d602081101561177457600080fd5b505160fb546040805163a9059cbb60e01b81526001600160a01b03808516600483015260248201889052915193945091169163a9059cbb916044808201926020929091908290030181600087803b1580156117ce57600080fd5b505af11580156117e2573d6000803e3d6000fd5b505050506040513d60208110156117f857600080fd5b505060fd5460fb5460fc546040805163410ace9360e01b81526001600160a01b03948516600482015230602482015292841660448401529083166064830152868316608483015260a482018690525160009284169163410ace939160c480830192602092919082900301818787803b15801561187357600080fd5b505af1158015611887573d6000803e3d6000fd5b505050506040513d602081101561189d57600080fd5b505190506118a9614816565b5060408051608080820183526001600160a01b038086168352602080840186905283850189905260608085018a9052610104548651938c1684529183018a90528286018790528201524291810191909152915190917fd92dda7384b5f0fa573be9bbf63d63ac81a5bbb08ebc31f00c0f066e50239609919081900360a00190a1600082815261011060209081526040808320845181546001600160a01b039182166001600160a01b031991821617835584870151600180850191909155848801516002808601919091556060890151600390950194909455918916808752610111865284872080548085018255818952878920018a90559384018c9055610104805488526101129096529390952080549095169092179093558154019055610105546119db908763ffffffff61381d16565b610105556119e886613915565b610feb61397d565b60fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113fe57600080fd5b60c95460ff1690565b600054610100900460ff1680611a6d5750611a6d613984565b80611a7b575060005460ff16155b611ab65760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015611ae1576000805460ff1961ff0019909116610100171660011790555b611b07604051806040016040528060048152602001631e10939560e21b8152508361398a565b611b0f613a3f565b611b17613af0565b60fb80546001600160a01b03199081166001600160a01b038e81169190911790925560fc805482168d841617905560fd805482168c841617905560fe805482168b841617905560ff805482168a841617905561010a8054909116918816919091179055611b85858585613b8d565b611b8d61397d565b8015611b9f576000805461ff00191690555b5050505050505050505050565b61010d5461010e5461010f5483565b611bc3613492565b6097546001600160a01b03908116911614611c13576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010154611c2a906202a30063ffffffff61381d16565b4211611c68576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010c5460fe80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b031660009081526065602052604090205490565b611cb0613492565b6097546001600160a01b03908116911614611d00576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b61010f54610106546000918291611d669163ffffffff6135db16565b61010654909150611d7d908263ffffffff61358216565b91505090565b6001600160a01b03166000908152610111602052604090206001015490565b6101065481565b611db1611eaa565b6001600160a01b0316336001600160a01b03161480611ddb5750610108546001600160a01b031633145b611e1f576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611e27613c7c565b61161161397d565b611e37613492565b6097546001600160a01b03908116911614611e87576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010980546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031690565b6001600160a01b03811660009081526101116020908152604091829020805483518184028101840190945280845260609392830182828015611f1a57602002820191906000526020600020905b815481526020019060010190808311611f06575b50505050509050919050565b6101025481565b611f35611eaa565b6001600160a01b0316336001600160a01b03161480611f5f5750610108546001600160a01b031633145b611fa3576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60fc546040805163095ea7b360e01b81526001600160a01b03848116600483015260001960248301529151919092169163095ea7b39160448083019260209291908290030181600087803b158015611ffa57600080fd5b505af115801561200e573d6000803e3d6000fd5b505050506040513d602081101561202457600080fd5b505050565b61010354821015612071576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b610104548111156120b9576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b60006120c361139d565b905060606000845b8481101561228257600081815261011260209081526040808320546001600160a01b031683526101118252918290208054835181840281018401909452808452909183018282801561213c57602002820191906000526020600020905b815481526020019060010190808311612128575b50939650600093505050505b835181101561227957846001600160a01b0316636d533e9b85838151811061216c57fe5b6020026020010151620f424061218e6283d6004261381d90919063ffffffff16565b6040518463ffffffff1660e01b8152600401808481526020018363ffffffff1663ffffffff168152602001828152602001935050505060606040518083038186803b1580156121dc57600080fd5b505afa1580156121f0573d6000803e3d6000fd5b505050506040513d606081101561220657600080fd5b5051845190935060009061011090829087908590811061222257fe5b6020026020010151815260200190815260200160002090508060030154841115612270576122648461153383600301546101055461358290919063ffffffff16565b61010555600381018490555b50600101612148565b506001016120cb565b505050505050565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111255780601f106110fa57610100808354040283529160200191611125565b6101045481565b610112602052600090815260409020546001600160a01b031681565b600061114461231b613492565b8461138785604051806060016040528060258152602001614ab56025913960666000612345613492565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61378616565b6000611144612389613492565b848461361d565b610103548210156123d8576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b61010454811115612420576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b600061242a613011565b610103549091506000905b61010454811015612506576000818152610112602090815260408083205481516318ebd13160e11b81526001600160a01b03918216600482018190529251929493918816926331d7a26292602480840193919291829003018186803b15801561249d57600080fd5b505afa1580156124b1573d6000803e3d6000fd5b505050506040513d60208110156124c757600080fd5b50516001600160a01b03831660009081526101116020526040902060010181905590506124fa848263ffffffff61381d16565b93505050600101612435565b506101065460408051918252602082018390524282820152517fdb6384c96bf21119d48fbb5985f4f9b3dcd153386eba0ffcb2b8b4c69fd9aa409181900360600190a161010655505050565b61255a611eaa565b6001600160a01b0316336001600160a01b031614806125845750610108546001600160a01b031633145b6125c8576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611611613e39565b60c95460ff161561261b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60008111612660576040805162461bcd60e51b815260206004820152600d60248201526c135d5cdd081cd95b9908109395609a1b604482015290519081900360640190fd5b60fb54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156126ba57600080fd5b505af11580156126ce573d6000803e3d6000fd5b505050506040513d60208110156126e457600080fd5b506126f0905081613eba565b50565b6126fb611eaa565b6001600160a01b0316336001600160a01b031614806127255750610108546001600160a01b031633145b612769576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b600082815261011260209081526040808320546001600160a01b03908116808552610111909352818420825163a04d481360e01b81529186166004830152825193949093859391928392859263a04d481392602480820193929182900301818787803b1580156127d857600080fd5b505af11580156127ec573d6000803e3d6000fd5b505050506040513d604081101561280257600080fd5b50805160209091015161010f54919350915061281f9082906135c4565b50835460018101855560008581526020902001829055600284015461284a908263ffffffff61381d16565b60028501556001840154610106546128679163ffffffff61358216565b610106556000600185015561010554612886908263ffffffff61381d16565b6101055560408051608080820183526001600160a01b0388811683526020808401878152848601878152606080870189815260008b81526101108652899020975188546001600160a01b031916961695909517875591516001870155516002860155915160039094019390935583518b8152928301859052828401869052429083015291517f9737e7b0050fbe768c31b5c3d88bbcb6fe5e72237a4b8f3d60864d9110e4d397929181900390910190a16119e881613915565b60008411612985576040805162461bcd60e51b815260206004820152600e60248201526d135d5cdd081cd95b99081e10939560921b604482015290519081900360640190fd5b600061298f612e66565b905060006129b661299e611303565b6112f2886129aa61150b565b9063ffffffff613efc16565b905081811115612a0d576040805162461bcd60e51b815260206004820181905260248201527f4275726e206578636565647320617661696c61626c65206c6971756964697479604482015290519081900360640190fd5b612a173387613f55565b6000612a298261010d600101546135c4565b90508515612c7a5760fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b505160fb54909150612ad1906001600160a01b03168261405d565b60006001600160a01b03821663b77d239b88612af3878763ffffffff61358216565b8960008060006040518763ffffffff1660e01b81526004018080602001878152602001868152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001838152602001828103825288818151815260200191508051906020019060200280838360005b83811015612b8a578181015183820152602001612b72565b50505050905001975050505050505050602060405180830381600087803b158015612bb457600080fd5b505af1158015612bc8573d6000803e3d6000fd5b505050506040513d6020811015612bde57600080fd5b5051604051909150600090339083908381818185875af1925050503d8060008114612c25576040519150601f19603f3d011682016040523d82523d6000602084013e612c2a565b606091505b5050905080612c72576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b505050610feb565b60fb546001600160a01b031663a9059cbb33612c9c858563ffffffff61358216565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ceb57600080fd5b505af1158015612cff573d6000803e3d6000fd5b505050506040513d6020811015612d1557600080fd5b505050505050505050565b612d28613492565b6097546001600160a01b03908116911614612d78576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010880546001600160a01b0319166001600160a01b0392909216919091179055565b6101055481565b600081612dc157612dba83600a63ffffffff613efc16565b9050611148565b612dec612ddc84612dd061150b565b9063ffffffff61358216565b6112f2858563ffffffff613efc16565b9392505050565b610102544290612e0c906224ea0063ffffffff61381d16565b10612e5e576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b611611613c7c565b60fb54604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015612eb657600080fd5b505afa158015612eca573d6000803e3d6000fd5b505050506040513d6020811015612ee057600080fd5b505161010754909150811015612efa57600091505061112d565b61010754611d7d90829063ffffffff61358216565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b610102544290612f53906224ea0063ffffffff61381d16565b10612fa5576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b6126f08161415f565b612fb6613492565b6097546001600160a01b03908116911614613006576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b612024838383613b8d565b60fd5460408051632ecd14d360e21b81526d5374616b696e675265776172647360901b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156113fe57600080fd5b613075613492565b6097546001600160a01b039081169116146130c5576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b61010b80546001600160a01b0319166001600160a01b03831617905542610100556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b61311a611eaa565b6001600160a01b0316336001600160a01b031614806131445750610108546001600160a01b031633145b613188576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b6131918161415f565b6126f061397d565b60c95460ff16156131e4576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60003411613229576040805162461bcd60e51b815260206004820152600d60248201526c09aeae6e840e6cadcc8408aa89609b1b604482015290519081900360640190fd5b60fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561328457600080fd5b505afa158015613298573d6000803e3d6000fd5b505050506040513d60208110156132ae57600080fd5b505160405163b77d239b60e01b81523460248201819052604482018590526000606483018190526084830181905260a4830181905260c06004840190815260c484018890526001600160a01b039094169363b77d239b938992899285928a92918291829190819060e4018960208a0280828437600081840152601f19601f820116905080830192505050985050505050505050506020604051808303818588803b15801561335b57600080fd5b505af115801561336f573d6000803e3d6000fd5b50505050506040513d602081101561338657600080fd5b5051905061339381613eba565b50505050565b6133a1613492565b6097546001600160a01b039081169116146133f1576040805162461bcd60e51b815260206004820181905260248201526000805160206149fd833981519152604482015290519081900360640190fd5b6001600160a01b0381166134365760405162461bcd60e51b81526004018080602001828103825260268152602001806149466026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b0383166134db5760405162461bcd60e51b8152600401808060200182810382526024815260200180614a916024913960400191505060405180910390fd5b6001600160a01b0382166135205760405162461bcd60e51b815260040180806020018281038252602281526020018061496c6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000612dec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613786565b60006135d08383614309565b90506111488161432f565b6000612dec83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061434a565b6001600160a01b0383166136625760405162461bcd60e51b8152600401808060200182810382526025815260200180614a6c6025913960400191505060405180910390fd5b6001600160a01b0382166136a75760405162461bcd60e51b81526004018080602001828103825260238152602001806149016023913960400191505060405180910390fd5b6136b2838383612024565b6136f58160405180606001604052806026815260200161498e602691396001600160a01b038616600090815260656020526040902054919063ffffffff61378616565b6001600160a01b03808516600090815260656020526040808220939093559084168152205461372a908263ffffffff61381d16565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156138155760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137da5781810151838201526020016137c2565b50505050905090810190601f1680156138075780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612dec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60c95460ff16156138c2576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138f8613492565b604080516001600160a01b039092168252519081900360200190a1565b60fe546040805163534a7e1d60e11b81526004810184905290516001600160a01b039092169163a694fc3a9160248082019260009290919082900301818387803b15801561396257600080fd5b505af1158015613976573d6000803e3d6000fd5b5050505050565b4261010255565b303b1590565b600054610100900460ff16806139a357506139a3613984565b806139b1575060005460ff16155b6139ec5760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015613a17576000805460ff1961ff0019909116610100171660011790555b613a1f6143af565b613a29838361444f565b8015612024576000805461ff0019169055505050565b600054610100900460ff1680613a585750613a58613984565b80613a66575060005460ff16155b613aa15760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015613acc576000805460ff1961ff0019909116610100171660011790555b613ad46143af565b613adc614527565b80156126f0576000805461ff001916905550565b600054610100900460ff1680613b095750613b09613984565b80613b17575060005460ff16155b613b525760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015613b7d576000805460ff1961ff0019909116610100171660011790555b613b856143af565b613adc614620565b821580613b9b575060328310155b613bda576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b811580613be8575060648210155b613c27576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b6019811015613c6b576040805162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015290519081900360640190fd5b61010d9290925561010e5561010f55565b61010354600090815261011260209081526040808320546001600160a01b0316808452610111909252909120600181015461010654839291613cc4919063ffffffff61358216565b61010655600060018201556002810154613cdd906146cb565b60fc5460028201546040805163a9059cbb60e01b81526001600160a01b03878116600483015260248201939093529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015613d3957600080fd5b505af1158015613d4d573d6000803e3d6000fd5b505050506040513d6020811015613d6357600080fd5b5050604080516386d1c5ff60e01b815290516000916001600160a01b038516916386d1c5ff9160048082019260209290919082900301818787803b158015613daa57600080fd5b505af1158015613dbe573d6000803e3d6000fd5b505050506040513d6020811015613dd457600080fd5b505161010f54909150613de89082906135c4565b5061010354604080519182526020820183905280517f2493012c2b3f032daebde31221d2adb14631b760cd03040957e4ba73dc20b9719281900390910190a16101038054600101905561339361397d565b60c95460ff16613e87576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6138f8613492565b6000613ecc8261010d600001546135c4565b90506000613ef0613ee3848463ffffffff61358216565b613eeb611303565b612da2565b90506120243382614718565b600082613f0b57506000611148565b82820282848281613f1857fe5b0414612dec5760405162461bcd60e51b81526004018080602001828103825260218152602001806149b46021913960400191505060405180910390fd5b6001600160a01b038216613f9a5760405162461bcd60e51b8152600401808060200182810382526021815260200180614a4b6021913960400191505060405180910390fd5b613fa682600083612024565b613fe981604051806060016040528060228152602001614924602291396001600160a01b038516600090815260656020526040902054919063ffffffff61378616565b6001600160a01b038316600090815260656020526040902055606754614015908263ffffffff61358216565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b1580156140ad57600080fd5b505afa1580156140c1573d6000803e3d6000fd5b505050506040513d60208110156140d757600080fd5b505161415b576040805163095ea7b360e01b81526001600160a01b038381166004830152600019602483015291519184169163095ea7b3916044808201926020929091908290030181600087803b15801561413157600080fd5b505af1158015614145573d6000803e3d6000fd5b505050506040513d602081101561339357600080fd5b5050565b600081815261011260205260408082205481516318284de560e11b815291516001600160a01b0390911692839283926330509bca9260048084019391929182900301818387803b1580156141b257600080fd5b505af11580156141c6573d6000803e3d6000fd5b5050505060006141d4614847565b6001600160a01b038416600090815261011160209081526040918290208251815460809381028201840190945260608101848152909391928492849184018282801561423f57602002820191906000526020600020905b81548152602001906001019080831161422b575b505050918352505060018201546020820152600290910154604090910152805190915060005b81518110156142b5576142ab610110600084848151811061428257fe5b60200260200101518152602001908152602001600020600301548561381d90919063ffffffff16565b9350600101614265565b506040805187815290517f7fc547d30654f63b77c16f8a90f08290e8f69a076d8d5512d182b4ddbc198d039181900360200190a1610105546142fd908463ffffffff61358216565b61010555505050505050565b6000808211801561431a5750600083115b1561114857612dec838363ffffffff6135db16565b61010754614343908263ffffffff61381d16565b6101075550565b600081836143995760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156137da5781810151838201526020016137c2565b5060008385816143a557fe5b0495945050505050565b600054610100900460ff16806143c857506143c8613984565b806143d6575060005460ff16155b6144115760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff16158015613adc576000805460ff1961ff00199091166101001716600117905580156126f0576000805461ff001916905550565b600054610100900460ff16806144685750614468613984565b80614476575060005460ff16155b6144b15760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff161580156144dc576000805460ff1961ff0019909116610100171660011790555b82516144ef906068906020860190614868565b508151614503906069906020850190614868565b50606a805460ff191660121790558015612024576000805461ff0019169055505050565b600054610100900460ff16806145405750614540613984565b8061454e575060005460ff16155b6145895760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff161580156145b4576000805460ff1961ff0019909116610100171660011790555b60006145be613492565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156126f0576000805461ff001916905550565b600054610100900460ff16806146395750614639613984565b80614647575060005460ff16155b6146825760405162461bcd60e51b815260040180806020018281038252602e815260200180614a1d602e913960400191505060405180910390fd5b600054610100900460ff161580156146ad576000805460ff1961ff0019909116610100171660011790555b60c9805460ff1916905580156126f0576000805461ff001916905550565b60fe54604080516305c2fbcf60e31b81526004810184905290516001600160a01b0390921691632e17de789160248082019260009290919082900301818387803b15801561396257600080fd5b6001600160a01b038216614773576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61477f60008383612024565b606754614792908263ffffffff61381d16565b6067556001600160a01b0382166000908152606560205260409020546147be908263ffffffff61381d16565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b60405180606001604052806060815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106148a957805160ff19168380011785556148d6565b828001600101855582156148d6579182015b828111156148d65782518255916020019190600101906148bb565b506148e29291506148e6565b5090565b61112d91905b808211156148e257600081556001016148ec56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e4bd2476bcdd59b0f73493b4ab3ed06d1ed1d47756bbc08ef49f3a90c11d424764736f6c63430006020033
Deployed Bytecode Sourcemap
38459:27411:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62579:219;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62579:219:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;62579:219:0;;;;;;;;;;;;;;;;;:::i;:::-;;59699:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59699:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59699:223:0;-1:-1:-1;;;;;59699:223:0;;:::i;21790:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21790:83:0;;;:::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;21790:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23896:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23896:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23896:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;57154:731;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57154:731:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57154:731:0;;:::i;61126:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61126:117:0;;;:::i;:::-;;;;;;;;;;;;;;;;22865:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22865:100:0;;;:::i;24539:321::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24539:321:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24539:321:0;;;;;;;;;;;;;;;;;:::i;39532:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39532:37:0;;;:::i;57893:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57893:261:0;;;:::i;:::-;;;;-1:-1:-1;;;;;57893:261:0;;;;;;;;;;;;;;22717:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22717:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59370:321;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59370:321:0;;;:::i;61251:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61251:195:0;;;:::i;25269:218::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25269:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25269:218:0;;;;;;;;:::i;63629:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63629:80:0;;;:::i;40359:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40359:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40359:53:0;;:::i;:::-;;;;-1:-1:-1;;;;;40359:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39708:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39708:34:0;;;:::i;46627:1649::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46627:1649:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46627:1649:0;;;;;;;;:::i;63331:160::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63331:160:0;;;:::i;12849:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12849:78:0;;;:::i;41364:893::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41364:893:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;41364:893:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;41364:893:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41364:893: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;41364:893:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41364:893:0;;-1:-1:-1;41364:893:0;;-1:-1:-1;;;;;41364:893:0:i;40150:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40150:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;59930:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59930:298:0;;;:::i;23028:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23028:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23028:119:0;-1:-1:-1;;;;;23028:119:0;;:::i;10944:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10944:148:0;;;:::i;61454:252::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61454:252:0;;;:::i;58844:223::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58844:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58844:223:0;-1:-1:-1;;;;;58844:223:0;;:::i;39653:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39653:46:0;;;:::i;54190:162::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54190:162:0;;;:::i;64463:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64463:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64463:98:0;-1:-1:-1;;;;;64463:98:0;;:::i;10302:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10302:79:0;;;:::i;58639:197::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58639:197:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58639:197:0;-1:-1:-1;;;;;58639:197:0;;:::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;58639:197:0;;;;;;;;;;;;;;;;;39488:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39488:35:0;;;:::i;63499:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63499:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63499:122:0;-1:-1:-1;;;;;63499:122:0;;:::i;52347:1744::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52347:1744:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52347:1744:0;;;;;;;:::i;21992:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21992:87:0;;;:::i;39576:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39576:29:0;;;:::i;40628:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40628:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40628:54:0;;:::i;25990:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25990:269:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25990:269:0;;;;;;;;:::i;23360:175::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23360:175:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23360:175:0;;;;;;;;:::i;50578:1277::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50578:1277:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50578:1277:0;;;;;;;:::i;63717:84::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63717:84:0;;;:::i;43422:227::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43422:227:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43422:227:0;;:::i;48589:1592::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48589:1592:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48589:1592:0;;;;;;-1:-1:-1;;;;;48589:1592:0;;:::i;44697:1379::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44697:1379:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;44697:1379:0;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;44697:1379:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44697:1379:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;44697:1379:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44697:1379:0;;-1:-1:-1;;44697:1379:0;;;-1:-1:-1;44697:1379:0;;-1:-1:-1;;44697:1379:0:i;64282:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64282:94:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64282:94:0;-1:-1:-1;;;;;64282:94:0;;:::i;39614:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39614:32:0;;;:::i;43985:370::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43985:370:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43985:370:0;;;;;;;:::i;54360:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54360:119:0;;;:::i;61714:224::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61714:224:0;;;:::i;23598:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23598:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23598:151:0;;;;;;;;;;:::i;55961:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55961:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55961:150:0;;:::i;64779:233::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64779:233:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64779:233:0;;;;;;;;;;;;:::i;58162:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58162:164:0;;;:::i;59075:287::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59075:287:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59075:287:0;-1:-1:-1;;;;;59075:287:0;;:::i;55799:154::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55799:154:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55799:154:0;;:::i;42725:559::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42725:559:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;42725:559:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42725:559:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;42725:559:0;;-1:-1:-1;42725:559:0;-1:-1:-1;42725:559:0;;:::i;11247:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11247:244:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11247:244:0;-1:-1:-1;;;;;11247:244:0;;:::i;62579:219::-;63884:7;:5;:7::i;:::-;-1:-1:-1;;;;;63870:21:0;:10;-1:-1:-1;;;;;63870:21:0;;:46;;;-1:-1:-1;63909:7:0;;-1:-1:-1;;;;;63909:7:0;63895:10;:21;63870:46;63848:112;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;;;;62747:16:::1;-1:-1:-1::0;;;;;62729:47:0::1;;62777:2;62781:8;62729:61;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;62729:61:0::1;-1:-1:-1::0;;;;;62729:61:0::1;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;62729:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;62729:61:0;;;;62579:219:::0;;;:::o;59699:223::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;59782:23:::1;:36:::0;;-1:-1:-1;;;;;;59782:36:0::1;-1:-1:-1::0;;;;;59782:36:0;::::1;;::::0;;59865:15:::1;59829:33;:51:::0;59896:18:::1;::::0;::::1;::::0;-1:-1:-1;;59896:18:0::1;59699:223:::0;:::o;21790:83::-;21860:5;21853:12;;;;;;;;-1:-1:-1;;21853:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21827:13;;21853:12;;21860:5;;21853:12;;21860:5;21853:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21790:83;;:::o;23896:169::-;23979:4;23996:39;24005:12;:10;:12::i;:::-;24019:7;24028:6;23996:8;:39::i;:::-;-1:-1:-1;24053:4:0;23896:169;;;;;:::o;57154:731::-;63884:7;:5;:7::i;:::-;-1:-1:-1;;;;;63870:21:0;:10;-1:-1:-1;;;;;63870:21:0;;:46;;;-1:-1:-1;63909:7:0;;-1:-1:-1;;;;;63909:7:0;63895:10;:21;63870:46;63848:112;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;;;;57278:22:::1;::::0;57235:20:::1;57258:43:::0;;;:19:::1;:43;::::0;;;;;-1:-1:-1;;;;;57258:43:0::1;::::0;;;57439:53:::1;57258:43:::0;57439:39:::1;:53::i;:::-;57537:31;::::0;57386:106;;-1:-1:-1;57537:90:0::1;::::0;57386:106;57537:90:::1;:35;:90;:::i;:::-;57503:31;:124:::0;-1:-1:-1;;;;;57638:32:0;;::::1;57705:1;57638:32:::0;;;:18:::1;:32;::::0;;;;;;;:64:::1;;:68:::0;;;57737:22;;-1:-1:-1;;;57737:22:0;;;;57705:1;;57737:20;::::1;::::0;::::1;::::0;:22:::1;::::0;;::::1;::::0;57638:32;;57737:22;;;;;;57705:1;57737:20;:22;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;57737:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;57737:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;57737:22:0;57805:20;;57737:22;;-1:-1:-1;57770:56:0::1;::::0;57737:22;;57770:25:::1;:56::i;:::-;-1:-1:-1::0;57844:33:0::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;63971:1;;;;57154:731:::0;:::o;61126:117::-;61181:7;61208:27;39123:2;61208:8;:6;:8::i;:::-;:12;:27;:12;:27;:::i;:::-;61201:34;;61126:117;:::o;22865:100::-;22945:12;;22865:100;:::o;24539:321::-;24645:4;24662:36;24672:6;24680:9;24691:6;24662:9;:36::i;:::-;24709:121;24718:6;24726:12;:10;:12::i;:::-;24740:89;24778:6;24740:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24740:19:0;;;;;;:11;:19;;;;;;24760:12;:10;:12::i;:::-;-1:-1:-1;;;;;24740:33:0;;;;;;;;;;;;-1:-1:-1;24740:33:0;;;:89;;:37;:89;:::i;:::-;24709:8;:121::i;:::-;-1:-1:-1;24848:4:0;24539:321;;;;;:::o;39532:37::-;;;;:::o;57893:261::-;58080:16;;:51;;;-1:-1:-1;;;58080:51:0;;-1:-1:-1;;;58080:51:0;;;;;;57983:20;;-1:-1:-1;;;;;58080:16:0;;:26;;:51;;;;;;;;;;;;;;:16;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;58080:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58080:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58080:51:0;;-1:-1:-1;57893:261:0;:::o;22717:83::-;22783:9;;;;22717:83;:::o;59370:321::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;59513:32:::1;::::0;:52:::1;::::0;39233:6:::1;59513:52;:36;:52;:::i;:::-;59478:15;:87;59456:145;;;::::0;;-1:-1:-1;;;59456:145:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59456:145:0;;;;;;;;;;;;;::::1;;59646:37;::::0;59612:31:::1;:71:::0;;-1:-1:-1;;;;;;59612:71:0::1;-1:-1:-1::0;;;;;59646:37:0;;::::1;59612:71:::0;;;::::1;::::0;;59370:321::o;61251:195::-;61290:7;61330:108;61405:18;:16;:18::i;:::-;61330:52;61352:29;:27;:29::i;:::-;61330:17;;;:52;:21;:52;:::i;:::-;:56;:108;:56;:108;:::i;25269:218::-;25357:4;25374:83;25383:12;:10;:12::i;:::-;25397:7;25406:50;25445:10;25406:11;:25;25418:12;:10;:12::i;:::-;-1:-1:-1;;;;;25406:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;25406:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;63629:80::-;63884:7;:5;:7::i;:::-;-1:-1:-1;;;;;63870:21:0;:10;-1:-1:-1;;;;;63870:21:0;;:46;;;-1:-1:-1;63909:7:0;;-1:-1:-1;;;;;63909:7:0;63895:10;:21;63870:46;63848:112;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;;;;63693:8:::1;:6;:8::i;:::-;63629:80::o:0;40359:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40359:53:0;;;;;;;:::o;39708:34::-;;;;:::o;46627:1649::-;63884:7;:5;:7::i;:::-;-1:-1:-1;;;;;63870:21:0;:10;-1:-1:-1;;;;;63870:21:0;;:46;;;-1:-1:-1;63909:7:0;;-1:-1:-1;;;;;63909:7:0;63895:10;:21;63870:46;63848:112;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;;;;46821:14:::1;::::0;46804:41:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;46804:41:0;;;;;;46794:52;;;;::::1;::::0;;;;46904:12:::1;::::0;46930:31:::1;::::0;-1:-1:-1;;;46904:58:0;;;;;;;;;-1:-1:-1;;;;;46930:31:0;;::::1;46904:58:::0;;;;;;46794:52;;46758:12:::1;::::0;46904;;;::::1;::::0;:19:::1;::::0;:58;;;;;46804:41;;46904:58;;;;;46758:12;46904;:58;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;46904:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46904:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;46904:58:0;46975:3:::1;::::0;:45:::1;::::0;;-1:-1:-1;;;46975:45:0;;-1:-1:-1;;;;;46975:45:0;;::::1;;::::0;::::1;::::0;;;;;;;;;46904:58;;-1:-1:-1;46975:3:0;::::1;::::0;:12:::1;::::0;:45;;;;;46904:58:::1;::::0;46975:45;;;;;;;;:3:::1;::::0;:45;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;46975:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46975:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;47171:16:0::1;::::0;47238:3:::1;::::0;47260:4:::1;::::0;47066:278:::1;::::0;;-1:-1:-1;;;47066:278:0;;-1:-1:-1;;;;;47171:16:0;;::::1;47066:278;::::0;::::1;::::0;47214:4:::1;47066:278:::0;;;;47238:3;;::::1;47066:278:::0;;;;47260:4;;::::1;47066:278:::0;;;;;;::::1;::::0;;;;;;;;;;;47033:17:::1;::::0;47066:86;::::1;::::0;::::1;::::0;:278;;;;;46975:45:::1;::::0;47066:278;;;;;;;47033:17;47066:86;:278;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;47066:278:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;47066:278:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;47066:278:0;;-1:-1:-1;47357:25:0::1;;:::i;:::-;-1:-1:-1::0;47398:216:0::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;47398:216:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;47740:14:::1;::::0;47632:163;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;47769:15:::1;47632:163:::0;;;;;;;;;47398:216;;47632:163:::1;::::0;;;;;;;;::::1;47808:29;::::0;;;:18:::1;:29;::::0;;;;;;;:42;;;;-1:-1:-1;;;;;47808:42:0;;::::1;-1:-1:-1::0;;;;;;47808:42:0;;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;47906;;::::1;::::0;;;:18:::1;:42:::0;;;;;27:10:-1;;23:18;;::::1;45:23:::0;;47959:36:0;;;;;;::::1;::::0;;;48006:21;;::::1;:31:::0;;;48070:14:::1;::::0;;48050:35;;:19:::1;:35:::0;;;;;;;:60;;;;::::1;::::0;;::::1;::::0;;;48121:16;;::::1;::::0;;48170:17:::1;::::0;:30:::1;::::0;48030:7;48170:30:::1;:21;:30;:::i;:::-;48150:17;:50:::0;48213:15:::1;48220:7:::0;48213:6:::1;:15::i;:::-;48239:29;:27;:29::i;63331:160::-:0;63437:16;;:45;;;-1:-1:-1;;;63437:45:0;;-1:-1:-1;;;63437:45:0;;;;;;63388:14;;-1:-1:-1;;;;;63437:16:0;;:26;;:45;;;;;;;;;;;;;;:16;:45;;;5:2:-1;;;;30:1;27;20:12;12849:78:0;12912:7;;;;12849:78;:::o;41364:893::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;41789:29:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;41789:29:0::1;;::::0;41810:7:::1;41789:12;:29::i;:::-;41829:16;:14;:16::i;:::-;41856:17;:15;:17::i;:::-;41886:3;:10:::0;;-1:-1:-1;;;;;;41886:10:0;;::::1;-1:-1:-1::0;;;;;41886:10:0;;::::1;::::0;;;::::1;::::0;;;41907:4:::1;:12:::0;;;::::1;::::0;;::::1;;::::0;;41930:16:::1;:36:::0;;;::::1;::::0;;::::1;;::::0;;41977:16:::1;:36:::0;;;::::1;::::0;;::::1;;::::0;;42024:12:::1;:28:::0;;;::::1;::::0;;::::1;;::::0;;42063:31:::1;:66:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;42142:67:::1;42158:15:::0;42175;42192:16;42142:15:::1;:67::i;:::-;42220:29;:27;:29::i;:::-;6801:14:::0;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;6797:57;41364:893;;;;;;;;;;;:::o;40150:30::-;;;;;;;;:::o;59930:298::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;60059:33:::1;::::0;:53:::1;::::0;39233:6:::1;60059:53;:37;:53;:::i;:::-;60024:15;:88;60002:146;;;::::0;;-1:-1:-1;;;60002:146:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;60002:146:0;;;;;;;;;;;;;::::1;;60196:23;::::0;60159:16:::1;:61:::0;;-1:-1:-1;;;;;;60159:61:0::1;-1:-1:-1::0;;;;;60196:23:0;;::::1;60159:61:::0;;;::::1;::::0;;59930:298::o;23028:119::-;-1:-1:-1;;;;;23121:18:0;23094:7;23121:18;;;:9;:18;;;;;;;23028:119::o;10944:148::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;11035:6:::1;::::0;11014:40:::1;::::0;11051:1:::1;::::0;-1:-1:-1;;;;;11035:6:0::1;::::0;11014:40:::1;::::0;11051:1;;11014:40:::1;11065:6;:19:::0;;-1:-1:-1;;;;;;11065:19:0::1;::::0;;10944:148::o;61454:252::-;61608:20;;61572:31;;61514:7;;;;61572:57;;;:35;:57;:::i;:::-;61647:31;;61534:95;;-1:-1:-1;61647:51:0;;61534:95;61647:51;:35;:51;:::i;:::-;61640:58;;;61454:252;:::o;58844:223::-;-1:-1:-1;;;;;58995:32:0;58963:7;58995:32;;;:18;:32;;;;;:64;;;;58844:223::o;39653:46::-;;;;:::o;54190:162::-;63884:7;:5;:7::i;:::-;-1:-1:-1;;;;;63870:21:0;:10;-1:-1:-1;;;;;63870:21:0;;:46;;;-1:-1:-1;63909:7:0;;-1:-1:-1;;;;;63909:7:0;63895:10;:21;63870:46;63848:112;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;;;;54271:33:::1;:31;:33::i;:::-;54315:29;:27;:29::i;64463:98::-:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;64533:8:::1;:20:::0;;-1:-1:-1;;;;;;64533:20:0::1;-1:-1:-1::0;;;;;64533:20:0;;;::::1;::::0;;;::::1;::::0;;64463:98::o;10302:79::-;10367:6;;-1:-1:-1;;;;;10367:6:0;10302:79;:::o;58639:197::-;-1:-1:-1;;;;;58785:32:0;;;;;;:18;:32;;;;;;;;;58778:50;;;;;;;;;;;;;;;;;58744:16;;58778:50;;;58785:32;58778:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58639:197;;;:::o;39488:35::-;;;;:::o;63499:122::-;63884:7;:5;:7::i;:::-;-1:-1:-1;;;;;63870:21:0;:10;-1:-1:-1;;;;;63870:21:0;;:46;;;-1:-1:-1;63909:7:0;;-1:-1:-1;;;;;63909:7:0;63895:10;:21;63870:46;63848:112;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;;;;63579:4:::1;::::0;:34:::1;::::0;;-1:-1:-1;;;63579:34:0;;-1:-1:-1;;;;;63579:34:0;;::::1;;::::0;::::1;::::0;-1:-1:-1;;63579:34:0;;;;;;:4;;;::::1;::::0;:12:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;:4:::1;::::0;:34;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;63579:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;63579:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;;63499:122:0:o;52347:1744::-;52538:22;;52511:23;:49;;52489:112;;;;;-1:-1:-1;;;52489:112:0;;;;;;;;;;;;-1:-1:-1;;;52489:112:0;;;;;;;;;;;;;;;52645:14;;52620:21;:39;;52612:65;;;;;-1:-1:-1;;;52612:65:0;;;;;;;;;;;;-1:-1:-1;;;52612:65:0;;;;;;;;;;;;;;;52690:23;52716:32;:30;:32::i;:::-;52690:58;-1:-1:-1;52761:27:0;52799:37;52880:23;52849:1235;52922:21;52918:1;:25;52849:1235;;;53001:42;53020:22;;;:19;:22;;;;;;;;;-1:-1:-1;;;;;53020:22:0;53001:42;;:18;:42;;;;;;52988:66;;;;;;;;;;;;;;;;;53001:42;;52988:66;;53001:42;52988:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52988:66:0;;-1:-1:-1;53076:9:0;;-1:-1:-1;;;;53071:1002:0;53095:10;:17;53091:1;:21;53071:1002;;;53176:2;-1:-1:-1;;;;;53176:24:0;;53223:10;53234:1;53223:13;;;;;;;;;;;;;;39023:7;53285:29;53305:8;53285:15;:19;;:29;;;;:::i;:::-;53176:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53176:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53176:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53176:157:0;53399:13;;53176:157;;-1:-1:-1;53354:23:0;;53380:18;;53354:23;;53399:10;;53410:1;;53399:13;;;;;;;;;;;;53380:33;;;;;;;;;;;53354:59;;53691:7;:31;;;53638:29;:84;53612:446;;;53785:141;53896:29;53785:80;53833:7;:31;;;53785:17;;:47;;:80;;;;:::i;:141::-;53765:17;:161;53949:57;;;:89;;;53612:446;-1:-1:-1;53114:3:0;;53071:1002;;;-1:-1:-1;52958:3:0;;52849:1235;;;;52347:1744;;;;;:::o;21992:87::-;22064:7;22057:14;;;;;;;;-1:-1:-1;;22057:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22031:13;;22057:14;;22064:7;;22057:14;;22064:7;22057:14;;;;;;;;;;;;;;;;;;;;;;;;39576:29;;;;:::o;40628:54::-;;;;;;;;;;;;-1:-1:-1;;;;;40628:54:0;;:::o;25990:269::-;26083:4;26100:129;26109:12;:10;:12::i;:::-;26123:7;26132:96;26171:15;26132:96;;;;;;;;;;;;;;;;;:11;:25;26144:12;:10;:12::i;:::-;-1:-1:-1;;;;;26132:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;26132:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;23360:175::-;23446:4;23463:42;23473:12;:10;:12::i;:::-;23487:9;23498:6;23463:9;:42::i;50578:1277::-;50783:22;;50756:23;:49;;50734:112;;;;;-1:-1:-1;;;50734:112:0;;;;;;;;;;;;-1:-1:-1;;;50734:112:0;;;;;;;;;;;;;;;50890:14;;50865:21;:39;;50857:65;;;;;-1:-1:-1;;;50857:65:0;;;;;;;;;;;;-1:-1:-1;;;50857:65:0;;;;;;;;;;;;;;;50933:30;50966:27;:25;:27::i;:::-;51080:22;;50933:60;;-1:-1:-1;51004:46:0;;51063:525;51108:14;;51104:1;:18;51063:525;;;51144:20;51167:22;;;:19;:22;;;;;;;;;51259:43;;-1:-1:-1;;;51259:43:0;;-1:-1:-1;;;;;51167:22:0;;;51259:43;;;;;;;;51167:22;;51144:20;51259:29;;;;;;:43;;;;;51167:22;;51259:43;;;;;;:29;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;51259:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51259:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51259:43:0;-1:-1:-1;;;;;51319:32:0;;;;;;:18;51259:43;51319:32;;;;:82;;:112;;;51259:43;-1:-1:-1;51487:89:0;:38;51259:43;51487:89;:60;:89;:::i;:::-;51446:130;-1:-1:-1;;;51124:3:0;;51063:525;;;-1:-1:-1;51637:31:0;;51605:157;;;;;;;;;;;;51736:15;51605:157;;;;;;;;;;;;;;51775:31;:72;-1:-1:-1;;;50578:1277:0:o;63717:84::-;63884:7;:5;:7::i;:::-;-1:-1:-1;;;;;63870:21:0;:10;-1:-1:-1;;;;;63870:21:0;;:46;;;-1:-1:-1;63909:7:0;;-1:-1:-1;;;;;63909:7:0;63895:10;:21;63870:46;63848:112;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;;;;63783:10:::1;:8;:10::i;43422:227::-:0;13086:7;;;;13085:8;13077:37;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;;;;43518:1:::1;43506:9;:13;43498:39;;;::::0;;-1:-1:-1;;;43498:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43498:39:0;;;;;;;;;;;;;::::1;;43550:3;::::0;:54:::1;::::0;;-1:-1:-1;;;43550:54:0;;43567:10:::1;43550:54;::::0;::::1;::::0;43587:4:::1;43550:54:::0;;;;;;;;;;;;-1:-1:-1;;;;;43550:3:0;;::::1;::::0;:16:::1;::::0;:54;;;;;::::1;::::0;;;;;;;;;:3:::1;::::0;:54;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;43550:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43550:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;43617:24:0::1;::::0;-1:-1:-1;43631:9:0;43617:13:::1;:24::i;:::-;43422:227:::0;:::o;48589:1592::-;63884:7;:5;:7::i;:::-;-1:-1:-1;;;;;63870:21:0;:10;-1:-1:-1;;;;;63870:21:0;;:46;;;-1:-1:-1;63909:7:0;;-1:-1:-1;;;;;63909:7:0;63895:10;:21;63870:46;63848:112;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;;;;48715:20:::1;48738:31:::0;;;:19:::1;:31;::::0;;;;;;;;-1:-1:-1;;;;;48738:31:0;;::::1;48810:32:::0;;;:18:::1;:32:::0;;;;;;48988:34;;-1:-1:-1;;;48988:34:0;;;;::::1;;::::0;::::1;::::0;;;48738:31;;48810:32;;48738:31;;48715:20;;;;48738:31;;48988:23:::1;::::0;:34;;;;;48738:31;48988:34;;;;;;48715:20;48738:31;48988:34;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;48988:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;48988:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;48988:34:0;;::::1;::::0;;::::1;::::0;49206:20;;48988:34;;-1:-1:-1;48988:34:0;-1:-1:-1;49167:60:0::1;::::0;48988:34;;49167:25:::1;:60::i;:::-;-1:-1:-1::0;27:10;;39:1:::1;23:18:::0;::::1;45:23:::0;;49240:20:0::1;:39:::0;;;::::1;::::0;;::::1;::::0;;;49314:21:::1;::::0;::::1;::::0;:38:::1;::::0;49340:11;49314:38:::1;:25;:38;:::i;:::-;49290:21;::::0;::::1;:62:::0;49487:41:::1;::::0;::::1;::::0;49437:31:::1;::::0;:102:::1;::::0;::::1;:35;:102;:::i;:::-;49403:31;:136:::0;49594:1:::1;49550:41;::::0;::::1;:45:::0;49673:17:::1;::::0;:34:::1;::::0;49695:11;49673:34:::1;:21;:34;:::i;:::-;49653:17;:54:::0;49755:197:::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;49755:197:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;-1:-1:-1;49720:32:0;;;:18:::1;:32:::0;;;;;:232;;;;-1:-1:-1;;;;;;49720:232:0::1;::::0;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;49720:232:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;49970:131;;;;;;;::::1;::::0;;;;;;;;;50075:15:::1;49970:131:::0;;;;;;::::1;::::0;;;;;;;;;::::1;50114:19;50121:11;50114:6;:19::i;44697:1379::-:0;44878:1;44863:12;:16;44855:43;;;;;-1:-1:-1;;;44855:43:0;;;;;;;;;;;;-1:-1:-1;;;44855:43:0;;;;;;;;;;;;;;;44911:21;44935:18;:16;:18::i;:::-;44911:42;;44964:18;44985:45;45016:13;:11;:13::i;:::-;44985:26;44998:12;44985:8;:6;:8::i;:::-;:12;:26;:12;:26;:::i;:45::-;44964:66;;45077:13;45063:10;:27;;45041:109;;;;;-1:-1:-1;;;45041:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45163:37;45175:10;45187:12;45163:11;:37::i;:::-;45211:11;45238:58;45264:10;45276:11;:19;;;45238:25;:58::i;:::-;45211:85;;45313:12;45309:760;;;45390:16;;:45;;;-1:-1:-1;;;45390:45:0;;-1:-1:-1;;;45390:45:0;;;;;;45342:28;;-1:-1:-1;;;;;45390:16:0;;:26;;:45;;;;;;;;;;;;;;:16;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;45390:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45390:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45390:45:0;45470:3;;45390:45;;-1:-1:-1;45450:46:0;;-1:-1:-1;;;;;45470:3:0;45390:45;45450:19;:46::i;:::-;45550:21;-1:-1:-1;;;;;45591:50:0;;;45664:4;45691:19;:10;45706:3;45691:19;:14;:19;:::i;:::-;45733:9;40025:1;;45835;45591:264;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45591:264:0;-1:-1:-1;;;;;45591:264:0;;;;;;-1:-1:-1;;;;;45591:264:0;-1:-1:-1;;;;;45591:264:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;45591:264:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45591:264:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45591:264:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45591:264:0;45889:40;;45591:264;;-1:-1:-1;45871:12:0;;45889:10;;45591:264;;45871:12;45889:40;45871:12;45889:40;45591:264;45889:10;:40;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;45870:59:0;;;45952:7;45944:35;;;;;-1:-1:-1;;;45944:35:0;;;;;;;;;;;;-1:-1:-1;;;45944:35:0;;;;;;;;;;;;;;;45309:760;;;;;;46012:3;;-1:-1:-1;;;;;46012:3:0;:12;46025:10;46037:19;:10;46052:3;46037:19;:14;:19;:::i;:::-;46012:45;;;;;;;;;;;;;-1:-1:-1;;;;;46012:45:0;-1:-1:-1;;;;;46012:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46012:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46012:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;44697:1379:0;;;;;;;:::o;64282:94::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;64350:7:::1;:18:::0;;-1:-1:-1;;;;;;64350:18:0::1;-1:-1:-1::0;;;;;64350:18:0;;;::::1;::::0;;;::::1;::::0;;64282:94::o;39614:32::-;;;;:::o;43985:370::-;44107:18;44147:16;44143:87;;44185:45;:14;39299:2;44185:45;:18;:45;:::i;:::-;44178:52;;;;44143:87;44256:91;44308:28;44321:14;44308:8;:6;:8::i;:::-;:12;:28;:12;:28;:::i;:::-;44256:33;44257:14;44277:11;44256:33;:20;:33;:::i;:91::-;44243:104;43985:370;-1:-1:-1;;;43985:370:0:o;54360:119::-;64053:20;;64105:15;;64053:49;;39359:7;64053:49;:24;:49;:::i;:::-;:67;64031:145;;;;;-1:-1:-1;;;64031:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54438:33:::1;:31;:33::i;61714:224::-:0;61800:3;;:28;;;-1:-1:-1;;;61800:28:0;;61822:4;61800:28;;;;;;61763:7;;;;-1:-1:-1;;;;;61800:3:0;;;;:13;;:28;;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;61800:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61800:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61800:28:0;61852:19;;61800:28;;-1:-1:-1;61843:28:0;;61839:42;;;61880:1;61873:8;;;;;61839:42;61910:19;;61899:31;;:6;;:31;:10;:31;:::i;23598:151::-;-1:-1:-1;;;;;23714:18:0;;;23687:7;23714:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23598:151::o;55961:150::-;64053:20;;64105:15;;64053:49;;39359:7;64053:49;:24;:49;:::i;:::-;:67;64031:145;;;;;-1:-1:-1;;;64031:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56078:25:::1;56092:10;56078:13;:25::i;64779:233::-:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;64940:64:::1;64956:14;64972;64988:15;64940;:64::i;58162:164::-:0;58271:16;;:46;;;-1:-1:-1;;;58271:46:0;;-1:-1:-1;;;58271:46:0;;;;;;58220:15;;-1:-1:-1;;;;;58271:16:0;;:26;;:46;;;;;;;;;;;;;;:16;:46;;;5:2:-1;;;;30:1;27;20:12;59075:287:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;59202:37:::1;:57:::0;;-1:-1:-1;;;;;;59202:57:0::1;-1:-1:-1::0;;;;;59202:57:0;::::1;;::::0;;59305:15:::1;59202:57;59270:50:::0;59336:18:::1;::::0;::::1;::::0;-1:-1:-1;;59336:18:0::1;59075:287:::0;:::o;55799:154::-;63884:7;:5;:7::i;:::-;-1:-1:-1;;;;;63870:21:0;:10;-1:-1:-1;;;;;63870:21:0;;:46;;;-1:-1:-1;63909:7:0;;-1:-1:-1;;;;;63909:7:0;63895:10;:21;63870:46;63848:112;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;-1:-1:-1;;;63848:112:0;;;;;;;;;;;;;;;55880:25:::1;55894:10;55880:13;:25::i;:::-;55916:29;:27;:29::i;42725:559::-:0;13086:7;;;;13085:8;13077:37;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;;;;42877:1:::1;42865:9;:13;42857:39;;;::::0;;-1:-1:-1;;;42857:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42857:39:0;;;;;;;;;;;;;::::1;;42962:16;::::0;:45:::1;::::0;;-1:-1:-1;;;42962:45:0;;-1:-1:-1;;;42962:45:0::1;::::0;::::1;::::0;;;42909:22:::1;::::0;-1:-1:-1;;;;;42962:16:0::1;::::0;:26:::1;::::0;:45;;;;;::::1;::::0;;;;;;;;:16;:45;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;42962:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42962:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;42962:45:0;42947:287:::1;::::0;-1:-1:-1;;;42947:287:0;;43048:9:::1;42947:287:::0;;;;;;;;;;;;40025:1:::1;42947:287:::0;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;42947:93:0;;::::1;::::0;::::1;::::0;43077:4;;;;43048:9;;43128;;40025:1;;;;;42947:287;;;;;43077:4;42962:45:::1;42947:287:::0;::::1;::::0;43077:4;42947:287;1:33:-1::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;;42947:287:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;42947:287:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42947:287:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;42947:287:0;;-1:-1:-1;43247:29:0::1;42947:287:::0;43247:13:::1;:29::i;:::-;13125:1;42725:559:::0;;;:::o;11247:244::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11336:22:0;::::1;11328:73;;;;-1:-1:-1::0;;;11328:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11438:6;::::0;11417:38:::1;::::0;-1:-1:-1;;;;;11417:38:0;;::::1;::::0;11438:6:::1;::::0;11417:38:::1;::::0;11438:6:::1;::::0;11417:38:::1;11466:6;:17:::0;;-1:-1:-1;;;;;;11466:17:0::1;-1:-1:-1::0;;;;;11466:17:0;;;::::1;::::0;;;::::1;::::0;;11247:244::o;8578:106::-;8666:10;8578:106;:::o;29137:346::-;-1:-1:-1;;;;;29239:19:0;;29231:68;;;;-1:-1:-1;;;29231:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29318:21:0;;29310:68;;;;-1:-1:-1;;;29310:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29391:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;29443:32;;;;;;;;;;;;;;;;;29137:346;;;:::o;1396:136::-;1454:7;1481:43;1485:1;1488;1481:43;;;;;;;;;;;;;;;;;:3;:43::i;62342:229::-;62449:11;62484:34;62498:6;62506:11;62484:13;:34::i;:::-;62478:40;;62529:34;62559:3;62529:29;:34::i;3209:132::-;3267:7;3294:39;3298:1;3301;3294:39;;;;;;;;;;;;;;;;;:3;:39::i;26749:539::-;-1:-1:-1;;;;;26855:20:0;;26847:70;;;;-1:-1:-1;;;26847:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26936:23:0;;26928:71;;;;-1:-1:-1;;;26928:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27012:47;27033:6;27041:9;27052:6;27012:20;:47::i;:::-;27092:71;27114:6;27092:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27092:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;27072:17:0;;;;;;;:9;:17;;;;;;:91;;;;27197:20;;;;;;;:32;;27222:6;27197:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;27174:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;27245:35;;;;;;;27174:20;;27245:35;;;;;;;;;;;;;26749:539;;;:::o;1827:192::-;1913:7;1949:12;1941:6;;;;1933:29;;;;-1:-1:-1;;;1933:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;1933:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1985:5:0;;;1827:192::o;940:181::-;998:7;1030:5;;;1054:6;;;;1046:46;;;;;-1:-1:-1;;;1046:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13400:118;13086:7;;;;13085:8;13077:37;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;;;;13460:7:::1;:14:::0;;-1:-1:-1;;13460:14:0::1;13470:4;13460:14;::::0;;13490:20:::1;13497:12;:10;:12::i;:::-;13490:20;::::0;;-1:-1:-1;;;;;13490:20:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;13400:118::o:0;60617:91::-;60669:16;;:31;;;-1:-1:-1;;;60669:31:0;;;;;;;;;;-1:-1:-1;;;;;60669:16:0;;;;:22;;:31;;;;;:16;;:31;;;;;;;;:16;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;60669:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60669:31:0;;;;60617:91;:::o;65763:104::-;65844:15;65821:20;:38;65763:104::o;6948:508::-;7365:4;7411:17;7443:7;6948:508;:::o;21349:177::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;21445:26:::1;:24;:26::i;:::-;21482:36;21505:4;21511:6;21482:22;:36::i;:::-;6801:14:::0;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;21349:177;;;:::o;9880:129::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;9938:26:::1;:24;:26::i;:::-;9975;:24;:26::i;:::-;6801:14:::0;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;9880:129;:::o;12510:131::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;12569:26:::1;:24;:26::i;:::-;12606:27;:25;:27::i;65020:515::-:0;65182:20;;;:45;;;65225:2;65206:15;:21;;65182:45;65174:69;;;;;-1:-1:-1;;;65174:69:0;;;;;;;;;;;;-1:-1:-1;;;65174:69:0;;;;;;;;;;;;;;;65262:20;;;:46;;;65305:3;65286:15;:22;;65262:46;65254:70;;;;;-1:-1:-1;;;65254:70:0;;;;;;;;;;;;-1:-1:-1;;;65254:70:0;;;;;;;;;;;;;;;65363:2;65343:16;:22;;65335:46;;;;;-1:-1:-1;;;65335:46:0;;;;;;;;;;;;-1:-1:-1;;;65335:46:0;;;;;;;;;;;;;;;65392:11;:37;;;;65440:19;:37;65488:20;:39;65020:515::o;54487:1109::-;54592:22;;54549:20;54572:43;;;:19;:43;;;;;;;;;-1:-1:-1;;;;;54572:43:0;54728:32;;;:18;:32;;;;;;54572:43;54922:41;;;54872:31;;54572:43;;54728:32;54872:102;;:31;:102;:35;:102;:::i;:::-;54838:31;:136;55029:1;54985:41;;;:45;55052:21;;;;55043:31;;:8;:31::i;:::-;55085:4;;55113:21;;;;55085:50;;;-1:-1:-1;;;55085:50:0;;-1:-1:-1;;;;;55085:50:0;;;;;;;;;;;;;;;;:4;;;;;:13;;:50;;;;;;;;;;;;;;:4;;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;55085:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55085:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;55173:40:0;;;-1:-1:-1;;;55173:40:0;;;;55148:22;;-1:-1:-1;;;;;55173:38:0;;;;;:40;;;;;55085:50;;55173:40;;;;;;;;55148:22;55173:38;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;55173:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55173:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55173:40:0;55266:20;;55173:40;;-1:-1:-1;55224:63:0;;55173:40;;55224:25;:63::i;:::-;-1:-1:-1;55317:22:0;;55305:51;;;;;;;;;;;;;;;;;;;;;;;;55524:22;:24;;;;;;55559:29;:27;:29::i;13582:120::-;13285:7;;;;13277:40;;;;;-1:-1:-1;;;13277:40:0;;;;;;;;;;;;-1:-1:-1;;;13277:40:0;;;;;;;;;;;;;;;13641:7:::1;:15:::0;;-1:-1:-1;;13641:15:0::1;::::0;;13672:22:::1;13681:12;:10;:12::i;43657:320::-:0;43724:11;43751:63;43777:15;43794:11;:19;;;43751:25;:63::i;:::-;43724:90;-1:-1:-1;43827:18:0;43861:60;43881:24;:15;43724:90;43881:24;:19;:24;:::i;:::-;43907:13;:11;:13::i;:::-;43861:19;:60::i;:::-;43827:94;;43934:35;43946:10;43958;43934:11;:35::i;2270:471::-;2328:7;2573:6;2569:47;;-1:-1:-1;2603:1:0;2596:8;;2569:47;2640:5;;;2644:1;2640;:5;:1;2664:5;;;;;:10;2656:56;;;;-1:-1:-1;;;2656:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28279:418;-1:-1:-1;;;;;28363:21:0;;28355:67;;;;-1:-1:-1;;;28355:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28435:49;28456:7;28473:1;28477:6;28435:20;:49::i;:::-;28518:68;28541:6;28518:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28518:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;28497:18:0;;;;;;:9;:18;;;;;:89;28612:12;;:24;;28629:6;28612:24;:16;:24;:::i;:::-;28597:12;:39;28652:37;;;;;;;;28678:1;;-1:-1:-1;;;;;28652:37:0;;;;;;;;;;;;28279:418;;:::o;63113:210::-;63200:43;;;-1:-1:-1;;;63200:43:0;;63225:4;63200:43;;;;-1:-1:-1;;;;;63200:43:0;;;;;;;;;:16;;;;;;:43;;;;;;;;;;;;;;;:16;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;63200:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63200:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63200:43:0;63196:120;;63265:39;;;-1:-1:-1;;;63265:39:0;;-1:-1:-1;;;;;63265:39:0;;;;;;;-1:-1:-1;;63265:39:0;;;;;;:14;;;;;;:39;;;;;;;;;;;;;;;-1:-1:-1;63265:14:0;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;63265:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63265:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;63196:120:0;63113:210;;:::o;56119:859::-;56182:20;56205:32;;;:19;:32;;;;;;;56320:22;;-1:-1:-1;;;56320:22:0;;;;-1:-1:-1;;;;;56205:32:0;;;;;;;;56320:20;;:22;;;;;56182:20;;56320:22;;;;;;56182:20;56205:32;56320:22;;;5:2:-1;;;;30:1;27;20:12;5:2;56320:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56320:22:0;;;;56355:39;56405:26;;:::i;:::-;-1:-1:-1;;;;;56434:32:0;;;;;;:18;:32;;;;;;;;;56405:61;;;;;;;;;;;;;;;;;;;;;;;56434:32;;56405:61;;56434:32;;56405:61;;56434:32;56405:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56405:61:0;;;-1:-1:-1;;56405:61:0;;;;;;;;;;;;;;;;;;56509:20;;56405:61;;-1:-1:-1;;56540:221:0;56564:10;:17;56560:1;:21;56540:221;;;56637:112;56691:18;:33;56710:10;56721:1;56710:13;;;;;;;;;;;;;;56691:33;;;;;;;;;;;:57;;;56637:31;:53;;:112;;;;:::i;:::-;56603:146;-1:-1:-1;56583:3:0;;56540:221;;;-1:-1:-1;56778:25:0;;;;;;;;;;;;;;;;;56892:17;;:78;;56928:31;56892:78;:21;:78;:::i;:::-;56872:17;:98;-1:-1:-1;;;;;;56119:859:0:o;61946:237::-;62056:11;62103:1;62089:11;:15;:29;;;;;62117:1;62108:6;:10;62089:29;62085:91;;;62141:23;:6;62152:11;62141:23;:10;:23;:::i;62191:143::-;62291:19;;:35;;62315:10;62291:35;:23;:35;:::i;:::-;62269:19;:57;-1:-1:-1;62191:143:0:o;3829:345::-;3915:7;4017:12;4010:5;4002:28;;;;-1:-1:-1;;;4002:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4002:28:0;;4041:9;4057:1;4053;:5;;;;;;;3829:345;-1:-1:-1;;;;;3829:345:0:o;8499:69::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6801:14;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;8499:69;:::o;21534:184::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;21644:12;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;21667:16:0;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;21694:9:0::1;:14:::0;;-1:-1:-1;;21694:14:0::1;21706:2;21694:14;::::0;;6797:57;;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;21534:184;;;:::o;10017:202::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;10089:17:::1;10109:12;:10;:12::i;:::-;10132:6;:18:::0;;-1:-1:-1;;;;;;10132:18:0::1;-1:-1:-1::0;;;;;10132:18:0;::::1;::::0;;::::1;::::0;;;10166:43:::1;::::0;10132:18;;-1:-1:-1;10132:18:0;-1:-1:-1;;10166:43:0::1;::::0;-1:-1:-1;;10166:43:0::1;6787:1;6801:14:::0;6797:57;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;10017:202;:::o;12649:98::-;6547:12;;;;;;;;:31;;;6563:15;:13;:15::i;:::-;6547:47;;;-1:-1:-1;6583:11:0;;;;6582:12;6547:47;6539:106;;;;-1:-1:-1;;;6539:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6654:19;6677:12;;;;;;6676:13;6696:83;;;;6725:12;:19;;-1:-1:-1;;;;6725:19:0;;;;;6753:18;6740:4;6753:18;;;6696:83;12722:7:::1;:15:::0;;-1:-1:-1;;12722:15:0::1;::::0;;6797:57;;;;6841:5;6826:20;;-1:-1:-1;;6826:20:0;;;12649:98;:::o;60716:95::-;60770:16;;:33;;;-1:-1:-1;;;60770:33:0;;;;;;;;;;-1:-1:-1;;;;;60770:16:0;;;;:24;;:33;;;;;:16;;:33;;;;;;;;:16;;:33;;;5:2:-1;;;;30:1;27;20:12;27569:378:0;-1:-1:-1;;;;;27653:21:0;;27645:65;;;;;-1:-1:-1;;;27645:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27723:49;27752:1;27756:7;27765:6;27723:20;:49::i;:::-;27800:12;;:24;;27817:6;27800:24;:16;:24;:::i;:::-;27785:12;:39;-1:-1:-1;;;;;27856:18:0;;;;;;:9;:18;;;;;;:30;;27879:6;27856:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;27835:18:0;;;;;;:9;:18;;;;;;;;:51;;;;27902:37;;;;;;;27835:18;;;;27902:37;;;;;;;;;;27569:378;;:::o;38459:27411::-;;;;;;;;;;-1:-1:-1;;;;;38459:27411:0;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38459:27411:0;;;-1:-1:-1;38459:27411:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://e4bd2476bcdd59b0f73493b4ab3ed06d1ed1d47756bbc08ef49f3a90c11d4247
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.