ERC-20
Overview
Max Total Supply
912,548,021.547324532 RYUTSUKA_TRACKER
Holders
36
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
10,748,183.507790322 RYUTSUKA_TRACKERValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
DividendTracker
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-26 */ pragma solidity ^0.8.12; // SPDX-License-Identifier: Unlicensed interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != - 1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? - a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } abstract contract Context { //function _msgSender() internal view virtual returns (address payable) { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } library Address { function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly {codehash := extcodehash(account)} return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success,) = recipient.call{value : amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value : weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router02 { function factory() external pure returns (address); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); } interface IV2SwapRouter { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to ) external payable returns (uint256 amountOut); } contract RyuukoTsuka is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; event SwapAndLiquifyEnabledUpdated(bool enabled); modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); IV2SwapRouter public v2SwapRouter = IV2SwapRouter(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45); address public uniswapV2PairUSDC = address(0); mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private botWallets; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedFromRewards; string private _name = "RYUUKO TSUKA"; string private _symbol = "RYUTSUKA"; uint8 private _decimals = 9; uint256 private _tTotal = 1000000000 * 10 ** _decimals; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; uint256 public usdcPriceToSwap = 450000000; //450 USDC uint256 public _maxWalletAmount = 15000100 * 10 ** _decimals; address public devAddress = 0x78A70B1059af06beE6Df22C977803311962aA13B; address private deadWallet = 0x000000000000000000000000000000000000dEaD; uint256 public gasForProcessing = 50000; address public usdcAddress = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address public tsukaAddress = 0xc5fB36dd2fb59d3B98dEfF88425a3F425Ee469eD; address public dividendContractAddress = address(0); IERC20 usdcToken = IERC20(usdcAddress); event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor); event SendDividends(uint256 EthAmount); struct Distribution { uint256 devTeam; uint256 dividend; } struct TaxFees { uint256 buyFee; uint256 sellFee; } bool private doTakeFees; bool private isSellTxn; TaxFees public taxFees; Distribution public distribution; DividendTracker public dividendTracker; constructor () { _balances[_msgSender()] = _tTotal; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[devAddress] = true; _isExcludedFromRewards[deadWallet] = true; uniswapV2PairUSDC = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), usdcAddress); _isExcludedFromRewards[uniswapV2PairUSDC] = true; taxFees = TaxFees(98, 98); distribution = Distribution(50, 50); emit Transfer(address(0), _msgSender(), _tTotal); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function airDrops(address[] calldata holders, uint256[] calldata amounts, bool doUpdateDividends) external { uint256 iterator = 0; require(_isExcludedFromFee[_msgSender()], "Airdrop can only be done by excluded from fee"); require(holders.length == amounts.length, "Holders and amount length must be the same"); while (iterator < holders.length) { _tokenTransfer(_msgSender(), holders[iterator], amounts[iterator] * 10 ** 9, false, false, doUpdateDividends,0); iterator += 1; } } function setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner { _maxWalletAmount = maxWalletAmount * 10 ** 9; } function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner { addRemoveFee(addresses, isExcludeFromFee); } function excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner { addRemoveRewards(addresses, isExcluded); } function isExcludedFromRewards(address addr) public view returns (bool) { return _isExcludedFromRewards[addr]; } function addRemoveRewards(address[] calldata addresses, bool flag) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; _isExcludedFromRewards[addr] = flag; } } function addRemoveFee(address[] calldata addresses, bool flag) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; _isExcludedFromFee[addr] = flag; } } function setTaxFees(uint256 buyFee, uint256 sellFee) external onlyOwner { taxFees.buyFee = buyFee; taxFees.sellFee = sellFee; } function setDistribution(uint256 dividend, uint256 devTeam) external onlyOwner { distribution.dividend = dividend; distribution.devTeam = devTeam; } function setWalletAddress(address devAddr) external onlyOwner { devAddress = devAddr; } function isAddressBlocked(address addr) public view returns (bool) { return botWallets[addr]; } function blockAddresses(address[] memory addresses) external onlyOwner() { blockUnblockAddress(addresses, true); } function unblockAddresses(address[] memory addresses) external onlyOwner() { blockUnblockAddress(addresses, false); } function blockUnblockAddress(address[] memory addresses, bool doBlock) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; if (doBlock) { botWallets[addr] = true; } else { delete botWallets[addr]; } } } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } function isExcludedFromFee(address account) public view returns (bool) { return _isExcludedFromFee[account]; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); bool isSell = false; uint256 tsukaTokenSwapAmount = 0; bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner(); uint256 holderBalance = balanceOf(to).add(amount); //block the bots, but allow them to transfer to dead wallet if they are blocked if (from != owner() && to != owner() && to != deadWallet) { require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens"); } if (from == uniswapV2PairUSDC) { require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit"); } if (from != uniswapV2PairUSDC && to == uniswapV2PairUSDC) {//if sell //only tax if tokens are going back to Uniswap isSell = true; uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance > 0) { uint256 tokenAmount = getTokenAmountByUSDCPrice(); if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify && swapAndLiquifyEnabled) { tsukaTokenSwapAmount = swapTokens(tokenAmount); } } } if (from != uniswapV2PairUSDC && to != uniswapV2PairUSDC) { require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit"); } _tokenTransfer(from, to, amount, takeFees, isSell, true, tsukaTokenSwapAmount); } function swapTokens(uint256 tokenAmount) private lockTheSwap returns(uint256) { uint256 usdcShare = tokenAmount.mul(distribution.devTeam).div(100).div(2); uint256 tsukaShare = tokenAmount.mul(distribution.dividend).div(100).div(2); swapTokensForUSDC(usdcShare); return swapTokensForTSUKA(tsukaShare); } function getTokenAmountByUSDCPrice() public view returns (uint256) { address[] memory path = new address[](2); path[0] = usdcAddress; path[1] = address(this); return uniswapV2Router.getAmountsOut(usdcPriceToSwap, path)[1]; } function setUSDCPriceToSwap(uint256 usdcPriceToSwap_) external onlyOwner { usdcPriceToSwap = usdcPriceToSwap_; } function updateGasForProcessing(uint256 newValue) public onlyOwner { require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value"); gasForProcessing = newValue; } receive() external payable {} function setDividendTracker(address dividendContractAddress_) external onlyOwner { dividendContractAddress = dividendContractAddress_; dividendTracker = DividendTracker(payable(dividendContractAddress)); } function sendUSDCBack() external onlyOwner { uint256 usdcBalance = usdcToken.balanceOf(address(this)); usdcToken.transfer(owner(), usdcBalance); } function swapTokensForUSDC(uint256 tokenAmount) private { address[] memory path; path = new address[](2); path[0] = address(this); path[1] = usdcAddress; // Approve the swap first _approve(address(this), address(v2SwapRouter), tokenAmount); v2SwapRouter.swapExactTokensForTokens( tokenAmount, 0, path, address(devAddress)); } function swapTokensForTSUKA(uint256 tokenAmount) private returns(uint256) { address[] memory path; path = new address[](3); path[0] = address(this); path[1] = usdcAddress; path[2] = tsukaAddress; // Approve the swap first _approve(address(this), address(v2SwapRouter), tokenAmount); return v2SwapRouter.swapExactTokensForTokens( tokenAmount, 0, path, address(dividendContractAddress)); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFees, bool isSell, bool doUpdateDividends, uint256 tsukaTokenSwapAmount) private { uint256 taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) : 0; if (takeFees && isSell) { taxAmount = amount.mul(taxFees.sellFee).div(100); } uint256 transferAmount = amount.sub(taxAmount); _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(transferAmount); _balances[address(this)] = _balances[address(this)].add(taxAmount); emit Transfer(sender, recipient, amount); if (doUpdateDividends) { try dividendTracker.setTokenBalance(sender) {} catch{} try dividendTracker.setTokenBalance(recipient) {} catch{} if(tsukaTokenSwapAmount > 0) { try dividendTracker.calculateDividends(tsukaTokenSwapAmount) {} catch{} } try dividendTracker.process(gasForProcessing) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin); }catch {} } } } contract IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } Map private map; function get(address key) public view returns (uint) { return map.values[key]; } function keyExists(address key) public view returns (bool) { return (getIndexOfKey(key) != - 1); } function getIndexOfKey(address key) public view returns (int) { if (!map.inserted[key]) { return - 1; } return int(map.indexOf[key]); } function getKeyAtIndex(uint index) public view returns (address) { return map.keys[index]; } function size() public view returns (uint) { return map.keys.length; } function set(address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } contract DividendTracker is IERC20, Context, Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; uint256 constant internal magnitude = 2 ** 128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping(address => uint256) internal claimedDividends; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name = "RYUUKO TSUKA Tracker"; string private _symbol = "RYUTSUKA_TRACKER"; uint8 private _decimals = 9; uint256 public totalDividendsDistributed; IterableMapping private tokenHoldersMap = new IterableMapping(); uint256 public minimumTokenBalanceForDividends = 5000000 * 10 ** _decimals; RyuukoTsuka private ryuukoTsuka; event updateBalance(address addr, uint256 amount); event DividendsDistributed(address indexed from, uint256 weiAmount); event DividendWithdrawn(address indexed to, uint256 weiAmount); uint256 public lastProcessedIndex; mapping(address => uint256) public lastClaimTimes; uint256 public claimWait = 3600; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); IERC20 public tsukaToken = IERC20(0xc5fB36dd2fb59d3B98dEfF88425a3F425Ee469eD); constructor() { } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address, uint256) public pure override returns (bool) { return true; } function transferFrom(address, address, uint256) public pure override returns (bool) { require(false, "No transfers allowed in dividend tracker"); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function setTokenBalance(address account) public { uint256 balance = ryuukoTsuka.balanceOf(account); if (!ryuukoTsuka.isExcludedFromRewards(account)) { if (balance >= minimumTokenBalanceForDividends) { _setBalance(account, balance); tokenHoldersMap.set(account, balance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } } else { if (balanceOf(account) > 0) { _setBalance(account, 0); tokenHoldersMap.remove(account); } } processAccount(payable(account), true); } function updateTokenBalances(address[] memory accounts) external { uint256 index = 0; while (index < accounts.length) { setTokenBalance(accounts[index]); index += 1; } } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub((magnifiedDividendPerShare.mul(amount)).toInt256Safe()); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add((magnifiedDividendPerShare.mul(amount)).toInt256Safe()); } function setERC20Contract(address contractAddr) external onlyOwner { ryuukoTsuka = RyuukoTsuka(payable(contractAddr)); } function excludeFromDividends(address account) external onlyOwner { _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function calculateDividends(uint256 amount) public { if(totalSupply() > 0) { if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amount).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed.add(amount); } } } function withdrawDividend() public virtual { _withdrawDividendOfUser(payable(msg.sender)); } function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); tsukaToken.transfer(user, _withdrawableDividend); return _withdrawableDividend; } return 0; } function dividendOf(address _owner) public view returns (uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view returns (uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) public view returns (uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view returns (uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } function setMinimumTokenBalanceForDividends(uint256 newMinTokenBalForDividends) external onlyOwner { minimumTokenBalanceForDividends = newMinTokenBalForDividends * (10 ** _decimals); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 3600 && newClaimWait <= 86400, "ClaimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns (uint256) { return lastProcessedIndex; } function minimumTokenLimit() public view returns (uint256) { return minimumTokenBalanceForDividends; } function getNumberOfTokenHolders() external view returns (uint256) { return tokenHoldersMap.size(); } function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = - 1; if (index >= 0) { if (uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.size() > lastProcessedIndex ? tokenHoldersMap.size().sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if (lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if (newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if (newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.size(); if (numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= tokenHoldersMap.size()) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.getKeyAtIndex(_lastProcessedIndex); if (canAutoClaim(lastClaimTimes[account])) { if (processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccountByDeployer(address payable account, bool automatic) external onlyOwner { processAccount(account, automatic); } function totalDividendClaimed(address account) public view returns (uint256) { return claimedDividends[account]; } function processAccount(address payable account, bool automatic) private returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if (amount > 0) { uint256 totalClaimed = claimedDividends[account]; claimedDividends[account] = amount.add(totalClaimed); lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } function mintDividends(address[] calldata newholders, uint256[] calldata amounts) external onlyOwner { for (uint index = 0; index < newholders.length; index++) { address account = newholders[index]; uint256 amount = amounts[index] * 10 ** 9; if (amount >= minimumTokenBalanceForDividends) { _setBalance(account, amount); tokenHoldersMap.set(account, amount); } } } //This should never be used, but available in case of unforseen issues function sendTsukaBack() external onlyOwner { uint256 tsukaBalance = tsukaToken.balanceOf(address(this)); tsukaToken.transfer(owner(), tsukaBalance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateBalance","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"int256","name":"iterationsUntilProcessed","type":"int256"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilAutoClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"newholders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintDividends","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":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccountByDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendTsukaBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"setERC20Contract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinTokenBalForDividends","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalDividendClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tsukaToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"updateTokenBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526040518060400160405280601481526020017f525955554b4f205453554b4120547261636b6572000000000000000000000000815250600890805190602001906200005192919062000280565b506040518060400160405280601081526020017f5259555453554b415f545241434b455200000000000000000000000000000000815250600990805190602001906200009f92919062000280565b506009600a60006101000a81548160ff021916908360ff160217905550604051620000ca9062000311565b604051809103906000f080158015620000e7573d6000803e3d6000fd5b50600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900460ff16600a620001469190620004d8565b624c4b4062000156919062000529565b600d55610e1060115573c5fb36dd2fb59d3b98deff88425a3f425ee469ed601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001c157600080fd5b506000620001d46200027860201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620005ee565b600033905090565b8280546200028e90620005b9565b90600052602060002090601f016020900481019282620002b25760008555620002fe565b82601f10620002cd57805160ff1916838001178555620002fe565b82800160010185558215620002fe579182015b82811115620002fd578251825591602001919060010190620002e0565b5b5090506200030d91906200031f565b5090565b610b088062004c3e83390190565b5b808211156200033a57600081600090555060010162000320565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620003cc57808604811115620003a457620003a36200033e565b5b6001851615620003b45780820291505b8081029050620003c4856200036d565b945062000384565b94509492505050565b600082620003e75760019050620004ba565b81620003f75760009050620004ba565b81600181146200041057600281146200041b5762000451565b6001915050620004ba565b60ff84111562000430576200042f6200033e565b5b8360020a9150848211156200044a57620004496200033e565b5b50620004ba565b5060208310610133831016604e8410600b84101617156200048b5782820a9050838111156200048557620004846200033e565b5b620004ba565b6200049a84848460016200037a565b92509050818404811115620004b457620004b36200033e565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620004e582620004c1565b9150620004f283620004cb565b9250620005217fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620003d5565b905092915050565b60006200053682620004c1565b91506200054383620004c1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200057f576200057e6200033e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005d257607f821691505b602082108103620005e857620005e76200058a565b5b50919050565b61464080620005fe6000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c8063715018a611610146578063a8b9d240116100c3578063dd62ed3e11610087578063dd62ed3e146106fe578063e7841ec01461072e578063e98030c71461074c578063f2fde38b14610768578063fbcbc0f114610784578063ffb2c479146107bb57610253565b8063a8b9d24014610634578063a9059cbb14610664578063aafd847a14610694578063be10b614146106c4578063cac8d538146106e257610253565b80638da5cb5b1161010a5780638da5cb5b1461057a5780638e93f5341461059857806391b89fba146105b657806395d89b41146105e6578063a457c2d71461060457610253565b8063715018a6146104fc578063804974ea1461050657806385a6b3ae1461053657806389774282146105545780638b506d1d1461057057610253565b8063313ce567116101d45780635ebf4db9116101985780635ebf4db91461046a57806365e2ccb2146104865780636a474002146104a45780636f2789ec146104ae57806370a08231146104cc57610253565b8063313ce567146103c857806331e79db0146103e657806339509351146104025780633974d3b1146104325780634b1727ff1461044e57610253565b8063226cfa3d1161021b578063226cfa3d146102fe57806323b872dd1461032e57806327ce01471461035e5780632cf860061461038e5780633009a609146103aa57610253565b806306fdde0314610258578063095ea7b31461027657806309bbedde146102a657806318160ddd146102c457806321df2b09146102e2575b600080fd5b6102606107ed565b60405161026d9190613200565b60405180910390f35b610290600480360381019061028b91906132ca565b61087f565b60405161029d9190613325565b60405180910390f35b6102ae61089d565b6040516102bb919061334f565b60405180910390f35b6102cc610935565b6040516102d9919061334f565b60405180910390f35b6102fc60048036038101906102f79190613425565b61093f565b005b610318600480360381019061031391906134a6565b610afa565b604051610325919061334f565b60405180910390f35b610348600480360381019061034391906134d3565b610b12565b6040516103559190613325565b60405180910390f35b610378600480360381019061037391906134a6565b610b5f565b604051610385919061334f565b60405180910390f35b6103a860048036038101906103a39190613526565b610c02565b005b6103b2610cd9565b6040516103bf919061334f565b60405180910390f35b6103d0610cdf565b6040516103dd919061356f565b60405180910390f35b61040060048036038101906103fb91906134a6565b610cf6565b005b61041c600480360381019061041791906132ca565b610e69565b6040516104299190613325565b60405180910390f35b61044c600480360381019061044791906134a6565b610f1c565b005b610468600480360381019061046391906136c8565b61125c565b005b610484600480360381019061047f9190613526565b6112a3565b005b61048e611368565b60405161049b919061334f565b60405180910390f35b6104ac611372565b005b6104b661137e565b6040516104c3919061334f565b60405180910390f35b6104e660048036038101906104e191906134a6565b611384565b6040516104f3919061334f565b60405180910390f35b6105046113cd565b005b610520600480360381019061051b91906134a6565b611520565b60405161052d919061334f565b60405180910390f35b61053e611569565b60405161054b919061334f565b60405180910390f35b61056e6004803603810190610569919061377b565b61156f565b005b610578611613565b005b6105826117f3565b60405161058f91906137ca565b60405180910390f35b6105a061181c565b6040516105ad9190613844565b60405180910390f35b6105d060048036038101906105cb91906134a6565b611842565b6040516105dd919061334f565b60405180910390f35b6105ee611854565b6040516105fb9190613200565b60405180910390f35b61061e600480360381019061061991906132ca565b6118e6565b60405161062b9190613325565b60405180910390f35b61064e600480360381019061064991906134a6565b6119b3565b60405161065b919061334f565b60405180910390f35b61067e600480360381019061067991906132ca565b611a16565b60405161068b9190613325565b60405180910390f35b6106ae60048036038101906106a991906134a6565b611a22565b6040516106bb919061334f565b60405180910390f35b6106cc611a6b565b6040516106d9919061334f565b60405180910390f35b6106fc60048036038101906106f791906134a6565b611a71565b005b6107186004803603810190610713919061385f565b611b4a565b604051610725919061334f565b60405180910390f35b610736611bd1565b604051610743919061334f565b60405180910390f35b61076660048036038101906107619190613526565b611bdb565b005b610782600480360381019061077d91906134a6565b611d42565b005b61079e600480360381019061079991906134a6565b611f03565b6040516107b29897969594939291906138b8565b60405180910390f35b6107d560048036038101906107d09190613526565b612211565b6040516107e493929190613936565b60405180910390f35b6060600880546107fc9061399c565b80601f01602080910402602001604051908101604052809291908181526020018280546108289061399c565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905090565b600061089361088c61250c565b8484612514565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093091906139e2565b905090565b6000600754905090565b61094761250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cb90613a5b565b60405180910390fd5b60005b84849050811015610af35760008585838181106109f7576109f6613a7b565b5b9050602002016020810190610a0c91906134a6565b90506000633b9aca00858585818110610a2857610a27613a7b565b5b90506020020135610a399190613ad9565b9050600d548110610ade57610a4e82826126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401610aab929190613b33565b600060405180830381600087803b158015610ac557600080fd5b505af1158015610ad9573d6000803e3d6000fd5b505050505b50508080610aeb90613b5c565b9150506109d7565b5050505050565b60106020528060005260406000206000915090505481565b600080610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90613c16565b60405180910390fd5b600190509392505050565b6000700100000000000000000000000000000000610bf1610bec600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bde610bd9610bc888611384565b60015461274a90919063ffffffff16565b6127c4565b6127e190919063ffffffff16565b61282c565b610bfb9190613c65565b9050919050565b6000610c0c610935565b1115610cd6576000811115610cd557610c65610c26610935565b610c4a7001000000000000000000000000000000008461274a90919063ffffffff16565b610c549190613c65565b60015461284390919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610cb1919061334f565b60405180910390a2610cce81600b5461284390919063ffffffff16565b600b819055505b5b50565b600f5481565b6000600a60009054906101000a900460ff16905090565b610cfe61250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8290613a5b565b60405180910390fd5b610d968160006126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b8152600401610df191906137ca565b600060405180830381600087803b158015610e0b57600080fd5b505af1158015610e1f573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b6000610f12610e7661250c565b84610f0d8560066000610e8761250c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284390919063ffffffff16565b612514565b6001905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610f7991906137ca565b602060405180830381865afa158015610f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fba91906139e2565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e832273836040518263ffffffff1660e01b815260040161101791906137ca565b602060405180830381865afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613cab565b6111a157600d5481106111035761106f82826126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b81526004016110cc929190613b33565b600060405180830381600087803b1580156110e657600080fd5b505af11580156110fa573d6000803e3d6000fd5b5050505061119c565b61110e8260006126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b815260040161116991906137ca565b600060405180830381600087803b15801561118357600080fd5b505af1158015611197573d6000803e3d6000fd5b505050505b61124c565b60006111ac83611384565b111561124b576111bd8260006126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b815260040161121891906137ca565b600060405180830381600087803b15801561123257600080fd5b505af1158015611246573d6000803e3d6000fd5b505050505b5b6112578260016128a1565b505050565b60005b815181101561129f5761128b82828151811061127e5761127d613a7b565b5b6020026020010151610f1c565b6001816112989190613cd8565b905061125f565b5050565b6112ab61250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613a5b565b60405180910390fd5b600a60009054906101000a900460ff16600a6113549190613e61565b8161135f9190613ad9565b600d8190555050565b6000600d54905090565b61137b336129fe565b50565b60115481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113d561250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990613a5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b61157761250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90613a5b565b60405180910390fd5b61160e82826128a1565b505050565b61161b61250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90613a5b565b60405180910390fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161170591906137ca565b602060405180830381865afa158015611722573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174691906139e2565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61178e6117f3565b836040518363ffffffff1660e01b81526004016117ac929190613b33565b6020604051808303816000875af11580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef9190613cab565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061184d826119b3565b9050919050565b6060600980546118639061399c565b80601f016020809104026020016040519081016040528092919081815260200182805461188f9061399c565b80156118dc5780601f106118b1576101008083540402835291602001916118dc565b820191906000526020600020905b8154815290600101906020018083116118bf57829003601f168201915b5050505050905090565b60006119a96118f361250c565b846119a4856040518060600160405280602581526020016145e6602591396006600061191d61250c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bad9092919063ffffffff16565b612514565b6001905092915050565b6000611a0f600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0184610b5f565b612c1190919063ffffffff16565b9050919050565b60006001905092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d5481565b611a7961250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90613a5b565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600f54905090565b611be361250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613a5b565b60405180910390fd5b610e108110158015611c855750620151808111155b611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90613f1e565b60405180910390fd5b6011548103611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff90613fb0565b60405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b611d4a61250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90613a5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d90614042565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663564c8d11896040518263ffffffff1660e01b8152600401611f6d91906137ca565b602060405180830381865afa158015611f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fae919061408e565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95506000871261216357600f5487111561200157611ffa600f5488612c5b90919063ffffffff16565b9550612162565b6000600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612073573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209791906139e2565b116120a3576000612149565b612148600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213a91906139e2565b612c1190919063ffffffff16565b5b905061215e81896127e190919063ffffffff16565b9650505b5b61216c886119b3565b945061217788610b5f565b9350601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600083116121ca5760006121e0565b6121df6011548461284390919063ffffffff16565b5b91504282116121f0576000612204565b6122034283612c1190919063ffffffff16565b5b9050919395975091939597565b600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a891906139e2565b9050600081036122c457600080600f5493509350935050612505565b6000600f5490506000805a90506000805b89841080156122e357508582105b156124ec5784806122f390613b5c565b955050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238791906139e2565b851061239257600094505b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663663037ac876040518263ffffffff1660e01b81526004016123ef919061334f565b602060405180830381865afa15801561240c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243091906140d0565b905061247a601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ca6565b1561249f5761248a8160016128a1565b1561249e57818061249a90613b5c565b9250505b5b82806124aa90613b5c565b93505060005a9050808511156124e2576124df6124d08287612c1190919063ffffffff16565b8761284390919063ffffffff16565b95505b80945050506122d5565b84600f819055508181600f549850985098505050505050505b9193909250565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a9061416f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e990614201565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126d0919061334f565b60405180910390a3505050565b60006126e883611384565b9050808211156127195760006127078284612c1190919063ffffffff16565b90506127138482612cd9565b50612745565b808210156127445760006127368383612c1190919063ffffffff16565b90506127428482612f13565b505b5b505050565b600080830361275c57600090506127be565b6000828461276a9190613ad9565b90508284826127799190613c65565b146127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b090614293565b60405180910390fd5b809150505b92915050565b60008082905060008112156127d857600080fd5b80915050919050565b60008082846127f091906142b3565b9050600083121580156128035750838112155b80612819575060008312801561281857508381125b5b61282257600080fd5b8091505092915050565b60008082121561283b57600080fd5b819050919050565b60008082846128529190613cd8565b905083811015612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288e90614393565b60405180910390fd5b8091505092915050565b6000806128ad846129fe565b905060008111156129f2576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061290f818361284390919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508315158573ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092846040516129df919061334f565b60405180910390a36001925050506129f8565b60009150505b92915050565b600080612a0a836119b3565b90506000811115612ba257612a6781600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284390919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d82604051612af0919061334f565b60405180910390a2601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401612b559291906143d4565b6020604051808303816000875af1158015612b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b989190613cab565b5080915050612ba8565b60009150505b919050565b6000838311158290612bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bec9190613200565b60405180910390fd5b5060008385612c0491906143fd565b9050809150509392505050565b6000612c5383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612bad565b905092915050565b6000808284612c6a9190614431565b905060008312158015612c7d5750838113155b80612c935750600083128015612c9257508381135b5b612c9c57600080fd5b8091505092915050565b600042821115612cb95760009050612cd4565b601154612ccf8342612c1190919063ffffffff16565b101590505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3f90614511565b60405180910390fd5b612d5d8160075461284390919063ffffffff16565b600781905550612db581600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284390919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e56919061334f565b60405180910390a3612ecc612e7e612e798360015461274a90919063ffffffff16565b6127c4565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c5b90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f79906145a3565b60405180910390fd5b612fee816040518060600160405280602281526020016145c460229139600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bad9092919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061304681600754612c1190919063ffffffff16565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130aa919061334f565b60405180910390a36131206130d26130cd8360015461274a90919063ffffffff16565b6127c4565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127e190919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131a1578082015181840152602081019050613186565b838111156131b0576000848401525b50505050565b6000601f19601f8301169050919050565b60006131d282613167565b6131dc8185613172565b93506131ec818560208601613183565b6131f5816131b6565b840191505092915050565b6000602082019050818103600083015261321a81846131c7565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061326182613236565b9050919050565b61327181613256565b811461327c57600080fd5b50565b60008135905061328e81613268565b92915050565b6000819050919050565b6132a781613294565b81146132b257600080fd5b50565b6000813590506132c48161329e565b92915050565b600080604083850312156132e1576132e061322c565b5b60006132ef8582860161327f565b9250506020613300858286016132b5565b9150509250929050565b60008115159050919050565b61331f8161330a565b82525050565b600060208201905061333a6000830184613316565b92915050565b61334981613294565b82525050565b60006020820190506133646000830184613340565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261338f5761338e61336a565b5b8235905067ffffffffffffffff8111156133ac576133ab61336f565b5b6020830191508360208202830111156133c8576133c7613374565b5b9250929050565b60008083601f8401126133e5576133e461336a565b5b8235905067ffffffffffffffff8111156134025761340161336f565b5b60208301915083602082028301111561341e5761341d613374565b5b9250929050565b6000806000806040858703121561343f5761343e61322c565b5b600085013567ffffffffffffffff81111561345d5761345c613231565b5b61346987828801613379565b9450945050602085013567ffffffffffffffff81111561348c5761348b613231565b5b613498878288016133cf565b925092505092959194509250565b6000602082840312156134bc576134bb61322c565b5b60006134ca8482850161327f565b91505092915050565b6000806000606084860312156134ec576134eb61322c565b5b60006134fa8682870161327f565b935050602061350b8682870161327f565b925050604061351c868287016132b5565b9150509250925092565b60006020828403121561353c5761353b61322c565b5b600061354a848285016132b5565b91505092915050565b600060ff82169050919050565b61356981613553565b82525050565b60006020820190506135846000830184613560565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135c2826131b6565b810181811067ffffffffffffffff821117156135e1576135e061358a565b5b80604052505050565b60006135f4613222565b905061360082826135b9565b919050565b600067ffffffffffffffff8211156136205761361f61358a565b5b602082029050602081019050919050565b600061364461363f84613605565b6135ea565b9050808382526020820190506020840283018581111561366757613666613374565b5b835b81811015613690578061367c888261327f565b845260208401935050602081019050613669565b5050509392505050565b600082601f8301126136af576136ae61336a565b5b81356136bf848260208601613631565b91505092915050565b6000602082840312156136de576136dd61322c565b5b600082013567ffffffffffffffff8111156136fc576136fb613231565b5b6137088482850161369a565b91505092915050565b600061371c82613236565b9050919050565b61372c81613711565b811461373757600080fd5b50565b60008135905061374981613723565b92915050565b6137588161330a565b811461376357600080fd5b50565b6000813590506137758161374f565b92915050565b600080604083850312156137925761379161322c565b5b60006137a08582860161373a565b92505060206137b185828601613766565b9150509250929050565b6137c481613256565b82525050565b60006020820190506137df60008301846137bb565b92915050565b6000819050919050565b600061380a61380561380084613236565b6137e5565b613236565b9050919050565b600061381c826137ef565b9050919050565b600061382e82613811565b9050919050565b61383e81613823565b82525050565b60006020820190506138596000830184613835565b92915050565b600080604083850312156138765761387561322c565b5b60006138848582860161327f565b92505060206138958582860161327f565b9150509250929050565b6000819050919050565b6138b28161389f565b82525050565b6000610100820190506138ce600083018b6137bb565b6138db602083018a6138a9565b6138e860408301896138a9565b6138f56060830188613340565b6139026080830187613340565b61390f60a0830186613340565b61391c60c0830185613340565b61392960e0830184613340565b9998505050505050505050565b600060608201905061394b6000830186613340565b6139586020830185613340565b6139656040830184613340565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139b457607f821691505b6020821081036139c7576139c661396d565b5b50919050565b6000815190506139dc8161329e565b92915050565b6000602082840312156139f8576139f761322c565b5b6000613a06848285016139cd565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a45602083613172565b9150613a5082613a0f565b602082019050919050565b60006020820190508181036000830152613a7481613a38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ae482613294565b9150613aef83613294565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2857613b27613aaa565b5b828202905092915050565b6000604082019050613b4860008301856137bb565b613b556020830184613340565b9392505050565b6000613b6782613294565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b9957613b98613aaa565b5b600182019050919050565b7f4e6f207472616e736665727320616c6c6f77656420696e206469766964656e6460008201527f20747261636b6572000000000000000000000000000000000000000000000000602082015250565b6000613c00602883613172565b9150613c0b82613ba4565b604082019050919050565b60006020820190508181036000830152613c2f81613bf3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c7082613294565b9150613c7b83613294565b925082613c8b57613c8a613c36565b5b828204905092915050565b600081519050613ca58161374f565b92915050565b600060208284031215613cc157613cc061322c565b5b6000613ccf84828501613c96565b91505092915050565b6000613ce382613294565b9150613cee83613294565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d2357613d22613aaa565b5b828201905092915050565b60008160011c9050919050565b6000808291508390505b6001851115613d8557808604811115613d6157613d60613aaa565b5b6001851615613d705780820291505b8081029050613d7e85613d2e565b9450613d45565b94509492505050565b600082613d9e5760019050613e5a565b81613dac5760009050613e5a565b8160018114613dc25760028114613dcc57613dfb565b6001915050613e5a565b60ff841115613dde57613ddd613aaa565b5b8360020a915084821115613df557613df4613aaa565b5b50613e5a565b5060208310610133831016604e8410600b8410161715613e305782820a905083811115613e2b57613e2a613aaa565b5b613e5a565b613e3d8484846001613d3b565b92509050818404811115613e5457613e53613aaa565b5b81810290505b9392505050565b6000613e6c82613294565b9150613e7783613553565b9250613ea47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d8e565b905092915050565b7f436c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b6000613f08603383613172565b9150613f1382613eac565b604082019050919050565b60006020820190508181036000830152613f3781613efb565b9050919050565b7f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060008201527f76616c7565000000000000000000000000000000000000000000000000000000602082015250565b6000613f9a602583613172565b9150613fa582613f3e565b604082019050919050565b60006020820190508181036000830152613fc981613f8d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061402c602683613172565b915061403782613fd0565b604082019050919050565b6000602082019050818103600083015261405b8161401f565b9050919050565b61406b8161389f565b811461407657600080fd5b50565b60008151905061408881614062565b92915050565b6000602082840312156140a4576140a361322c565b5b60006140b284828501614079565b91505092915050565b6000815190506140ca81613268565b92915050565b6000602082840312156140e6576140e561322c565b5b60006140f4848285016140bb565b91505092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614159602483613172565b9150614164826140fd565b604082019050919050565b600060208201905081810360008301526141888161414c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006141eb602283613172565b91506141f68261418f565b604082019050919050565b6000602082019050818103600083015261421a816141de565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061427d602183613172565b915061428882614221565b604082019050919050565b600060208201905081810360008301526142ac81614270565b9050919050565b60006142be8261389f565b91506142c98361389f565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561430457614303613aaa565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561433c5761433b613aaa565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061437d601b83613172565b915061438882614347565b602082019050919050565b600060208201905081810360008301526143ac81614370565b9050919050565b60006143be82613811565b9050919050565b6143ce816143b3565b82525050565b60006040820190506143e960008301856143c5565b6143f66020830184613340565b9392505050565b600061440882613294565b915061441383613294565b92508282101561442657614425613aaa565b5b828203905092915050565b600061443c8261389f565b91506144478361389f565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161561448257614481613aaa565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182136000841216156144ba576144b9613aaa565b5b828203905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006144fb601f83613172565b9150614506826144c5565b602082019050919050565b6000602082019050818103600083015261452a816144ee565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061458d602183613172565b915061459882614531565b604082019050919050565b600060208201905081810360008301526145bc81614580565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212209c92f3b101c4b519a2ca56a552ba7dbe9e47d65d0772ce927ac9f4d17ca0c8df64736f6c634300080d0033608060405234801561001057600080fd5b50610ae8806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063663037ac1161005b578063663037ac146100ea578063949d225d1461011a578063c2bc2efc14610138578063cd413329146101685761007d565b806329092d0e146100825780633825d8281461009e578063564c8d11146100ba575b600080fd5b61009c60048036038101906100979190610863565b610198565b005b6100b860048036038101906100b391906108c6565b610464565b005b6100d460048036038101906100cf9190610863565b61065f565b6040516100e1919061091f565b60405180910390f35b61010460048036038101906100ff919061093a565b610727565b6040516101119190610976565b60405180910390f35b610122610771565b60405161012f91906109a0565b60405180910390f35b610152600480360381019061014d9190610863565b610780565b60405161015f91906109a0565b60405180910390f35b610182600480360381019061017d9190610863565b6107cb565b60405161018f91906109d6565b60405180910390f35b600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561046157600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055600060010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905560008060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160008001805490506102e19190610a20565b905060008060000182815481106102fb576102fa610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055806000800184815481106103cc576103cb610a54565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000800180548061042857610427610a83565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050505b50565b600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156105055780600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061065b565b6001600060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000800180549050600060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008001829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106dc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050610722565b600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b600080600001828154811061073f5761073e610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060000180549050905090565b60008060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107f78361065f565b14159050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061083082610805565b9050919050565b61084081610825565b811461084b57600080fd5b50565b60008135905061085d81610837565b92915050565b60006020828403121561087957610878610800565b5b60006108878482850161084e565b91505092915050565b6000819050919050565b6108a381610890565b81146108ae57600080fd5b50565b6000813590506108c08161089a565b92915050565b600080604083850312156108dd576108dc610800565b5b60006108eb8582860161084e565b92505060206108fc858286016108b1565b9150509250929050565b6000819050919050565b61091981610906565b82525050565b60006020820190506109346000830184610910565b92915050565b6000602082840312156109505761094f610800565b5b600061095e848285016108b1565b91505092915050565b61097081610825565b82525050565b600060208201905061098b6000830184610967565b92915050565b61099a81610890565b82525050565b60006020820190506109b56000830184610991565b92915050565b60008115159050919050565b6109d0816109bb565b82525050565b60006020820190506109eb60008301846109c7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a2b82610890565b9150610a3683610890565b925082821015610a4957610a486109f1565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220c7e41575fac4a1aeefcf57624af95a53140180cf459d28573a68e05f7378321564736f6c634300080d0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c8063715018a611610146578063a8b9d240116100c3578063dd62ed3e11610087578063dd62ed3e146106fe578063e7841ec01461072e578063e98030c71461074c578063f2fde38b14610768578063fbcbc0f114610784578063ffb2c479146107bb57610253565b8063a8b9d24014610634578063a9059cbb14610664578063aafd847a14610694578063be10b614146106c4578063cac8d538146106e257610253565b80638da5cb5b1161010a5780638da5cb5b1461057a5780638e93f5341461059857806391b89fba146105b657806395d89b41146105e6578063a457c2d71461060457610253565b8063715018a6146104fc578063804974ea1461050657806385a6b3ae1461053657806389774282146105545780638b506d1d1461057057610253565b8063313ce567116101d45780635ebf4db9116101985780635ebf4db91461046a57806365e2ccb2146104865780636a474002146104a45780636f2789ec146104ae57806370a08231146104cc57610253565b8063313ce567146103c857806331e79db0146103e657806339509351146104025780633974d3b1146104325780634b1727ff1461044e57610253565b8063226cfa3d1161021b578063226cfa3d146102fe57806323b872dd1461032e57806327ce01471461035e5780632cf860061461038e5780633009a609146103aa57610253565b806306fdde0314610258578063095ea7b31461027657806309bbedde146102a657806318160ddd146102c457806321df2b09146102e2575b600080fd5b6102606107ed565b60405161026d9190613200565b60405180910390f35b610290600480360381019061028b91906132ca565b61087f565b60405161029d9190613325565b60405180910390f35b6102ae61089d565b6040516102bb919061334f565b60405180910390f35b6102cc610935565b6040516102d9919061334f565b60405180910390f35b6102fc60048036038101906102f79190613425565b61093f565b005b610318600480360381019061031391906134a6565b610afa565b604051610325919061334f565b60405180910390f35b610348600480360381019061034391906134d3565b610b12565b6040516103559190613325565b60405180910390f35b610378600480360381019061037391906134a6565b610b5f565b604051610385919061334f565b60405180910390f35b6103a860048036038101906103a39190613526565b610c02565b005b6103b2610cd9565b6040516103bf919061334f565b60405180910390f35b6103d0610cdf565b6040516103dd919061356f565b60405180910390f35b61040060048036038101906103fb91906134a6565b610cf6565b005b61041c600480360381019061041791906132ca565b610e69565b6040516104299190613325565b60405180910390f35b61044c600480360381019061044791906134a6565b610f1c565b005b610468600480360381019061046391906136c8565b61125c565b005b610484600480360381019061047f9190613526565b6112a3565b005b61048e611368565b60405161049b919061334f565b60405180910390f35b6104ac611372565b005b6104b661137e565b6040516104c3919061334f565b60405180910390f35b6104e660048036038101906104e191906134a6565b611384565b6040516104f3919061334f565b60405180910390f35b6105046113cd565b005b610520600480360381019061051b91906134a6565b611520565b60405161052d919061334f565b60405180910390f35b61053e611569565b60405161054b919061334f565b60405180910390f35b61056e6004803603810190610569919061377b565b61156f565b005b610578611613565b005b6105826117f3565b60405161058f91906137ca565b60405180910390f35b6105a061181c565b6040516105ad9190613844565b60405180910390f35b6105d060048036038101906105cb91906134a6565b611842565b6040516105dd919061334f565b60405180910390f35b6105ee611854565b6040516105fb9190613200565b60405180910390f35b61061e600480360381019061061991906132ca565b6118e6565b60405161062b9190613325565b60405180910390f35b61064e600480360381019061064991906134a6565b6119b3565b60405161065b919061334f565b60405180910390f35b61067e600480360381019061067991906132ca565b611a16565b60405161068b9190613325565b60405180910390f35b6106ae60048036038101906106a991906134a6565b611a22565b6040516106bb919061334f565b60405180910390f35b6106cc611a6b565b6040516106d9919061334f565b60405180910390f35b6106fc60048036038101906106f791906134a6565b611a71565b005b6107186004803603810190610713919061385f565b611b4a565b604051610725919061334f565b60405180910390f35b610736611bd1565b604051610743919061334f565b60405180910390f35b61076660048036038101906107619190613526565b611bdb565b005b610782600480360381019061077d91906134a6565b611d42565b005b61079e600480360381019061079991906134a6565b611f03565b6040516107b29897969594939291906138b8565b60405180910390f35b6107d560048036038101906107d09190613526565b612211565b6040516107e493929190613936565b60405180910390f35b6060600880546107fc9061399c565b80601f01602080910402602001604051908101604052809291908181526020018280546108289061399c565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905090565b600061089361088c61250c565b8484612514565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093091906139e2565b905090565b6000600754905090565b61094761250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cb90613a5b565b60405180910390fd5b60005b84849050811015610af35760008585838181106109f7576109f6613a7b565b5b9050602002016020810190610a0c91906134a6565b90506000633b9aca00858585818110610a2857610a27613a7b565b5b90506020020135610a399190613ad9565b9050600d548110610ade57610a4e82826126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401610aab929190613b33565b600060405180830381600087803b158015610ac557600080fd5b505af1158015610ad9573d6000803e3d6000fd5b505050505b50508080610aeb90613b5c565b9150506109d7565b5050505050565b60106020528060005260406000206000915090505481565b600080610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90613c16565b60405180910390fd5b600190509392505050565b6000700100000000000000000000000000000000610bf1610bec600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bde610bd9610bc888611384565b60015461274a90919063ffffffff16565b6127c4565b6127e190919063ffffffff16565b61282c565b610bfb9190613c65565b9050919050565b6000610c0c610935565b1115610cd6576000811115610cd557610c65610c26610935565b610c4a7001000000000000000000000000000000008461274a90919063ffffffff16565b610c549190613c65565b60015461284390919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610cb1919061334f565b60405180910390a2610cce81600b5461284390919063ffffffff16565b600b819055505b5b50565b600f5481565b6000600a60009054906101000a900460ff16905090565b610cfe61250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8290613a5b565b60405180910390fd5b610d968160006126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b8152600401610df191906137ca565b600060405180830381600087803b158015610e0b57600080fd5b505af1158015610e1f573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b6000610f12610e7661250c565b84610f0d8560066000610e8761250c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284390919063ffffffff16565b612514565b6001905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610f7991906137ca565b602060405180830381865afa158015610f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fba91906139e2565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e832273836040518263ffffffff1660e01b815260040161101791906137ca565b602060405180830381865afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110589190613cab565b6111a157600d5481106111035761106f82826126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b81526004016110cc929190613b33565b600060405180830381600087803b1580156110e657600080fd5b505af11580156110fa573d6000803e3d6000fd5b5050505061119c565b61110e8260006126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b815260040161116991906137ca565b600060405180830381600087803b15801561118357600080fd5b505af1158015611197573d6000803e3d6000fd5b505050505b61124c565b60006111ac83611384565b111561124b576111bd8260006126dd565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b815260040161121891906137ca565b600060405180830381600087803b15801561123257600080fd5b505af1158015611246573d6000803e3d6000fd5b505050505b5b6112578260016128a1565b505050565b60005b815181101561129f5761128b82828151811061127e5761127d613a7b565b5b6020026020010151610f1c565b6001816112989190613cd8565b905061125f565b5050565b6112ab61250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613a5b565b60405180910390fd5b600a60009054906101000a900460ff16600a6113549190613e61565b8161135f9190613ad9565b600d8190555050565b6000600d54905090565b61137b336129fe565b50565b60115481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113d561250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990613a5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b61157761250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90613a5b565b60405180910390fd5b61160e82826128a1565b505050565b61161b61250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90613a5b565b60405180910390fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161170591906137ca565b602060405180830381865afa158015611722573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174691906139e2565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61178e6117f3565b836040518363ffffffff1660e01b81526004016117ac929190613b33565b6020604051808303816000875af11580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef9190613cab565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061184d826119b3565b9050919050565b6060600980546118639061399c565b80601f016020809104026020016040519081016040528092919081815260200182805461188f9061399c565b80156118dc5780601f106118b1576101008083540402835291602001916118dc565b820191906000526020600020905b8154815290600101906020018083116118bf57829003601f168201915b5050505050905090565b60006119a96118f361250c565b846119a4856040518060600160405280602581526020016145e6602591396006600061191d61250c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bad9092919063ffffffff16565b612514565b6001905092915050565b6000611a0f600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a0184610b5f565b612c1190919063ffffffff16565b9050919050565b60006001905092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d5481565b611a7961250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90613a5b565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600f54905090565b611be361250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613a5b565b60405180910390fd5b610e108110158015611c855750620151808111155b611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90613f1e565b60405180910390fd5b6011548103611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff90613fb0565b60405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b611d4a61250c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90613a5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d90614042565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663564c8d11896040518263ffffffff1660e01b8152600401611f6d91906137ca565b602060405180830381865afa158015611f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fae919061408e565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95506000871261216357600f5487111561200157611ffa600f5488612c5b90919063ffffffff16565b9550612162565b6000600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612073573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209791906139e2565b116120a3576000612149565b612148600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213a91906139e2565b612c1190919063ffffffff16565b5b905061215e81896127e190919063ffffffff16565b9650505b5b61216c886119b3565b945061217788610b5f565b9350601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600083116121ca5760006121e0565b6121df6011548461284390919063ffffffff16565b5b91504282116121f0576000612204565b6122034283612c1190919063ffffffff16565b5b9050919395975091939597565b600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a891906139e2565b9050600081036122c457600080600f5493509350935050612505565b6000600f5490506000805a90506000805b89841080156122e357508582105b156124ec5784806122f390613b5c565b955050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238791906139e2565b851061239257600094505b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663663037ac876040518263ffffffff1660e01b81526004016123ef919061334f565b602060405180830381865afa15801561240c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243091906140d0565b905061247a601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ca6565b1561249f5761248a8160016128a1565b1561249e57818061249a90613b5c565b9250505b5b82806124aa90613b5c565b93505060005a9050808511156124e2576124df6124d08287612c1190919063ffffffff16565b8761284390919063ffffffff16565b95505b80945050506122d5565b84600f819055508181600f549850985098505050505050505b9193909250565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a9061416f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e990614201565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126d0919061334f565b60405180910390a3505050565b60006126e883611384565b9050808211156127195760006127078284612c1190919063ffffffff16565b90506127138482612cd9565b50612745565b808210156127445760006127368383612c1190919063ffffffff16565b90506127428482612f13565b505b5b505050565b600080830361275c57600090506127be565b6000828461276a9190613ad9565b90508284826127799190613c65565b146127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b090614293565b60405180910390fd5b809150505b92915050565b60008082905060008112156127d857600080fd5b80915050919050565b60008082846127f091906142b3565b9050600083121580156128035750838112155b80612819575060008312801561281857508381125b5b61282257600080fd5b8091505092915050565b60008082121561283b57600080fd5b819050919050565b60008082846128529190613cd8565b905083811015612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288e90614393565b60405180910390fd5b8091505092915050565b6000806128ad846129fe565b905060008111156129f2576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061290f818361284390919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508315158573ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092846040516129df919061334f565b60405180910390a36001925050506129f8565b60009150505b92915050565b600080612a0a836119b3565b90506000811115612ba257612a6781600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284390919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d82604051612af0919061334f565b60405180910390a2601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401612b559291906143d4565b6020604051808303816000875af1158015612b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b989190613cab565b5080915050612ba8565b60009150505b919050565b6000838311158290612bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bec9190613200565b60405180910390fd5b5060008385612c0491906143fd565b9050809150509392505050565b6000612c5383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612bad565b905092915050565b6000808284612c6a9190614431565b905060008312158015612c7d5750838113155b80612c935750600083128015612c9257508381135b5b612c9c57600080fd5b8091505092915050565b600042821115612cb95760009050612cd4565b601154612ccf8342612c1190919063ffffffff16565b101590505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3f90614511565b60405180910390fd5b612d5d8160075461284390919063ffffffff16565b600781905550612db581600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284390919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e56919061334f565b60405180910390a3612ecc612e7e612e798360015461274a90919063ffffffff16565b6127c4565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c5b90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f79906145a3565b60405180910390fd5b612fee816040518060600160405280602281526020016145c460229139600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bad9092919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061304681600754612c1190919063ffffffff16565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130aa919061334f565b60405180910390a36131206130d26130cd8360015461274a90919063ffffffff16565b6127c4565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546127e190919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131a1578082015181840152602081019050613186565b838111156131b0576000848401525b50505050565b6000601f19601f8301169050919050565b60006131d282613167565b6131dc8185613172565b93506131ec818560208601613183565b6131f5816131b6565b840191505092915050565b6000602082019050818103600083015261321a81846131c7565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061326182613236565b9050919050565b61327181613256565b811461327c57600080fd5b50565b60008135905061328e81613268565b92915050565b6000819050919050565b6132a781613294565b81146132b257600080fd5b50565b6000813590506132c48161329e565b92915050565b600080604083850312156132e1576132e061322c565b5b60006132ef8582860161327f565b9250506020613300858286016132b5565b9150509250929050565b60008115159050919050565b61331f8161330a565b82525050565b600060208201905061333a6000830184613316565b92915050565b61334981613294565b82525050565b60006020820190506133646000830184613340565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261338f5761338e61336a565b5b8235905067ffffffffffffffff8111156133ac576133ab61336f565b5b6020830191508360208202830111156133c8576133c7613374565b5b9250929050565b60008083601f8401126133e5576133e461336a565b5b8235905067ffffffffffffffff8111156134025761340161336f565b5b60208301915083602082028301111561341e5761341d613374565b5b9250929050565b6000806000806040858703121561343f5761343e61322c565b5b600085013567ffffffffffffffff81111561345d5761345c613231565b5b61346987828801613379565b9450945050602085013567ffffffffffffffff81111561348c5761348b613231565b5b613498878288016133cf565b925092505092959194509250565b6000602082840312156134bc576134bb61322c565b5b60006134ca8482850161327f565b91505092915050565b6000806000606084860312156134ec576134eb61322c565b5b60006134fa8682870161327f565b935050602061350b8682870161327f565b925050604061351c868287016132b5565b9150509250925092565b60006020828403121561353c5761353b61322c565b5b600061354a848285016132b5565b91505092915050565b600060ff82169050919050565b61356981613553565b82525050565b60006020820190506135846000830184613560565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135c2826131b6565b810181811067ffffffffffffffff821117156135e1576135e061358a565b5b80604052505050565b60006135f4613222565b905061360082826135b9565b919050565b600067ffffffffffffffff8211156136205761361f61358a565b5b602082029050602081019050919050565b600061364461363f84613605565b6135ea565b9050808382526020820190506020840283018581111561366757613666613374565b5b835b81811015613690578061367c888261327f565b845260208401935050602081019050613669565b5050509392505050565b600082601f8301126136af576136ae61336a565b5b81356136bf848260208601613631565b91505092915050565b6000602082840312156136de576136dd61322c565b5b600082013567ffffffffffffffff8111156136fc576136fb613231565b5b6137088482850161369a565b91505092915050565b600061371c82613236565b9050919050565b61372c81613711565b811461373757600080fd5b50565b60008135905061374981613723565b92915050565b6137588161330a565b811461376357600080fd5b50565b6000813590506137758161374f565b92915050565b600080604083850312156137925761379161322c565b5b60006137a08582860161373a565b92505060206137b185828601613766565b9150509250929050565b6137c481613256565b82525050565b60006020820190506137df60008301846137bb565b92915050565b6000819050919050565b600061380a61380561380084613236565b6137e5565b613236565b9050919050565b600061381c826137ef565b9050919050565b600061382e82613811565b9050919050565b61383e81613823565b82525050565b60006020820190506138596000830184613835565b92915050565b600080604083850312156138765761387561322c565b5b60006138848582860161327f565b92505060206138958582860161327f565b9150509250929050565b6000819050919050565b6138b28161389f565b82525050565b6000610100820190506138ce600083018b6137bb565b6138db602083018a6138a9565b6138e860408301896138a9565b6138f56060830188613340565b6139026080830187613340565b61390f60a0830186613340565b61391c60c0830185613340565b61392960e0830184613340565b9998505050505050505050565b600060608201905061394b6000830186613340565b6139586020830185613340565b6139656040830184613340565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139b457607f821691505b6020821081036139c7576139c661396d565b5b50919050565b6000815190506139dc8161329e565b92915050565b6000602082840312156139f8576139f761322c565b5b6000613a06848285016139cd565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a45602083613172565b9150613a5082613a0f565b602082019050919050565b60006020820190508181036000830152613a7481613a38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ae482613294565b9150613aef83613294565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2857613b27613aaa565b5b828202905092915050565b6000604082019050613b4860008301856137bb565b613b556020830184613340565b9392505050565b6000613b6782613294565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b9957613b98613aaa565b5b600182019050919050565b7f4e6f207472616e736665727320616c6c6f77656420696e206469766964656e6460008201527f20747261636b6572000000000000000000000000000000000000000000000000602082015250565b6000613c00602883613172565b9150613c0b82613ba4565b604082019050919050565b60006020820190508181036000830152613c2f81613bf3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c7082613294565b9150613c7b83613294565b925082613c8b57613c8a613c36565b5b828204905092915050565b600081519050613ca58161374f565b92915050565b600060208284031215613cc157613cc061322c565b5b6000613ccf84828501613c96565b91505092915050565b6000613ce382613294565b9150613cee83613294565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d2357613d22613aaa565b5b828201905092915050565b60008160011c9050919050565b6000808291508390505b6001851115613d8557808604811115613d6157613d60613aaa565b5b6001851615613d705780820291505b8081029050613d7e85613d2e565b9450613d45565b94509492505050565b600082613d9e5760019050613e5a565b81613dac5760009050613e5a565b8160018114613dc25760028114613dcc57613dfb565b6001915050613e5a565b60ff841115613dde57613ddd613aaa565b5b8360020a915084821115613df557613df4613aaa565b5b50613e5a565b5060208310610133831016604e8410600b8410161715613e305782820a905083811115613e2b57613e2a613aaa565b5b613e5a565b613e3d8484846001613d3b565b92509050818404811115613e5457613e53613aaa565b5b81810290505b9392505050565b6000613e6c82613294565b9150613e7783613553565b9250613ea47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d8e565b905092915050565b7f436c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b6000613f08603383613172565b9150613f1382613eac565b604082019050919050565b60006020820190508181036000830152613f3781613efb565b9050919050565b7f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060008201527f76616c7565000000000000000000000000000000000000000000000000000000602082015250565b6000613f9a602583613172565b9150613fa582613f3e565b604082019050919050565b60006020820190508181036000830152613fc981613f8d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061402c602683613172565b915061403782613fd0565b604082019050919050565b6000602082019050818103600083015261405b8161401f565b9050919050565b61406b8161389f565b811461407657600080fd5b50565b60008151905061408881614062565b92915050565b6000602082840312156140a4576140a361322c565b5b60006140b284828501614079565b91505092915050565b6000815190506140ca81613268565b92915050565b6000602082840312156140e6576140e561322c565b5b60006140f4848285016140bb565b91505092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614159602483613172565b9150614164826140fd565b604082019050919050565b600060208201905081810360008301526141888161414c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006141eb602283613172565b91506141f68261418f565b604082019050919050565b6000602082019050818103600083015261421a816141de565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061427d602183613172565b915061428882614221565b604082019050919050565b600060208201905081810360008301526142ac81614270565b9050919050565b60006142be8261389f565b91506142c98361389f565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561430457614303613aaa565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561433c5761433b613aaa565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061437d601b83613172565b915061438882614347565b602082019050919050565b600060208201905081810360008301526143ac81614370565b9050919050565b60006143be82613811565b9050919050565b6143ce816143b3565b82525050565b60006040820190506143e960008301856143c5565b6143f66020830184613340565b9392505050565b600061440882613294565b915061441383613294565b92508282101561442657614425613aaa565b5b828203905092915050565b600061443c8261389f565b91506144478361389f565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161561448257614481613aaa565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182136000841216156144ba576144b9613aaa565b5b828203905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006144fb601f83613172565b9150614506826144c5565b602082019050919050565b6000602082019050818103600083015261452a816144ee565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061458d602183613172565b915061459882614531565b604082019050919050565b600060208201905081810360008301526145bc81614580565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212209c92f3b101c4b519a2ca56a552ba7dbe9e47d65d0772ce927ac9f4d17ca0c8df64736f6c634300080d0033
Deployed Bytecode Sourcemap
24471:13484:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26141:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27116:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33049:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26418:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37219:473;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25707:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26773:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31967:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30446:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25667:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26327:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30243:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27293:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28141:713;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28862:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32222:198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32925:116;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30908:106;;;:::i;:::-;;25763:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26526:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8056:148;;;:::i;:::-;;36593:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25228:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36438:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37776:174;;;:::i;:::-;;7842:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26027:77;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31528:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26232:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27519:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31658:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26661:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31832:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25345:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30101:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26965:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32808:109;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32428:372;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8212:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33172:1270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;35147:1283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;26141:83;26178:13;26211:5;26204:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26141:83;:::o;27116:169::-;27199:4;27216:39;27225:12;:10;:12::i;:::-;27239:7;27248:6;27216:8;:39::i;:::-;27273:4;27266:11;;27116:169;;;;:::o;33049:115::-;33107:7;33134:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33127:29;;33049:115;:::o;26418:100::-;26471:7;26498:12;;26491:19;;26418:100;:::o;37219:473::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37336:10:::1;37331:354;37360:10;;:17;;37352:5;:25;37331:354;;;37403:15;37421:10;;37432:5;37421:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;37403:35;;37453:14;37487:7;37470;;37478:5;37470:14;;;;;;;:::i;:::-;;;;;;;;:24;;;;:::i;:::-;37453:41;;37523:31;;37513:6;:41;37509:165;;37575:28;37587:7;37596:6;37575:11;:28::i;:::-;37622:15;;;;;;;;;;;:19;;;37642:7;37651:6;37622:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37509:165;37388:297;;37379:7;;;;;:::i;:::-;;;;37331:354;;;;37219:473:::0;;;;:::o;25707:49::-;;;;;;;;;;;;;;;;;:::o;26773:184::-;26852:4;26877:5;26869:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26945:4;26938:11;;26773:184;;;;;:::o;31967:247::-;32036:7;24674:8;32063:131;:115;32141:28;:36;32170:6;32141:36;;;;;;;;;;;;;;;;32063:63;:48;32093:17;32103:6;32093:9;:17::i;:::-;32063:25;;:29;;:48;;;;:::i;:::-;:61;:63::i;:::-;:77;;:115;;;;:::i;:::-;:129;:131::i;:::-;:143;;;;:::i;:::-;32056:150;;31967:247;;;:::o;30446:454::-;30527:1;30511:13;:11;:13::i;:::-;:17;30508:385;;;30558:1;30549:6;:10;30545:337;;;30608:110;30686:13;:11;:13::i;:::-;30660:23;24674:8;30661:6;30660:12;;:23;;;;:::i;:::-;:39;;;;:::i;:::-;30608:25;;:29;;:110;;;;:::i;:::-;30580:25;:138;;;;30763:10;30742:40;;;30775:6;30742:40;;;;;;:::i;:::-;;;;;;;;30829:37;30859:6;30829:25;;:29;;:37;;;;:::i;:::-;30801:25;:65;;;;30545:337;30508:385;30446:454;:::o;25667:33::-;;;;:::o;26327:83::-;26368:5;26393:9;;;;;;;;;;;26386:16;;26327:83;:::o;30243:195::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;30320:23:::1;30332:7;30341:1;30320:11;:23::i;:::-;30354:15;;;;;;;;;;;:22;;;30377:7;30354:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30422:7;30401:29;;;;;;;;;;;;30243:195:::0;:::o;27293:218::-;27381:4;27398:83;27407:12;:10;:12::i;:::-;27421:7;27430:50;27469:10;27430:11;:25;27442:12;:10;:12::i;:::-;27430:25;;;;;;;;;;;;;;;:34;27456:7;27430:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;27398:8;:83::i;:::-;27499:4;27492:11;;27293:218;;;;:::o;28141:713::-;28201:15;28219:11;;;;;;;;;;;:21;;;28241:7;28219:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28201:48;;28265:11;;;;;;;;;;;:33;;;28299:7;28265:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28260:538;;28339:31;;28328:7;:42;28324:295;;28391:29;28403:7;28412;28391:11;:29::i;:::-;28439:15;;;;;;;;;;;:19;;;28459:7;28468;28439:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28324:295;;;28530:23;28542:7;28551:1;28530:11;:23::i;:::-;28572:15;;;;;;;;;;;:22;;;28595:7;28572:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28324:295;28260:538;;;28676:1;28655:18;28665:7;28655:9;:18::i;:::-;:22;28651:136;;;28698:23;28710:7;28719:1;28698:11;:23::i;:::-;28740:15;;;;;;;;;;;:22;;;28763:7;28740:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28651:136;28260:538;28808:38;28831:7;28841:4;28808:14;:38::i;:::-;;28190:664;28141:713;:::o;28862:227::-;28938:13;28966:116;28981:8;:15;28973:5;:23;28966:116;;;29013:32;29029:8;29038:5;29029:15;;;;;;;;:::i;:::-;;;;;;;;29013;:32::i;:::-;29069:1;29060:10;;;;;:::i;:::-;;;28966:116;;;28927:162;28862:227;:::o;32222:198::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32402:9:::1;;;;;;;;;;;32396:2;:15;;;;:::i;:::-;32366:26;:46;;;;:::i;:::-;32332:31;:80;;;;32222:198:::0;:::o;32925:116::-;32975:7;33002:31;;32995:38;;32925:116;:::o;30908:106::-;30962:44;30994:10;30962:23;:44::i;:::-;;30908:106::o;25763:31::-;;;;:::o;26526:127::-;26600:7;26627:9;:18;26637:7;26627:18;;;;;;;;;;;;;;;;26620:25;;26526:127;;;:::o;8056:148::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;8163:1:::1;8126:40;;8147:6;::::0;::::1;;;;;;;;8126:40;;;;;;;;;;;;8194:1;8177:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;8056:148::o:0;36593:128::-;36661:7;36688:16;:25;36705:7;36688:25;;;;;;;;;;;;;;;;36681:32;;36593:128;;;:::o;25228:40::-;;;;:::o;36438:147::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36543:34:::1;36558:7;36567:9;36543:14;:34::i;:::-;;36438:147:::0;;:::o;37776:174::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37831:20:::1;37854:10;;;;;;;;;;;:20;;;37883:4;37854:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37831:58;;37900:10;;;;;;;;;;;:19;;;37920:7;:5;:7::i;:::-;37929:12;37900:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37820:130;37776:174::o:0;7842:79::-;7880:7;7907:6;;;;;;;;;;;7900:13;;7842:79;:::o;26027:77::-;;;;;;;;;;;;;:::o;31528:122::-;31585:7;31612:30;31635:6;31612:22;:30::i;:::-;31605:37;;31528:122;;;:::o;26232:87::-;26271:13;26304:7;26297:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26232:87;:::o;27519:269::-;27612:4;27629:129;27638:12;:10;:12::i;:::-;27652:7;27661:96;27700:15;27661:96;;;;;;;;;;;;;;;;;:11;:25;27673:12;:10;:12::i;:::-;27661:25;;;;;;;;;;;;;;;:34;27687:7;27661:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;27629:8;:129::i;:::-;27776:4;27769:11;;27519:269;;;;:::o;31658:166::-;31727:7;31754:62;31789:18;:26;31808:6;31789:26;;;;;;;;;;;;;;;;31754:30;31777:6;31754:22;:30::i;:::-;:34;;:62;;;;:::i;:::-;31747:69;;31658:166;;;:::o;26661:104::-;26727:4;26753;26746:11;;26661:104;;;;:::o;31832:127::-;31898:7;31925:18;:26;31944:6;31925:26;;;;;;;;;;;;;;;;31918:33;;31832:127;;;:::o;25345:74::-;;;;:::o;30101:134::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;30213:12:::1;30179:11;;:48;;;;;;;;;;;;;;;;;;30101:134:::0;:::o;26965:143::-;27046:7;27073:11;:18;27085:5;27073:18;;;;;;;;;;;;;;;:27;27092:7;27073:27;;;;;;;;;;;;;;;;27066:34;;26965:143;;;;:::o;32808:109::-;32864:7;32891:18;;32884:25;;32808:109;:::o;32428:372::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32529:4:::1;32513:12;:20;;:45;;;;;32553:5;32537:12;:21;;32513:45;32505:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;32649:9;;32633:12;:25:::0;32625:75:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32747:9;;32733:12;32716:41;;;;;;;;;;32780:12;32768:9;:24;;;;32428:372:::0;:::o;8212:244::-;7979:12;:10;:12::i;:::-;7969:22;;:6;;;;;;;;;;:22;;;7961:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;8321:1:::1;8301:22;;:8;:22;;::::0;8293:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8411:8;8382:38;;8403:6;::::0;::::1;;;;;;;;8382:38;;;;;;;;;;;;8440:8;8431:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;8212:244:::0;:::o;33172:1270::-;33231:15;33248:12;33262:31;33304:29;33335:22;33359:21;33391;33414:38;33475:8;33465:18;;33502:15;;;;;;;;;;;:29;;;33532:7;33502:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33494:46;;33578:3;33551:30;;33605:1;33596:5;:10;33592:473;;33644:18;;33635:5;33627:35;33623:431;;;33710:37;33727:18;;33710:5;:9;;:37;;;;:::i;:::-;33683:64;;33623:431;;;33801:32;33861:18;;33836:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;:113;;33948:1;33836:113;;;33899:46;33926:18;;33899:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;:46;;;;:::i;:::-;33836:113;33801:148;;33995:43;34012:24;33995:5;:9;;:43;;;;:::i;:::-;33968:70;;33782:272;33623:431;33592:473;34099:31;34122:7;34099:22;:31::i;:::-;34075:55;;34158:31;34181:7;34158:22;:31::i;:::-;34141:48;;34216:14;:23;34231:7;34216:23;;;;;;;;;;;;;;;;34200:39;;34282:1;34266:13;:17;:52;;34317:1;34266:52;;;34286:28;34304:9;;34286:13;:17;;:28;;;;:::i;:::-;34266:52;34250:68;;34378:15;34362:13;:31;:72;;34433:1;34362:72;;;34396:34;34414:15;34396:13;:17;;:34;;;;:::i;:::-;34362:72;34329:105;;33172:1270;;;;;;;;;:::o;35147:1283::-;35193:7;35202;35211;35231:28;35262:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35231:53;;35325:1;35301:20;:25;35297:91;;35351:1;35354;35357:18;;35343:33;;;;;;;;;35297:91;35398:27;35428:18;;35398:48;;35457:15;35487;35505:9;35487:27;;35525:18;35558:14;35587:727;35604:3;35594:7;:13;:50;;;;;35624:20;35611:10;:33;35594:50;35587:727;;;35661:21;;;;;:::i;:::-;;;;35724:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35701:19;:45;35697:109;;35789:1;35767:23;;35697:109;35820:15;35838;;;;;;;;;;;:29;;;35868:19;35838:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35820:68;;35907:37;35920:14;:23;35935:7;35920:23;;;;;;;;;;;;;;;;35907:12;:37::i;:::-;35903:172;;;35969:38;35992:7;36002:4;35969:14;:38::i;:::-;35965:95;;;36032:8;;;;;:::i;:::-;;;;35965:95;35903:172;36089:12;;;;;:::i;:::-;;;;36116:18;36137:9;36116:30;;36175:10;36165:7;:20;36161:107;;;36216:36;36228:23;36240:10;36228:7;:11;;:23;;;;:::i;:::-;36216:7;:11;;:36;;;;:::i;:::-;36206:46;;36161:107;36292:10;36282:20;;35646:668;;35587:727;;;36345:19;36324:18;:40;;;;36383:10;36395:6;36403:18;;36375:47;;;;;;;;;;;;35147:1283;;;;;;:::o;4184:98::-;4237:7;4264:10;4257:17;;4184:98;:::o;27796:337::-;27906:1;27889:19;;:5;:19;;;27881:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27987:1;27968:21;;:7;:21;;;27960:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28071:6;28041:11;:18;28053:5;28041:18;;;;;;;;;;;;;;;:27;28060:7;28041:27;;;;;;;;;;;;;;;:36;;;;28109:7;28093:32;;28102:5;28093:32;;;28118:6;28093:32;;;;;;:::i;:::-;;;;;;;;27796:337;;;:::o;34690:449::-;34768:22;34793:18;34803:7;34793:9;:18::i;:::-;34768:43;;34839:14;34826:10;:27;34822:310;;;34870:18;34891:30;34906:14;34891:10;:14;;:30;;;;:::i;:::-;34870:51;;34936:26;34942:7;34951:10;34936:5;:26::i;:::-;34855:119;34822:310;;;34997:14;34984:10;:27;34980:152;;;35028:18;35049:30;35068:10;35049:14;:18;;:30;;;;:::i;:::-;35028:51;;35094:26;35100:7;35109:10;35094:5;:26::i;:::-;35013:119;34980:152;34822:310;34757:382;34690:449;;:::o;2856:471::-;2914:7;3164:1;3159;:6;3155:47;;3189:1;3182:8;;;;3155:47;3214:9;3230:1;3226;:5;;;;:::i;:::-;3214:17;;3259:1;3254;3250;:5;;;;:::i;:::-;:10;3242:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3318:1;3311:8;;;2856:471;;;;;:::o;2142:148::-;2198:6;2217:8;2235:1;2217:20;;2261:1;2256;:6;;2248:15;;;;;;2281:1;2274:8;;;2142:148;;;:::o;1658:176::-;1714:6;1733:8;1748:1;1744;:5;;;;:::i;:::-;1733:16;;1774:1;1769;:6;;:16;;;;;1784:1;1779;:6;;1769:16;1768:38;;;;1795:1;1791;:5;:14;;;;;1804:1;1800;:5;1791:14;1768:38;1760:47;;;;;;1825:1;1818:8;;;1658:176;;;;:::o;1980:127::-;2036:7;2069:1;2064;:6;;2056:15;;;;;;2097:1;2082:17;;1980:127;;;:::o;2323:181::-;2381:7;2401:9;2417:1;2413;:5;;;;:::i;:::-;2401:17;;2442:1;2437;:6;;2429:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2495:1;2488:8;;;2323:181;;;;:::o;36729:482::-;36811:4;36828:14;36845:32;36869:7;36845:23;:32::i;:::-;36828:49;;36901:1;36892:6;:10;36888:293;;;36919:20;36942:16;:25;36959:7;36942:25;;;;;;;;;;;;;;;;36919:48;;37010:24;37021:12;37010:6;:10;;:24;;;;:::i;:::-;36982:16;:25;36999:7;36982:25;;;;;;;;;;;;;;;:52;;;;37075:15;37049:14;:23;37064:7;37049:23;;;;;;;;;;;;;;;:41;;;;37133:9;37110:33;;37116:7;37110:33;;;37125:6;37110:33;;;;;;:::i;:::-;;;;;;;;37165:4;37158:11;;;;;;36888:293;37198:5;37191:12;;;36729:482;;;;;:::o;31022:498::-;31095:7;31115:29;31147:28;31170:4;31147:22;:28::i;:::-;31115:60;;31214:1;31190:21;:25;31186:308;;;31259:51;31288:21;31259:18;:24;31278:4;31259:24;;;;;;;;;;;;;;;;:28;;:51;;;;:::i;:::-;31232:18;:24;31251:4;31232:24;;;;;;;;;;;;;;;:78;;;;31348:4;31330:46;;;31354:21;31330:46;;;;;;:::i;:::-;;;;;;;;31391:10;;;;;;;;;;;:19;;;31411:4;31417:21;31391:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31461:21;31454:28;;;;;31186:308;31511:1;31504:8;;;31022:498;;;;:::o;2656:192::-;2742:7;2775:1;2770;:6;;2778:12;2762:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2802:9;2818:1;2814;:5;;;;:::i;:::-;2802:17;;2839:1;2832:8;;;2656:192;;;;;:::o;2512:136::-;2570:7;2597:43;2601:1;2604;2597:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2590:50;;2512:136;;;;:::o;1474:176::-;1530:6;1549:8;1564:1;1560;:5;;;;:::i;:::-;1549:16;;1590:1;1585;:6;;:16;;;;;1600:1;1595;:6;;1585:16;1584:38;;;;1611:1;1607;:5;:14;;;;;1620:1;1616;:5;1607:14;1584:38;1576:47;;;;;;1641:1;1634:8;;;1474:176;;;;:::o;34450:232::-;34517:4;34554:15;34538:13;:31;34534:76;;;34593:5;34586:12;;;;34534:76;34665:9;;34627:34;34647:13;34627:15;:19;;:34;;;;:::i;:::-;:47;;34620:54;;34450:232;;;;:::o;29097:472::-;29200:1;29181:21;;:7;:21;;;29173:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29264:24;29281:6;29264:12;;:16;;:24;;;;:::i;:::-;29249:12;:39;;;;29320:30;29343:6;29320:9;:18;29330:7;29320:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;29299:9;:18;29309:7;29299:18;;;;;;;;;;;;;;;:51;;;;29387:7;29366:37;;29383:1;29366:37;;;29396:6;29366:37;;;;;;:::i;:::-;;;;;;;;29454:107;29506:54;29507:37;29537:6;29507:25;;:29;;:37;;;;:::i;:::-;29506:52;:54::i;:::-;29454:28;:37;29483:7;29454:37;;;;;;;;;;;;;;;;:51;;:107;;;;:::i;:::-;29414:28;:37;29443:7;29414:37;;;;;;;;;;;;;;;:147;;;;29097:472;;:::o;29577:516::-;29680:1;29661:21;;:7;:21;;;29653:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29754:68;29777:6;29754:68;;;;;;;;;;;;;;;;;:9;:18;29764:7;29754:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;29733:9;:18;29743:7;29733:18;;;;;;;;;;;;;;;:89;;;;29848:24;29865:6;29848:12;;:16;;:24;;;;:::i;:::-;29833:12;:39;;;;29914:1;29888:37;;29897:7;29888:37;;;29918:6;29888:37;;;;;;:::i;:::-;;;;;;;;29978:107;30030:54;30031:37;30061:6;30031:25;;:29;;:37;;;;:::i;:::-;30030:52;:54::i;:::-;29978:28;:37;30007:7;29978:37;;;;;;;;;;;;;;;;:51;;:107;;;;:::i;:::-;29938:28;:37;29967:7;29938:37;;;;;;;;;;;;;;;:147;;;;29577:516;;:::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;1397:75::-;1430:6;1463:2;1457:9;1447:19;;1397:75;:::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:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:117::-;3955:1;3952;3945:12;3969:117;4078:1;4075;4068:12;4092:117;4201:1;4198;4191:12;4232:568;4305:8;4315:6;4365:3;4358:4;4350:6;4346:17;4342:27;4332:122;;4373:79;;:::i;:::-;4332:122;4486:6;4473:20;4463:30;;4516:18;4508:6;4505:30;4502:117;;;4538:79;;:::i;:::-;4502:117;4652:4;4644:6;4640:17;4628:29;;4706:3;4698:4;4690:6;4686:17;4676:8;4672:32;4669:41;4666:128;;;4713:79;;:::i;:::-;4666:128;4232:568;;;;;:::o;4823:::-;4896:8;4906:6;4956:3;4949:4;4941:6;4937:17;4933:27;4923:122;;4964:79;;:::i;:::-;4923:122;5077:6;5064:20;5054:30;;5107:18;5099:6;5096:30;5093:117;;;5129:79;;:::i;:::-;5093:117;5243:4;5235:6;5231:17;5219:29;;5297:3;5289:4;5281:6;5277:17;5267:8;5263:32;5260:41;5257:128;;;5304:79;;:::i;:::-;5257:128;4823:568;;;;;:::o;5397:934::-;5519:6;5527;5535;5543;5592:2;5580:9;5571:7;5567:23;5563:32;5560:119;;;5598:79;;:::i;:::-;5560:119;5746:1;5735:9;5731:17;5718:31;5776:18;5768:6;5765:30;5762:117;;;5798:79;;:::i;:::-;5762:117;5911:80;5983:7;5974:6;5963:9;5959:22;5911:80;:::i;:::-;5893:98;;;;5689:312;6068:2;6057:9;6053:18;6040:32;6099:18;6091:6;6088:30;6085:117;;;6121:79;;:::i;:::-;6085:117;6234:80;6306:7;6297:6;6286:9;6282:22;6234:80;:::i;:::-;6216:98;;;;6011:313;5397:934;;;;;;;:::o;6337:329::-;6396:6;6445:2;6433:9;6424:7;6420:23;6416:32;6413:119;;;6451:79;;:::i;:::-;6413:119;6571:1;6596:53;6641:7;6632:6;6621:9;6617:22;6596:53;:::i;:::-;6586:63;;6542:117;6337:329;;;;:::o;6672:619::-;6749:6;6757;6765;6814:2;6802:9;6793:7;6789:23;6785:32;6782:119;;;6820:79;;:::i;:::-;6782:119;6940:1;6965:53;7010:7;7001:6;6990:9;6986:22;6965:53;:::i;:::-;6955:63;;6911:117;7067:2;7093:53;7138:7;7129:6;7118:9;7114:22;7093:53;:::i;:::-;7083:63;;7038:118;7195:2;7221:53;7266:7;7257:6;7246:9;7242:22;7221:53;:::i;:::-;7211:63;;7166:118;6672:619;;;;;:::o;7297:329::-;7356:6;7405:2;7393:9;7384:7;7380:23;7376:32;7373:119;;;7411:79;;:::i;:::-;7373:119;7531:1;7556:53;7601:7;7592:6;7581:9;7577:22;7556:53;:::i;:::-;7546:63;;7502:117;7297:329;;;;:::o;7632:86::-;7667:7;7707:4;7700:5;7696:16;7685:27;;7632:86;;;:::o;7724:112::-;7807:22;7823:5;7807:22;:::i;:::-;7802:3;7795:35;7724:112;;:::o;7842:214::-;7931:4;7969:2;7958:9;7954:18;7946:26;;7982:67;8046:1;8035:9;8031:17;8022:6;7982:67;:::i;:::-;7842:214;;;;:::o;8062:180::-;8110:77;8107:1;8100:88;8207:4;8204:1;8197:15;8231:4;8228:1;8221:15;8248:281;8331:27;8353:4;8331:27;:::i;:::-;8323:6;8319:40;8461:6;8449:10;8446:22;8425:18;8413:10;8410:34;8407:62;8404:88;;;8472:18;;:::i;:::-;8404:88;8512:10;8508:2;8501:22;8291:238;8248:281;;:::o;8535:129::-;8569:6;8596:20;;:::i;:::-;8586:30;;8625:33;8653:4;8645:6;8625:33;:::i;:::-;8535:129;;;:::o;8670:311::-;8747:4;8837:18;8829:6;8826:30;8823:56;;;8859:18;;:::i;:::-;8823:56;8909:4;8901:6;8897:17;8889:25;;8969:4;8963;8959:15;8951:23;;8670:311;;;:::o;9004:710::-;9100:5;9125:81;9141:64;9198:6;9141:64;:::i;:::-;9125:81;:::i;:::-;9116:90;;9226:5;9255:6;9248:5;9241:21;9289:4;9282:5;9278:16;9271:23;;9342:4;9334:6;9330:17;9322:6;9318:30;9371:3;9363:6;9360:15;9357:122;;;9390:79;;:::i;:::-;9357:122;9505:6;9488:220;9522:6;9517:3;9514:15;9488:220;;;9597:3;9626:37;9659:3;9647:10;9626:37;:::i;:::-;9621:3;9614:50;9693:4;9688:3;9684:14;9677:21;;9564:144;9548:4;9543:3;9539:14;9532:21;;9488:220;;;9492:21;9106:608;;9004:710;;;;;:::o;9737:370::-;9808:5;9857:3;9850:4;9842:6;9838:17;9834:27;9824:122;;9865:79;;:::i;:::-;9824:122;9982:6;9969:20;10007:94;10097:3;10089:6;10082:4;10074:6;10070:17;10007:94;:::i;:::-;9998:103;;9814:293;9737:370;;;;:::o;10113:539::-;10197:6;10246:2;10234:9;10225:7;10221:23;10217:32;10214:119;;;10252:79;;:::i;:::-;10214:119;10400:1;10389:9;10385:17;10372:31;10430:18;10422:6;10419:30;10416:117;;;10452:79;;:::i;:::-;10416:117;10557:78;10627:7;10618:6;10607:9;10603:22;10557:78;:::i;:::-;10547:88;;10343:302;10113:539;;;;:::o;10658:104::-;10703:7;10732:24;10750:5;10732:24;:::i;:::-;10721:35;;10658:104;;;:::o;10768:138::-;10849:32;10875:5;10849:32;:::i;:::-;10842:5;10839:43;10829:71;;10896:1;10893;10886:12;10829:71;10768:138;:::o;10912:155::-;10966:5;11004:6;10991:20;10982:29;;11020:41;11055:5;11020:41;:::i;:::-;10912:155;;;;:::o;11073:116::-;11143:21;11158:5;11143:21;:::i;:::-;11136:5;11133:32;11123:60;;11179:1;11176;11169:12;11123:60;11073:116;:::o;11195:133::-;11238:5;11276:6;11263:20;11254:29;;11292:30;11316:5;11292:30;:::i;:::-;11195:133;;;;:::o;11334:484::-;11407:6;11415;11464:2;11452:9;11443:7;11439:23;11435:32;11432:119;;;11470:79;;:::i;:::-;11432:119;11590:1;11615:61;11668:7;11659:6;11648:9;11644:22;11615:61;:::i;:::-;11605:71;;11561:125;11725:2;11751:50;11793:7;11784:6;11773:9;11769:22;11751:50;:::i;:::-;11741:60;;11696:115;11334:484;;;;;:::o;11824:118::-;11911:24;11929:5;11911:24;:::i;:::-;11906:3;11899:37;11824:118;;:::o;11948:222::-;12041:4;12079:2;12068:9;12064:18;12056:26;;12092:71;12160:1;12149:9;12145:17;12136:6;12092:71;:::i;:::-;11948:222;;;;:::o;12176:60::-;12204:3;12225:5;12218:12;;12176:60;;;:::o;12242:142::-;12292:9;12325:53;12343:34;12352:24;12370:5;12352:24;:::i;:::-;12343:34;:::i;:::-;12325:53;:::i;:::-;12312:66;;12242:142;;;:::o;12390:126::-;12440:9;12473:37;12504:5;12473:37;:::i;:::-;12460:50;;12390:126;;;:::o;12522:139::-;12585:9;12618:37;12649:5;12618:37;:::i;:::-;12605:50;;12522:139;;;:::o;12667:157::-;12767:50;12811:5;12767:50;:::i;:::-;12762:3;12755:63;12667:157;;:::o;12830:248::-;12936:4;12974:2;12963:9;12959:18;12951:26;;12987:84;13068:1;13057:9;13053:17;13044:6;12987:84;:::i;:::-;12830:248;;;;:::o;13084:474::-;13152:6;13160;13209:2;13197:9;13188:7;13184:23;13180:32;13177:119;;;13215:79;;:::i;:::-;13177:119;13335:1;13360:53;13405:7;13396:6;13385:9;13381:22;13360:53;:::i;:::-;13350:63;;13306:117;13462:2;13488:53;13533:7;13524:6;13513:9;13509:22;13488:53;:::i;:::-;13478:63;;13433:118;13084:474;;;;;:::o;13564:76::-;13600:7;13629:5;13618:16;;13564:76;;;:::o;13646:115::-;13731:23;13748:5;13731:23;:::i;:::-;13726:3;13719:36;13646:115;;:::o;13767:989::-;14052:4;14090:3;14079:9;14075:19;14067:27;;14104:71;14172:1;14161:9;14157:17;14148:6;14104:71;:::i;:::-;14185:70;14251:2;14240:9;14236:18;14227:6;14185:70;:::i;:::-;14265;14331:2;14320:9;14316:18;14307:6;14265:70;:::i;:::-;14345:72;14413:2;14402:9;14398:18;14389:6;14345:72;:::i;:::-;14427:73;14495:3;14484:9;14480:19;14471:6;14427:73;:::i;:::-;14510;14578:3;14567:9;14563:19;14554:6;14510:73;:::i;:::-;14593;14661:3;14650:9;14646:19;14637:6;14593:73;:::i;:::-;14676;14744:3;14733:9;14729:19;14720:6;14676:73;:::i;:::-;13767:989;;;;;;;;;;;:::o;14762:442::-;14911:4;14949:2;14938:9;14934:18;14926:26;;14962:71;15030:1;15019:9;15015:17;15006:6;14962:71;:::i;:::-;15043:72;15111:2;15100:9;15096:18;15087:6;15043:72;:::i;:::-;15125;15193:2;15182:9;15178:18;15169:6;15125:72;:::i;:::-;14762:442;;;;;;:::o;15210:180::-;15258:77;15255:1;15248:88;15355:4;15352:1;15345:15;15379:4;15376:1;15369:15;15396:320;15440:6;15477:1;15471:4;15467:12;15457:22;;15524:1;15518:4;15514:12;15545:18;15535:81;;15601:4;15593:6;15589:17;15579:27;;15535:81;15663:2;15655:6;15652:14;15632:18;15629:38;15626:84;;15682:18;;:::i;:::-;15626:84;15447:269;15396:320;;;:::o;15722:143::-;15779:5;15810:6;15804:13;15795:22;;15826:33;15853:5;15826:33;:::i;:::-;15722:143;;;;:::o;15871:351::-;15941:6;15990:2;15978:9;15969:7;15965:23;15961:32;15958:119;;;15996:79;;:::i;:::-;15958:119;16116:1;16141:64;16197:7;16188:6;16177:9;16173:22;16141:64;:::i;:::-;16131:74;;16087:128;15871:351;;;;:::o;16228:182::-;16368:34;16364:1;16356:6;16352:14;16345:58;16228:182;:::o;16416:366::-;16558:3;16579:67;16643:2;16638:3;16579:67;:::i;:::-;16572:74;;16655:93;16744:3;16655:93;:::i;:::-;16773:2;16768:3;16764:12;16757:19;;16416:366;;;:::o;16788:419::-;16954:4;16992:2;16981:9;16977:18;16969:26;;17041:9;17035:4;17031:20;17027:1;17016:9;17012:17;17005:47;17069:131;17195:4;17069:131;:::i;:::-;17061:139;;16788:419;;;:::o;17213:180::-;17261:77;17258:1;17251:88;17358:4;17355:1;17348:15;17382:4;17379:1;17372:15;17399:180;17447:77;17444:1;17437:88;17544:4;17541:1;17534:15;17568:4;17565:1;17558:15;17585:348;17625:7;17648:20;17666:1;17648:20;:::i;:::-;17643:25;;17682:20;17700:1;17682:20;:::i;:::-;17677:25;;17870:1;17802:66;17798:74;17795:1;17792:81;17787:1;17780:9;17773:17;17769:105;17766:131;;;17877:18;;:::i;:::-;17766:131;17925:1;17922;17918:9;17907:20;;17585:348;;;;:::o;17939:332::-;18060:4;18098:2;18087:9;18083:18;18075:26;;18111:71;18179:1;18168:9;18164:17;18155:6;18111:71;:::i;:::-;18192:72;18260:2;18249:9;18245:18;18236:6;18192:72;:::i;:::-;17939:332;;;;;:::o;18277:233::-;18316:3;18339:24;18357:5;18339:24;:::i;:::-;18330:33;;18385:66;18378:5;18375:77;18372:103;;18455:18;;:::i;:::-;18372:103;18502:1;18495:5;18491:13;18484:20;;18277:233;;;:::o;18516:227::-;18656:34;18652:1;18644:6;18640:14;18633:58;18725:10;18720:2;18712:6;18708:15;18701:35;18516:227;:::o;18749:366::-;18891:3;18912:67;18976:2;18971:3;18912:67;:::i;:::-;18905:74;;18988:93;19077:3;18988:93;:::i;:::-;19106:2;19101:3;19097:12;19090:19;;18749:366;;;:::o;19121:419::-;19287:4;19325:2;19314:9;19310:18;19302:26;;19374:9;19368:4;19364:20;19360:1;19349:9;19345:17;19338:47;19402:131;19528:4;19402:131;:::i;:::-;19394:139;;19121:419;;;:::o;19546:180::-;19594:77;19591:1;19584:88;19691:4;19688:1;19681:15;19715:4;19712:1;19705:15;19732:185;19772:1;19789:20;19807:1;19789:20;:::i;:::-;19784:25;;19823:20;19841:1;19823:20;:::i;:::-;19818:25;;19862:1;19852:35;;19867:18;;:::i;:::-;19852:35;19909:1;19906;19902:9;19897:14;;19732:185;;;;:::o;19923:137::-;19977:5;20008:6;20002:13;19993:22;;20024:30;20048:5;20024:30;:::i;:::-;19923:137;;;;:::o;20066:345::-;20133:6;20182:2;20170:9;20161:7;20157:23;20153:32;20150:119;;;20188:79;;:::i;:::-;20150:119;20308:1;20333:61;20386:7;20377:6;20366:9;20362:22;20333:61;:::i;:::-;20323:71;;20279:125;20066:345;;;;:::o;20417:305::-;20457:3;20476:20;20494:1;20476:20;:::i;:::-;20471:25;;20510:20;20528:1;20510:20;:::i;:::-;20505:25;;20664:1;20596:66;20592:74;20589:1;20586:81;20583:107;;;20670:18;;:::i;:::-;20583:107;20714:1;20711;20707:9;20700:16;;20417:305;;;;:::o;20728:102::-;20770:8;20817:5;20814:1;20810:13;20789:34;;20728:102;;;:::o;20836:848::-;20897:5;20904:4;20928:6;20919:15;;20952:5;20943:14;;20966:712;20987:1;20977:8;20974:15;20966:712;;;21082:4;21077:3;21073:14;21067:4;21064:24;21061:50;;;21091:18;;:::i;:::-;21061:50;21141:1;21131:8;21127:16;21124:451;;;21556:4;21549:5;21545:16;21536:25;;21124:451;21606:4;21600;21596:15;21588:23;;21636:32;21659:8;21636:32;:::i;:::-;21624:44;;20966:712;;;20836:848;;;;;;;:::o;21690:1073::-;21744:5;21935:8;21925:40;;21956:1;21947:10;;21958:5;;21925:40;21984:4;21974:36;;22001:1;21992:10;;22003:5;;21974:36;22070:4;22118:1;22113:27;;;;22154:1;22149:191;;;;22063:277;;22113:27;22131:1;22122:10;;22133:5;;;22149:191;22194:3;22184:8;22181:17;22178:43;;;22201:18;;:::i;:::-;22178:43;22250:8;22247:1;22243:16;22234:25;;22285:3;22278:5;22275:14;22272:40;;;22292:18;;:::i;:::-;22272:40;22325:5;;;22063:277;;22449:2;22439:8;22436:16;22430:3;22424:4;22421:13;22417:36;22399:2;22389:8;22386:16;22381:2;22375:4;22372:12;22368:35;22352:111;22349:246;;;22505:8;22499:4;22495:19;22486:28;;22540:3;22533:5;22530:14;22527:40;;;22547:18;;:::i;:::-;22527:40;22580:5;;22349:246;22620:42;22658:3;22648:8;22642:4;22639:1;22620:42;:::i;:::-;22605:57;;;;22694:4;22689:3;22685:14;22678:5;22675:25;22672:51;;;22703:18;;:::i;:::-;22672:51;22752:4;22745:5;22741:16;22732:25;;21690:1073;;;;;;:::o;22769:281::-;22827:5;22851:23;22869:4;22851:23;:::i;:::-;22843:31;;22895:25;22911:8;22895:25;:::i;:::-;22883:37;;22939:104;22976:66;22966:8;22960:4;22939:104;:::i;:::-;22930:113;;22769:281;;;;:::o;23056:238::-;23196:34;23192:1;23184:6;23180:14;23173:58;23265:21;23260:2;23252:6;23248:15;23241:46;23056:238;:::o;23300:366::-;23442:3;23463:67;23527:2;23522:3;23463:67;:::i;:::-;23456:74;;23539:93;23628:3;23539:93;:::i;:::-;23657:2;23652:3;23648:12;23641:19;;23300:366;;;:::o;23672:419::-;23838:4;23876:2;23865:9;23861:18;23853:26;;23925:9;23919:4;23915:20;23911:1;23900:9;23896:17;23889:47;23953:131;24079:4;23953:131;:::i;:::-;23945:139;;23672:419;;;:::o;24097:224::-;24237:34;24233:1;24225:6;24221:14;24214:58;24306:7;24301:2;24293:6;24289:15;24282:32;24097:224;:::o;24327:366::-;24469:3;24490:67;24554:2;24549:3;24490:67;:::i;:::-;24483:74;;24566:93;24655:3;24566:93;:::i;:::-;24684:2;24679:3;24675:12;24668:19;;24327:366;;;:::o;24699:419::-;24865:4;24903:2;24892:9;24888:18;24880:26;;24952:9;24946:4;24942:20;24938:1;24927:9;24923:17;24916:47;24980:131;25106:4;24980:131;:::i;:::-;24972:139;;24699:419;;;:::o;25124:225::-;25264:34;25260:1;25252:6;25248:14;25241:58;25333:8;25328:2;25320:6;25316:15;25309:33;25124:225;:::o;25355:366::-;25497:3;25518:67;25582:2;25577:3;25518:67;:::i;:::-;25511:74;;25594:93;25683:3;25594:93;:::i;:::-;25712:2;25707:3;25703:12;25696:19;;25355:366;;;:::o;25727:419::-;25893:4;25931:2;25920:9;25916:18;25908:26;;25980:9;25974:4;25970:20;25966:1;25955:9;25951:17;25944:47;26008:131;26134:4;26008:131;:::i;:::-;26000:139;;25727:419;;;:::o;26152:120::-;26224:23;26241:5;26224:23;:::i;:::-;26217:5;26214:34;26204:62;;26262:1;26259;26252:12;26204:62;26152:120;:::o;26278:141::-;26334:5;26365:6;26359:13;26350:22;;26381:32;26407:5;26381:32;:::i;:::-;26278:141;;;;:::o;26425:349::-;26494:6;26543:2;26531:9;26522:7;26518:23;26514:32;26511:119;;;26549:79;;:::i;:::-;26511:119;26669:1;26694:63;26749:7;26740:6;26729:9;26725:22;26694:63;:::i;:::-;26684:73;;26640:127;26425:349;;;;:::o;26780:143::-;26837:5;26868:6;26862:13;26853:22;;26884:33;26911:5;26884:33;:::i;:::-;26780:143;;;;:::o;26929:351::-;26999:6;27048:2;27036:9;27027:7;27023:23;27019:32;27016:119;;;27054:79;;:::i;:::-;27016:119;27174:1;27199:64;27255:7;27246:6;27235:9;27231:22;27199:64;:::i;:::-;27189:74;;27145:128;26929:351;;;;:::o;27286:223::-;27426:34;27422:1;27414:6;27410:14;27403:58;27495:6;27490:2;27482:6;27478:15;27471:31;27286:223;:::o;27515:366::-;27657:3;27678:67;27742:2;27737:3;27678:67;:::i;:::-;27671:74;;27754:93;27843:3;27754:93;:::i;:::-;27872:2;27867:3;27863:12;27856:19;;27515:366;;;:::o;27887:419::-;28053:4;28091:2;28080:9;28076:18;28068:26;;28140:9;28134:4;28130:20;28126:1;28115:9;28111:17;28104:47;28168:131;28294:4;28168:131;:::i;:::-;28160:139;;27887:419;;;:::o;28312:221::-;28452:34;28448:1;28440:6;28436:14;28429:58;28521:4;28516:2;28508:6;28504:15;28497:29;28312:221;:::o;28539:366::-;28681:3;28702:67;28766:2;28761:3;28702:67;:::i;:::-;28695:74;;28778:93;28867:3;28778:93;:::i;:::-;28896:2;28891:3;28887:12;28880:19;;28539:366;;;:::o;28911:419::-;29077:4;29115:2;29104:9;29100:18;29092:26;;29164:9;29158:4;29154:20;29150:1;29139:9;29135:17;29128:47;29192:131;29318:4;29192:131;:::i;:::-;29184:139;;28911:419;;;:::o;29336:220::-;29476:34;29472:1;29464:6;29460:14;29453:58;29545:3;29540:2;29532:6;29528:15;29521:28;29336:220;:::o;29562:366::-;29704:3;29725:67;29789:2;29784:3;29725:67;:::i;:::-;29718:74;;29801:93;29890:3;29801:93;:::i;:::-;29919:2;29914:3;29910:12;29903:19;;29562:366;;;:::o;29934:419::-;30100:4;30138:2;30127:9;30123:18;30115:26;;30187:9;30181:4;30177:20;30173:1;30162:9;30158:17;30151:47;30215:131;30341:4;30215:131;:::i;:::-;30207:139;;29934:419;;;:::o;30359:525::-;30398:3;30417:19;30434:1;30417:19;:::i;:::-;30412:24;;30450:19;30467:1;30450:19;:::i;:::-;30445:24;;30638:1;30570:66;30566:74;30563:1;30559:82;30554:1;30551;30547:9;30540:17;30536:106;30533:132;;;30645:18;;:::i;:::-;30533:132;30825:1;30757:66;30753:74;30750:1;30746:82;30742:1;30739;30735:9;30731:98;30728:124;;;30832:18;;:::i;:::-;30728:124;30876:1;30873;30869:9;30862:16;;30359:525;;;;:::o;30890:177::-;31030:29;31026:1;31018:6;31014:14;31007:53;30890:177;:::o;31073:366::-;31215:3;31236:67;31300:2;31295:3;31236:67;:::i;:::-;31229:74;;31312:93;31401:3;31312:93;:::i;:::-;31430:2;31425:3;31421:12;31414:19;;31073:366;;;:::o;31445:419::-;31611:4;31649:2;31638:9;31634:18;31626:26;;31698:9;31692:4;31688:20;31684:1;31673:9;31669:17;31662:47;31726:131;31852:4;31726:131;:::i;:::-;31718:139;;31445:419;;;:::o;31870:134::-;31928:9;31961:37;31992:5;31961:37;:::i;:::-;31948:50;;31870:134;;;:::o;32010:147::-;32105:45;32144:5;32105:45;:::i;:::-;32100:3;32093:58;32010:147;;:::o;32163:348::-;32292:4;32330:2;32319:9;32315:18;32307:26;;32343:79;32419:1;32408:9;32404:17;32395:6;32343:79;:::i;:::-;32432:72;32500:2;32489:9;32485:18;32476:6;32432:72;:::i;:::-;32163:348;;;;;:::o;32517:191::-;32557:4;32577:20;32595:1;32577:20;:::i;:::-;32572:25;;32611:20;32629:1;32611:20;:::i;:::-;32606:25;;32650:1;32647;32644:8;32641:34;;;32655:18;;:::i;:::-;32641:34;32700:1;32697;32693:9;32685:17;;32517:191;;;;:::o;32714:527::-;32753:4;32773:19;32790:1;32773:19;:::i;:::-;32768:24;;32806:19;32823:1;32806:19;:::i;:::-;32801:24;;32995:1;32927:66;32923:74;32920:1;32916:82;32911:1;32908;32904:9;32897:17;32893:106;32890:132;;;33002:18;;:::i;:::-;32890:132;33181:1;33113:66;33109:74;33106:1;33102:82;33098:1;33095;33091:9;33087:98;33084:124;;;33188:18;;:::i;:::-;33084:124;33233:1;33230;33226:9;33218:17;;32714:527;;;;:::o;33247:181::-;33387:33;33383:1;33375:6;33371:14;33364:57;33247:181;:::o;33434:366::-;33576:3;33597:67;33661:2;33656:3;33597:67;:::i;:::-;33590:74;;33673:93;33762:3;33673:93;:::i;:::-;33791:2;33786:3;33782:12;33775:19;;33434:366;;;:::o;33806:419::-;33972:4;34010:2;33999:9;33995:18;33987:26;;34059:9;34053:4;34049:20;34045:1;34034:9;34030:17;34023:47;34087:131;34213:4;34087:131;:::i;:::-;34079:139;;33806:419;;;:::o;34231:220::-;34371:34;34367:1;34359:6;34355:14;34348:58;34440:3;34435:2;34427:6;34423:15;34416:28;34231:220;:::o;34457:366::-;34599:3;34620:67;34684:2;34679:3;34620:67;:::i;:::-;34613:74;;34696:93;34785:3;34696:93;:::i;:::-;34814:2;34809:3;34805:12;34798:19;;34457:366;;;:::o;34829:419::-;34995:4;35033:2;35022:9;35018:18;35010:26;;35082:9;35076:4;35072:20;35068:1;35057:9;35053:17;35046:47;35110:131;35236:4;35110:131;:::i;:::-;35102:139;;34829:419;;;:::o
Swarm Source
ipfs://c7e41575fac4a1aeefcf57624af95a53140180cf459d28573a68e05f73783215
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.