ETH Price: $3,168.02 (+1.03%)

Token

Krill Token (KRILL)
 

Overview

Max Total Supply

84,466,046,838.45567999469803777 KRILL

Holders

1,711

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
25,026.643860914814814816 KRILL

Value
$0.00
0xD827745B4Cc5D206A3116049AC4FbC3616939d79
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KRILL

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-28
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

/*

       .
      ":"
    ___:____     |"\/"|
  ,'        `.    \  /
  |  O        \___/  |
~^~^~^~^~^~^~^~^~^~^~^~^~

Whales Game | Generative Yield NFTs
Mint tokens and earn KRILL with this new blockchain based game! Battle it out to see who can generate the most yield.

Website: https://whales.game/

*/

interface MetadataInterface {
	function name() external view returns (string memory);
	function symbol() external view returns (string memory);
	function tokenURI(uint256 _tokenId) external view returns (string memory);
	function deploySetWhalesGame(WhalesGame _wg) external;
}

interface Callable {
	function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
}

interface Receiver {
	function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns (bytes4);
}

interface Router {
	function WETH() external pure returns (address);
	function factory() external pure returns (address);
}

interface Factory {
	function getPair(address, address) external view returns (address);
	function createPair(address, address) external returns (address);
}

interface Pair {
	function token0() external view returns (address);
	function totalSupply() external view returns (uint256);
	function balanceOf(address) external view returns (uint256);
	function allowance(address, address) external view returns (uint256);
	function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
	function transfer(address, uint256) external returns (bool);
	function transferFrom(address, address, uint256) external returns (bool);
}


contract KRILL {

	uint256 constant private UINT_MAX = type(uint256).max;
	uint256 constant private TRANSFER_FEE = 1; // 1% per transfer

	string constant public name = "Krill Token";
	string constant public symbol = "KRILL";
	uint8 constant public decimals = 18;

	struct User {
		uint256 balance;
		mapping(address => uint256) allowance;
	}

	struct Info {
		uint256 totalSupply;
		mapping(address => User) users;
		mapping(address => bool) toWhitelist;
		mapping(address => bool) fromWhitelist;
		address owner;
		Router router;
		Pair pair;
		bool weth0;
		WhalesGame wg;
		StakingRewards stakingRewards;
	}
	Info private info;


	event Transfer(address indexed from, address indexed to, uint256 tokens);
	event Approval(address indexed owner, address indexed spender, uint256 tokens);
	event WhitelistUpdated(address indexed user, bool fromWhitelisted, bool toWhitelisted);


	modifier _onlyOwner() {
		require(msg.sender == owner());
		_;
	}


	constructor() {
		info.router = Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
		info.pair = Pair(Factory(info.router.factory()).createPair(info.router.WETH(), address(this)));
		info.weth0 = info.pair.token0() == info.router.WETH();
		info.owner = msg.sender;
	}

	function setOwner(address _owner) external _onlyOwner {
		info.owner = _owner;
	}

	function setWhitelisted(address _address, bool _fromWhitelisted, bool _toWhitelisted) external _onlyOwner {
		info.fromWhitelist[_address] = _fromWhitelisted;
		info.toWhitelist[_address] = _toWhitelisted;
		emit WhitelistUpdated(_address, _fromWhitelisted, _toWhitelisted);
	}

	function deploySetWhalesGame(WhalesGame _wg) external {
		require(tx.origin == owner() && stakingRewardsAddress() == address(0x0));
		info.wg = _wg;
		info.stakingRewards = new StakingRewards(info.wg, info.pair);
		_approve(address(this), stakingRewardsAddress(), UINT_MAX);
	}


	function mint(address _receiver, uint256 _tokens) external {
		require(msg.sender == address(info.wg));
		info.totalSupply += _tokens;
		info.users[_receiver].balance += _tokens;
		emit Transfer(address(0x0), _receiver, _tokens);
	}

	function burn(uint256 _tokens) external {
		require(balanceOf(msg.sender) >= _tokens);
		info.totalSupply -= _tokens;
		info.users[msg.sender].balance -= _tokens;
		emit Transfer(msg.sender, address(0x0), _tokens);
	}

	function transfer(address _to, uint256 _tokens) external returns (bool) {
		return _transfer(msg.sender, _to, _tokens);
	}

	function approve(address _spender, uint256 _tokens) external returns (bool) {
		return _approve(msg.sender, _spender, _tokens);
	}

	function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) {
		uint256 _allowance = allowance(_from, msg.sender);
		require(_allowance >= _tokens);
		if (_allowance != UINT_MAX) {
			info.users[_from].allowance[msg.sender] -= _tokens;
		}
		return _transfer(_from, _to, _tokens);
	}

	function transferAndCall(address _to, uint256 _tokens, bytes calldata _data) external returns (bool) {
		uint256 _balanceBefore = balanceOf(_to);
		_transfer(msg.sender, _to, _tokens);
		uint256 _tokensReceived = balanceOf(_to) - _balanceBefore;
		uint32 _size;
		assembly {
			_size := extcodesize(_to)
		}
		if (_size > 0) {
			require(Callable(_to).tokenCallback(msg.sender, _tokensReceived, _data));
		}
		return true;
	}
	

	function whalesGameAddress() public view returns (address) {
		return address(info.wg);
	}

	function pairAddress() external view returns (address) {
		return address(info.pair);
	}

	function stakingRewardsAddress() public view returns (address) {
		return address(info.stakingRewards);
	}

	function owner() public view returns (address) {
		return info.owner;
	}

	function isFromWhitelisted(address _address) public view returns (bool) {
		return info.fromWhitelist[_address];
	}

	function isToWhitelisted(address _address) public view returns (bool) {
		return info.toWhitelist[_address];
	}
	
	function totalSupply() public view returns (uint256) {
		return info.totalSupply;
	}

	function balanceOf(address _user) public view returns (uint256) {
		return info.users[_user].balance;
	}

	function allowance(address _user, address _spender) public view returns (uint256) {
		return info.users[_user].allowance[_spender];
	}

	function allInfoFor(address _user) external view returns (uint256 totalTokens, uint256 totalLPTokens, uint256 wethReserve, uint256 krillReserve, uint256 userAllowance, uint256 userBalance, uint256 userLPBalance) {
		totalTokens = totalSupply();
		totalLPTokens = info.pair.totalSupply();
		(uint256 _res0, uint256 _res1, ) = info.pair.getReserves();
		wethReserve = info.weth0 ? _res0 : _res1;
		krillReserve = info.weth0 ? _res1 : _res0;
		userAllowance = allowance(_user, whalesGameAddress());
		userBalance = balanceOf(_user);
		userLPBalance = info.pair.balanceOf(_user);
	}


	function _approve(address _owner, address _spender, uint256 _tokens) internal returns (bool) {
		info.users[_owner].allowance[_spender] = _tokens;
		emit Approval(_owner, _spender, _tokens);
		return true;
	}
	
	function _transfer(address _from, address _to, uint256 _tokens) internal returns (bool) {
		require(balanceOf(_from) >= _tokens);
		info.users[_from].balance -= _tokens;
		uint256 _fee = 0;
		if (!(_from == stakingRewardsAddress() || _to == stakingRewardsAddress() || _to == whalesGameAddress() || isFromWhitelisted(_from) || isToWhitelisted(_to))) {
			_fee = _tokens * TRANSFER_FEE / 100;
			address _this = address(this);
			info.users[_this].balance += _fee;
			emit Transfer(_from, _this, _fee);
			info.stakingRewards.disburse(balanceOf(_this));
		}
		info.users[_to].balance += _tokens - _fee;
		emit Transfer(_from, _to, _tokens - _fee);
		return true;
	}
}


contract StakingRewards {

	uint256 constant private FLOAT_SCALAR = 2**64;

	struct User {
		uint256 deposited;
		int256 scaledPayout;
	}

	struct Info {
		uint256 totalDeposited;
		uint256 scaledRewardsPerToken;
		uint256 pendingRewards;
		mapping(address => User) users;
		WhalesGame wg;
		KRILL krill;
		Pair pair;
	}
	Info private info;


	event Deposit(address indexed user, uint256 amount);
	event Withdraw(address indexed user, uint256 amount);
	event Claim(address indexed user, uint256 amount);
	event Reward(uint256 amount);


	constructor(WhalesGame _wg, Pair _pair) {
		info.wg = _wg;
		info.krill = KRILL(msg.sender);
		info.pair = _pair;
	}

	function disburse(uint256 _amount) external {
		if (_amount > 0) {
			info.krill.transferFrom(msg.sender, address(this), _amount);
			_disburse(_amount);
		}
	}

	function deposit(uint256 _amount) external {
		depositFor(_amount, msg.sender);
	}

	function depositFor(uint256 _amount, address _user) public {
		require(_amount > 0);
		_update();
		info.pair.transferFrom(msg.sender, address(this), _amount);
		info.totalDeposited += _amount;
		info.users[_user].deposited += _amount;
		info.users[_user].scaledPayout += int256(_amount * info.scaledRewardsPerToken);
		emit Deposit(_user, _amount);
	}

	function withdrawAll() external {
		uint256 _deposited = depositedOf(msg.sender);
		if (_deposited > 0) {
			withdraw(_deposited);
		}
	}

	function withdraw(uint256 _amount) public {
		require(_amount > 0 && _amount <= depositedOf(msg.sender));
		_update();
		info.totalDeposited -= _amount;
		info.users[msg.sender].deposited -= _amount;
		info.users[msg.sender].scaledPayout -= int256(_amount * info.scaledRewardsPerToken);
		info.pair.transfer(msg.sender, _amount);
		emit Withdraw(msg.sender, _amount);
	}

	function claim() external {
		_update();
		uint256 _rewards = rewardsOf(msg.sender);
		if (_rewards > 0) {
			info.users[msg.sender].scaledPayout += int256(_rewards * FLOAT_SCALAR);
			info.krill.transfer(msg.sender, _rewards);
			emit Claim(msg.sender, _rewards);
		}
	}

	
	function totalDeposited() public view returns (uint256) {
		return info.totalDeposited;
	}

	function depositedOf(address _user) public view returns (uint256) {
		return info.users[_user].deposited;
	}
	
	function rewardsOf(address _user) public view returns (uint256) {
		return uint256(int256(info.scaledRewardsPerToken * depositedOf(_user)) - info.users[_user].scaledPayout) / FLOAT_SCALAR;
	}

	function allInfoFor(address _user) external view returns (uint256 totalLPDeposited, uint256 totalLPTokens, uint256 wethReserve, uint256 krillReserve, uint256 userBalance, uint256 userAllowance, uint256 userDeposited, uint256 userRewards) {
		totalLPDeposited = totalDeposited();
		( , totalLPTokens, wethReserve, krillReserve, , , ) = info.krill.allInfoFor(address(this));
		userBalance = info.pair.balanceOf(_user);
		userAllowance = info.pair.allowance(_user, address(this));
		userDeposited = depositedOf(_user);
		userRewards = rewardsOf(_user);
	}

	function _update() internal {
		address _this = address(this);
		uint256 _balanceBefore = info.krill.balanceOf(_this);
		info.wg.claim();
		_disburse(info.krill.balanceOf(_this) - _balanceBefore);
	}

	function _disburse(uint256 _amount) internal {
		if (_amount > 0) {
			if (totalDeposited() == 0) {
				info.pendingRewards += _amount;
			} else {
				info.scaledRewardsPerToken += (_amount + info.pendingRewards) * FLOAT_SCALAR / totalDeposited();
				info.pendingRewards = 0;
			}
			emit Reward(_amount);
		}
	}
}


contract WhalesGame {

	uint256 constant public ETH_MINTABLE_SUPPLY = 2000;
	uint256 constant public WHITELIST_ETH_MINTABLE_SUPPLY = 8000;
	uint256 constant public KRILL_MINTABLE_SUPPLY = 40000;
	uint256 constant public MAX_SUPPLY = ETH_MINTABLE_SUPPLY + WHITELIST_ETH_MINTABLE_SUPPLY + KRILL_MINTABLE_SUPPLY;
	uint256 constant public INITIAL_MINT_COST_ETH = 0.05 ether;
	uint256 constant public KRILL_PER_DAY_PER_FISHERMAN = 1e22; // 10,000

	uint256 constant private KRILL_COST_ADD = 1e4;
	uint256 constant private KRILL_COST_EXPONENT = 3;
	uint256 constant private KRILL_COST_SCALER = 2e10;
	// KRILL minted tokens = 0, minting cost = 20,000
	// KRILL minted tokens = 40k, minting cost = 2,500,000

	uint256 constant private FLOAT_SCALAR = 2**64;
	uint256 constant private WHALE_MODULUS = 10; // 1 in 10
	uint256 constant private WHALES_CUT = 20; // 20% of all yield
	uint256 constant private STAKING_CUT = 25; // 25% of minting costs
	uint256 constant private DEV_TOKENS = 50;
	uint256 constant private OPENING_DELAY = 2 hours;
	uint256 constant private WHITELIST_DURATION = 8 hours;

	struct User {
		uint256 balance;
		mapping(uint256 => uint256) list;
		mapping(address => bool) approved;
		mapping(uint256 => uint256) indexOf;
		uint256 rewards;
		uint256 lastUpdated;
		uint256 krillPerDay;
		uint256 whales;
		int256 scaledPayout;
	}

	struct Token {
		address owner;
		address approved;
		bytes32 seed;
		bool isWhale;
	}

	struct Info {
		uint256 totalSupply;
		uint256 totalWhales;
		uint256 ethMintedTokens;
		uint256 krillMintedTokens;
		uint256 scaledRewardsPerWhale;
		uint256 openingTime;
		uint256 whitelistExpiry;
		mapping(uint256 => Token) list;
		mapping(address => User) users;
		mapping(uint256 => uint256) claimedBitMap;
		bytes32 merkleRoot;
		MetadataInterface metadata;
		address owner;
		KRILL krill;
		StakingRewards stakingRewards;
	}
	Info private info;

	mapping(bytes4 => bool) public supportsInterface;

	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
	event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

	event Mint(address indexed owner, uint256 indexed tokenId, bytes32 seed, bool isWhale);
	event ClaimFishermenRewards(address indexed user, uint256 amount);
	event ClaimWhaleRewards(address indexed user, uint256 amount);
	event Reward(address indexed user, uint256 amount);
	event WhalesReward(uint256 amount);
	event StakingReward(uint256 amount);


	modifier _onlyOwner() {
		require(msg.sender == owner());
		_;
	}


	constructor(MetadataInterface _metadata, KRILL _krill, bytes32 _merkleRoot) {
		info.metadata = _metadata;
		info.metadata.deploySetWhalesGame(this);
		info.krill = _krill;
		info.krill.deploySetWhalesGame(this);
		info.stakingRewards = StakingRewards(info.krill.stakingRewardsAddress());
		info.krill.approve(stakingRewardsAddress(), type(uint256).max);
		info.merkleRoot = _merkleRoot;
		info.owner = 0x99A768bd14Ea62FaADA61F2c7f123303CDAa69fC;
		info.openingTime = block.timestamp + OPENING_DELAY;
		info.whitelistExpiry = block.timestamp + OPENING_DELAY + WHITELIST_DURATION;

		supportsInterface[0x01ffc9a7] = true; // ERC-165
		supportsInterface[0x80ac58cd] = true; // ERC-721
		supportsInterface[0x5b5e139f] = true; // Metadata
		supportsInterface[0x780e9d63] = true; // Enumerable

		for (uint256 i = 0; i < DEV_TOKENS; i++) {
			_mint(0xa1450E7D547b4748fc94C8C98C9dB667eaD31cF8);
		}
	}

	function setOwner(address _owner) external _onlyOwner {
		info.owner = _owner;
	}

	function setMetadata(MetadataInterface _metadata) external _onlyOwner {
		info.metadata = _metadata;
	}

	function withdraw() external {
		address _this = address(this);
		require(_this.balance > 0);
		payable(0xFaDED72464D6e76e37300B467673b36ECc4d2ccF).transfer(_this.balance / 2); // 50% total
		payable(0x1cC79d49ce5b9519C912D810E39025DD27d1F033).transfer(_this.balance / 10); // 5% total
		payable(0xa1450E7D547b4748fc94C8C98C9dB667eaD31cF8).transfer(_this.balance); // 45% total
	}

	
	receive() external payable {
		mintManyWithETH(msg.value / INITIAL_MINT_COST_ETH);
	}
	
	function mintWithETH() external payable {
		mintManyWithETH(1);
	}

	function mintManyWithETH(uint256 _tokens) public payable {
		require(isOpen());
		require(_tokens > 0);
		if (whitelistExpired()) {
			require(totalSupply() - krillMintedTokens() + _tokens <= ETH_MINTABLE_SUPPLY + WHITELIST_ETH_MINTABLE_SUPPLY);
		} else {
			require(ethMintedTokens() + _tokens <= ETH_MINTABLE_SUPPLY);
		}
		uint256 _cost = _tokens * INITIAL_MINT_COST_ETH;
		require(msg.value >= _cost);
		info.ethMintedTokens += _tokens;
		for (uint256 i = 0; i < _tokens; i++) {
			_mint(msg.sender);
		}
		if (msg.value > _cost) {
			payable(msg.sender).transfer(msg.value - _cost);
		}
	}

	function mintWithProof(uint256 _index, address _account, bytes32[] calldata _merkleProof) external payable {
		require(isOpen());
		require(!whitelistExpired() && whitelistMintedTokens() < WHITELIST_ETH_MINTABLE_SUPPLY);
		require(msg.value >= INITIAL_MINT_COST_ETH);
		require(!proofClaimed(_index));
		bytes32 _node = keccak256(abi.encodePacked(_index, _account));
		require(_verify(_merkleProof, _node));
		uint256 _claimedWordIndex = _index / 256;
		uint256 _claimedBitIndex = _index % 256;
		info.claimedBitMap[_claimedWordIndex] = info.claimedBitMap[_claimedWordIndex] | (1 << _claimedBitIndex);
		_mint(_account);
		if (msg.value > INITIAL_MINT_COST_ETH) {
			payable(msg.sender).transfer(msg.value - INITIAL_MINT_COST_ETH);
		}
	}

	function mint() external {
		mintMany(1);
	}

	function mintMany(uint256 _tokens) public {
		require(isOpen());
		require(_tokens > 0 && krillMintedTokens() + _tokens <= KRILL_MINTABLE_SUPPLY);
		uint256 _cost = calculateKrillMintCost(_tokens);
		info.krill.transferFrom(msg.sender, address(this), _cost);
		uint256 _stakingReward = _cost * STAKING_CUT / 100;
		info.stakingRewards.disburse(_stakingReward);
		emit StakingReward(_stakingReward);
		info.krill.burn(info.krill.balanceOf(address(this)));
		info.krillMintedTokens += _tokens;
		for (uint256 i = 0; i < _tokens; i++) {
			_mint(msg.sender);
		}
	}

	function claim() external {
		claimFishermenRewards();
		claimWhaleRewards();
	}

	function claimFishermenRewards() public {
		_update(msg.sender);
		uint256 _rewards = info.users[msg.sender].rewards;
		if (_rewards > 0) {
			info.users[msg.sender].rewards = 0;
			info.krill.mint(msg.sender, _rewards);
			emit ClaimFishermenRewards(msg.sender, _rewards);
		}
	}

	function claimWhaleRewards() public {
		uint256 _rewards = whaleRewardsOf(msg.sender);
		if (_rewards > 0) {
			info.users[msg.sender].scaledPayout += int256(_rewards * FLOAT_SCALAR);
			info.krill.mint(msg.sender, _rewards);
			emit ClaimWhaleRewards(msg.sender, _rewards);
		}
	}
	
	function approve(address _approved, uint256 _tokenId) external {
		require(msg.sender == ownerOf(_tokenId));
		info.list[_tokenId].approved = _approved;
		emit Approval(msg.sender, _approved, _tokenId);
	}

	function setApprovalForAll(address _operator, bool _approved) external {
		info.users[msg.sender].approved[_operator] = _approved;
		emit ApprovalForAll(msg.sender, _operator, _approved);
	}

	function transferFrom(address _from, address _to, uint256 _tokenId) external {
		_transfer(_from, _to, _tokenId);
	}

	function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
		safeTransferFrom(_from, _to, _tokenId, "");
	}

	function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public {
		_transfer(_from, _to, _tokenId);
		uint32 _size;
		assembly {
			_size := extcodesize(_to)
		}
		if (_size > 0) {
			require(Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) == 0x150b7a02);
		}
	}


	function name() external view returns (string memory) {
		return info.metadata.name();
	}

	function symbol() external view returns (string memory) {
		return info.metadata.symbol();
	}

	function tokenURI(uint256 _tokenId) external view returns (string memory) {
		return info.metadata.tokenURI(_tokenId);
	}

	function krillAddress() external view returns (address) {
		return address(info.krill);
	}

	function pairAddress() external view returns (address) {
		return info.krill.pairAddress();
	}

	function stakingRewardsAddress() public view returns (address) {
		return address(info.stakingRewards);
	}

	function merkleRoot() public view returns (bytes32) {
		return info.merkleRoot;
	}

	function openingTime() public view returns (uint256) {
		return info.openingTime;
	}

	function isOpen() public view returns (bool) {
		return block.timestamp > openingTime();
	}

	function whitelistExpiry() public view returns (uint256) {
		return info.whitelistExpiry;
	}

	function whitelistExpired() public view returns (bool) {
		return block.timestamp > whitelistExpiry();
	}

	function owner() public view returns (address) {
		return info.owner;
	}

	function totalSupply() public view returns (uint256) {
		return info.totalSupply;
	}

	function ethMintedTokens() public view returns (uint256) {
		return info.ethMintedTokens;
	}

	function krillMintedTokens() public view returns (uint256) {
		return info.krillMintedTokens;
	}

	function whitelistMintedTokens() public view returns (uint256) {
		return totalSupply() - ethMintedTokens() - krillMintedTokens();
	}

	function totalWhales() public view returns (uint256) {
		return info.totalWhales;
	}

	function totalFishermen() public view returns (uint256) {
		return totalSupply() - totalWhales();
	}

	function totalKrillPerDay() external view returns (uint256) {
		return totalFishermen() * KRILL_PER_DAY_PER_FISHERMAN;
	}

	function currentKrillMintCost() public view returns (uint256) {
		return krillMintCost(krillMintedTokens());
	}

	function krillMintCost(uint256 _krillMintedTokens) public pure returns (uint256) {
		return (_krillMintedTokens + KRILL_COST_ADD)**KRILL_COST_EXPONENT * KRILL_COST_SCALER;
	}

	function calculateKrillMintCost(uint256 _tokens) public view returns (uint256 cost) {
		cost = 0;
		for (uint256 i = 0; i < _tokens; i++) {
			cost += krillMintCost(krillMintedTokens() + i);
		}
	}

	function fishermenRewardsOf(address _owner) public view returns (uint256) {
		uint256 _pending = 0;
		uint256 _last = info.users[_owner].lastUpdated;
		if (_last < block.timestamp) {
			uint256 _diff = block.timestamp - _last;
			_pending += ownerKrillPerDay(_owner) * _diff * (100 - WHALES_CUT) / 8640000;
		}
		return info.users[_owner].rewards + _pending;
	}
	
	function whaleRewardsOf(address _owner) public view returns (uint256) {
		return uint256(int256(info.scaledRewardsPerWhale * whalesOf(_owner)) - info.users[_owner].scaledPayout) / FLOAT_SCALAR;
	}

	function balanceOf(address _owner) public view returns (uint256) {
		return info.users[_owner].balance;
	}

	function whalesOf(address _owner) public view returns (uint256) {
		return info.users[_owner].whales;
	}

	function fishermenOf(address _owner) public view returns (uint256) {
		return balanceOf(_owner) - whalesOf(_owner);
	}

	function ownerOf(uint256 _tokenId) public view returns (address) {
		require(_tokenId < totalSupply());
		return info.list[_tokenId].owner;
	}

	function getApproved(uint256 _tokenId) public view returns (address) {
		require(_tokenId < totalSupply());
		return info.list[_tokenId].approved;
	}

	function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
		return info.users[_owner].approved[_operator];
	}

	function getSeed(uint256 _tokenId) public view returns (bytes32) {
		require(_tokenId < totalSupply());
		return info.list[_tokenId].seed;
	}

	function getIsWhale(uint256 _tokenId) public view returns (bool) {
		require(_tokenId < totalSupply());
		return info.list[_tokenId].isWhale;
	}

	function tokenByIndex(uint256 _index) public view returns (uint256) {
		require(_index < totalSupply());
		return _index;
	}

	function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
		require(_index < balanceOf(_owner));
		return info.users[_owner].list[_index];
	}

	function ownerKrillPerDay(address _owner) public view returns (uint256 amount) {
		return info.users[_owner].krillPerDay;
	}

	function proofClaimed(uint256 _index) public view returns (bool) {
		uint256 _claimedWordIndex = _index / 256;
		uint256 _claimedBitIndex = _index % 256;
		uint256 _claimedWord = info.claimedBitMap[_claimedWordIndex];
		uint256 _mask = (1 << _claimedBitIndex);
		return _claimedWord & _mask == _mask;
	}

	function getToken(uint256 _tokenId) public view returns (address tokenOwner, address approved, bytes32 seed, bool isWhale) {
		return (ownerOf(_tokenId), getApproved(_tokenId), getSeed(_tokenId), getIsWhale(_tokenId));
	}

	function getTokens(uint256[] memory _tokenIds) public view returns (address[] memory owners, address[] memory approveds, bytes32[] memory seeds, bool[] memory isWhales) {
		uint256 _length = _tokenIds.length;
		owners = new address[](_length);
		approveds = new address[](_length);
		seeds = new bytes32[](_length);
		isWhales = new bool[](_length);
		for (uint256 i = 0; i < _length; i++) {
			(owners[i], approveds[i], seeds[i], isWhales[i]) = getToken(_tokenIds[i]);
		}
	}

	function getTokensTable(uint256 _limit, uint256 _page, bool _isAsc) external view returns (uint256[] memory tokenIds, address[] memory owners, address[] memory approveds, bytes32[] memory seeds, bool[] memory isWhales, uint256 totalTokens, uint256 totalPages) {
		require(_limit > 0);
		totalTokens = totalSupply();

		if (totalTokens > 0) {
			totalPages = (totalTokens / _limit) + (totalTokens % _limit == 0 ? 0 : 1);
			require(_page < totalPages);

			uint256 _offset = _limit * _page;
			if (_page == totalPages - 1 && totalTokens % _limit != 0) {
				_limit = totalTokens % _limit;
			}

			tokenIds = new uint256[](_limit);
			for (uint256 i = 0; i < _limit; i++) {
				tokenIds[i] = tokenByIndex(_isAsc ? _offset + i : totalTokens - _offset - i - 1);
			}
		} else {
			totalPages = 0;
			tokenIds = new uint256[](0);
		}
		(owners, approveds, seeds, isWhales) = getTokens(tokenIds);
	}

	function getOwnerTokensTable(address _owner, uint256 _limit, uint256 _page, bool _isAsc) external view returns (uint256[] memory tokenIds, address[] memory approveds, bytes32[] memory seeds, bool[] memory isWhales, uint256 totalTokens, uint256 totalPages) {
		require(_limit > 0);
		totalTokens = balanceOf(_owner);

		if (totalTokens > 0) {
			totalPages = (totalTokens / _limit) + (totalTokens % _limit == 0 ? 0 : 1);
			require(_page < totalPages);

			uint256 _offset = _limit * _page;
			if (_page == totalPages - 1 && totalTokens % _limit != 0) {
				_limit = totalTokens % _limit;
			}

			tokenIds = new uint256[](_limit);
			for (uint256 i = 0; i < _limit; i++) {
				tokenIds[i] = tokenOfOwnerByIndex(_owner, _isAsc ? _offset + i : totalTokens - _offset - i - 1);
			}
		} else {
			totalPages = 0;
			tokenIds = new uint256[](0);
		}
		( , approveds, seeds, isWhales) = getTokens(tokenIds);
	}

	function allMintingInfo() external view returns (uint256 ethMinted, uint256 whitelistMinted, uint256 krillMinted, uint256 currentKrillCost, uint256 whitelistExpiryTime, bool hasWhitelistExpired, uint256 openTime, bool open) {
		return (ethMintedTokens(), whitelistMintedTokens(), krillMintedTokens(), currentKrillMintCost(), whitelistExpiry(), whitelistExpired(), openingTime(), isOpen());
	}

	function allInfoFor(address _owner) external view returns (uint256 supply, uint256 whales, uint256 ownerBalance, uint256 ownerWhales, uint256 ownerFishermenRewards, uint256 ownerWhaleRewards, uint256 ownerDailyKrill) {
		return (totalSupply(), totalWhales(), balanceOf(_owner), whalesOf(_owner), fishermenRewardsOf(_owner), whaleRewardsOf(_owner), ownerKrillPerDay(_owner));
	}


	function _mint(address _receiver) internal {
		require(msg.sender == tx.origin);
		require(totalSupply() < MAX_SUPPLY);
		uint256 _tokenId = info.totalSupply++;
		Token storage _newToken = info.list[_tokenId];
		_newToken.owner = _receiver;
		bytes32 _seed = keccak256(abi.encodePacked(_tokenId, _receiver, blockhash(block.number - 1), gasleft()));
		_newToken.seed = _seed;
		_newToken.isWhale = _tokenId < DEV_TOKENS || _tokenId % WHALE_MODULUS == 0;

		if (_newToken.isWhale) {
			info.totalWhales++;
			info.users[_receiver].whales++;
			info.users[_receiver].scaledPayout += int256(info.scaledRewardsPerWhale);
		} else {
			_update(_receiver);
			info.users[_receiver].krillPerDay += KRILL_PER_DAY_PER_FISHERMAN;
		}
		uint256 _index = info.users[_receiver].balance++;
		info.users[_receiver].indexOf[_tokenId] = _index + 1;
		info.users[_receiver].list[_index] = _tokenId;
		emit Transfer(address(0x0), _receiver, _tokenId);
		emit Mint(_receiver, _tokenId, _seed, _newToken.isWhale);
	}
	
	function _transfer(address _from, address _to, uint256 _tokenId) internal {
		address _owner = ownerOf(_tokenId);
		address _approved = getApproved(_tokenId);
		require(_from == _owner);
		require(msg.sender == _owner || msg.sender == _approved || isApprovedForAll(_owner, msg.sender));

		info.list[_tokenId].owner = _to;
		if (_approved != address(0x0)) {
			info.list[_tokenId].approved = address(0x0);
			emit Approval(address(0x0), address(0x0), _tokenId);
		}

		if (getIsWhale(_tokenId)) {
			info.users[_from].whales--;
			info.users[_from].scaledPayout -= int256(info.scaledRewardsPerWhale);
			info.users[_to].whales++;
			info.users[_to].scaledPayout += int256(info.scaledRewardsPerWhale);
		} else {
			_update(_from);
			info.users[_from].krillPerDay -= KRILL_PER_DAY_PER_FISHERMAN;
			_update(_to);
			info.users[_to].krillPerDay += KRILL_PER_DAY_PER_FISHERMAN;
		}

		uint256 _index = info.users[_from].indexOf[_tokenId] - 1;
		uint256 _moved = info.users[_from].list[info.users[_from].balance - 1];
		info.users[_from].list[_index] = _moved;
		info.users[_from].indexOf[_moved] = _index + 1;
		info.users[_from].balance--;
		delete info.users[_from].indexOf[_tokenId];
		uint256 _newIndex = info.users[_to].balance++;
		info.users[_to].indexOf[_tokenId] = _newIndex + 1;
		info.users[_to].list[_newIndex] = _tokenId;
		emit Transfer(_from, _to, _tokenId);
	}

	function _update(address _owner) internal {
		uint256 _last = info.users[_owner].lastUpdated;
		if (_last < block.timestamp) {
			uint256 _diff = block.timestamp - _last;
			uint256 _rewards = ownerKrillPerDay(_owner) * _diff / 86400;
			uint256 _whalesCut = _rewards * WHALES_CUT / 100;
			info.scaledRewardsPerWhale += _whalesCut * FLOAT_SCALAR / totalWhales();
			emit WhalesReward(_whalesCut);
			info.users[_owner].lastUpdated = block.timestamp;
			info.users[_owner].rewards += _rewards - _whalesCut;
			emit Reward(_owner, _rewards - _whalesCut);
		}
	}


	function _verify(bytes32[] memory _proof, bytes32 _leaf) internal view returns (bool) {
		require(_leaf != merkleRoot());
		bytes32 _computedHash = _leaf;
		for (uint256 i = 0; i < _proof.length; i++) {
			bytes32 _proofElement = _proof[i];
			if (_computedHash <= _proofElement) {
				_computedHash = keccak256(abi.encodePacked(_computedHash, _proofElement));
			} else {
				_computedHash = keccak256(abi.encodePacked(_proofElement, _computedHash));
			}
		}
		return _computedHash == merkleRoot();
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Approval","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":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"fromWhitelisted","type":"bool"},{"indexed":false,"internalType":"bool","name":"toWhitelisted","type":"bool"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"allInfoFor","outputs":[{"internalType":"uint256","name":"totalTokens","type":"uint256"},{"internalType":"uint256","name":"totalLPTokens","type":"uint256"},{"internalType":"uint256","name":"wethReserve","type":"uint256"},{"internalType":"uint256","name":"krillReserve","type":"uint256"},{"internalType":"uint256","name":"userAllowance","type":"uint256"},{"internalType":"uint256","name":"userBalance","type":"uint256"},{"internalType":"uint256","name":"userLPBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract WhalesGame","name":"_wg","type":"address"}],"name":"deploySetWhalesGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isFromWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isToWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_fromWhitelisted","type":"bool"},{"internalType":"bool","name":"_toWhitelisted","type":"bool"}],"name":"setWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingRewardsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whalesGameAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50737a250d5630b4cf539739df2c5dacb4c659f2488d600060050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000101919062000487565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200018d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b3919062000487565b306040518363ffffffff1660e01b8152600401620001d3929190620004ca565b6020604051808303816000875af1158015620001f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000219919062000487565b600060060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f3919062000487565b73ffffffffffffffffffffffffffffffffffffffff16600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a0919062000487565b73ffffffffffffffffffffffffffffffffffffffff1614600060060160146101000a81548160ff02191690831515021790555033600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004f7565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200044f8262000422565b9050919050565b620004618162000442565b81146200046d57600080fd5b50565b600081519050620004818162000456565b92915050565b600060208284031215620004a0576200049f6200041d565b5b6000620004b08482850162000470565b91505092915050565b620004c48162000442565b82525050565b6000604082019050620004e16000830185620004b9565b620004f06020830184620004b9565b9392505050565b6138f980620005076000396000f3fe60806040523480156200001157600080fd5b5060043610620001605760003560e01c806342966c6811620000c957806395d89b41116200008757806395d89b41146200040f578063a8b089821462000431578063a9059cbb1462000453578063c81c08651462000489578063dd62ed3e14620004ab578063e6a6dcce14620004e15762000160565b806342966c68146200033957806357f6b812146200035957806370a082311462000395578063788bff6814620003cb5780638da5cb5b14620003ed5762000160565b80631e3c187f11620001235780631e3c187f146200021f57806323b872dd146200025557806328687cc7146200028b578063313ce56714620002c15780634000aea014620002e357806340c10f1914620003195762000160565b806306fdde031462000165578063080ad5551462000187578063095ea7b314620001a757806313af403514620001dd57806318160ddd14620001fd575b600080fd5b6200016f62000501565b6040516200017e9190620017c4565b60405180910390f35b620001a560048036038101906200019f91906200186b565b6200053a565b005b620001c56004803603810190620001bf91906200191d565b62000704565b604051620001d4919062001981565b60405180910390f35b620001fb6004803603810190620001f591906200199e565b6200071b565b005b62000207620007a4565b604051620002169190620019e1565b60405180910390f35b6200023d60048036038101906200023791906200199e565b620007b0565b6040516200024c919062001981565b60405180910390f35b6200027360048036038101906200026d9190620019fe565b62000808565b60405162000282919062001981565b60405180910390f35b620002a96004803603810190620002a391906200199e565b62000902565b604051620002b8919062001981565b60405180910390f35b620002cb6200095a565b604051620002da919062001a78565b60405180910390f35b620003016004803603810190620002fb919062001b03565b6200095f565b60405162000310919062001981565b60405180910390f35b6200033760048036038101906200033191906200191d565b62000a50565b005b62000357600480360381019062000351919062001b83565b62000b95565b005b6200037760048036038101906200037191906200199e565b62000c93565b6040516200038c979695949392919062001bb5565b60405180910390f35b620003b36004803603810190620003ad91906200199e565b62000f1f565b604051620003c29190620019e1565b60405180910390f35b620003d562000f6d565b604051620003e4919062001c43565b60405180910390f35b620003f762000f99565b60405162000406919062001c43565b60405180910390f35b6200041962000fc5565b604051620004289190620017c4565b60405180910390f35b6200043b62000ffe565b6040516200044a919062001c43565b60405180910390f35b6200047160048036038101906200046b91906200191d565b6200102a565b60405162000480919062001981565b60405180910390f35b6200049362001041565b604051620004a2919062001c43565b60405180910390f35b620004c96004803603810190620004c3919062001c60565b6200106d565b604051620004d89190620019e1565b60405180910390f35b620004ff6004803603810190620004f9919062001cd8565b620010f9565b005b6040518060400160405280600b81526020017f4b72696c6c20546f6b656e00000000000000000000000000000000000000000081525081565b6200054462000f99565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148015620005b45750600073ffffffffffffffffffffffffffffffffffffffff166200059c62000f6d565b73ffffffffffffffffffffffffffffffffffffffff16145b620005be57600080fd5b80600060070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516200065c9062001712565b6200066992919062001dd8565b604051809103906000f08015801562000686573d6000803e3d6000fd5b50600060080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200070030620006d962000f6d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62001246565b5050565b60006200071333848462001246565b905092915050565b6200072562000f99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200075d57600080fd5b80600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060000154905090565b60008060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000806200081785336200106d565b9050828110156200082757600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114620008eb5782600060010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620008e3919062001e34565b925050819055505b620008f885858562001341565b9150509392505050565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601281565b6000806200096d8662000f1f565b90506200097c33878762001341565b506000816200098b8862000f1f565b62000997919062001e34565b90506000873b905060008163ffffffff16111562000a41578773ffffffffffffffffffffffffffffffffffffffff16636be32e73338489896040518563ffffffff1660e01b8152600401620009f0949392919062001ec2565b6020604051808303816000875af115801562000a10573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a36919062001f1f565b62000a4057600080fd5b5b60019350505050949350505050565b600060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000aae57600080fd5b8060008001600082825462000ac4919062001f51565b9250508190555080600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462000b22919062001f51565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000b899190620019e1565b60405180910390a35050565b8062000ba13362000f1f565b101562000bad57600080fd5b8060008001600082825462000bc3919062001e34565b9250508190555080600060010160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462000c21919062001e34565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c889190620019e1565b60405180910390a350565b600080600080600080600062000ca8620007a4565b9650600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d1b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d41919062001fc5565b9550600080600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000db7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ddd919062002083565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600060060160149054906101000a900460ff1662000e21578062000e23565b815b9650600060060160149054906101000a900460ff1662000e44578162000e46565b805b955062000e5d8a62000e5762001041565b6200106d565b945062000e6a8a62000f1f565b9350600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b815260040162000ecc919062001c43565b602060405180830381865afa15801562000eea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f10919062001fc5565b92505050919395979092949650565b60008060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60008060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600581526020017f4b52494c4c00000000000000000000000000000000000000000000000000000081525081565b60008060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006200103933848462001341565b905092915050565b60008060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6200110362000f99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200113b57600080fd5b81600060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600060020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167f855852ede06df792cbe12bbb8b292fd0d251a1dcfea1f072d5793f1930568ebf838360405162001239929190620020df565b60405180910390a2505050565b600081600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200132e9190620019e1565b60405180910390a3600190509392505050565b6000816200134f8562000f1f565b10156200135b57600080fd5b81600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254620013b2919062001e34565b925050819055506000620013c562000f6d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806200143357506200140462000f6d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b806200147357506200144462001041565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80620014865750620014858562000902565b5b806200149957506200149884620007b0565b5b62001627576064600184620014af91906200210c565b620014bb91906200219c565b9050600030905081600060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462001519919062001f51565b925050819055508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516200157f9190620019e1565b60405180910390a3600060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd77ac2c620015d38362000f1f565b6040518263ffffffff1660e01b8152600401620015f19190620019e1565b600060405180830381600087803b1580156200160c57600080fd5b505af115801562001621573d6000803e3d6000fd5b50505050505b808362001635919062001e34565b600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546200168b919062001f51565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8386620016ef919062001e34565b604051620016fe9190620019e1565b60405180910390a360019150509392505050565b6116ef80620021d583390190565b600081519050919050565b600082825260208201905092915050565b60005b838110156200175c5780820151818401526020810190506200173f565b838111156200176c576000848401525b50505050565b6000601f19601f8301169050919050565b6000620017908262001720565b6200179c81856200172b565b9350620017ae8185602086016200173c565b620017b98162001772565b840191505092915050565b60006020820190508181036000830152620017e0818462001783565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200181f82620017f2565b9050919050565b6000620018338262001812565b9050919050565b620018458162001826565b81146200185157600080fd5b50565b60008135905062001865816200183a565b92915050565b600060208284031215620018845762001883620017e8565b5b6000620018948482850162001854565b91505092915050565b6000620018aa82620017f2565b9050919050565b620018bc816200189d565b8114620018c857600080fd5b50565b600081359050620018dc81620018b1565b92915050565b6000819050919050565b620018f781620018e2565b81146200190357600080fd5b50565b6000813590506200191781620018ec565b92915050565b60008060408385031215620019375762001936620017e8565b5b60006200194785828601620018cb565b92505060206200195a8582860162001906565b9150509250929050565b60008115159050919050565b6200197b8162001964565b82525050565b600060208201905062001998600083018462001970565b92915050565b600060208284031215620019b757620019b6620017e8565b5b6000620019c784828501620018cb565b91505092915050565b620019db81620018e2565b82525050565b6000602082019050620019f86000830184620019d0565b92915050565b60008060006060848603121562001a1a5762001a19620017e8565b5b600062001a2a86828701620018cb565b935050602062001a3d86828701620018cb565b925050604062001a508682870162001906565b9150509250925092565b600060ff82169050919050565b62001a728162001a5a565b82525050565b600060208201905062001a8f600083018462001a67565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262001abd5762001abc62001a95565b5b8235905067ffffffffffffffff81111562001add5762001adc62001a9a565b5b60208301915083600182028301111562001afc5762001afb62001a9f565b5b9250929050565b6000806000806060858703121562001b205762001b1f620017e8565b5b600062001b3087828801620018cb565b945050602062001b438782880162001906565b935050604085013567ffffffffffffffff81111562001b675762001b66620017ed565b5b62001b758782880162001aa4565b925092505092959194509250565b60006020828403121562001b9c5762001b9b620017e8565b5b600062001bac8482850162001906565b91505092915050565b600060e08201905062001bcc600083018a620019d0565b62001bdb6020830189620019d0565b62001bea6040830188620019d0565b62001bf96060830187620019d0565b62001c086080830186620019d0565b62001c1760a0830185620019d0565b62001c2660c0830184620019d0565b98975050505050505050565b62001c3d816200189d565b82525050565b600060208201905062001c5a600083018462001c32565b92915050565b6000806040838503121562001c7a5762001c79620017e8565b5b600062001c8a85828601620018cb565b925050602062001c9d85828601620018cb565b9150509250929050565b62001cb28162001964565b811462001cbe57600080fd5b50565b60008135905062001cd28162001ca7565b92915050565b60008060006060848603121562001cf45762001cf3620017e8565b5b600062001d0486828701620018cb565b935050602062001d178682870162001cc1565b925050604062001d2a8682870162001cc1565b9150509250925092565b6000819050919050565b600062001d5f62001d5962001d5384620017f2565b62001d34565b620017f2565b9050919050565b600062001d738262001d3e565b9050919050565b600062001d878262001d66565b9050919050565b62001d998162001d7a565b82525050565b600062001dac8262001d3e565b9050919050565b600062001dc08262001d9f565b9050919050565b62001dd28162001db3565b82525050565b600060408201905062001def600083018562001d8e565b62001dfe602083018462001dc7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001e4182620018e2565b915062001e4e83620018e2565b92508282101562001e645762001e6362001e05565b5b828203905092915050565b600082825260208201905092915050565b82818337600083830152505050565b600062001e9d838562001e6f565b935062001eac83858462001e80565b62001eb78362001772565b840190509392505050565b600060608201905062001ed9600083018762001c32565b62001ee86020830186620019d0565b818103604083015262001efd81848662001e8f565b905095945050505050565b60008151905062001f198162001ca7565b92915050565b60006020828403121562001f385762001f37620017e8565b5b600062001f488482850162001f08565b91505092915050565b600062001f5e82620018e2565b915062001f6b83620018e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001fa35762001fa262001e05565b5b828201905092915050565b60008151905062001fbf81620018ec565b92915050565b60006020828403121562001fde5762001fdd620017e8565b5b600062001fee8482850162001fae565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b6200201c8162001ff7565b81146200202857600080fd5b50565b6000815190506200203c8162002011565b92915050565b600063ffffffff82169050919050565b6200205d8162002042565b81146200206957600080fd5b50565b6000815190506200207d8162002052565b92915050565b6000806000606084860312156200209f576200209e620017e8565b5b6000620020af868287016200202b565b9350506020620020c2868287016200202b565b9250506040620020d5868287016200206c565b9150509250925092565b6000604082019050620020f6600083018562001970565b62002105602083018462001970565b9392505050565b60006200211982620018e2565b91506200212683620018e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562002162576200216162001e05565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620021a982620018e2565b9150620021b683620018e2565b925082620021c957620021c86200216d565b5b82820490509291505056fe60806040523480156200001157600080fd5b50604051620016ef380380620016ef8339818101604052810190620000379190620001e2565b81600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600060050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000229565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200013d8262000110565b9050919050565b6000620001518262000130565b9050919050565b620001638162000144565b81146200016f57600080fd5b50565b600081519050620001838162000158565b92915050565b6000620001968262000110565b9050919050565b6000620001aa8262000189565b9050919050565b620001bc816200019d565b8114620001c857600080fd5b50565b600081519050620001dc81620001b1565b92915050565b60008060408385031215620001fc57620001fb6200010b565b5b60006200020c8582860162000172565b92505060206200021f85828601620001cb565b9150509250929050565b6114b680620002396000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80635c99d8cc116100665780635c99d8cc1461014c578063853828b61461017c578063b6b55f2514610186578063bd77ac2c146101a2578063ff50abdc146101be5761009e565b80632e1a7d4d146100a357806336efd16f146100bf578063479ba7ae146100db5780634e71d92d1461010b57806357f6b81214610115575b600080fd5b6100bd60048036038101906100b89190610e3f565b6101dc565b005b6100d960048036038101906100d49190610eca565b6103dd565b005b6100f560048036038101906100f09190610f0a565b6105cd565b6040516101029190610f46565b60405180910390f35b610113610653565b005b61012f600480360381019061012a9190610f0a565b6107d7565b604051610143989796959493929190610f61565b60405180910390f35b61016660048036038101906101619190610f0a565b610a0a565b6040516101739190610f46565b60405180910390f35b610184610a58565b005b6101a0600480360381019061019b9190610e3f565b610a7b565b005b6101bc60048036038101906101b79190610e3f565b610a88565b005b6101c6610b44565b6040516101d39190610f46565b60405180910390f35b6000811180156101f457506101f033610a0a565b8111155b6101fd57600080fd5b610205610b50565b80600080016000828254610219919061100e565b9250508190555080600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610275919061100e565b925050819055506000600101548161028d9190611042565b600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546102e191906110a6565b92505081905550600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610348929190611149565b6020604051808303816000875af1158015610367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b91906111aa565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516103d29190610f46565b60405180910390a250565b600082116103ea57600080fd5b6103f2610b50565b600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610454939291906111d7565b6020604051808303816000875af1158015610473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049791906111aa565b50816000800160008282546104ac919061120e565b9250508190555081600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610508919061120e565b92505081905550600060010154826105209190611042565b600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546105749190611264565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c836040516105c19190610f46565b60405180910390a25050565b600068010000000000000000600060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461062884610a0a565b6000600101546106389190611042565b61064291906110a6565b61064c9190611327565b9050919050565b61065b610b50565b6000610666336105cd565b905060008111156107d45768010000000000000000816106869190611042565b600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546106da9190611264565b92505081905550600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610741929190611149565b6020604051808303816000875af1158015610760573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078491906111aa565b503373ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4826040516107cb9190610f46565b60405180910390a25b50565b6000806000806000806000806107eb610b44565b9750600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357f6b812306040518263ffffffff1660e01b815260040161084b9190611358565b60e060405180830381865afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190611388565b90919293949550909150905050809750819850829950505050600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b81526004016109039190611358565b602060405180830381865afa158015610920573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610944919061142a565b9350600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a306040518363ffffffff1660e01b81526004016109a6929190611457565b602060405180830381865afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e7919061142a565b92506109f289610a0a565b91506109fd896105cd565b9050919395975091939597565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000610a6333610a0a565b90506000811115610a7857610a77816101dc565b5b50565b610a8581336103dd565b50565b6000811115610b4157600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610af3939291906111d7565b6020604051808303816000875af1158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3691906111aa565b50610b4081610d32565b5b50565b60008060000154905090565b600030905060008060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610bb49190611358565b602060405180830381865afa158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf5919061142a565b9050600060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b50505050610d2e81600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610cde9190611358565b602060405180830381865afa158015610cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1f919061142a565b610d29919061100e565b610d32565b5050565b6000811115610e01576000610d45610b44565b1415610d6c578060006002016000828254610d60919061120e565b92505081905550610dc9565b610d74610b44565b6801000000000000000060006002015483610d8f919061120e565b610d999190611042565b610da39190611327565b60006001016000828254610db7919061120e565b92505081905550600080600201819055505b7f3ac0594a85a20354f9dc74f33728416d19ce00d04a406c108cc2dcf2cecea13481604051610df89190610f46565b60405180910390a15b50565b600080fd5b6000819050919050565b610e1c81610e09565b8114610e2757600080fd5b50565b600081359050610e3981610e13565b92915050565b600060208284031215610e5557610e54610e04565b5b6000610e6384828501610e2a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e9782610e6c565b9050919050565b610ea781610e8c565b8114610eb257600080fd5b50565b600081359050610ec481610e9e565b92915050565b60008060408385031215610ee157610ee0610e04565b5b6000610eef85828601610e2a565b9250506020610f0085828601610eb5565b9150509250929050565b600060208284031215610f2057610f1f610e04565b5b6000610f2e84828501610eb5565b91505092915050565b610f4081610e09565b82525050565b6000602082019050610f5b6000830184610f37565b92915050565b600061010082019050610f77600083018b610f37565b610f84602083018a610f37565b610f916040830189610f37565b610f9e6060830188610f37565b610fab6080830187610f37565b610fb860a0830186610f37565b610fc560c0830185610f37565b610fd260e0830184610f37565b9998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061101982610e09565b915061102483610e09565b92508282101561103757611036610fdf565b5b828203905092915050565b600061104d82610e09565b915061105883610e09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561109157611090610fdf565b5b828202905092915050565b6000819050919050565b60006110b18261109c565b91506110bc8361109c565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156110f7576110f6610fdf565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561112f5761112e610fdf565b5b828203905092915050565b61114381610e8c565b82525050565b600060408201905061115e600083018561113a565b61116b6020830184610f37565b9392505050565b60008115159050919050565b61118781611172565b811461119257600080fd5b50565b6000815190506111a48161117e565b92915050565b6000602082840312156111c0576111bf610e04565b5b60006111ce84828501611195565b91505092915050565b60006060820190506111ec600083018661113a565b6111f9602083018561113a565b6112066040830184610f37565b949350505050565b600061121982610e09565b915061122483610e09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561125957611258610fdf565b5b828201905092915050565b600061126f8261109c565b915061127a8361109c565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156112b5576112b4610fdf565b5b817f80000000000000000000000000000000000000000000000000000000000000000383126000831216156112ed576112ec610fdf565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061133282610e09565b915061133d83610e09565b92508261134d5761134c6112f8565b5b828204905092915050565b600060208201905061136d600083018461113a565b92915050565b60008151905061138281610e13565b92915050565b600080600080600080600060e0888a0312156113a7576113a6610e04565b5b60006113b58a828b01611373565b97505060206113c68a828b01611373565b96505060406113d78a828b01611373565b95505060606113e88a828b01611373565b94505060806113f98a828b01611373565b93505060a061140a8a828b01611373565b92505060c061141b8a828b01611373565b91505092959891949750929550565b6000602082840312156114405761143f610e04565b5b600061144e84828501611373565b91505092915050565b600060408201905061146c600083018561113a565b611479602083018461113a565b939250505056fea2646970667358221220795594f2fe07a454decd154a2e9c7744cd6f0aae312bc6290ac096a11381bb9f64736f6c634300080a0033a26469706673582212206399482d31b563b20032ee5c2eceda4245cecb36674a015ccdaa7267c2a12ae164736f6c634300080a0033

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620001605760003560e01c806342966c6811620000c957806395d89b41116200008757806395d89b41146200040f578063a8b089821462000431578063a9059cbb1462000453578063c81c08651462000489578063dd62ed3e14620004ab578063e6a6dcce14620004e15762000160565b806342966c68146200033957806357f6b812146200035957806370a082311462000395578063788bff6814620003cb5780638da5cb5b14620003ed5762000160565b80631e3c187f11620001235780631e3c187f146200021f57806323b872dd146200025557806328687cc7146200028b578063313ce56714620002c15780634000aea014620002e357806340c10f1914620003195762000160565b806306fdde031462000165578063080ad5551462000187578063095ea7b314620001a757806313af403514620001dd57806318160ddd14620001fd575b600080fd5b6200016f62000501565b6040516200017e9190620017c4565b60405180910390f35b620001a560048036038101906200019f91906200186b565b6200053a565b005b620001c56004803603810190620001bf91906200191d565b62000704565b604051620001d4919062001981565b60405180910390f35b620001fb6004803603810190620001f591906200199e565b6200071b565b005b62000207620007a4565b604051620002169190620019e1565b60405180910390f35b6200023d60048036038101906200023791906200199e565b620007b0565b6040516200024c919062001981565b60405180910390f35b6200027360048036038101906200026d9190620019fe565b62000808565b60405162000282919062001981565b60405180910390f35b620002a96004803603810190620002a391906200199e565b62000902565b604051620002b8919062001981565b60405180910390f35b620002cb6200095a565b604051620002da919062001a78565b60405180910390f35b620003016004803603810190620002fb919062001b03565b6200095f565b60405162000310919062001981565b60405180910390f35b6200033760048036038101906200033191906200191d565b62000a50565b005b62000357600480360381019062000351919062001b83565b62000b95565b005b6200037760048036038101906200037191906200199e565b62000c93565b6040516200038c979695949392919062001bb5565b60405180910390f35b620003b36004803603810190620003ad91906200199e565b62000f1f565b604051620003c29190620019e1565b60405180910390f35b620003d562000f6d565b604051620003e4919062001c43565b60405180910390f35b620003f762000f99565b60405162000406919062001c43565b60405180910390f35b6200041962000fc5565b604051620004289190620017c4565b60405180910390f35b6200043b62000ffe565b6040516200044a919062001c43565b60405180910390f35b6200047160048036038101906200046b91906200191d565b6200102a565b60405162000480919062001981565b60405180910390f35b6200049362001041565b604051620004a2919062001c43565b60405180910390f35b620004c96004803603810190620004c3919062001c60565b6200106d565b604051620004d89190620019e1565b60405180910390f35b620004ff6004803603810190620004f9919062001cd8565b620010f9565b005b6040518060400160405280600b81526020017f4b72696c6c20546f6b656e00000000000000000000000000000000000000000081525081565b6200054462000f99565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148015620005b45750600073ffffffffffffffffffffffffffffffffffffffff166200059c62000f6d565b73ffffffffffffffffffffffffffffffffffffffff16145b620005be57600080fd5b80600060070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516200065c9062001712565b6200066992919062001dd8565b604051809103906000f08015801562000686573d6000803e3d6000fd5b50600060080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200070030620006d962000f6d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62001246565b5050565b60006200071333848462001246565b905092915050565b6200072562000f99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200075d57600080fd5b80600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060000154905090565b60008060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000806200081785336200106d565b9050828110156200082757600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114620008eb5782600060010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620008e3919062001e34565b925050819055505b620008f885858562001341565b9150509392505050565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601281565b6000806200096d8662000f1f565b90506200097c33878762001341565b506000816200098b8862000f1f565b62000997919062001e34565b90506000873b905060008163ffffffff16111562000a41578773ffffffffffffffffffffffffffffffffffffffff16636be32e73338489896040518563ffffffff1660e01b8152600401620009f0949392919062001ec2565b6020604051808303816000875af115801562000a10573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a36919062001f1f565b62000a4057600080fd5b5b60019350505050949350505050565b600060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000aae57600080fd5b8060008001600082825462000ac4919062001f51565b9250508190555080600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462000b22919062001f51565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000b899190620019e1565b60405180910390a35050565b8062000ba13362000f1f565b101562000bad57600080fd5b8060008001600082825462000bc3919062001e34565b9250508190555080600060010160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462000c21919062001e34565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c889190620019e1565b60405180910390a350565b600080600080600080600062000ca8620007a4565b9650600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d1b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d41919062001fc5565b9550600080600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000db7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ddd919062002083565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600060060160149054906101000a900460ff1662000e21578062000e23565b815b9650600060060160149054906101000a900460ff1662000e44578162000e46565b805b955062000e5d8a62000e5762001041565b6200106d565b945062000e6a8a62000f1f565b9350600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b815260040162000ecc919062001c43565b602060405180830381865afa15801562000eea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f10919062001fc5565b92505050919395979092949650565b60008060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60008060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600581526020017f4b52494c4c00000000000000000000000000000000000000000000000000000081525081565b60008060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006200103933848462001341565b905092915050565b60008060070160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6200110362000f99565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200113b57600080fd5b81600060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600060020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167f855852ede06df792cbe12bbb8b292fd0d251a1dcfea1f072d5793f1930568ebf838360405162001239929190620020df565b60405180910390a2505050565b600081600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200132e9190620019e1565b60405180910390a3600190509392505050565b6000816200134f8562000f1f565b10156200135b57600080fd5b81600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254620013b2919062001e34565b925050819055506000620013c562000f6d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806200143357506200140462000f6d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b806200147357506200144462001041565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80620014865750620014858562000902565b5b806200149957506200149884620007b0565b5b62001627576064600184620014af91906200210c565b620014bb91906200219c565b9050600030905081600060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825462001519919062001f51565b925050819055508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516200157f9190620019e1565b60405180910390a3600060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd77ac2c620015d38362000f1f565b6040518263ffffffff1660e01b8152600401620015f19190620019e1565b600060405180830381600087803b1580156200160c57600080fd5b505af115801562001621573d6000803e3d6000fd5b50505050505b808362001635919062001e34565b600060010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546200168b919062001f51565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8386620016ef919062001e34565b604051620016fe9190620019e1565b60405180910390a360019150509392505050565b6116ef80620021d583390190565b600081519050919050565b600082825260208201905092915050565b60005b838110156200175c5780820151818401526020810190506200173f565b838111156200176c576000848401525b50505050565b6000601f19601f8301169050919050565b6000620017908262001720565b6200179c81856200172b565b9350620017ae8185602086016200173c565b620017b98162001772565b840191505092915050565b60006020820190508181036000830152620017e0818462001783565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200181f82620017f2565b9050919050565b6000620018338262001812565b9050919050565b620018458162001826565b81146200185157600080fd5b50565b60008135905062001865816200183a565b92915050565b600060208284031215620018845762001883620017e8565b5b6000620018948482850162001854565b91505092915050565b6000620018aa82620017f2565b9050919050565b620018bc816200189d565b8114620018c857600080fd5b50565b600081359050620018dc81620018b1565b92915050565b6000819050919050565b620018f781620018e2565b81146200190357600080fd5b50565b6000813590506200191781620018ec565b92915050565b60008060408385031215620019375762001936620017e8565b5b60006200194785828601620018cb565b92505060206200195a8582860162001906565b9150509250929050565b60008115159050919050565b6200197b8162001964565b82525050565b600060208201905062001998600083018462001970565b92915050565b600060208284031215620019b757620019b6620017e8565b5b6000620019c784828501620018cb565b91505092915050565b620019db81620018e2565b82525050565b6000602082019050620019f86000830184620019d0565b92915050565b60008060006060848603121562001a1a5762001a19620017e8565b5b600062001a2a86828701620018cb565b935050602062001a3d86828701620018cb565b925050604062001a508682870162001906565b9150509250925092565b600060ff82169050919050565b62001a728162001a5a565b82525050565b600060208201905062001a8f600083018462001a67565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262001abd5762001abc62001a95565b5b8235905067ffffffffffffffff81111562001add5762001adc62001a9a565b5b60208301915083600182028301111562001afc5762001afb62001a9f565b5b9250929050565b6000806000806060858703121562001b205762001b1f620017e8565b5b600062001b3087828801620018cb565b945050602062001b438782880162001906565b935050604085013567ffffffffffffffff81111562001b675762001b66620017ed565b5b62001b758782880162001aa4565b925092505092959194509250565b60006020828403121562001b9c5762001b9b620017e8565b5b600062001bac8482850162001906565b91505092915050565b600060e08201905062001bcc600083018a620019d0565b62001bdb6020830189620019d0565b62001bea6040830188620019d0565b62001bf96060830187620019d0565b62001c086080830186620019d0565b62001c1760a0830185620019d0565b62001c2660c0830184620019d0565b98975050505050505050565b62001c3d816200189d565b82525050565b600060208201905062001c5a600083018462001c32565b92915050565b6000806040838503121562001c7a5762001c79620017e8565b5b600062001c8a85828601620018cb565b925050602062001c9d85828601620018cb565b9150509250929050565b62001cb28162001964565b811462001cbe57600080fd5b50565b60008135905062001cd28162001ca7565b92915050565b60008060006060848603121562001cf45762001cf3620017e8565b5b600062001d0486828701620018cb565b935050602062001d178682870162001cc1565b925050604062001d2a8682870162001cc1565b9150509250925092565b6000819050919050565b600062001d5f62001d5962001d5384620017f2565b62001d34565b620017f2565b9050919050565b600062001d738262001d3e565b9050919050565b600062001d878262001d66565b9050919050565b62001d998162001d7a565b82525050565b600062001dac8262001d3e565b9050919050565b600062001dc08262001d9f565b9050919050565b62001dd28162001db3565b82525050565b600060408201905062001def600083018562001d8e565b62001dfe602083018462001dc7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001e4182620018e2565b915062001e4e83620018e2565b92508282101562001e645762001e6362001e05565b5b828203905092915050565b600082825260208201905092915050565b82818337600083830152505050565b600062001e9d838562001e6f565b935062001eac83858462001e80565b62001eb78362001772565b840190509392505050565b600060608201905062001ed9600083018762001c32565b62001ee86020830186620019d0565b818103604083015262001efd81848662001e8f565b905095945050505050565b60008151905062001f198162001ca7565b92915050565b60006020828403121562001f385762001f37620017e8565b5b600062001f488482850162001f08565b91505092915050565b600062001f5e82620018e2565b915062001f6b83620018e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001fa35762001fa262001e05565b5b828201905092915050565b60008151905062001fbf81620018ec565b92915050565b60006020828403121562001fde5762001fdd620017e8565b5b600062001fee8482850162001fae565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b6200201c8162001ff7565b81146200202857600080fd5b50565b6000815190506200203c8162002011565b92915050565b600063ffffffff82169050919050565b6200205d8162002042565b81146200206957600080fd5b50565b6000815190506200207d8162002052565b92915050565b6000806000606084860312156200209f576200209e620017e8565b5b6000620020af868287016200202b565b9350506020620020c2868287016200202b565b9250506040620020d5868287016200206c565b9150509250925092565b6000604082019050620020f6600083018562001970565b62002105602083018462001970565b9392505050565b60006200211982620018e2565b91506200212683620018e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562002162576200216162001e05565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620021a982620018e2565b9150620021b683620018e2565b925082620021c957620021c86200216d565b5b82820490509291505056fe60806040523480156200001157600080fd5b50604051620016ef380380620016ef8339818101604052810190620000379190620001e2565b81600060040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600060050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000229565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200013d8262000110565b9050919050565b6000620001518262000130565b9050919050565b620001638162000144565b81146200016f57600080fd5b50565b600081519050620001838162000158565b92915050565b6000620001968262000110565b9050919050565b6000620001aa8262000189565b9050919050565b620001bc816200019d565b8114620001c857600080fd5b50565b600081519050620001dc81620001b1565b92915050565b60008060408385031215620001fc57620001fb6200010b565b5b60006200020c8582860162000172565b92505060206200021f85828601620001cb565b9150509250929050565b6114b680620002396000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80635c99d8cc116100665780635c99d8cc1461014c578063853828b61461017c578063b6b55f2514610186578063bd77ac2c146101a2578063ff50abdc146101be5761009e565b80632e1a7d4d146100a357806336efd16f146100bf578063479ba7ae146100db5780634e71d92d1461010b57806357f6b81214610115575b600080fd5b6100bd60048036038101906100b89190610e3f565b6101dc565b005b6100d960048036038101906100d49190610eca565b6103dd565b005b6100f560048036038101906100f09190610f0a565b6105cd565b6040516101029190610f46565b60405180910390f35b610113610653565b005b61012f600480360381019061012a9190610f0a565b6107d7565b604051610143989796959493929190610f61565b60405180910390f35b61016660048036038101906101619190610f0a565b610a0a565b6040516101739190610f46565b60405180910390f35b610184610a58565b005b6101a0600480360381019061019b9190610e3f565b610a7b565b005b6101bc60048036038101906101b79190610e3f565b610a88565b005b6101c6610b44565b6040516101d39190610f46565b60405180910390f35b6000811180156101f457506101f033610a0a565b8111155b6101fd57600080fd5b610205610b50565b80600080016000828254610219919061100e565b9250508190555080600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610275919061100e565b925050819055506000600101548161028d9190611042565b600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546102e191906110a6565b92505081905550600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610348929190611149565b6020604051808303816000875af1158015610367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b91906111aa565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516103d29190610f46565b60405180910390a250565b600082116103ea57600080fd5b6103f2610b50565b600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610454939291906111d7565b6020604051808303816000875af1158015610473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049791906111aa565b50816000800160008282546104ac919061120e565b9250508190555081600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610508919061120e565b92505081905550600060010154826105209190611042565b600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546105749190611264565b925050819055508073ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c836040516105c19190610f46565b60405180910390a25050565b600068010000000000000000600060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461062884610a0a565b6000600101546106389190611042565b61064291906110a6565b61064c9190611327565b9050919050565b61065b610b50565b6000610666336105cd565b905060008111156107d45768010000000000000000816106869190611042565b600060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546106da9190611264565b92505081905550600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610741929190611149565b6020604051808303816000875af1158015610760573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078491906111aa565b503373ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4826040516107cb9190610f46565b60405180910390a25b50565b6000806000806000806000806107eb610b44565b9750600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357f6b812306040518263ffffffff1660e01b815260040161084b9190611358565b60e060405180830381865afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190611388565b90919293949550909150905050809750819850829950505050600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b81526004016109039190611358565b602060405180830381865afa158015610920573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610944919061142a565b9350600060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a306040518363ffffffff1660e01b81526004016109a6929190611457565b602060405180830381865afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e7919061142a565b92506109f289610a0a565b91506109fd896105cd565b9050919395975091939597565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000610a6333610a0a565b90506000811115610a7857610a77816101dc565b5b50565b610a8581336103dd565b50565b6000811115610b4157600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610af3939291906111d7565b6020604051808303816000875af1158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3691906111aa565b50610b4081610d32565b5b50565b60008060000154905090565b600030905060008060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610bb49190611358565b602060405180830381865afa158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf5919061142a565b9050600060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6457600080fd5b505af1158015610c78573d6000803e3d6000fd5b50505050610d2e81600060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610cde9190611358565b602060405180830381865afa158015610cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1f919061142a565b610d29919061100e565b610d32565b5050565b6000811115610e01576000610d45610b44565b1415610d6c578060006002016000828254610d60919061120e565b92505081905550610dc9565b610d74610b44565b6801000000000000000060006002015483610d8f919061120e565b610d999190611042565b610da39190611327565b60006001016000828254610db7919061120e565b92505081905550600080600201819055505b7f3ac0594a85a20354f9dc74f33728416d19ce00d04a406c108cc2dcf2cecea13481604051610df89190610f46565b60405180910390a15b50565b600080fd5b6000819050919050565b610e1c81610e09565b8114610e2757600080fd5b50565b600081359050610e3981610e13565b92915050565b600060208284031215610e5557610e54610e04565b5b6000610e6384828501610e2a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e9782610e6c565b9050919050565b610ea781610e8c565b8114610eb257600080fd5b50565b600081359050610ec481610e9e565b92915050565b60008060408385031215610ee157610ee0610e04565b5b6000610eef85828601610e2a565b9250506020610f0085828601610eb5565b9150509250929050565b600060208284031215610f2057610f1f610e04565b5b6000610f2e84828501610eb5565b91505092915050565b610f4081610e09565b82525050565b6000602082019050610f5b6000830184610f37565b92915050565b600061010082019050610f77600083018b610f37565b610f84602083018a610f37565b610f916040830189610f37565b610f9e6060830188610f37565b610fab6080830187610f37565b610fb860a0830186610f37565b610fc560c0830185610f37565b610fd260e0830184610f37565b9998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061101982610e09565b915061102483610e09565b92508282101561103757611036610fdf565b5b828203905092915050565b600061104d82610e09565b915061105883610e09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561109157611090610fdf565b5b828202905092915050565b6000819050919050565b60006110b18261109c565b91506110bc8361109c565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156110f7576110f6610fdf565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561112f5761112e610fdf565b5b828203905092915050565b61114381610e8c565b82525050565b600060408201905061115e600083018561113a565b61116b6020830184610f37565b9392505050565b60008115159050919050565b61118781611172565b811461119257600080fd5b50565b6000815190506111a48161117e565b92915050565b6000602082840312156111c0576111bf610e04565b5b60006111ce84828501611195565b91505092915050565b60006060820190506111ec600083018661113a565b6111f9602083018561113a565b6112066040830184610f37565b949350505050565b600061121982610e09565b915061122483610e09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561125957611258610fdf565b5b828201905092915050565b600061126f8261109c565b915061127a8361109c565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156112b5576112b4610fdf565b5b817f80000000000000000000000000000000000000000000000000000000000000000383126000831216156112ed576112ec610fdf565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061133282610e09565b915061133d83610e09565b92508261134d5761134c6112f8565b5b828204905092915050565b600060208201905061136d600083018461113a565b92915050565b60008151905061138281610e13565b92915050565b600080600080600080600060e0888a0312156113a7576113a6610e04565b5b60006113b58a828b01611373565b97505060206113c68a828b01611373565b96505060406113d78a828b01611373565b95505060606113e88a828b01611373565b94505060806113f98a828b01611373565b93505060a061140a8a828b01611373565b92505060c061141b8a828b01611373565b91505092959891949750929550565b6000602082840312156114405761143f610e04565b5b600061144e84828501611373565b91505092915050565b600060408201905061146c600083018561113a565b611479602083018461113a565b939250505056fea2646970667358221220795594f2fe07a454decd154a2e9c7744cd6f0aae312bc6290ac096a11381bb9f64736f6c634300080a0033a26469706673582212206399482d31b563b20032ee5c2eceda4245cecb36674a015ccdaa7267c2a12ae164736f6c634300080a0033

Deployed Bytecode Sourcemap

1776:5898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1920:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3419:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4306:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3045:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5839:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5720:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4443:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5598:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2010:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4769:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3708:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3950:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6182:587;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;5930:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5406:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5519:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1967:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5311:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4177:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5214:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6041:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3133:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1920:43;;;;;;;;;;;;;;;;;;;:::o;3419:282::-;3499:7;:5;:7::i;:::-;3486:20;;:9;:20;;;:63;;;;;3545:3;3510:39;;:23;:21;:23::i;:::-;:39;;;3486:63;3478:72;;;;;;3565:3;3555:4;:7;;;:13;;;;;;;;;;;;;;;;;;3614:4;:7;;;;;;;;;;;;3623:4;:9;;;;;;;;;;;;3595:38;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;3573:4;:19;;;:60;;;;;;;;;;;;;;;;;;3638:58;3655:4;3662:23;:21;:23::i;:::-;1833:17;3638:8;:58::i;:::-;;3419:282;:::o;4306:132::-;4376:4;4394:39;4403:10;4415:8;4425:7;4394:8;:39::i;:::-;4387:46;;4306:132;;;;:::o;3045:83::-;2741:7;:5;:7::i;:::-;2727:21;;:10;:21;;;2719:30;;;;;;3117:6:::1;3104:4;:10;;;:19;;;;;;;;;;;;;;;;;;3045:83:::0;:::o;5839:86::-;5883:7;5904:4;:16;;;5897:23;;5839:86;:::o;5720:113::-;5784:4;5802;:16;;:26;5819:8;5802:26;;;;;;;;;;;;;;;;;;;;;;;;;5795:33;;5720:113;;;:::o;4443:321::-;4528:4;4539:18;4560:28;4570:5;4577:10;4560:9;:28::i;:::-;4539:49;;4615:7;4601:10;:21;;4593:30;;;;;;1833:17;4632:10;:22;4628:90;;4705:7;4662:4;:10;;:17;4673:5;4662:17;;;;;;;;;;;;;;;:27;;:39;4690:10;4662:39;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;4628:90;4729:30;4739:5;4746:3;4751:7;4729:9;:30::i;:::-;4722:37;;;4443:321;;;;;:::o;5598:117::-;5664:4;5682;:18;;:28;5701:8;5682:28;;;;;;;;;;;;;;;;;;;;;;;;;5675:35;;5598:117;;;:::o;2010:35::-;2043:2;2010:35;:::o;4769:437::-;4864:4;4875:22;4900:14;4910:3;4900:9;:14::i;:::-;4875:39;;4919:35;4929:10;4941:3;4946:7;4919:9;:35::i;:::-;;4959:23;5002:14;4985;4995:3;4985:9;:14::i;:::-;:31;;;;:::i;:::-;4959:57;;5021:12;5074:3;5062:16;5053:25;;5099:1;5091:5;:9;;;5087:99;;;5125:3;5116:27;;;5144:10;5156:15;5173:5;;5116:63;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5108:72;;;;;;5087:99;5197:4;5190:11;;;;;4769:437;;;;;;:::o;3708:237::-;3802:4;:7;;;;;;;;;;;;3780:30;;:10;:30;;;3772:39;;;;;;3836:7;3816:4;:16;;;:27;;;;;;;:::i;:::-;;;;;;;;3881:7;3848:4;:10;;:21;3859:9;3848:21;;;;;;;;;;;;;;;:29;;;:40;;;;;;;:::i;:::-;;;;;;;;3921:9;3898:42;;3915:3;3898:42;;;3932:7;3898:42;;;;;;:::i;:::-;;;;;;;;3708:237;;:::o;3950:222::-;4028:7;4003:21;4013:10;4003:9;:21::i;:::-;:32;;3995:41;;;;;;4061:7;4041:4;:16;;;:27;;;;;;;:::i;:::-;;;;;;;;4107:7;4073:4;:10;;:22;4084:10;4073:22;;;;;;;;;;;;;;;:30;;;:41;;;;;;;:::i;:::-;;;;;;;;4153:3;4124:43;;4133:10;4124:43;;;4159:7;4124:43;;;;;;:::i;:::-;;;;;;;;3950:222;:::o;6182:587::-;6240:19;6261:21;6284:19;6305:20;6327:21;6350:19;6371:21;6413:13;:11;:13::i;:::-;6399:27;;6447:4;:9;;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6431:39;;6476:13;6491;6510:4;:9;;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6475:58;;;;;;;;;6552:4;:10;;;;;;;;;;;;:26;;6573:5;6552:26;;;6565:5;6552:26;6538:40;;6598:4;:10;;;;;;;;;;;;:26;;6619:5;6598:26;;;6611:5;6598:26;6583:41;;6645:37;6655:5;6662:19;:17;:19::i;:::-;6645:9;:37::i;:::-;6629:53;;6701:16;6711:5;6701:9;:16::i;:::-;6687:30;;6738:4;:9;;;;;;;;;;;;:19;;;6758:5;6738:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6722:42;;6394:375;;6182:587;;;;;;;;;:::o;5930:106::-;5985:7;6006:4;:10;;:17;6017:5;6006:17;;;;;;;;;;;;;;;:25;;;5999:32;;5930:106;;;:::o;5406:108::-;5460:7;5489:4;:19;;;;;;;;;;;;5474:35;;5406:108;:::o;5519:74::-;5557:7;5578:4;:10;;;;;;;;;;;;5571:17;;5519:74;:::o;1967:39::-;;;;;;;;;;;;;;;;;;;:::o;5311:90::-;5357:7;5386:4;:9;;;;;;;;;;;;5371:25;;5311:90;:::o;4177:124::-;4243:4;4261:35;4271:10;4283:3;4288:7;4261:9;:35::i;:::-;4254:42;;4177:124;;;;:::o;5214:92::-;5264:7;5293:4;:7;;;;;;;;;;;;5278:23;;5214:92;:::o;6041:136::-;6114:7;6135:4;:10;;:17;6146:5;6135:17;;;;;;;;;;;;;;;:27;;:37;6163:8;6135:37;;;;;;;;;;;;;;;;6128:44;;6041:136;;;;:::o;3133:281::-;2741:7;:5;:7::i;:::-;2727:21;;:10;:21;;;2719:30;;;;;;3275:16:::1;3244:4;:18;;:28;3263:8;3244:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;3325:14;3296:4;:16;;:26;3313:8;3296:26;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;3366:8;3349:60;;;3376:16;3394:14;3349:60;;;;;;;:::i;:::-;;;;;;;;3133:281:::0;;;:::o;6776:212::-;6863:4;6915:7;6874:4;:10;;:18;6885:6;6874:18;;;;;;;;;;;;;;;:28;;:38;6903:8;6874:38;;;;;;;;;;;;;;;:48;;;;6949:8;6932:35;;6941:6;6932:35;;;6959:7;6932:35;;;;;;:::i;:::-;;;;;;;;6979:4;6972:11;;6776:212;;;;;:::o;6994:677::-;7076:4;7115:7;7095:16;7105:5;7095:9;:16::i;:::-;:27;;7087:36;;;;;;7157:7;7128:4;:10;;:17;7139:5;7128:17;;;;;;;;;;;;;;;:25;;;:36;;;;;;;:::i;:::-;;;;;;;;7169:12;7205:23;:21;:23::i;:::-;7196:32;;:5;:32;;;:66;;;;7239:23;:21;:23::i;:::-;7232:30;;:3;:30;;;7196:66;:96;;;;7273:19;:17;:19::i;:::-;7266:26;;:3;:26;;;7196:96;:124;;;;7296:24;7314:5;7296:17;:24::i;:::-;7196:124;:148;;;;7324:20;7340:3;7324:15;:20::i;:::-;7196:148;7190:369;;7385:3;1894:1;7360:7;:22;;;;:::i;:::-;:28;;;;:::i;:::-;7353:35;;7394:13;7418:4;7394:29;;7458:4;7429;:10;;:17;7440:5;7429:17;;;;;;;;;;;;;;;:25;;;:33;;;;;;;:::i;:::-;;;;;;;;7489:5;7473:28;;7482:5;7473:28;;;7496:4;7473:28;;;;;;:::i;:::-;;;;;;;;7507:4;:19;;;;;;;;;;;;:28;;;7536:16;7546:5;7536:9;:16::i;:::-;7507:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7347:212;7190:369;7600:4;7590:7;:14;;;;:::i;:::-;7563:4;:10;;:15;7574:3;7563:15;;;;;;;;;;;;;;;:23;;;:41;;;;;;;:::i;:::-;;;;;;;;7630:3;7614:36;;7623:5;7614:36;;;7645:4;7635:7;:14;;;;:::i;:::-;7614:36;;;;;;:::i;:::-;;;;;;;;7662:4;7655:11;;;6994:677;;;;;:::o;-1:-1:-1:-;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:104::-;1901:7;1930:24;1948:5;1930:24;:::i;:::-;1919:35;;1856:104;;;:::o;1966:123::-;2022:7;2051:32;2077:5;2051:32;:::i;:::-;2040:43;;1966:123;;;:::o;2095:160::-;2187:43;2224:5;2187:43;:::i;:::-;2180:5;2177:54;2167:82;;2245:1;2242;2235:12;2167:82;2095:160;:::o;2261:177::-;2326:5;2364:6;2351:20;2342:29;;2380:52;2426:5;2380:52;:::i;:::-;2261:177;;;;:::o;2444:367::-;2522:6;2571:2;2559:9;2550:7;2546:23;2542:32;2539:119;;;2577:79;;:::i;:::-;2539:119;2697:1;2722:72;2786:7;2777:6;2766:9;2762:22;2722:72;:::i;:::-;2712:82;;2668:136;2444:367;;;;:::o;2817:96::-;2854:7;2883:24;2901:5;2883:24;:::i;:::-;2872:35;;2817:96;;;:::o;2919:122::-;2992:24;3010:5;2992:24;:::i;:::-;2985:5;2982:35;2972:63;;3031:1;3028;3021:12;2972:63;2919:122;:::o;3047:139::-;3093:5;3131:6;3118:20;3109:29;;3147:33;3174:5;3147:33;:::i;:::-;3047:139;;;;:::o;3192:77::-;3229:7;3258:5;3247:16;;3192:77;;;:::o;3275:122::-;3348:24;3366:5;3348:24;:::i;:::-;3341:5;3338:35;3328:63;;3387:1;3384;3377:12;3328:63;3275:122;:::o;3403:139::-;3449:5;3487:6;3474:20;3465:29;;3503:33;3530:5;3503:33;:::i;:::-;3403:139;;;;:::o;3548:474::-;3616:6;3624;3673:2;3661:9;3652:7;3648:23;3644:32;3641:119;;;3679:79;;:::i;:::-;3641:119;3799:1;3824:53;3869:7;3860:6;3849:9;3845:22;3824:53;:::i;:::-;3814:63;;3770:117;3926:2;3952:53;3997:7;3988:6;3977:9;3973:22;3952:53;:::i;:::-;3942:63;;3897:118;3548:474;;;;;:::o;4028:90::-;4062:7;4105:5;4098:13;4091:21;4080:32;;4028:90;;;:::o;4124:109::-;4205:21;4220:5;4205:21;:::i;:::-;4200:3;4193:34;4124:109;;:::o;4239:210::-;4326:4;4364:2;4353:9;4349:18;4341:26;;4377:65;4439:1;4428:9;4424:17;4415:6;4377:65;:::i;:::-;4239:210;;;;:::o;4455:329::-;4514:6;4563:2;4551:9;4542:7;4538:23;4534:32;4531:119;;;4569:79;;:::i;:::-;4531:119;4689:1;4714:53;4759:7;4750:6;4739:9;4735:22;4714:53;:::i;:::-;4704:63;;4660:117;4455:329;;;;:::o;4790:118::-;4877:24;4895:5;4877:24;:::i;:::-;4872:3;4865:37;4790:118;;:::o;4914:222::-;5007:4;5045:2;5034:9;5030:18;5022:26;;5058:71;5126:1;5115:9;5111:17;5102:6;5058:71;:::i;:::-;4914:222;;;;:::o;5142:619::-;5219:6;5227;5235;5284:2;5272:9;5263:7;5259:23;5255:32;5252:119;;;5290:79;;:::i;:::-;5252:119;5410:1;5435:53;5480:7;5471:6;5460:9;5456:22;5435:53;:::i;:::-;5425:63;;5381:117;5537:2;5563:53;5608:7;5599:6;5588:9;5584:22;5563:53;:::i;:::-;5553:63;;5508:118;5665:2;5691:53;5736:7;5727:6;5716:9;5712:22;5691:53;:::i;:::-;5681:63;;5636:118;5142:619;;;;;:::o;5767:86::-;5802:7;5842:4;5835:5;5831:16;5820:27;;5767:86;;;:::o;5859:112::-;5942:22;5958:5;5942:22;:::i;:::-;5937:3;5930:35;5859:112;;:::o;5977:214::-;6066:4;6104:2;6093:9;6089:18;6081:26;;6117:67;6181:1;6170:9;6166:17;6157:6;6117:67;:::i;:::-;5977:214;;;;:::o;6197:117::-;6306:1;6303;6296:12;6320:117;6429:1;6426;6419:12;6443:117;6552:1;6549;6542:12;6579:552;6636:8;6646:6;6696:3;6689:4;6681:6;6677:17;6673:27;6663:122;;6704:79;;:::i;:::-;6663:122;6817:6;6804:20;6794:30;;6847:18;6839:6;6836:30;6833:117;;;6869:79;;:::i;:::-;6833:117;6983:4;6975:6;6971:17;6959:29;;7037:3;7029:4;7021:6;7017:17;7007:8;7003:32;7000:41;6997:128;;;7044:79;;:::i;:::-;6997:128;6579:552;;;;;:::o;7137:817::-;7225:6;7233;7241;7249;7298:2;7286:9;7277:7;7273:23;7269:32;7266:119;;;7304:79;;:::i;:::-;7266:119;7424:1;7449:53;7494:7;7485:6;7474:9;7470:22;7449:53;:::i;:::-;7439:63;;7395:117;7551:2;7577:53;7622:7;7613:6;7602:9;7598:22;7577:53;:::i;:::-;7567:63;;7522:118;7707:2;7696:9;7692:18;7679:32;7738:18;7730:6;7727:30;7724:117;;;7760:79;;:::i;:::-;7724:117;7873:64;7929:7;7920:6;7909:9;7905:22;7873:64;:::i;:::-;7855:82;;;;7650:297;7137:817;;;;;;;:::o;7960:329::-;8019:6;8068:2;8056:9;8047:7;8043:23;8039:32;8036:119;;;8074:79;;:::i;:::-;8036:119;8194:1;8219:53;8264:7;8255:6;8244:9;8240:22;8219:53;:::i;:::-;8209:63;;8165:117;7960:329;;;;:::o;8295:886::-;8556:4;8594:3;8583:9;8579:19;8571:27;;8608:71;8676:1;8665:9;8661:17;8652:6;8608:71;:::i;:::-;8689:72;8757:2;8746:9;8742:18;8733:6;8689:72;:::i;:::-;8771;8839:2;8828:9;8824:18;8815:6;8771:72;:::i;:::-;8853;8921:2;8910:9;8906:18;8897:6;8853:72;:::i;:::-;8935:73;9003:3;8992:9;8988:19;8979:6;8935:73;:::i;:::-;9018;9086:3;9075:9;9071:19;9062:6;9018:73;:::i;:::-;9101;9169:3;9158:9;9154:19;9145:6;9101:73;:::i;:::-;8295:886;;;;;;;;;;:::o;9187:118::-;9274:24;9292:5;9274:24;:::i;:::-;9269:3;9262:37;9187:118;;:::o;9311:222::-;9404:4;9442:2;9431:9;9427:18;9419:26;;9455:71;9523:1;9512:9;9508:17;9499:6;9455:71;:::i;:::-;9311:222;;;;:::o;9539:474::-;9607:6;9615;9664:2;9652:9;9643:7;9639:23;9635:32;9632:119;;;9670:79;;:::i;:::-;9632:119;9790:1;9815:53;9860:7;9851:6;9840:9;9836:22;9815:53;:::i;:::-;9805:63;;9761:117;9917:2;9943:53;9988:7;9979:6;9968:9;9964:22;9943:53;:::i;:::-;9933:63;;9888:118;9539:474;;;;;:::o;10019:116::-;10089:21;10104:5;10089:21;:::i;:::-;10082:5;10079:32;10069:60;;10125:1;10122;10115:12;10069:60;10019:116;:::o;10141:133::-;10184:5;10222:6;10209:20;10200:29;;10238:30;10262:5;10238:30;:::i;:::-;10141:133;;;;:::o;10280:607::-;10351:6;10359;10367;10416:2;10404:9;10395:7;10391:23;10387:32;10384:119;;;10422:79;;:::i;:::-;10384:119;10542:1;10567:53;10612:7;10603:6;10592:9;10588:22;10567:53;:::i;:::-;10557:63;;10513:117;10669:2;10695:50;10737:7;10728:6;10717:9;10713:22;10695:50;:::i;:::-;10685:60;;10640:115;10794:2;10820:50;10862:7;10853:6;10842:9;10838:22;10820:50;:::i;:::-;10810:60;;10765:115;10280:607;;;;;:::o;10893:60::-;10921:3;10942:5;10935:12;;10893:60;;;:::o;10959:142::-;11009:9;11042:53;11060:34;11069:24;11087:5;11069:24;:::i;:::-;11060:34;:::i;:::-;11042:53;:::i;:::-;11029:66;;10959:142;;;:::o;11107:134::-;11165:9;11198:37;11229:5;11198:37;:::i;:::-;11185:50;;11107:134;;;:::o;11247:161::-;11324:9;11357:45;11396:5;11357:45;:::i;:::-;11344:58;;11247:161;;;:::o;11414:185::-;11528:64;11586:5;11528:64;:::i;:::-;11523:3;11516:77;11414:185;;:::o;11605:126::-;11655:9;11688:37;11719:5;11688:37;:::i;:::-;11675:50;;11605:126;;;:::o;11737:138::-;11799:9;11832:37;11863:5;11832:37;:::i;:::-;11819:50;;11737:138;;;:::o;11881:155::-;11980:49;12023:5;11980:49;:::i;:::-;11975:3;11968:62;11881:155;;:::o;12042:410::-;12202:4;12240:2;12229:9;12225:18;12217:26;;12253:98;12348:1;12337:9;12333:17;12324:6;12253:98;:::i;:::-;12361:84;12441:2;12430:9;12426:18;12417:6;12361:84;:::i;:::-;12042:410;;;;;:::o;12458:180::-;12506:77;12503:1;12496:88;12603:4;12600:1;12593:15;12627:4;12624:1;12617:15;12644:191;12684:4;12704:20;12722:1;12704:20;:::i;:::-;12699:25;;12738:20;12756:1;12738:20;:::i;:::-;12733:25;;12777:1;12774;12771:8;12768:34;;;12782:18;;:::i;:::-;12768:34;12827:1;12824;12820:9;12812:17;;12644:191;;;;:::o;12841:168::-;12924:11;12958:6;12953:3;12946:19;12998:4;12993:3;12989:14;12974:29;;12841:168;;;;:::o;13015:154::-;13099:6;13094:3;13089;13076:30;13161:1;13152:6;13147:3;13143:16;13136:27;13015:154;;;:::o;13197:301::-;13293:3;13314:70;13377:6;13372:3;13314:70;:::i;:::-;13307:77;;13394:43;13430:6;13425:3;13418:5;13394:43;:::i;:::-;13462:29;13484:6;13462:29;:::i;:::-;13457:3;13453:39;13446:46;;13197:301;;;;;:::o;13504:549::-;13681:4;13719:2;13708:9;13704:18;13696:26;;13732:71;13800:1;13789:9;13785:17;13776:6;13732:71;:::i;:::-;13813:72;13881:2;13870:9;13866:18;13857:6;13813:72;:::i;:::-;13932:9;13926:4;13922:20;13917:2;13906:9;13902:18;13895:48;13960:86;14041:4;14032:6;14024;13960:86;:::i;:::-;13952:94;;13504:549;;;;;;;:::o;14059:137::-;14113:5;14144:6;14138:13;14129:22;;14160:30;14184:5;14160:30;:::i;:::-;14059:137;;;;:::o;14202:345::-;14269:6;14318:2;14306:9;14297:7;14293:23;14289:32;14286:119;;;14324:79;;:::i;:::-;14286:119;14444:1;14469:61;14522:7;14513:6;14502:9;14498:22;14469:61;:::i;:::-;14459:71;;14415:125;14202:345;;;;:::o;14553:305::-;14593:3;14612:20;14630:1;14612:20;:::i;:::-;14607:25;;14646:20;14664:1;14646:20;:::i;:::-;14641:25;;14800:1;14732:66;14728:74;14725:1;14722:81;14719:107;;;14806:18;;:::i;:::-;14719:107;14850:1;14847;14843:9;14836:16;;14553:305;;;;:::o;14864:143::-;14921:5;14952:6;14946:13;14937:22;;14968:33;14995:5;14968:33;:::i;:::-;14864:143;;;;:::o;15013:351::-;15083:6;15132:2;15120:9;15111:7;15107:23;15103:32;15100:119;;;15138:79;;:::i;:::-;15100:119;15258:1;15283:64;15339:7;15330:6;15319:9;15315:22;15283:64;:::i;:::-;15273:74;;15229:128;15013:351;;;;:::o;15370:114::-;15407:7;15447:30;15440:5;15436:42;15425:53;;15370:114;;;:::o;15490:122::-;15563:24;15581:5;15563:24;:::i;:::-;15556:5;15553:35;15543:63;;15602:1;15599;15592:12;15543:63;15490:122;:::o;15618:143::-;15675:5;15706:6;15700:13;15691:22;;15722:33;15749:5;15722:33;:::i;:::-;15618:143;;;;:::o;15767:93::-;15803:7;15843:10;15836:5;15832:22;15821:33;;15767:93;;;:::o;15866:120::-;15938:23;15955:5;15938:23;:::i;:::-;15931:5;15928:34;15918:62;;15976:1;15973;15966:12;15918:62;15866:120;:::o;15992:141::-;16048:5;16079:6;16073:13;16064:22;;16095:32;16121:5;16095:32;:::i;:::-;15992:141;;;;:::o;16139:661::-;16226:6;16234;16242;16291:2;16279:9;16270:7;16266:23;16262:32;16259:119;;;16297:79;;:::i;:::-;16259:119;16417:1;16442:64;16498:7;16489:6;16478:9;16474:22;16442:64;:::i;:::-;16432:74;;16388:128;16555:2;16581:64;16637:7;16628:6;16617:9;16613:22;16581:64;:::i;:::-;16571:74;;16526:129;16694:2;16720:63;16775:7;16766:6;16755:9;16751:22;16720:63;:::i;:::-;16710:73;;16665:128;16139:661;;;;;:::o;16806:308::-;16915:4;16953:2;16942:9;16938:18;16930:26;;16966:65;17028:1;17017:9;17013:17;17004:6;16966:65;:::i;:::-;17041:66;17103:2;17092:9;17088:18;17079:6;17041:66;:::i;:::-;16806:308;;;;;:::o;17120:348::-;17160:7;17183:20;17201:1;17183:20;:::i;:::-;17178:25;;17217:20;17235:1;17217:20;:::i;:::-;17212:25;;17405:1;17337:66;17333:74;17330:1;17327:81;17322:1;17315:9;17308:17;17304:105;17301:131;;;17412:18;;:::i;:::-;17301:131;17460:1;17457;17453:9;17442:20;;17120:348;;;;:::o;17474:180::-;17522:77;17519:1;17512:88;17619:4;17616:1;17609:15;17643:4;17640:1;17633:15;17660:185;17700:1;17717:20;17735:1;17717:20;:::i;:::-;17712:25;;17751:20;17769:1;17751:20;:::i;:::-;17746:25;;17790:1;17780:35;;17795:18;;:::i;:::-;17780:35;17837:1;17834;17830:9;17825:14;;17660:185;;;;:::o

Swarm Source

ipfs://6399482d31b563b20032ee5c2eceda4245cecb36674a015ccdaa7267c2a12ae1
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.