ERC-20
Overview
Max Total Supply
27,528.044031766813599097 SOS
Holders
58
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SoarsFinance
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-06 */ pragma solidity ^0.5.17; // File: @openzeppelin/contracts/GSN/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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 Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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/math/SafeMath.sol /** * @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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol /** * @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 {ERC20Mintable}. * * 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 ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; constructor (uint256 totalSupply) public { _mint(_msgSender(),totalSupply); } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public 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 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 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 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _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 { require(account != address(0), "ERC20: mint to the zero address"); _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 { require(account != address(0), "ERC20: burn from the zero address"); _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 { 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 Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public { _burn(_msgSender(), amount); } /** * @dev See {ERC20-_burnFrom}. */ function burnFrom(address account, uint256 amount) public { _burnFrom(account, amount); } } // File: @openzeppelin/contracts/access/Roles.sol /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @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. * * 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; } } // File: @openzeppelin/contracts/access/roles/WhitelistAdminRole.sol /** * @title WhitelistAdminRole * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts. */ contract WhitelistAdminRole is Context { using Roles for Roles.Role; event WhitelistAdminAdded(address indexed account); event WhitelistAdminRemoved(address indexed account); Roles.Role private _whitelistAdmins; constructor () internal { _addWhitelistAdmin(_msgSender()); } modifier onlyWhitelistAdmin() { require(isWhitelistAdmin(_msgSender()), "WhitelistAdminRole: caller does not have the WhitelistAdmin role"); _; } function isWhitelistAdmin(address account) public view returns (bool) { return _whitelistAdmins.has(account); } function addWhitelistAdmin(address account) public onlyWhitelistAdmin { _addWhitelistAdmin(account); } function renounceWhitelistAdmin() public { _removeWhitelistAdmin(_msgSender()); } function _addWhitelistAdmin(address account) internal { _whitelistAdmins.add(account); emit WhitelistAdminAdded(account); } function _removeWhitelistAdmin(address account) internal { _whitelistAdmins.remove(account); emit WhitelistAdminRemoved(account); } } // File: contracts/ERC20/ERC20TransferLiquidityLock.sol contract ERC20TransferLiquidityLock is ERC20 { using SafeMath for uint256; event Rebalance(uint256 tokenBurnt); event RewardLiquidityProviders(uint256 liquidityRewards); address public uniswapV2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address public uniswapV2Pair; address payable public treasury; address public bounce = 0x73282A63F0e3D7e9604575420F777361ecA3C86A; mapping(address => bool) feelessAddr; mapping(address => bool) unlocked; // the amount of tokens to lock for liquidity during every transfer, i.e. 100 = 1%, 50 = 2%, 40 = 2.5%, 33 ~ 3% uint256 public liquidityLockDivisor; uint256 public callerRewardDivisor; uint256 public rebalanceDivisor; uint256 public tokenBurnDivisor; uint256 public tokenBurnedAmount; uint256 public minRebalanceAmount; uint256 public lastRebalance; uint256 public rebalanceInterval; uint256 public lpUnlocked; bool public locked; Balancer balancer; constructor() public { lastRebalance = block.timestamp; liquidityLockDivisor = 100; callerRewardDivisor = 20; rebalanceDivisor = 33; rebalanceInterval = 1 hours; tokenBurnDivisor = 40; tokenBurnedAmount = 0; lpUnlocked = block.timestamp + 90 days; minRebalanceAmount = 50 ether; treasury = msg.sender; balancer = new Balancer(treasury); feelessAddr[address(this)] = true; feelessAddr[address(balancer)] = true; feelessAddr[bounce] = true; feelessAddr[msg.sender] = true; locked = true; unlocked[msg.sender] = true; unlocked[bounce] = true; unlocked[address(balancer)] = true; } //sav3 transfer function function _transfer(address from, address to, uint256 amount) internal { // calculate liquidity lock amount // dont transfer burn from this contract // or can never lock full lockable amount if(locked && unlocked[from] != true && unlocked[to] != true) revert("Locked until end of presale"); if (liquidityLockDivisor != 0 && feelessAddr[from] == false && feelessAddr[to] == false) { uint256 liquidityLockAmount = amount.div(liquidityLockDivisor); uint256 tokenBurnAmount = amount.div(tokenBurnDivisor); super._transfer(from, address(this), liquidityLockAmount); super._burn(from, tokenBurnAmount); tokenBurnedAmount += tokenBurnAmount; super._transfer(from, to, amount.sub(liquidityLockAmount).sub(tokenBurnAmount)); } else { super._transfer(from, to, amount); } } // receive eth from uniswap swap function () external payable {} function rebalanceLiquidity() public { require(balanceOf(msg.sender) >= minRebalanceAmount, "You are not allowed to rebalance!"); require(block.timestamp > lastRebalance + rebalanceInterval, 'Too Soon.'); lastRebalance = block.timestamp; // lockable supply is the token balance of this contract uint256 _lockableSupply = balanceOf(address(this)); _rewardLiquidityProviders(_lockableSupply); uint256 amountToRemove = ERC20(uniswapV2Pair).balanceOf(address(this)).div(rebalanceDivisor); // needed in case contract already owns eth remLiquidity(amountToRemove); uint _locked = balancer.rebalance(callerRewardDivisor); emit Rebalance(_locked); } function _rewardLiquidityProviders(uint256 liquidityRewards) private { super._transfer(address(this), uniswapV2Pair, liquidityRewards); IUniswapV2Pair(uniswapV2Pair).sync(); emit RewardLiquidityProviders(liquidityRewards); } function remLiquidity(uint256 lpAmount) private returns(uint ETHAmount) { ERC20(uniswapV2Pair).approve(uniswapV2Router, lpAmount); (ETHAmount) = IUniswapV2Router02(uniswapV2Router) .removeLiquidityETHSupportingFeeOnTransferTokens( address(this), lpAmount, 0, 0, address(balancer), block.timestamp ); } // returns token amount function lockableSupply() external view returns (uint256) { return balanceOf(address(this)); } // returns token amount function lockedSupply() external view returns (uint256) { uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply(); uint256 lpBalance = lockedLiquidity(); uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply); uint256 uniswapBalance = balanceOf(uniswapV2Pair); uint256 _lockedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12); return _lockedSupply; } // returns token amount function burnedSupply() external view returns (uint256) { uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply(); uint256 lpBalance = burnedLiquidity(); uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply); uint256 uniswapBalance = balanceOf(uniswapV2Pair); uint256 _burnedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12); return _burnedSupply; } // returns LP amount, not token amount function burnableLiquidity() public view returns (uint256) { return ERC20(uniswapV2Pair).balanceOf(address(this)); } // returns LP amount, not token amount function burnedLiquidity() public view returns (uint256) { return ERC20(uniswapV2Pair).balanceOf(address(0)); } // returns LP amount, not token amount function lockedLiquidity() public view returns (uint256) { return burnableLiquidity().add(burnedLiquidity()); } } interface IUniswapV2Router02 { function WETH() external pure returns (address); function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); } interface IUniswapV2Pair { function sync() external; } // File: contracts/ERC20/ERC20Governance.sol contract ERC20Governance is ERC20, ERC20Detailed { using SafeMath for uint256; function _transfer(address from, address to, uint256 amount) internal { _moveDelegates(_delegates[from], _delegates[to], amount); super._transfer(from, to, amount); } function _mint(address account, uint256 amount) internal { _moveDelegates(address(0), _delegates[account], amount); super._mint(account, amount); } function _burn(address account, uint256 amount) internal { _moveDelegates(_delegates[account], address(0), amount); super._burn(account, amount); } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @notice A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "ERC20Governance::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "ERC20Governance::delegateBySig: invalid nonce"); require(now <= expiry, "ERC20Governance::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "ERC20Governance::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying ERC20Governances (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "ERC20Governance::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } contract Balancer { using SafeMath for uint256; SoarsFinance token; address public burnAddr = 0x000000000000000000000000000000000000dEaD; address payable public treasury; constructor(address payable treasury_) public { token = SoarsFinance(msg.sender); treasury = treasury_; } function () external payable {} function rebalance(uint callerRewardDivisor) external returns (uint256) { require(msg.sender == address(token), "only token"); swapEthForTokens(address(this).balance, callerRewardDivisor); uint256 lockableBalance = token.balanceOf(address(this)); uint256 callerReward = lockableBalance.div(callerRewardDivisor); token.transfer(tx.origin, callerReward); token.transfer(burnAddr, lockableBalance.sub(callerReward)); return lockableBalance.sub(callerReward); } function swapEthForTokens(uint256 EthAmount, uint callerRewardDivisor) private { address[] memory uniswapPairPath = new address[](2); uniswapPairPath[0] = IUniswapV2Router02(token.uniswapV2Router()).WETH(); uniswapPairPath[1] = address(token); uint256 treasuryAmount = EthAmount.div(callerRewardDivisor); treasury.transfer(treasuryAmount); token.approve(token.uniswapV2Router(), EthAmount); IUniswapV2Router02(token.uniswapV2Router()) .swapExactETHForTokensSupportingFeeOnTransferTokens.value(EthAmount.sub(treasuryAmount))( 0, uniswapPairPath, address(this), block.timestamp ); } } contract SoarsFinance is ERC20(30000 ether), ERC20Detailed("SoarsFinance", "SOS", 18), ERC20Burnable, ERC20Governance, ERC20TransferLiquidityLock, WhitelistAdminRole { function setUniswapV2Router(address _uniswapV2Router) public onlyWhitelistAdmin { require(uniswapV2Router == address(0), "SOS::setUniswapV2Router: already set"); uniswapV2Router = _uniswapV2Router; } function setUniswapV2Pair(address _uniswapV2Pair) public onlyWhitelistAdmin { require(uniswapV2Pair == address(0), "SOS::setUniswapV2Pair: already set"); uniswapV2Pair = _uniswapV2Pair; } function setLiquidityLockDivisor(uint256 _liquidityLockDivisor) public onlyWhitelistAdmin { if (_liquidityLockDivisor != 0) { require(_liquidityLockDivisor >= 10, "SOS::setLiquidityLockDivisor: too small"); } liquidityLockDivisor = _liquidityLockDivisor; } function setRebalanceDivisor(uint256 _rebalanceDivisor) public onlyWhitelistAdmin { if (_rebalanceDivisor != 0) { require(_rebalanceDivisor >= 10, "SOS::setRebalanceDivisor: too small"); } rebalanceDivisor = _rebalanceDivisor; } function setRebalanceInterval(uint256 _interval) public onlyWhitelistAdmin { rebalanceInterval = _interval; } function setCallerRewardDivisior(uint256 _rewardDivisor) public onlyWhitelistAdmin { if (_rewardDivisor != 0) { require(_rewardDivisor >= 10, "SOS::setCallerRewardDivisor: too small"); } callerRewardDivisor = _rewardDivisor; } function unlockLP() public onlyWhitelistAdmin { require(now > lpUnlocked, "Not unlocked yet"); uint256 amount = IERC20(uniswapV2Pair).balanceOf(address(this)); IERC20(uniswapV2Pair).transfer(msg.sender, amount); } function toggleFeeless(address _addr) public onlyWhitelistAdmin { feelessAddr[_addr] = !feelessAddr[_addr]; } function toggleUnlockable(address _addr) public onlyWhitelistAdmin { unlocked[_addr] = !unlocked[_addr]; } function unlock() public onlyWhitelistAdmin { locked = false; } function setMinRebalanceAmount(uint256 amount_) public onlyWhitelistAdmin { minRebalanceAmount = amount_; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenBurnt","type":"uint256"}],"name":"Rebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityRewards","type":"uint256"}],"name":"RewardLiquidityProviders","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":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bounce","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"burnableLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"callerRewardDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastRebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidityLockDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lpUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minRebalanceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalanceLiquidity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rewardDivisor","type":"uint256"}],"name":"setCallerRewardDivisior","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_liquidityLockDivisor","type":"uint256"}],"name":"setLiquidityLockDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMinRebalanceAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rebalanceDivisor","type":"uint256"}],"name":"setRebalanceDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"setRebalanceInterval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"setUniswapV2Pair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_uniswapV2Router","type":"address"}],"name":"setUniswapV2Router","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleFeeless","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleUnlockable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenBurnDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenBurnedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlockLP","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052737a250d5630b4cf539739df2c5dacb4c659f2488d600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507373282a63f0e3d7e9604575420f777361eca3c86a600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600c81526020017f536f61727346696e616e636500000000000000000000000000000000000000008152506040518060400160405280600381526020017f534f530000000000000000000000000000000000000000000000000000000000815250601269065a4da25d3016c00000620001486200013b6200062460201b60201c565b826200062c60201b60201c565b508260039080519060200190620001619291906200126a565b5081600490805190602001906200017a9291906200126a565b5080600560006101000a81548160ff021916908360ff16021790555050505042601681905550606460108190555060146011819055506021601281905550610e10601781905550602860138190555060006014819055506276a70042016018819055506802b5e3af16b188000060158190555033600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516200025f90620012f1565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015620002b2573d6000803e3d6000fd5b50601960016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e6000601960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601960006101000a81548160ff0219169083151502179055506001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000601960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200061e620006126200062460201b60201c565b620006ba60201b60201c565b62001327565b600033905090565b6200069f6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836200071b60201b60201c565b620006b68282620009de60201b6200530f1760201c565b5050565b620006d581601a62000ba860201b62004c0f1790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015620007585750600081115b15620009d957600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146200089b576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611620007ff57600062000863565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b9050600062000881848362000c8c60201b620045ed1790919060201c565b9050620008978684848462000cde60201b60201c565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620009d8576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116200093c576000620009a0565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000620009be848362000f7e60201b62003c181790919060201c565b9050620009d48584848462000cde60201b60201c565b5050505b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000a82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b62000a9e8160025462000f7e60201b62003c181790919060201c565b60028190555062000afc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000f7e60201b62003c181790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b62000bba82826200100760201b60201c565b1562000c2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600062000cd683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250620010e760201b60201c565b905092915050565b600062000d0b436040518060600160405280603f815260200162007b0d603f9139620011ab60201b60201c565b905060008463ffffffff1611801562000da157508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b1562000e145781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff1681526020019081526020016000206001018190555062000f21565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b60008082840190508381101562000ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018062007b4c6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600083831115829062001198576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200115c5780820151818401526020810190506200113f565b50505050905090810190601f1680156200118a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60006401000000008310829062001260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200122457808201518184015260208101905062001207565b50505050905090810190601f168015620012525780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620012ad57805160ff1916838001178555620012de565b82800160010185558215620012de579182015b82811115620012dd578251825591602001919060010190620012c0565b5b509050620012ed9190620012ff565b5090565b610e778062006c9683390190565b6200132491905b808211156200132057600081600090555060010162001306565b5090565b90565b61595f80620013376000396000f3fe6080604052600436106103805760003560e01c806379cc6790116101d1578063b91f3f9711610102578063dc654a73116100a0578063e7a324dc1161006f578063e7a324dc1461132f578063e84354c51461135a578063f1127ed814611385578063f95379731461140d57610380565b8063dc654a73146111fd578063dd62ed3e14611228578063e161eb56146112ad578063e5ec1d8c146112d857610380565b8063ca5c7b91116100dc578063ca5c7b911461114d578063cafab28914611178578063cf309012146111a3578063d6d76b55146111d257610380565b8063b91f3f9714611047578063bb5f747b1461105e578063c3cda520146110c757610380565b8063a457c2d71161016f578063a9059cbb11610149578063a9059cbb14610f09578063b439824414610f7c578063b4b5ea5714610fa7578063b6833c591461100c57610380565b8063a457c2d714610e54578063a69df4b514610ec7578063a8a5550e14610ede57610380565b80637f4aeb1a116101ab5780637f4aeb1a14610d31578063858750ab14610d4857806395d89b4114610d73578063a29a608914610e0357610380565b806379cc679014610c365780637e0d943e14610c915780637ecebe0014610ccc57610380565b806339509351116102b65780635c19a95c1161025457806370709a7c1161022357806370709a7c14610ac057806370a0823114610b115780637362d9c814610b76578063782d6fe114610bc757610380565b80635c19a95c1461096c57806361d027b3146109bd57806367a9fca614610a145780636fcfff4514610a4f57610380565b80634c5a628c116102905780634c5a628c1461085e57806355d0a1d014610875578063587cde1e146108a05780635b7dcaed1461093157610380565b8063395093511461075957806342966c68146107cc57806349bd5a5e1461080757610380565b80631694505e1161032357806320606b70116102fd57806320606b701461063f57806323b872dd1461066a5780632898cafa146106fd578063313ce5671461072857610380565b80631694505e1461059257806316d1d916146105e957806318160ddd1461061457610380565b8063095ea7b31161035f578063095ea7b314610478578063106b9ca1146104eb5780631395ebbb146105165780631419841d1461054157610380565b80629a81301461038257806302dd19d9146103bd57806306fdde03146103e8575b005b34801561038e57600080fd5b506103bb600480360360208110156103a557600080fd5b810190808035906020019092919050505061145e565b005b3480156103c957600080fd5b506103d2611530565b6040518082815260200191505060405180910390f35b3480156103f457600080fd5b506103fd611536565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561043d578082015181840152602081019050610422565b50505050905090810190601f16801561046a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048457600080fd5b506104d16004803603604081101561049b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115d8565b604051808215151515815260200191505060405180910390f35b3480156104f757600080fd5b506105006115f6565b6040518082815260200191505060405180910390f35b34801561052257600080fd5b5061052b6115fc565b6040518082815260200191505060405180910390f35b34801561054d57600080fd5b506105906004803603602081101561056457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611602565b005b34801561059e57600080fd5b506105a7611752565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105f557600080fd5b506105fe611778565b6040518082815260200191505060405180910390f35b34801561062057600080fd5b5061062961177e565b6040518082815260200191505060405180910390f35b34801561064b57600080fd5b50610654611788565b6040518082815260200191505060405180910390f35b34801561067657600080fd5b506106e36004803603606081101561068d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117a4565b604051808215151515815260200191505060405180910390f35b34801561070957600080fd5b5061071261187d565b6040518082815260200191505060405180910390f35b34801561073457600080fd5b5061073d61195f565b604051808260ff1660ff16815260200191505060405180910390f35b34801561076557600080fd5b506107b26004803603604081101561077c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611976565b604051808215151515815260200191505060405180910390f35b3480156107d857600080fd5b50610805600480360360208110156107ef57600080fd5b8101908080359060200190929190505050611a29565b005b34801561081357600080fd5b5061081c611a3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561086a57600080fd5b50610873611a63565b005b34801561088157600080fd5b5061088a611a75565b6040518082815260200191505060405180910390f35b3480156108ac57600080fd5b506108ef600480360360208110156108c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bbf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561093d57600080fd5b5061096a6004803603602081101561095457600080fd5b8101908080359060200190929190505050611c28565b005b34801561097857600080fd5b506109bb6004803603602081101561098f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c97565b005b3480156109c957600080fd5b506109d2611ca4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a2057600080fd5b50610a4d60048036036020811015610a3757600080fd5b8101908080359060200190929190505050611cca565b005b348015610a5b57600080fd5b50610a9e60048036036020811015610a7257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d9c565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610acc57600080fd5b50610b0f60048036036020811015610ae357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dbf565b005b348015610b1d57600080fd5b50610b6060048036036020811015610b3457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ecb565b6040518082815260200191505060405180910390f35b348015610b8257600080fd5b50610bc560048036036020811015610b9957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f13565b005b348015610bd357600080fd5b50610c2060048036036040811015610bea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f84565b6040518082815260200191505060405180910390f35b348015610c4257600080fd5b50610c8f60048036036040811015610c5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612349565b005b348015610c9d57600080fd5b50610cca60048036036020811015610cb457600080fd5b8101908080359060200190929190505050612357565b005b348015610cd857600080fd5b50610d1b60048036036020811015610cef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612429565b6040518082815260200191505060405180910390f35b348015610d3d57600080fd5b50610d46612441565b005b348015610d5457600080fd5b50610d5d61272a565b6040518082815260200191505060405180910390f35b348015610d7f57600080fd5b50610d8861280b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dc8578082015181840152602081019050610dad565b50505050905090810190601f168015610df55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e0f57600080fd5b50610e5260048036036020811015610e2657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ad565b005b348015610e6057600080fd5b50610ead60048036036040811015610e7757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129fd565b604051808215151515815260200191505060405180910390f35b348015610ed357600080fd5b50610edc612aca565b005b348015610eea57600080fd5b50610ef3612b4c565b6040518082815260200191505060405180910390f35b348015610f1557600080fd5b50610f6260048036036040811015610f2c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b5c565b604051808215151515815260200191505060405180910390f35b348015610f8857600080fd5b50610f91612b7a565b6040518082815260200191505060405180910390f35b348015610fb357600080fd5b50610ff660048036036020811015610fca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ba2565b6040518082815260200191505060405180910390f35b34801561101857600080fd5b506110456004803603602081101561102f57600080fd5b8101908080359060200190929190505050612c78565b005b34801561105357600080fd5b5061105c612ce7565b005b34801561106a57600080fd5b506110ad6004803603602081101561108157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f89565b604051808215151515815260200191505060405180910390f35b3480156110d357600080fd5b5061114b600480360360c08110156110ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050612fa6565b005b34801561115957600080fd5b50611162613329565b6040518082815260200191505060405180910390f35b34801561118457600080fd5b5061118d613473565b6040518082815260200191505060405180910390f35b3480156111af57600080fd5b506111b8613479565b604051808215151515815260200191505060405180910390f35b3480156111de57600080fd5b506111e761348c565b6040518082815260200191505060405180910390f35b34801561120957600080fd5b50611212613492565b6040518082815260200191505060405180910390f35b34801561123457600080fd5b506112976004803603604081101561124b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613498565b6040518082815260200191505060405180910390f35b3480156112b957600080fd5b506112c261351f565b6040518082815260200191505060405180910390f35b3480156112e457600080fd5b506112ed613525565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561133b57600080fd5b5061134461354b565b6040518082815260200191505060405180910390f35b34801561136657600080fd5b5061136f613567565b6040518082815260200191505060405180910390f35b34801561139157600080fd5b506113e4600480360360408110156113a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff16906020019092919050505061356d565b604051808363ffffffff1663ffffffff1681526020018281526020019250505060405180910390f35b34801561141957600080fd5b5061145c6004803603602081101561143057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135ae565b005b61146e6114696136ba565b612f89565b6114c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b6000811461152657600a811015611525576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155ac6026913960400191505060405180910390fd5b5b8060118190555050565b60115481565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115ce5780601f106115a3576101008083540402835291602001916115ce565b820191906000526020600020905b8154815290600101906020018083116115b157829003601f168201915b5050505050905090565b60006115ec6115e56136ba565b84846136c2565b6001905092915050565b60165481565b60135481565b61161261160d6136ba565b612f89565b611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461170e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806155f96024913960400191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60175481565b6000600254905090565b60405180806156c0604391396043019050604051809103902081565b60006117b18484846138b9565b611872846117bd6136ba565b61186d8560405180606001604052806028815260200161572460289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006118236136ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6136c2565b600190509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823160006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561191f57600080fd5b505afa158015611933573d6000803e3d6000fd5b505050506040513d602081101561194957600080fd5b8101908080519060200190929190505050905090565b6000600560009054906101000a900460ff16905090565b6000611a1f6119836136ba565b84611a1a85600160006119946136ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c1890919063ffffffff16565b6136c2565b6001905092915050565b611a3a611a346136ba565b82613ca0565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a73611a6e6136ba565b613d19565b565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae057600080fd5b505afa158015611af4573d6000803e3d6000fd5b505050506040513d6020811015611b0a57600080fd5b810190808051906020019092919050505090506000611b2761187d565b90506000611b5583611b4764e8d4a5100085613d7390919063ffffffff16565b613df990919063ffffffff16565b90506000611b84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611ecb565b90506000611bb264e8d4a51000611ba48585613d7390919063ffffffff16565b613df990919063ffffffff16565b9050809550505050505090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611c38611c336136ba565b612f89565b611c8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b8060178190555050565b611ca13382613e43565b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cda611cd56136ba565b612f89565b611d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b60008114611d9257600a811015611d91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806155d26027913960400191505060405180910390fd5b5b8060108190555050565b60086020528060005260406000206000915054906101000a900463ffffffff1681565b611dcf611dca6136ba565b612f89565b611e24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f23611f1e6136ba565b612f89565b611f78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b611f8181613fb4565b50565b6000438210611fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806158496032913960400191505060405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16141561204b576000915050612343565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161213557600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff16815260200190815260200160002060010154915050612343565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156121b6576000915050612343565b600080905060006001830390505b8163ffffffff168163ffffffff1611156122dd576000600283830363ffffffff16816121ec57fe5b04820390506121f96152ef565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156122b557806020015195505050505050612343565b86816000015163ffffffff1610156122cf578193506122d6565b6001820392505b50506121c4565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b612353828261400e565b5050565b6123676123626136ba565b612f89565b6123bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b6000811461241f57600a81101561241e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806155636023913960400191505060405180910390fd5b5b8060128190555050565b60096020528060005260406000206000915090505481565b60155461244d33611ecb565b10156124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061569f6021913960400191505060405180910390fd5b60175460165401421161251f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f546f6f20536f6f6e2e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b42601681905550600061253130611ecb565b905061253c816140dd565b600061262c601254600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125e357600080fd5b505afa1580156125f7573d6000803e3d6000fd5b505050506040513d602081101561260d57600080fd5b8101908080519060200190929190505050613df990919063ffffffff16565b9050612637816141c6565b506000601960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49930186011546040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156126b157600080fd5b505af11580156126c5573d6000803e3d6000fd5b505050506040513d60208110156126db57600080fd5b810190808051906020019092919050505090507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0816040518082815260200191505060405180910390a1505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156127cb57600080fd5b505afa1580156127df573d6000803e3d6000fd5b505050506040513d60208110156127f557600080fd5b8101908080519060200190929190505050905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128a35780601f10612878576101008083540402835291602001916128a3565b820191906000526020600020905b81548152906001019060200180831161288657829003601f168201915b5050505050905090565b6128bd6128b86136ba565b612f89565b612912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061563e6022913960400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612ac0612a0a6136ba565b84612abb856040518060600160405280602581526020016159066025913960016000612a346136ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6136c2565b6001905092915050565b612ada612ad56136ba565b612f89565b612b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b6000601960006101000a81548160ff021916908315150217905550565b6000612b5730611ecb565b905090565b6000612b70612b696136ba565b84846138b9565b6001905092915050565b6000612b9d612b8761187d565b612b8f61272a565b613c1890919063ffffffff16565b905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611612c0c576000612c70565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b612c88612c836136ba565b612f89565b612cdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b8060158190555050565b612cf7612cf26136ba565b612f89565b612d4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b6018544211612dc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420756e6c6f636b6564207965740000000000000000000000000000000081525060200191505060405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e6457600080fd5b505afa158015612e78573d6000803e3d6000fd5b505050506040513d6020811015612e8e57600080fd5b81019080805190602001909291905050509050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f4a57600080fd5b505af1158015612f5e573d6000803e3d6000fd5b505050506040513d6020811015612f7457600080fd5b81019080805190602001909291905050505050565b6000612f9f82601a61442990919063ffffffff16565b9050919050565b600060405180806156c06043913960430190506040518091039020612fc9611536565b80519060200120612fd8614507565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001945050505050604051602081830303815290604052805190602001209050600060405180806158cc603a9139603a0190506040518091039020888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613183573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613215576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806155106031913960400191505060405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505589146132ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061589f602d913960400191505060405180910390fd5b87421115613313576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806157d26031913960400191505060405180910390fd5b61331d818b613e43565b50505050505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561339457600080fd5b505afa1580156133a8573d6000803e3d6000fd5b505050506040513d60208110156133be57600080fd5b8101908080519060200190929190505050905060006133db612b7a565b90506000613409836133fb64e8d4a5100085613d7390919063ffffffff16565b613df990919063ffffffff16565b90506000613438600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611ecb565b9050600061346664e8d4a510006134588585613d7390919063ffffffff16565b613df990919063ffffffff16565b9050809550505050505090565b60185481565b601960009054906101000a900460ff1681565b60145481565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60125481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60405180806158cc603a9139603a019050604051809103902081565b60155481565b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b6135be6135b96136ba565b612f89565b613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061587b6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806155416022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b601960009054906101000a900460ff168015613926575060011515600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514155b8015613983575060011515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514155b156139f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4c6f636b656420756e74696c20656e64206f662070726573616c65000000000081525060200191505060405180910390fd5b600060105414158015613a59575060001515600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b8015613ab5575060001515600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b15613b47576000613ad160105483613df990919063ffffffff16565b90506000613aea60135484613df990919063ffffffff16565b9050613af7853084614514565b613b018582613ca0565b80601460008282540192505081905550613b408585613b3b84613b2d87896145ed90919063ffffffff16565b6145ed90919063ffffffff16565b614514565b5050613b53565b613b52838383614514565b5b505050565b6000838311158290613c05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613bca578082015181840152602081019050613baf565b50505050905090810190601f168015613bf75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015613c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613d0b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600083614637565b613d1582826148d4565b5050565b613d2d81601a614a8c90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b600080831415613d865760009050613df3565b6000828402905082848281613d9757fe5b0414613dee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157036021913960400191505060405180910390fd5b809150505b92915050565b6000613e3b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614b49565b905092915050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613eb284611ecb565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4613fae828483614637565b50505050565b613fc881601a614c0f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b6140188282613ca0565b6140d9826140246136ba565b6140d4846040518060600160405280602481526020016157ae60249139600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061408a6136ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6136c2565b5050565b61410a30600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614514565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561417457600080fd5b505af1158015614188573d6000803e3d6000fd5b505050507f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d49054816040518082815260200191505060405180910390a150565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561429357600080fd5b505af11580156142a7573d6000803e3d6000fd5b505050506040513d60208110156142bd57600080fd5b810190808051906020019092919050505050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af2979eb3084600080601960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019650505050505050602060405180830381600087803b1580156143e757600080fd5b505af11580156143fb573d6000803e3d6000fd5b505050506040513d602081101561441157600080fd5b81019080805190602001909291905050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156144b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061574c6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000804690508091505090565b6145dd600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614637565b6145e8838383614cea565b505050565b600061462f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b58565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156146735750600081115b156148cf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146147a3576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161471657600061477a565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061479184836145ed90919063ffffffff16565b905061479f86848484614fa0565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146148ce576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116148415760006148a5565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006148bc8483613c1890919063ffffffff16565b90506148ca85848484614fa0565b5050505b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561495a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158036021913960400191505060405180910390fd5b6149c5816040518060600160405280602281526020016154ee602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a1c816002546145ed90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b614a968282614429565b614aeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061561d6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083118290614bf5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bba578082015181840152602081019050614b9f565b50505050905090810190601f168015614be75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614c0157fe5b049050809150509392505050565b614c198282614429565b15614c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614d70576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806158246025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614df6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154cb6023913960400191505060405180910390fd5b614e6181604051806060016040528060268152602001615586602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ef4816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c1890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000614fc4436040518060600160405280603f8152602001615660603f9139615234565b905060008463ffffffff1611801561505957508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156150ca5781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff168152602001908152602001600020600101819055506151d7565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b6000640100000000831082906152e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156152aa57808201518184015260208101905061528f565b50505050905090810190601f1680156152d75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff168152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156153b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6153c781600254613c1890919063ffffffff16565b60028190555061541e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c1890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a20617070726f766520746f20746865207a65726f2061646472657373534f533a3a736574526562616c616e636544697669736f723a20746f6f20736d616c6c45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365534f533a3a73657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c534f533a3a7365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c534f533a3a736574556e69737761705632526f757465723a20616c726561647920736574526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65534f533a3a736574556e69737761705632506169723a20616c7265616479207365744552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473596f7520617265206e6f7420616c6c6f77656420746f20726562616c616e636521454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c6545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e63654552433230476f7665726e616e63653a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964206e6f6e636544656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e74323536206578706972792945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820acfdd5e8ea1ea591d77da623a586f8ab7bc4363c50b4de0ff94234d4c452eb1d64736f6c63430005110032608060405261dead600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005357600080fd5b50604051610e77380380610e778339818101604052602081101561007657600080fd5b8101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610d5f806101186000396000f3fe6080604052600436106100345760003560e01c806361d027b314610036578063d246d4111461008d578063f4993018146100e4575b005b34801561004257600080fd5b5061004b610133565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561009957600080fd5b506100a2610159565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156100f057600080fd5b5061011d6004803603602081101561010757600080fd5b810190808035906020019092919050505061017f565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c7920746f6b656e0000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61024d4783610559565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156102ed57600080fd5b505afa158015610301573d6000803e3d6000fd5b505050506040513d602081101561031757600080fd5b81019080805190602001909291905050509050600061033f8483610b1090919063ffffffff16565b90506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb32836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156103e957600080fd5b505af11580156103fd573d6000803e3d6000fd5b505050506040513d602081101561041357600080fd5b8101908080519060200190929190505050506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166104988486610b5a90919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561050157600080fd5b505af1158015610515573d6000803e3d6000fd5b505050506040513d602081101561052b57600080fd5b8101908080519060200190929190505050506105508183610b5a90919063ffffffff16565b92505050919050565b6060600260405190808252806020026020018201604052801561058b5781602001602082028038833980820191505090505b5090506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631694505e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105f557600080fd5b505afa158015610609573d6000803e3d6000fd5b505050506040513d602081101561061f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561067557600080fd5b505afa158015610689573d6000803e3d6000fd5b505050506040513d602081101561069f57600080fd5b8101908080519060200190929190505050816000815181106106bd57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061072657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006107758385610b1090919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156107df573d6000803e3d6000fd5b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b36000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631694505e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561088457600080fd5b505afa158015610898573d6000803e3d6000fd5b505050506040513d60208110156108ae57600080fd5b8101908080519060200190929190505050866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561092957600080fd5b505af115801561093d573d6000803e3d6000fd5b505050506040513d602081101561095357600080fd5b8101908080519060200190929190505050506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631694505e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109cc57600080fd5b505afa1580156109e0573d6000803e3d6000fd5b505050506040513d60208110156109f657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663b6f9de95610a358387610b5a90919063ffffffff16565b60008530426040518663ffffffff1660e01b815260040180858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610aca578082015181840152602081019050610aaf565b50505050905001955050505050506000604051808303818588803b158015610af157600080fd5b505af1158015610b05573d6000803e3d6000fd5b505050505050505050565b6000610b5283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610ba4565b905092915050565b6000610b9c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610c6a565b905092915050565b60008083118290610c50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c15578082015181840152602081019050610bfa565b50505050905090810190601f168015610c425780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581610c5c57fe5b049050809150509392505050565b6000838311158290610d17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838503905080915050939250505056fea265627a7a723158205fa2777e0a8361dff1223213046fd0e40be78230807295f2701790f71c65b9bb64736f6c634300051100324552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373
Deployed Bytecode
0x6080604052600436106103805760003560e01c806379cc6790116101d1578063b91f3f9711610102578063dc654a73116100a0578063e7a324dc1161006f578063e7a324dc1461132f578063e84354c51461135a578063f1127ed814611385578063f95379731461140d57610380565b8063dc654a73146111fd578063dd62ed3e14611228578063e161eb56146112ad578063e5ec1d8c146112d857610380565b8063ca5c7b91116100dc578063ca5c7b911461114d578063cafab28914611178578063cf309012146111a3578063d6d76b55146111d257610380565b8063b91f3f9714611047578063bb5f747b1461105e578063c3cda520146110c757610380565b8063a457c2d71161016f578063a9059cbb11610149578063a9059cbb14610f09578063b439824414610f7c578063b4b5ea5714610fa7578063b6833c591461100c57610380565b8063a457c2d714610e54578063a69df4b514610ec7578063a8a5550e14610ede57610380565b80637f4aeb1a116101ab5780637f4aeb1a14610d31578063858750ab14610d4857806395d89b4114610d73578063a29a608914610e0357610380565b806379cc679014610c365780637e0d943e14610c915780637ecebe0014610ccc57610380565b806339509351116102b65780635c19a95c1161025457806370709a7c1161022357806370709a7c14610ac057806370a0823114610b115780637362d9c814610b76578063782d6fe114610bc757610380565b80635c19a95c1461096c57806361d027b3146109bd57806367a9fca614610a145780636fcfff4514610a4f57610380565b80634c5a628c116102905780634c5a628c1461085e57806355d0a1d014610875578063587cde1e146108a05780635b7dcaed1461093157610380565b8063395093511461075957806342966c68146107cc57806349bd5a5e1461080757610380565b80631694505e1161032357806320606b70116102fd57806320606b701461063f57806323b872dd1461066a5780632898cafa146106fd578063313ce5671461072857610380565b80631694505e1461059257806316d1d916146105e957806318160ddd1461061457610380565b8063095ea7b31161035f578063095ea7b314610478578063106b9ca1146104eb5780631395ebbb146105165780631419841d1461054157610380565b80629a81301461038257806302dd19d9146103bd57806306fdde03146103e8575b005b34801561038e57600080fd5b506103bb600480360360208110156103a557600080fd5b810190808035906020019092919050505061145e565b005b3480156103c957600080fd5b506103d2611530565b6040518082815260200191505060405180910390f35b3480156103f457600080fd5b506103fd611536565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561043d578082015181840152602081019050610422565b50505050905090810190601f16801561046a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048457600080fd5b506104d16004803603604081101561049b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115d8565b604051808215151515815260200191505060405180910390f35b3480156104f757600080fd5b506105006115f6565b6040518082815260200191505060405180910390f35b34801561052257600080fd5b5061052b6115fc565b6040518082815260200191505060405180910390f35b34801561054d57600080fd5b506105906004803603602081101561056457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611602565b005b34801561059e57600080fd5b506105a7611752565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105f557600080fd5b506105fe611778565b6040518082815260200191505060405180910390f35b34801561062057600080fd5b5061062961177e565b6040518082815260200191505060405180910390f35b34801561064b57600080fd5b50610654611788565b6040518082815260200191505060405180910390f35b34801561067657600080fd5b506106e36004803603606081101561068d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117a4565b604051808215151515815260200191505060405180910390f35b34801561070957600080fd5b5061071261187d565b6040518082815260200191505060405180910390f35b34801561073457600080fd5b5061073d61195f565b604051808260ff1660ff16815260200191505060405180910390f35b34801561076557600080fd5b506107b26004803603604081101561077c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611976565b604051808215151515815260200191505060405180910390f35b3480156107d857600080fd5b50610805600480360360208110156107ef57600080fd5b8101908080359060200190929190505050611a29565b005b34801561081357600080fd5b5061081c611a3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561086a57600080fd5b50610873611a63565b005b34801561088157600080fd5b5061088a611a75565b6040518082815260200191505060405180910390f35b3480156108ac57600080fd5b506108ef600480360360208110156108c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bbf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561093d57600080fd5b5061096a6004803603602081101561095457600080fd5b8101908080359060200190929190505050611c28565b005b34801561097857600080fd5b506109bb6004803603602081101561098f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c97565b005b3480156109c957600080fd5b506109d2611ca4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a2057600080fd5b50610a4d60048036036020811015610a3757600080fd5b8101908080359060200190929190505050611cca565b005b348015610a5b57600080fd5b50610a9e60048036036020811015610a7257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d9c565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610acc57600080fd5b50610b0f60048036036020811015610ae357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dbf565b005b348015610b1d57600080fd5b50610b6060048036036020811015610b3457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ecb565b6040518082815260200191505060405180910390f35b348015610b8257600080fd5b50610bc560048036036020811015610b9957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f13565b005b348015610bd357600080fd5b50610c2060048036036040811015610bea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f84565b6040518082815260200191505060405180910390f35b348015610c4257600080fd5b50610c8f60048036036040811015610c5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612349565b005b348015610c9d57600080fd5b50610cca60048036036020811015610cb457600080fd5b8101908080359060200190929190505050612357565b005b348015610cd857600080fd5b50610d1b60048036036020811015610cef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612429565b6040518082815260200191505060405180910390f35b348015610d3d57600080fd5b50610d46612441565b005b348015610d5457600080fd5b50610d5d61272a565b6040518082815260200191505060405180910390f35b348015610d7f57600080fd5b50610d8861280b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dc8578082015181840152602081019050610dad565b50505050905090810190601f168015610df55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e0f57600080fd5b50610e5260048036036020811015610e2657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ad565b005b348015610e6057600080fd5b50610ead60048036036040811015610e7757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129fd565b604051808215151515815260200191505060405180910390f35b348015610ed357600080fd5b50610edc612aca565b005b348015610eea57600080fd5b50610ef3612b4c565b6040518082815260200191505060405180910390f35b348015610f1557600080fd5b50610f6260048036036040811015610f2c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b5c565b604051808215151515815260200191505060405180910390f35b348015610f8857600080fd5b50610f91612b7a565b6040518082815260200191505060405180910390f35b348015610fb357600080fd5b50610ff660048036036020811015610fca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ba2565b6040518082815260200191505060405180910390f35b34801561101857600080fd5b506110456004803603602081101561102f57600080fd5b8101908080359060200190929190505050612c78565b005b34801561105357600080fd5b5061105c612ce7565b005b34801561106a57600080fd5b506110ad6004803603602081101561108157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f89565b604051808215151515815260200191505060405180910390f35b3480156110d357600080fd5b5061114b600480360360c08110156110ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050612fa6565b005b34801561115957600080fd5b50611162613329565b6040518082815260200191505060405180910390f35b34801561118457600080fd5b5061118d613473565b6040518082815260200191505060405180910390f35b3480156111af57600080fd5b506111b8613479565b604051808215151515815260200191505060405180910390f35b3480156111de57600080fd5b506111e761348c565b6040518082815260200191505060405180910390f35b34801561120957600080fd5b50611212613492565b6040518082815260200191505060405180910390f35b34801561123457600080fd5b506112976004803603604081101561124b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613498565b6040518082815260200191505060405180910390f35b3480156112b957600080fd5b506112c261351f565b6040518082815260200191505060405180910390f35b3480156112e457600080fd5b506112ed613525565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561133b57600080fd5b5061134461354b565b6040518082815260200191505060405180910390f35b34801561136657600080fd5b5061136f613567565b6040518082815260200191505060405180910390f35b34801561139157600080fd5b506113e4600480360360408110156113a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff16906020019092919050505061356d565b604051808363ffffffff1663ffffffff1681526020018281526020019250505060405180910390f35b34801561141957600080fd5b5061145c6004803603602081101561143057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135ae565b005b61146e6114696136ba565b612f89565b6114c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b6000811461152657600a811015611525576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155ac6026913960400191505060405180910390fd5b5b8060118190555050565b60115481565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115ce5780601f106115a3576101008083540402835291602001916115ce565b820191906000526020600020905b8154815290600101906020018083116115b157829003601f168201915b5050505050905090565b60006115ec6115e56136ba565b84846136c2565b6001905092915050565b60165481565b60135481565b61161261160d6136ba565b612f89565b611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461170e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806155f96024913960400191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60175481565b6000600254905090565b60405180806156c0604391396043019050604051809103902081565b60006117b18484846138b9565b611872846117bd6136ba565b61186d8560405180606001604052806028815260200161572460289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006118236136ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6136c2565b600190509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823160006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561191f57600080fd5b505afa158015611933573d6000803e3d6000fd5b505050506040513d602081101561194957600080fd5b8101908080519060200190929190505050905090565b6000600560009054906101000a900460ff16905090565b6000611a1f6119836136ba565b84611a1a85600160006119946136ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c1890919063ffffffff16565b6136c2565b6001905092915050565b611a3a611a346136ba565b82613ca0565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a73611a6e6136ba565b613d19565b565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae057600080fd5b505afa158015611af4573d6000803e3d6000fd5b505050506040513d6020811015611b0a57600080fd5b810190808051906020019092919050505090506000611b2761187d565b90506000611b5583611b4764e8d4a5100085613d7390919063ffffffff16565b613df990919063ffffffff16565b90506000611b84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611ecb565b90506000611bb264e8d4a51000611ba48585613d7390919063ffffffff16565b613df990919063ffffffff16565b9050809550505050505090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611c38611c336136ba565b612f89565b611c8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b8060178190555050565b611ca13382613e43565b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cda611cd56136ba565b612f89565b611d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b60008114611d9257600a811015611d91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806155d26027913960400191505060405180910390fd5b5b8060108190555050565b60086020528060005260406000206000915054906101000a900463ffffffff1681565b611dcf611dca6136ba565b612f89565b611e24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f23611f1e6136ba565b612f89565b611f78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b611f8181613fb4565b50565b6000438210611fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806158496032913960400191505060405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16141561204b576000915050612343565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161213557600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff16815260200190815260200160002060010154915050612343565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156121b6576000915050612343565b600080905060006001830390505b8163ffffffff168163ffffffff1611156122dd576000600283830363ffffffff16816121ec57fe5b04820390506121f96152ef565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156122b557806020015195505050505050612343565b86816000015163ffffffff1610156122cf578193506122d6565b6001820392505b50506121c4565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b612353828261400e565b5050565b6123676123626136ba565b612f89565b6123bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b6000811461241f57600a81101561241e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806155636023913960400191505060405180910390fd5b5b8060128190555050565b60096020528060005260406000206000915090505481565b60155461244d33611ecb565b10156124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061569f6021913960400191505060405180910390fd5b60175460165401421161251f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f546f6f20536f6f6e2e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b42601681905550600061253130611ecb565b905061253c816140dd565b600061262c601254600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125e357600080fd5b505afa1580156125f7573d6000803e3d6000fd5b505050506040513d602081101561260d57600080fd5b8101908080519060200190929190505050613df990919063ffffffff16565b9050612637816141c6565b506000601960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49930186011546040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156126b157600080fd5b505af11580156126c5573d6000803e3d6000fd5b505050506040513d60208110156126db57600080fd5b810190808051906020019092919050505090507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0816040518082815260200191505060405180910390a1505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156127cb57600080fd5b505afa1580156127df573d6000803e3d6000fd5b505050506040513d60208110156127f557600080fd5b8101908080519060200190929190505050905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128a35780601f10612878576101008083540402835291602001916128a3565b820191906000526020600020905b81548152906001019060200180831161288657829003601f168201915b5050505050905090565b6128bd6128b86136ba565b612f89565b612912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061563e6022913960400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612ac0612a0a6136ba565b84612abb856040518060600160405280602581526020016159066025913960016000612a346136ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6136c2565b6001905092915050565b612ada612ad56136ba565b612f89565b612b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b6000601960006101000a81548160ff021916908315150217905550565b6000612b5730611ecb565b905090565b6000612b70612b696136ba565b84846138b9565b6001905092915050565b6000612b9d612b8761187d565b612b8f61272a565b613c1890919063ffffffff16565b905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611612c0c576000612c70565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b612c88612c836136ba565b612f89565b612cdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b8060158190555050565b612cf7612cf26136ba565b612f89565b612d4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b6018544211612dc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420756e6c6f636b6564207965740000000000000000000000000000000081525060200191505060405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e6457600080fd5b505afa158015612e78573d6000803e3d6000fd5b505050506040513d6020811015612e8e57600080fd5b81019080805190602001909291905050509050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f4a57600080fd5b505af1158015612f5e573d6000803e3d6000fd5b505050506040513d6020811015612f7457600080fd5b81019080805190602001909291905050505050565b6000612f9f82601a61442990919063ffffffff16565b9050919050565b600060405180806156c06043913960430190506040518091039020612fc9611536565b80519060200120612fd8614507565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001945050505050604051602081830303815290604052805190602001209050600060405180806158cc603a9139603a0190506040518091039020888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613183573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613215576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806155106031913960400191505060405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505589146132ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061589f602d913960400191505060405180910390fd5b87421115613313576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806157d26031913960400191505060405180910390fd5b61331d818b613e43565b50505050505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561339457600080fd5b505afa1580156133a8573d6000803e3d6000fd5b505050506040513d60208110156133be57600080fd5b8101908080519060200190929190505050905060006133db612b7a565b90506000613409836133fb64e8d4a5100085613d7390919063ffffffff16565b613df990919063ffffffff16565b90506000613438600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611ecb565b9050600061346664e8d4a510006134588585613d7390919063ffffffff16565b613df990919063ffffffff16565b9050809550505050505090565b60185481565b601960009054906101000a900460ff1681565b60145481565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60125481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60405180806158cc603a9139603a019050604051809103902081565b60155481565b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b6135be6135b96136ba565b612f89565b613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061576e6040913960400191505060405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061587b6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806155416022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b601960009054906101000a900460ff168015613926575060011515600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514155b8015613983575060011515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514155b156139f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4c6f636b656420756e74696c20656e64206f662070726573616c65000000000081525060200191505060405180910390fd5b600060105414158015613a59575060001515600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b8015613ab5575060001515600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b15613b47576000613ad160105483613df990919063ffffffff16565b90506000613aea60135484613df990919063ffffffff16565b9050613af7853084614514565b613b018582613ca0565b80601460008282540192505081905550613b408585613b3b84613b2d87896145ed90919063ffffffff16565b6145ed90919063ffffffff16565b614514565b5050613b53565b613b52838383614514565b5b505050565b6000838311158290613c05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613bca578082015181840152602081019050613baf565b50505050905090810190601f168015613bf75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015613c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613d0b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600083614637565b613d1582826148d4565b5050565b613d2d81601a614a8c90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b600080831415613d865760009050613df3565b6000828402905082848281613d9757fe5b0414613dee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157036021913960400191505060405180910390fd5b809150505b92915050565b6000613e3b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614b49565b905092915050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613eb284611ecb565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4613fae828483614637565b50505050565b613fc881601a614c0f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b6140188282613ca0565b6140d9826140246136ba565b6140d4846040518060600160405280602481526020016157ae60249139600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061408a6136ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6136c2565b5050565b61410a30600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614514565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561417457600080fd5b505af1158015614188573d6000803e3d6000fd5b505050507f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d49054816040518082815260200191505060405180910390a150565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561429357600080fd5b505af11580156142a7573d6000803e3d6000fd5b505050506040513d60208110156142bd57600080fd5b810190808051906020019092919050505050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af2979eb3084600080601960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019650505050505050602060405180830381600087803b1580156143e757600080fd5b505af11580156143fb573d6000803e3d6000fd5b505050506040513d602081101561441157600080fd5b81019080805190602001909291905050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156144b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061574c6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000804690508091505090565b6145dd600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614637565b6145e8838383614cea565b505050565b600061462f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b58565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156146735750600081115b156148cf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146147a3576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161471657600061477a565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061479184836145ed90919063ffffffff16565b905061479f86848484614fa0565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146148ce576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116148415760006148a5565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006148bc8483613c1890919063ffffffff16565b90506148ca85848484614fa0565b5050505b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561495a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158036021913960400191505060405180910390fd5b6149c5816040518060600160405280602281526020016154ee602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a1c816002546145ed90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b614a968282614429565b614aeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061561d6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083118290614bf5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bba578082015181840152602081019050614b9f565b50505050905090810190601f168015614be75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614c0157fe5b049050809150509392505050565b614c198282614429565b15614c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614d70576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806158246025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614df6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154cb6023913960400191505060405180910390fd5b614e6181604051806060016040528060268152602001615586602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b589092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ef4816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c1890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000614fc4436040518060600160405280603f8152602001615660603f9139615234565b905060008463ffffffff1611801561505957508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156150ca5781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff168152602001908152602001600020600101819055506151d7565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b6000640100000000831082906152e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156152aa57808201518184015260208101905061528f565b50505050905090810190601f1680156152d75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff168152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156153b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6153c781600254613c1890919063ffffffff16565b60028190555061541e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c1890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a20617070726f766520746f20746865207a65726f2061646472657373534f533a3a736574526562616c616e636544697669736f723a20746f6f20736d616c6c45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365534f533a3a73657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c534f533a3a7365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c534f533a3a736574556e69737761705632526f757465723a20616c726561647920736574526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65534f533a3a736574556e69737761705632506169723a20616c7265616479207365744552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473596f7520617265206e6f7420616c6c6f77656420746f20726562616c616e636521454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c6545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e63654552433230476f7665726e616e63653a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964206e6f6e636544656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e74323536206578706972792945524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820acfdd5e8ea1ea591d77da623a586f8ab7bc4363c50b4de0ff94234d4c452eb1d64736f6c63430005110032
Deployed Bytecode Sourcemap
40587:2419:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41986:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41986:279:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41986:279:0;;;;;;;;;;;;;;;;;:::i;:::-;;23365:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23365:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20309:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20309:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20309:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12145:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12145:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12145:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23573:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23573:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23444:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23444:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40801:222;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40801:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40801:222:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;22889:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22889:75:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23608:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23608:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11166:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11166:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31247:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31247:122:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12769:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12769:304:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12769:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28413:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28413:125:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21161:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21161:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13482:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13482:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13482:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18325:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18325:83:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18325:83:0;;;;;;;;;;;;;;;;;:::i;:::-;;22971:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22971:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22212:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22212:95:0;;;:::i;:::-;;27736:443;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27736:443:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32230:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32230:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32230:149:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41851:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41851:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41851:123:0;;;;;;;;;;;;;;;;;:::i;:::-;;32523:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32523:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32523:104:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;23006:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23006:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41249:301;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41249:301:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41249:301:0;;;;;;;;;;;;;;;;;:::i;:::-;;31125:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31125:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31125:49:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42534:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42534:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42534:123:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11320:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11320:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11320:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22088:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22088:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22088:116:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;35159:1264;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35159:1264:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35159:1264:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18470:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18470:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18470:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41558:281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41558:281:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41558:281:0;;;;;;;;;;;;;;;;;:::i;:::-;;31661:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31661:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31661:39:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25583:767;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25583:767:0;;;:::i;:::-;;28231:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28231:130:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20511:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20511:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20511:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41031:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41031:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41031:210:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14195:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14195:261:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14195:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42793:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42793:77:0;;;:::i;:::-;;27111:108;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27111:108:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11643:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11643:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11643:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28590:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28590:125:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34473:255;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34473:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34473:255:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42882:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42882:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42882:121:0;;;;;;;;;;;;;;;;;:::i;:::-;;42277:245;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42277:245:0;;;:::i;:::-;;21955:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21955:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21955:125:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33061:1211;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33061:1211:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;33061:1211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27256:443;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27256:443:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23653:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23653:25:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23685:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23685:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23488:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23488:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23323:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23323:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11864:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11864:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11864:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23406:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23406:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23044:66;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23044:66:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31463:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31463:117:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23533:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23533:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30986:70;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30986:70:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30986:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42663:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42663:120:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42663:120:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;41986:279;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42102:1;42084:14;:19;42080:123;;42146:2;42128:14;:20;;42120:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42080:123;42243:14;42221:19;:36;;;;41986:279;:::o;23365:34::-;;;;:::o;20309:83::-;20346:13;20379:5;20372:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20309:83;:::o;12145:152::-;12211:4;12228:39;12237:12;:10;:12::i;:::-;12251:7;12260:6;12228:8;:39::i;:::-;12285:4;12278:11;;12145:152;;;;:::o;23573:28::-;;;;:::o;23444:31::-;;;;:::o;40801:222::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40927:1;40900:29;;:15;;;;;;;;;;;:29;;;40892:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40999:16;40981:15;;:34;;;;;;;;;;;;;;;;;;40801:222;:::o;22889:75::-;;;;;;;;;;;;;:::o;23608:32::-;;;;:::o;11166:91::-;11210:7;11237:12;;11230:19;;11166:91;:::o;31247:122::-;31289:80;;;;;;;;;;;;;;;;;;;31247:122;:::o;12769:304::-;12858:4;12875:36;12885:6;12893:9;12904:6;12875:9;:36::i;:::-;12922:121;12931:6;12939:12;:10;:12::i;:::-;12953:89;12991:6;12953:89;;;;;;;;;;;;;;;;;:11;:19;12965:6;12953:19;;;;;;;;;;;;;;;:33;12973:12;:10;:12::i;:::-;12953:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;12922:8;:121::i;:::-;13061:4;13054:11;;12769:304;;;;;:::o;28413:125::-;28461:7;28494:13;;;;;;;;;;;28488:30;;;28527:1;28488:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28488:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28488:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28488:42:0;;;;;;;;;;;;;;;;28481:49;;28413:125;:::o;21161:83::-;21202:5;21227:9;;;;;;;;;;;21220:16;;21161:83;:::o;13482:210::-;13562:4;13579:83;13588:12;:10;:12::i;:::-;13602:7;13611:50;13650:10;13611:11;:25;13623:12;:10;:12::i;:::-;13611:25;;;;;;;;;;;;;;;:34;13637:7;13611:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;13579:8;:83::i;:::-;13680:4;13673:11;;13482:210;;;;:::o;18325:83::-;18373:27;18379:12;:10;:12::i;:::-;18393:6;18373:5;:27::i;:::-;18325:83;:::o;22971:28::-;;;;;;;;;;;;;:::o;22212:95::-;22264:35;22286:12;:10;:12::i;:::-;22264:21;:35::i;:::-;22212:95::o;27736:443::-;27783:7;27803:21;27833:13;;;;;;;;;;;27827:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27827:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27827:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27827:34:0;;;;;;;;;;;;;;;;27803:58;;27872:17;27892;:15;:17::i;:::-;27872:37;;27920:30;27953:38;27977:13;27953:19;27967:4;27953:9;:13;;:19;;;;:::i;:::-;:23;;:38;;;;:::i;:::-;27920:71;;28004:22;28029:24;28039:13;;;;;;;;;;;28029:9;:24::i;:::-;28004:49;;28064:21;28088:52;28135:4;28088:42;28107:22;28088:14;:18;;:42;;;;:::i;:::-;:46;;:52;;;;:::i;:::-;28064:76;;28158:13;28151:20;;;;;;;27736:443;:::o;32230:149::-;32318:7;32350:10;:21;32361:9;32350:21;;;;;;;;;;;;;;;;;;;;;;;;;32343:28;;32230:149;;;:::o;41851:123::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41957:9;41937:17;:29;;;;41851:123;:::o;32523:104::-;32587:32;32597:10;32609:9;32587;:32::i;:::-;32523:104;:::o;23006:31::-;;;;;;;;;;;;;:::o;41249:301::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41379:1;41354:21;:26;41350:138;;41430:2;41405:21;:27;;41397:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41350:138;41521:21;41498:20;:44;;;;41249:301;:::o;31125:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;42534:123::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42631:11;:18;42643:5;42631:18;;;;;;;;;;;;;;;;;;;;;;;;;42630:19;42609:11;:18;42621:5;42609:18;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;42534:123;:::o;11320:110::-;11377:7;11404:9;:18;11414:7;11404:18;;;;;;;;;;;;;;;;11397:25;;11320:110;;;:::o;22088:116::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22169:27;22188:7;22169:18;:27::i;:::-;22088:116;:::o;35159:1264::-;35267:7;35314:12;35300:11;:26;35292:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35394:19;35416:14;:23;35431:7;35416:23;;;;;;;;;;;;;;;;;;;;;;;;;35394:45;;35470:1;35454:12;:17;;;35450:58;;;35495:1;35488:8;;;;;35450:58;35620:11;35568;:20;35580:7;35568:20;;;;;;;;;;;;;;;:38;35604:1;35589:12;:16;35568:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;35564:147;;35655:11;:20;35667:7;35655:20;;;;;;;;;;;;;;;:38;35691:1;35676:12;:16;35655:38;;;;;;;;;;;;;;;:44;;;35648:51;;;;;35564:147;35808:11;35772;:20;35784:7;35772:20;;;;;;;;;;;;;;;:23;35793:1;35772:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;35768:88;;;35843:1;35836:8;;;;;35768:88;35868:12;35883:1;35868:16;;35895:12;35925:1;35910:12;:16;35895:31;;35937:428;35952:5;35944:13;;:5;:13;;;35937:428;;;35974:13;36016:1;36007:5;35999;:13;35998:19;;;;;;;;35990:5;:27;35974:43;;36059:20;;:::i;:::-;36082:11;:20;36094:7;36082:20;;;;;;;;;;;;;;;:28;36103:6;36082:28;;;;;;;;;;;;;;;36059:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36145:11;36129:2;:12;;;:27;;;36125:229;;;36184:2;:8;;;36177:15;;;;;;;;;36125:229;36233:11;36218:2;:12;;;:26;;;36214:140;;;36273:6;36265:14;;36214:140;;;36337:1;36328:6;:10;36320:18;;36214:140;35937:428;;;;;36382:11;:20;36394:7;36382:20;;;;;;;;;;;;;;;:27;36403:5;36382:27;;;;;;;;;;;;;;;:33;;;36375:40;;;;;35159:1264;;;;;:::o;18470:103::-;18539:26;18549:7;18558:6;18539:9;:26::i;:::-;18470:103;;:::o;41558:281::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41676:1;41655:17;:22;41651:126;;41723:2;41702:17;:23;;41694:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41651:126;41814:17;41795:16;:36;;;;41558:281;:::o;31661:39::-;;;;;;;;;;;;;;;;;:::o;25583:767::-;25664:18;;25639:21;25649:10;25639:9;:21::i;:::-;:43;;25631:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25773:17;;25757:13;;:33;25739:15;:51;25731:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25831:15;25815:13;:31;;;;25923:23;25949:24;25967:4;25949:9;:24::i;:::-;25923:50;;25984:42;26010:15;25984:25;:42::i;:::-;26047:22;26072:67;26122:16;;26078:13;;;;;;;;;;;26072:30;;;26111:4;26072:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26072:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26072:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26072:45:0;;;;;;;;;;;;;;;;:49;;:67;;;;:::i;:::-;26047:92;;26213:28;26226:14;26213:12;:28::i;:::-;;26252:12;26267:8;;;;;;;;;;;:18;;;26286:19;;26267:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26267:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26267:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26267:39:0;;;;;;;;;;;;;;;;26252:54;;26324:18;26334:7;26324:18;;;;;;;;;;;;;;;;;;25583:767;;;:::o;28231:130::-;28281:7;28314:13;;;;;;;;;;;28308:30;;;28347:4;28308:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28308:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28308:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28308:45:0;;;;;;;;;;;;;;;;28301:52;;28231:130;:::o;20511:87::-;20550:13;20583:7;20576:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20511:87;:::o;41031:210::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41151:1;41126:27;;:13;;;;;;;;;;;:27;;;41118:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41219:14;41203:13;;:30;;;;;;;;;;;;;;;;;;41031:210;:::o;14195:261::-;14280:4;14297:129;14306:12;:10;:12::i;:::-;14320:7;14329:96;14368:15;14329:96;;;;;;;;;;;;;;;;;:11;:25;14341:12;:10;:12::i;:::-;14329:25;;;;;;;;;;;;;;;:34;14355:7;14329:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;14297:8;:129::i;:::-;14444:4;14437:11;;14195:261;;;;:::o;42793:77::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42857:5;42848:6;;:14;;;;;;;;;;;;;;;;;;42793:77::o;27111:108::-;27160:7;27187:24;27205:4;27187:9;:24::i;:::-;27180:31;;27111:108;:::o;11643:158::-;11712:4;11729:42;11739:12;:10;:12::i;:::-;11753:9;11764:6;11729:9;:42::i;:::-;11789:4;11782:11;;11643:158;;;;:::o;28590:125::-;28638:7;28665:42;28689:17;:15;:17::i;:::-;28665:19;:17;:19::i;:::-;:23;;:42;;;;:::i;:::-;28658:49;;28590:125;:::o;34473:255::-;34565:7;34590:19;34612:14;:23;34627:7;34612:23;;;;;;;;;;;;;;;;;;;;;;;;;34590:45;;34668:1;34653:12;:16;;;:67;;34719:1;34653:67;;;34672:11;:20;34684:7;34672:20;;;;;;;;;;;;;;;:38;34708:1;34693:12;:16;34672:38;;;;;;;;;;;;;;;:44;;;34653:67;34646:74;;;34473:255;;;:::o;42882:121::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42988:7;42967:18;:28;;;;42882:121;:::o;42277:245::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42348:10;;42342:3;:16;42334:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42390:14;42414:13;;;;;;;;;;;42407:31;;;42447:4;42407:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42407:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42407:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42407:46:0;;;;;;;;;;;;;;;;42390:63;;42471:13;;;;;;;;;;;42464:30;;;42495:10;42507:6;42464:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42464:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42464:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42464:50:0;;;;;;;;;;;;;;;;;21938:1;42277:245::o;21955:125::-;22019:4;22043:29;22064:7;22043:16;:20;;:29;;;;:::i;:::-;22036:36;;21955:125;;;:::o;33061:1211::-;33254:23;31289:80;;;;;;;;;;;;;;;;;;;33383:6;:4;:6::i;:::-;33367:24;;;;;;33410:12;:10;:12::i;:::-;33449:4;33304:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;33304:165:0;;;33280:200;;;;;;33254:226;;33493:18;31509:71;;;;;;;;;;;;;;;;;;;33605:9;33633:5;33657:6;33538:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;33538:140:0;;;33514:175;;;;;;33493:196;;33702:14;33807:15;33841:10;33743:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;33743:123:0;;;33719:158;;;;;;33702:175;;33890:17;33910:26;33920:6;33928:1;33931;33934;33910:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33910:26:0;;;;;;;;33890:46;;33976:1;33955:23;;:9;:23;;;;33947:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34060:6;:17;34067:9;34060:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;34051:5;:28;34043:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34155:6;34148:3;:13;;34140:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34233:31;34243:9;34254;34233;:31::i;:::-;34226:38;;;;33061:1211;;;;;;:::o;27256:443::-;27303:7;27323:21;27353:13;;;;;;;;;;;27347:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27347:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27347:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27347:34:0;;;;;;;;;;;;;;;;27323:58;;27392:17;27412;:15;:17::i;:::-;27392:37;;27440:30;27473:38;27497:13;27473:19;27487:4;27473:9;:13;;:19;;;;:::i;:::-;:23;;:38;;;;:::i;:::-;27440:71;;27524:22;27549:24;27559:13;;;;;;;;;;;27549:9;:24::i;:::-;27524:49;;27584:21;27608:52;27655:4;27608:42;27627:22;27608:14;:18;;:42;;;;:::i;:::-;:46;;:52;;;;:::i;:::-;27584:76;;27678:13;27671:20;;;;;;;27256:443;:::o;23653:25::-;;;;:::o;23685:18::-;;;;;;;;;;;;;:::o;23488:32::-;;;;:::o;23323:35::-;;;;:::o;11864:134::-;11936:7;11963:11;:18;11975:5;11963:18;;;;;;;;;;;;;;;:27;11982:7;11963:27;;;;;;;;;;;;;;;;11956:34;;11864:134;;;;:::o;23406:31::-;;;;:::o;23044:66::-;;;;;;;;;;;;;:::o;31463:117::-;31509:71;;;;;;;;;;;;;;;;;;;31463:117;:::o;23533:33::-;;;;:::o;30986:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42663:120::-;21828:30;21845:12;:10;:12::i;:::-;21828:16;:30::i;:::-;21820:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42760:8;:15;42769:5;42760:15;;;;;;;;;;;;;;;;;;;;;;;;;42759:16;42741:8;:15;42750:5;42741:15;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;42663:120;:::o;859:98::-;904:15;939:10;932:17;;859:98;:::o;17126:338::-;17237:1;17220:19;;:5;:19;;;;17212:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17318:1;17299:21;;:7;:21;;;;17291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17402:6;17372:11;:18;17384:5;17372:18;;;;;;;;;;;;;;;:27;17391:7;17372:27;;;;;;;;;;;;;;;:36;;;;17440:7;17424:32;;17433:5;17424:32;;;17449:6;17424:32;;;;;;;;;;;;;;;;;;17126:338;;;:::o;24541:957::-;24770:6;;;;;;;;;;;:32;;;;;24798:4;24780:22;;:8;:14;24789:4;24780:14;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;;24770:32;:56;;;;;24822:4;24806:20;;:8;:12;24815:2;24806:12;;;;;;;;;;;;;;;;;;;;;;;;;:20;;;;24770:56;24767:111;;;24841:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24767:111;24931:1;24907:20;;:25;;:55;;;;;24957:5;24936:26;;:11;:17;24948:4;24936:17;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;24907:55;:83;;;;;24985:5;24966:24;;:11;:15;24978:2;24966:15;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;24907:83;24903:588;;;25007:27;25037:32;25048:20;;25037:6;:10;;:32;;;;:::i;:::-;25007:62;;25084:23;25110:28;25121:16;;25110:6;:10;;:28;;;;:::i;:::-;25084:54;;25153:57;25169:4;25183;25190:19;25153:15;:57::i;:::-;25225:34;25237:4;25243:15;25225:11;:34::i;:::-;25295:15;25274:17;;:36;;;;;;;;;;;25325:79;25341:4;25347:2;25351:52;25387:15;25351:31;25362:19;25351:6;:10;;:31;;;;:::i;:::-;:35;;:52;;;;:::i;:::-;25325:15;:79::i;:::-;24903:588;;;;;25446:33;25462:4;25468:2;25472:6;25446:15;:33::i;:::-;24903:588;24541:957;;;:::o;5865:192::-;5951:7;5984:1;5979;:6;;5987:12;5971:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5971:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6011:9;6027:1;6023;:5;6011:17;;6048:1;6041:8;;;5865:192;;;;;:::o;4936:181::-;4994:7;5014:9;5030:1;5026;:5;5014:17;;5055:1;5050;:6;;5042:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5108:1;5101:8;;;4936:181;;;;:::o;30059:170::-;30127:55;30142:10;:19;30153:7;30142:19;;;;;;;;;;;;;;;;;;;;;;;;;30171:1;30175:6;30127:14;:55::i;:::-;30193:28;30205:7;30214:6;30193:11;:28::i;:::-;30059:170;;:::o;22469:154::-;22537:32;22561:7;22537:16;:23;;:32;;;;:::i;:::-;22607:7;22585:30;;;;;;;;;;;;22469:154;:::o;6308:471::-;6366:7;6616:1;6611;:6;6607:47;;;6641:1;6634:8;;;;6607:47;6666:9;6682:1;6678;:5;6666:17;;6711:1;6706;6702;:5;;;;;;:10;6694:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6770:1;6763:8;;;6308:471;;;;;:::o;7247:132::-;7305:7;7332:39;7336:1;7339;7332:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7325:46;;7247:132;;;;:::o;36431:449::-;36522:23;36548:10;:21;36559:9;36548:21;;;;;;;;;;;;;;;;;;;;;;;;;36522:47;;36580:24;36607:20;36617:9;36607;:20::i;:::-;36580:47;;36718:9;36694:10;:21;36705:9;36694:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;36789:9;36745:54;;36772:15;36745:54;;36761:9;36745:54;;;;;;;;;;;;36812:60;36827:15;36844:9;36855:16;36812:14;:60::i;:::-;36431:449;;;;:::o;22315:146::-;22380:29;22401:7;22380:16;:20;;:29;;;;:::i;:::-;22445:7;22425:28;;;;;;;;;;;;22315:146;:::o;17650:232::-;17722:22;17728:7;17737:6;17722:5;:22::i;:::-;17755:119;17764:7;17773:12;:10;:12::i;:::-;17787:86;17826:6;17787:86;;;;;;;;;;;;;;;;;:11;:20;17799:7;17787:20;;;;;;;;;;;;;;;:34;17808:12;:10;:12::i;:::-;17787:34;;;;;;;;;;;;;;;;:38;;:86;;;;;:::i;:::-;17755:8;:119::i;:::-;17650:232;;:::o;26358:256::-;26438:63;26462:4;26469:13;;;;;;;;;;;26484:16;26438:15;:63::i;:::-;26527:13;;;;;;;;;;;26512:34;;;:36;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26512:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26512:36:0;;;;26564:42;26589:16;26564:42;;;;;;;;;;;;;;;;;;26358:256;:::o;26622:452::-;26678:14;26711:13;;;;;;;;;;;26705:28;;;26734:15;;;;;;;;;;;26751:8;26705:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26705:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26705:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26705:55:0;;;;;;;;;;;;;;;;;26804:15;;;;;;;;;;;26785:97;;;26909:4;26933:8;26960:1;26980;27008:8;;;;;;;;;;;27036:15;26785:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26785:281:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26785:281:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26785:281:0;;;;;;;;;;;;;;;;26771:295;;26622:452;;;:::o;19416:203::-;19488:4;19532:1;19513:21;;:7;:21;;;;19505:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19591:4;:11;;:20;19603:7;19591:20;;;;;;;;;;;;;;;;;;;;;;;;;19584:27;;19416:203;;;;:::o;38735:153::-;38780:4;38797:15;38845:9;38834:20;;38873:7;38866:14;;;38735:153;:::o;29684:189::-;29765:56;29780:10;:16;29791:4;29780:16;;;;;;;;;;;;;;;;;;;;;;;;;29798:10;:14;29809:2;29798:14;;;;;;;;;;;;;;;;;;;;;;;;;29814:6;29765:14;:56::i;:::-;29832:33;29848:4;29854:2;29858:6;29832:15;:33::i;:::-;29684:189;;;:::o;5392:136::-;5450:7;5477:43;5481:1;5484;5477:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5470:50;;5392:136;;;;:::o;36888:947::-;36994:6;36984:16;;:6;:16;;;;:30;;;;;37013:1;37004:6;:10;36984:30;36980:848;;;37053:1;37035:20;;:6;:20;;;37031:385;;37124:16;37143:14;:22;37158:6;37143:22;;;;;;;;;;;;;;;;;;;;;;;;;37124:41;;37184:17;37216:1;37204:9;:13;;;:60;;37263:1;37204:60;;;37220:11;:19;37232:6;37220:19;;;;;;;;;;;;;;;:34;37252:1;37240:9;:13;37220:34;;;;;;;;;;;;;;;:40;;;37204:60;37184:80;;37283:17;37303:21;37317:6;37303:9;:13;;:21;;;;:::i;:::-;37283:41;;37343:57;37360:6;37368:9;37379;37390;37343:16;:57::i;:::-;37031:385;;;;37454:1;37436:20;;:6;:20;;;37432:385;;37525:16;37544:14;:22;37559:6;37544:22;;;;;;;;;;;;;;;;;;;;;;;;;37525:41;;37585:17;37617:1;37605:9;:13;;;:60;;37664:1;37605:60;;;37621:11;:19;37633:6;37621:19;;;;;;;;;;;;;;;:34;37653:1;37641:9;:13;37621:34;;;;;;;;;;;;;;;:40;;;37605:60;37585:80;;37684:17;37704:21;37718:6;37704:9;:13;;:21;;;;:::i;:::-;37684:41;;37744:57;37761:6;37769:9;37780;37791;37744:16;:57::i;:::-;37432:385;;;;36980:848;36888:947;;;:::o;16338:348::-;16433:1;16414:21;;:7;:21;;;;16406:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16507:68;16530:6;16507:68;;;;;;;;;;;;;;;;;:9;:18;16517:7;16507:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;16486:9;:18;16496:7;16486:18;;;;;;;;;;;;;;;:89;;;;16601:24;16618:6;16601:12;;:16;;:24;;;;:::i;:::-;16586:12;:39;;;;16667:1;16641:37;;16650:7;16641:37;;;16671:6;16641:37;;;;;;;;;;;;;;;;;;16338:348;;:::o;19138:183::-;19218:18;19222:4;19228:7;19218:3;:18::i;:::-;19210:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19308:5;19285:4;:11;;:20;19297:7;19285:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;19138:183;;:::o;7909:345::-;7995:7;8094:1;8090;:5;8097:12;8082:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8082:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8121:9;8137:1;8133;:5;;;;;;8121:17;;8245:1;8238:8;;;7909:345;;;;;:::o;18880:178::-;18958:18;18962:4;18968:7;18958:3;:18::i;:::-;18957:19;18949:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19046:4;19023;:11;;:20;19035:7;19023:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;18880:178;;:::o;14946:471::-;15062:1;15044:20;;:6;:20;;;;15036:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15146:1;15125:23;;:9;:23;;;;15117:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15221;15243:6;15221:71;;;;;;;;;;;;;;;;;:9;:17;15231:6;15221:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;15201:9;:17;15211:6;15201:17;;;;;;;;;;;;;;;:91;;;;15326:32;15351:6;15326:9;:20;15336:9;15326:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;15303:9;:20;15313:9;15303:20;;;;;;;;;;;;;;;:55;;;;15391:9;15374:35;;15383:6;15374:35;;;15402:6;15374:35;;;;;;;;;;;;;;;;;;14946:471;;;:::o;37843:715::-;38022:18;38043:87;38050:12;38043:87;;;;;;;;;;;;;;;;;:6;:87::i;:::-;38022:108;;38162:1;38147:12;:16;;;:85;;;;;38221:11;38167:65;;:11;:22;38179:9;38167:22;;;;;;;;;;;;;;;:40;38205:1;38190:12;:16;38167:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;38147:85;38143:339;;;38298:8;38249:11;:22;38261:9;38249:22;;;;;;;;;;;;;;;:40;38287:1;38272:12;:16;38249:40;;;;;;;;;;;;;;;:46;;:57;;;;38143:339;;;38378:33;;;;;;;;38389:11;38378:33;;;;;;38402:8;38378:33;;;38339:11;:22;38351:9;38339:22;;;;;;;;;;;;;;;:36;38362:12;38339:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38469:1;38454:12;:16;38426:14;:25;38441:9;38426:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;38143:339;38520:9;38499:51;;;38531:8;38541;38499:51;;;;;;;;;;;;;;;;;;;;;;;;37843:715;;;;;:::o;38566:161::-;38641:6;38672:5;38668:1;:9;38679:12;38660:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;38660:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38717:1;38703:16;;38566:161;;;;:::o;40587:2419::-;;;;;;;;;;;;;;;;;;;;;:::o;15698:308::-;15793:1;15774:21;;:7;:21;;;;15766:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15859:24;15876:6;15859:12;;:16;;:24;;;;:::i;:::-;15844:12;:39;;;;15915:30;15938:6;15915:9;:18;15925:7;15915:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;15894:9;:18;15904:7;15894:18;;;;;;;;;;;;;;;:51;;;;15982:7;15961:37;;15978:1;15961:37;;;15991:6;15961:37;;;;;;;;;;;;;;;;;;15698:308;;:::o
Swarm Source
bzzr://5fa2777e0a8361dff1223213046fd0e40be78230807295f2701790f71c65b9bb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.