ERC-20
Overview
Max Total Supply
244,070,387.36805123 CER
Holders
371
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 8 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Cereneum
Compiler Version
v0.5.2+commit.1df8f40c
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.5.2; import "./CereneumImplementation.sol"; /// @author AshKetchumNakamoto09 /// @title A Trustless Interest-bearing Cryptographic Certificate of Interest on Ethereum contract Cereneum is CereneumImplementation { using SafeMath for uint256; constructor( bytes32 a_hBTCMerkleTreeRoot, bytes32 a_hBCHMerkleTreeRoot, bytes32 a_hBSVMerkleTreeRoot, bytes32 a_hETHMerkleTreeRoot, bytes32 a_hLTCMerkleTreeRoot ) public { //Store the launch time of the contract m_tContractLaunchTime = block.timestamp; m_hMerkleTreeRootsArray[0] = a_hBTCMerkleTreeRoot; m_hMerkleTreeRootsArray[1] = a_hBCHMerkleTreeRoot; m_hMerkleTreeRootsArray[2] = a_hBSVMerkleTreeRoot; m_hMerkleTreeRootsArray[3] = a_hETHMerkleTreeRoot; m_hMerkleTreeRootsArray[4] = a_hLTCMerkleTreeRoot; //These ratios will be updated on snapshot day //All ratios have an invisible 0.0 in front of them m_blockchainRatios[0] = 5128; //BCH m_blockchainRatios[1] = 2263; //BSV m_blockchainRatios[2] = 3106; //ETH m_blockchainRatios[3] = 1311; //LTC //Binance 1 m_exchangeAirdropAddresses[0] = 0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE; m_exchangeAirdropAmounts[0] = 17400347788910; //Binance 2 m_exchangeAirdropAddresses[1] = 0xD551234Ae421e3BCBA99A0Da6d736074f22192FF; m_exchangeAirdropAmounts[1] = 6758097982665; //Binance 3 m_exchangeAirdropAddresses[2] = 0x564286362092D8e7936f0549571a803B203aAceD; m_exchangeAirdropAmounts[2] = 5557947334680; //Binance 4 m_exchangeAirdropAddresses[3] = 0x0681d8Db095565FE8A346fA0277bFfdE9C0eDBBF; m_exchangeAirdropAmounts[3] = 5953786344335; //Binance 5 has little ether in it //Binance 6 m_exchangeAirdropAddresses[4] = 0x4E9ce36E442e55EcD9025B9a6E0D88485d628A67; m_exchangeAirdropAmounts[4] = 779918770916450; //Bittrex1 m_exchangeAirdropAddresses[5] = 0xFBb1b73C4f0BDa4f67dcA266ce6Ef42f520fBB98; m_exchangeAirdropAmounts[5] = 84975797259280; //Bittrex3 m_exchangeAirdropAddresses[6] = 0x66f820a414680B5bcda5eECA5dea238543F42054; m_exchangeAirdropAmounts[6] = 651875804471280; //KuCoin1 m_exchangeAirdropAddresses[7] = 0x2B5634C42055806a59e9107ED44D43c426E58258; m_exchangeAirdropAmounts[7] = 6609673761160; //KuCoin2 m_exchangeAirdropAddresses[8] = 0x689C56AEf474Df92D44A1B70850f808488F9769C; m_exchangeAirdropAmounts[8] = 4378334643430; //LAToken m_exchangeAirdropAddresses[9] = 0x7891b20C690605F4E370d6944C8A5DBfAc5a451c; m_exchangeAirdropAmounts[9] = 6754951284855; //Huobi Global m_exchangeAirdropAddresses[10] = 0xDc76CD25977E0a5Ae17155770273aD58648900D3; m_exchangeAirdropAmounts[10] = 427305320984440; //CoinBene m_exchangeAirdropAddresses[11] = 0x33683b94334eeBc9BD3EA85DDBDA4a86Fb461405; m_exchangeAirdropAmounts[11] = 2414794474090; //Mint all claimable coins to contract wallet _mint(address(this), m_nMaxRedeemable); } //ERC20 Constants string public constant name = "Cereneum"; string public constant symbol = "CER"; uint public constant decimals = 8; /// @dev A one time callable function to airdrop Ethereum chain CER tokens to some exchange wallets. /// The amounts granted had the standard whale penalties applied and were removed from the UTXO /// set before the Merkle Tree was built so they cannot be claimed a second time. function ExchangeEthereumAirdrops() external { UpdateDailyData(); require(m_bHasAirdroppedExchanges == false); m_bHasAirdroppedExchanges = true; //The following Ethereum exchange addresses are removed from the claimable UTXO set and automatically airdropped //To encourage early exchange support. uint256 nGenesisBonuses = 0; uint256 nPublicReferralBonuses = 0; uint256 nTokensRedeemed = 0; uint256 nBonuses = 0; uint256 nPenalties = 0; for(uint256 i=0; i < 12; ++i) { (nTokensRedeemed, nBonuses, nPenalties) = GetRedeemAmount(m_exchangeAirdropAmounts[i], BlockchainType.Ethereum); //Transfer coins from contracts wallet to claim wallet _transfer(address(this), m_exchangeAirdropAddresses[i], nTokensRedeemed); //Mint speed bonus and 10% referral bonus to claiming address _mint(m_exchangeAirdropAddresses[i], nBonuses.add(nTokensRedeemed.div(10))); //Speed bonus and referral bonus matched for genesis address (20% for referral and 10% for claimer referral = 30%) nGenesisBonuses = nGenesisBonuses.add(nBonuses.add(nTokensRedeemed.mul(1000000000000).div(3333333333333))); //Grant 20% bonus of tokens to referrer nPublicReferralBonuses = nPublicReferralBonuses.add(nTokensRedeemed.div(5)); m_nTotalRedeemed = m_nTotalRedeemed.add(GetRedeemRatio(m_exchangeAirdropAmounts[i], BlockchainType.Ethereum)); m_nRedeemedCount = m_nRedeemedCount.add(1); } //Mint all of the referrer bonuses in a single call _mint(m_publicReferralAddress, nPublicReferralBonuses); //Mint all of the genesis bonuses in a single call _mint(m_genesis, nGenesisBonuses); } }
pragma solidity ^0.5.2; import "./MerkleProof.sol"; import "./ERC20.sol"; import "./SafeMath.sol"; contract CereneumData is ERC20 { using SafeMath for uint256; //Launch timestamp of contract used to track how long contract has been running uint256 internal m_tContractLaunchTime; //Root hashes of the 5 UTXO Merkle trees. Used to verify claims. //0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC bytes32[5] public m_hMerkleTreeRootsArray; //Total number of UTXO's at snapshot. Used for calculating bonus rewards. uint256 public constant m_nUTXOCountAtSnapshot = 85997439; //Maximum number of redeemable coins at snapshot. uint256 public constant m_nMaxRedeemable = 21275254524468718; //For Prosperous bonus we need to use the adjusted redeemable amount //That has the whale penalties applied (lowering claimable supply) uint256 public constant m_nAdjustedMaxRedeemable = 15019398043400000; //Genesis Address address constant internal m_genesis = 0xb26165df612B1c9dc705B9872178B3F48151b24d; //Eth Pool Genesis Address address payable constant internal m_EthGenesis = 0xbe9CEF4196a835F29B117108460ed6fcA299b611; //The public donation address for referrals address payable constant internal m_publicReferralAddress = 0x8eAf4Fec503da352EB66Ef1E2f75C63e5bC635e1; //Store the BTC ratios for BCH, BSV, ETH and LTC uint16[4] public m_blockchainRatios; enum AddressType { LegacyUncompressed, LegacyCompressed, SegwitUncompressed, SegwitCompressed } enum BlockchainType { Bitcoin, BitcoinCash, BitcoinSV, Ethereum, Litecoin } //Track how many tokens and UTXOs have been redeemed. //These are used for calculating bonus rewards. uint256 public m_nTotalRedeemed = 0; uint256 public m_nRedeemedCount = 0; //Map of redeemed UTXOs to boolean (true/false if redeemed or not) mapping(uint8 => mapping(bytes32 => bool)) internal m_claimedUTXOsMap; //Store the last day UpdateDailyData() was successfully executed //Starts at 14 to give a two week buffer after contract launch uint256 internal m_nLastUpdatedDay = 14; //Daily data struct DailyDataStuct { uint256 nPayoutAmount; uint256 nTotalStakeShares; uint256 nTotalEthStaked; } //Map to store daily historical data. mapping(uint256 => DailyDataStuct) public m_dailyDataMap; //Stakes Storage struct StakeStruct { uint256 nAmountStaked; uint256 nSharesStaked; //Get bonus shares for longer stake times uint256 nCompoundedPayoutAccumulated; uint256 tLockTime; uint256 tEndStakeCommitTime; uint256 tLastCompoundedUpdateTime; uint256 tTimeRemovedFromGlobalPool; uint8 nVotedOnMultiplier; bool bIsInGlobalPool; bool bIsLatePenaltyAlreadyPooled; } //Eth Pool Stakes Storage struct EthStakeStruct { uint256 nAmount; uint256 nDay; } //Map of addresses to StakeStructs. mapping(address => StakeStruct[]) public m_staked; //Map of addresses to ETH amount (in Wei) participating in the Eth pool mapping(address => EthStakeStruct[]) public m_EthereumStakers; //Accumulated early/late unstake penalties to go into next staker pool as rewards uint256 internal m_nEarlyAndLateUnstakePool; //Track the number of staked tokens and shares uint256 public m_nTotalStakedTokens; uint256 public m_nTotalStakeShares; //The daily amount of ETH in the ETH pool uint256 public m_nTotalEthStaked = 0; //The latest interest multiplier voted on by the majority of the staker pool uint8 public m_nInterestMultiplier = 1; //The number of stake shares voting for each interest multiplier //1 keeps the base 5% interest (minimum), 2 is 10%, ... 10 is 50% (maximum) mapping(uint8 => uint256) public m_votingMultiplierMap; //Maximum stake time allowed uint256 internal constant m_nMaxStakingTime = 365 days * 5; //years is deprecated because of leap years //Two week buffer window after launch before interest starts uint256 internal constant m_nClaimPhaseBufferDays = 14; uint256 public m_nLastEthWithdrawalTime = 0; bool internal m_bHasAirdroppedExchanges = false; address[12] internal m_exchangeAirdropAddresses; uint256[12] internal m_exchangeAirdropAmounts; }
pragma solidity ^0.5.2; import "./CereneumData.sol"; contract CereneumImplementation is CereneumData { using SafeMath for uint256; //Events event ClaimEvent( uint256 nOriginalClaimAmount, uint256 nAmountGranted, uint256 nBonuses, uint256 nPenalties, bool bWasReferred ); event StartStakeEvent( uint256 nAmount, uint256 nDays ); event CompoundInterestEvent( uint256 nInterestCompounded ); event EndStakeEvent( uint256 nPrincipal, uint256 nPayout, uint256 nDaysServed, uint256 nPenalty, uint256 nStakeShares, uint256 nDaysCommitted ); event EndStakeForAFriendEvent( uint256 nShares, uint256 tStakeEndTimeCommit ); event StartEthStakeEvent( uint256 nEthAmount ); event EndEthStakeEvent( uint256 nPayout ); /// @dev Returns the number of current stakes for given address. /// @param a_address Address of stake to lookup /// @return The number of stakes. function GetNumberOfStakes( address a_address ) external view returns (uint256) { return m_staked[a_address].length; } /// @dev Returns the number of current Eth pool stakes for given address. /// @param a_address Address of stake to lookup /// @return The number of stakes. function GetNumberOfEthPoolStakes( address a_address ) external view returns (uint256) { return m_EthereumStakers[a_address].length; } /// @dev Returns the timestamp until the next daily update /// @return The time until the next daily update. function GetTimeUntilNextDailyUpdate() external view returns (uint256) { uint256 nDay = 1 days; return nDay.sub((block.timestamp.sub(m_tContractLaunchTime)).mod(1 days)); } /// @dev Calculates difference between 2 timestamps in days /// @param a_nStartTime beginning timestamp /// @param a_nEndTime ending timestamp /// @return Difference between timestamps in days function DifferenceInDays( uint256 a_nStartTime, uint256 a_nEndTime ) public pure returns (uint256) { return (a_nEndTime.sub(a_nStartTime).div(1 days)); } /// @dev Calculates the number of days since contract launch for a given timestamp. /// @param a_tTimestamp Timestamp to calculate from /// @return Number of days into contract function TimestampToDaysSinceLaunch( uint256 a_tTimestamp ) public view returns (uint256) { return (a_tTimestamp.sub(m_tContractLaunchTime).div(1 days)); } /// @dev Gets the number of days since the launch of the contract /// @return Number of days since contract launch function DaysSinceLaunch() public view returns (uint256) { return (TimestampToDaysSinceLaunch(block.timestamp)); } /// @dev Checks if we're still in the claimable phase (first 52 weeks) /// @return Boolean on if we are still in the claimable phase function IsClaimablePhase() public view returns (bool) { return (DaysSinceLaunch() < 364); } /// @dev Starts a 1 day stake in the ETH pool. Requires minimum of 0.01 ETH function StartEthStake() external payable { //Require the minimum value for staking require(msg.value >= 0.01 ether, "ETH Sent not above minimum value"); require(DaysSinceLaunch() >= m_nClaimPhaseBufferDays, "Eth Pool staking doesn't begin until after the buffer window"); UpdateDailyData(); m_EthereumStakers[msg.sender].push( EthStakeStruct( msg.value, // Ethereum staked DaysSinceLaunch() //Day staked ) ); emit StartEthStakeEvent( msg.value ); m_nTotalEthStaked = m_nTotalEthStaked.add(msg.value); } /// @dev The default function function() external payable { } /// @dev Withdraw CER from the Eth pool after stake has completed /// @param a_nIndex The index of the stake to be withdrawn function WithdrawFromEthPool(uint256 a_nIndex) external { //Require that the stake index doesn't go out of bounds require(m_EthereumStakers[msg.sender].length > a_nIndex, "Eth stake does not exist"); UpdateDailyData(); uint256 nDay = m_EthereumStakers[msg.sender][a_nIndex].nDay; require(nDay < DaysSinceLaunch(), "Must wait until next day to withdraw"); uint256 nAmount = m_EthereumStakers[msg.sender][a_nIndex].nAmount; uint256 nPayoutAmount = m_dailyDataMap[nDay].nPayoutAmount.div(10); //10% uint256 nEthPoolPayout = nPayoutAmount.mul(nAmount) .div(m_dailyDataMap[nDay].nTotalEthStaked); _mint(msg.sender, nEthPoolPayout); emit EndEthStakeEvent( nEthPoolPayout ); uint256 nEndingIndex = m_EthereumStakers[msg.sender].length.sub(1); //Only copy if we aren't removing the last index if(nEndingIndex != a_nIndex) { //Copy last stake in array over stake we are removing m_EthereumStakers[msg.sender][a_nIndex] = m_EthereumStakers[msg.sender][nEndingIndex]; } //Lower array length by 1 m_EthereumStakers[msg.sender].length = nEndingIndex; } /// @dev Transfers ETH in the contract to the genesis address /// Only callable once every 12 weeks. function TransferContractETH() external { require(address(this).balance != 0, "No Eth to transfer"); require(m_nLastEthWithdrawalTime.add(12 weeks) <= block.timestamp, "Can only withdraw once every 3 months"); m_EthGenesis.transfer(address(this).balance); m_nLastEthWithdrawalTime = block.timestamp; } /// @dev Updates and stores the global interest for each day. /// Additionally adds the frenzy/prosperous bonuses and the Early/Late unstake penalties. /// This function gets called at the start of popular public functions to continuously update. function UpdateDailyData() public { for(m_nLastUpdatedDay; DaysSinceLaunch() > m_nLastUpdatedDay; m_nLastUpdatedDay++) { //Gives 5% inflation per 365 days uint256 nPayoutRound = totalSupply().div(7300); uint256 nUnclaimedCoins = 0; //Frenzy/Prosperous bonuses and Unclaimed redistribution only available during claims phase. if(m_nLastUpdatedDay < 364) { nUnclaimedCoins = m_nMaxRedeemable.sub(m_nTotalRedeemed); nUnclaimedCoins = GetRobinHoodMonthlyAmount(nUnclaimedCoins, m_nLastUpdatedDay); nPayoutRound = nPayoutRound.add(nUnclaimedCoins); //Pay frenzy and Prosperous bonuses to genesis address _mint(m_genesis, nPayoutRound.mul(m_nRedeemedCount).div(m_nUTXOCountAtSnapshot)); // Frenzy _mint(m_genesis, nPayoutRound.mul(m_nTotalRedeemed).div(m_nAdjustedMaxRedeemable)); // Prosperous nPayoutRound = nPayoutRound.add( //Frenzy bonus 0-100% based on total users claiming nPayoutRound.mul(m_nRedeemedCount).div(m_nUTXOCountAtSnapshot) ).add( //Prosperous bonus 0-100% based on size of claims nPayoutRound.mul(m_nTotalRedeemed).div(m_nAdjustedMaxRedeemable) ); } else { //If we are not in the claimable phase anymore apply the voted on interest multiplier //First we need to check if there is a new "most voted on" multiplier uint8 nVoteMultiplier = 1; uint256 nVoteCount = m_votingMultiplierMap[1]; for(uint8 i=2; i <= 10; i++) { if(m_votingMultiplierMap[i] > nVoteCount) { nVoteCount = m_votingMultiplierMap[i]; nVoteMultiplier = i; } } nPayoutRound = nPayoutRound.mul(nVoteMultiplier); //Store last interest multiplier for public viewing m_nInterestMultiplier = nVoteMultiplier; } //Add nPayoutRound to contract's balance _mint(address(this), nPayoutRound.sub(nUnclaimedCoins)); //Add early and late unstake pool to payout round if(m_nEarlyAndLateUnstakePool != 0) { nPayoutRound = nPayoutRound.add(m_nEarlyAndLateUnstakePool); //Reset back to 0 for next day m_nEarlyAndLateUnstakePool = 0; } //Store daily data m_dailyDataMap[m_nLastUpdatedDay] = DailyDataStuct( nPayoutRound, m_nTotalStakeShares, m_nTotalEthStaked ); m_nTotalEthStaked = 0; } } /// @dev Gets the circulating supply (total supply minus staked coins). /// @return Circulating Supply function GetCirculatingSupply() external view returns (uint256) { return totalSupply().sub(balanceOf(address(this))); } /// @dev Verify a Merkle proof using the UTXO Merkle tree /// @param a_hMerkleTreeBranches Merkle tree branches from leaf to root /// @param a_hMerkleLeaf Merkle leaf hash that must be present in the UTXO Merkle tree /// @param a_nWhichChain Which blockchain is claiming, 0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC /// @return Boolean on validity of proof function VerifyProof( bytes32[] memory a_hMerkleTreeBranches, bytes32 a_hMerkleLeaf, BlockchainType a_nWhichChain ) public view returns (bool) { require(uint8(a_nWhichChain) >= 0 && uint8(a_nWhichChain) <= 4, "Invalid blockchain option"); return MerkleProof.verify(a_hMerkleTreeBranches, m_hMerkleTreeRootsArray[uint8(a_nWhichChain)], a_hMerkleLeaf); } /// @dev Validate the ECDSA parameters of signed message /// ECDSA public key associated with the specified Ethereum address /// @param a_addressClaiming Address within signed message /// @param a_publicKeyX X parameter of uncompressed ECDSA public key /// @param a_publicKeyY Y parameter of uncompressed ECDSA public key /// @param a_v v parameter of ECDSA signature /// @param a_r r parameter of ECDSA signature /// @param a_s s parameter of ECDSA signature /// @param a_nWhichChain Which blockchain is claiming, 0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC /// @return Boolean on if the signature is valid function ECDSAVerify( address a_addressClaiming, bytes32 a_publicKeyX, bytes32 a_publicKeyY, uint8 a_v, bytes32 a_r, bytes32 a_s, BlockchainType a_nWhichChain ) public pure returns (bool) { bytes memory addressAsHex = GenerateSignatureMessage(a_addressClaiming, a_nWhichChain); bytes32 hHash; if(a_nWhichChain != BlockchainType.Ethereum) //All Bitcoin chains and Litecoin do double sha256 hash { hHash = sha256(abi.encodePacked(sha256(abi.encodePacked(addressAsHex)))); } else //Otherwise ETH { hHash = keccak256(abi.encodePacked(addressAsHex)); } return ValidateSignature( hHash, a_v, a_r, a_s, PublicKeyToEthereumAddress(a_publicKeyX, a_publicKeyY) ); } /// @dev Convert an uncompressed ECDSA public key into an Ethereum address /// @param a_publicKeyX X parameter of uncompressed ECDSA public key /// @param a_publicKeyY Y parameter of uncompressed ECDSA public key /// @return Ethereum address generated from the ECDSA public key function PublicKeyToEthereumAddress( bytes32 a_publicKeyX, bytes32 a_publicKeyY ) public pure returns (address) { bytes32 hash = keccak256(abi.encodePacked(a_publicKeyX, a_publicKeyY)); return address(uint160(uint256((hash)))); } /// @dev Calculate the Bitcoin-style address associated with an ECDSA public key /// @param a_publicKeyX First half of ECDSA public key /// @param a_publicKeyY Second half of ECDSA public key /// @param a_nAddressType Whether BTC/LTC is Legacy or Segwit address and if it was compressed /// @return Raw Bitcoin address function PublicKeyToBitcoinAddress( bytes32 a_publicKeyX, bytes32 a_publicKeyY, AddressType a_nAddressType ) public pure returns (bytes20) { bytes20 publicKey; uint8 initialByte; if(a_nAddressType == AddressType.LegacyCompressed || a_nAddressType == AddressType.SegwitCompressed) { //Hash the compressed format initialByte = (uint256(a_publicKeyY) & 1) == 0 ? 0x02 : 0x03; publicKey = ripemd160(abi.encodePacked(sha256(abi.encodePacked(initialByte, a_publicKeyX)))); } else { //Hash the uncompressed format initialByte = 0x04; publicKey = ripemd160(abi.encodePacked(sha256(abi.encodePacked(initialByte, a_publicKeyX, a_publicKeyY)))); } if(a_nAddressType == AddressType.LegacyUncompressed || a_nAddressType == AddressType.LegacyCompressed) { return publicKey; } else if(a_nAddressType == AddressType.SegwitUncompressed || a_nAddressType == AddressType.SegwitCompressed) { return ripemd160(abi.encodePacked(sha256(abi.encodePacked(hex"0014", publicKey)))); } } /// @dev Appends an Ethereum address onto the expected string for a Bitcoin signed message /// @param a_address Ethereum address /// @param a_nWhichChain Which blockchain is claiming, 0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC /// @return Correctly formatted message for bitcoin signing function GenerateSignatureMessage( address a_address, BlockchainType a_nWhichChain ) public pure returns(bytes memory) { bytes16 hexDigits = "0123456789abcdef"; bytes memory prefix; uint8 nPrefixLength = 0; //One of the bitcoin chains if(a_nWhichChain >= BlockchainType.Bitcoin && a_nWhichChain <= BlockchainType.BitcoinSV) { nPrefixLength = 46; prefix = new bytes(nPrefixLength); prefix = "\x18Bitcoin Signed Message:\n\x3CClaim_Cereneum_to_0x"; } else if(a_nWhichChain == BlockchainType.Ethereum) //Ethereum chain { nPrefixLength = 48; prefix = new bytes(nPrefixLength); prefix = "\x19Ethereum Signed Message:\n60Claim_Cereneum_to_0x"; } else //Otherwise LTC { nPrefixLength = 47; prefix = new bytes(nPrefixLength); prefix = "\x19Litecoin Signed Message:\n\x3CClaim_Cereneum_to_0x"; } bytes20 addressBytes = bytes20(a_address); bytes memory message = new bytes(nPrefixLength + 40); uint256 nOffset = 0; for(uint i = 0; i < nPrefixLength; i++) { message[nOffset++] = prefix[i]; } for(uint i = 0; i < 20; i++) { message[nOffset++] = hexDigits[uint256(uint8(addressBytes[i] >> 4))]; message[nOffset++] = hexDigits[uint256(uint8(addressBytes[i] & 0x0f))]; } return message; } /// @dev Validate ECSDA signature was signed by the specified address /// @param a_hash Hash of signed data /// @param a_v v parameter of ECDSA signature /// @param a_r r parameter of ECDSA signature /// @param a_s s parameter of ECDSA signature /// @param a_address Ethereum address matching the signature /// @return Boolean on if the signature is valid function ValidateSignature( bytes32 a_hash, uint8 a_v, bytes32 a_r, bytes32 a_s, address a_address ) public pure returns (bool) { return ecrecover( a_hash, a_v, a_r, a_s ) == a_address; } /// @dev Verify that a UTXO with the Merkle leaf hash can be claimed /// @param a_hMerkleLeafHash Merkle tree hash of the UTXO to be checked /// @param a_hMerkleTreeBranches Merkle tree branches from leaf to root /// @param a_nWhichChain Which blockchain is claiming, 0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC /// @return Boolean on if the UTXO from the given hash can be redeemed function CanClaimUTXOHash( bytes32 a_hMerkleLeafHash, bytes32[] memory a_hMerkleTreeBranches, BlockchainType a_nWhichChain ) public view returns (bool) { //Check that the UTXO has not yet been redeemed and that it exists in the Merkle tree return( (m_claimedUTXOsMap[uint8(a_nWhichChain)][a_hMerkleLeafHash] == false) && VerifyProof(a_hMerkleTreeBranches, a_hMerkleLeafHash, a_nWhichChain) ); } /// @dev Check if address can make a claim /// @param a_addressRedeeming Raw Bitcoin address (no base58-check encoding) /// @param a_nAmount Amount of UTXO to redeem /// @param a_hMerkleTreeBranches Merkle tree branches from leaf to root /// @param a_nWhichChain Which blockchain is claiming, 0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC /// @return Boolean on if the UTXO can be redeemed function CanClaim( bytes20 a_addressRedeeming, uint256 a_nAmount, bytes32[] memory a_hMerkleTreeBranches, BlockchainType a_nWhichChain ) public view returns (bool) { //Calculate the hash of the Merkle leaf associated with this UTXO bytes32 hMerkleLeafHash = keccak256( abi.encodePacked( a_addressRedeeming, a_nAmount ) ); //Check if it can be redeemed return CanClaimUTXOHash(hMerkleLeafHash, a_hMerkleTreeBranches, a_nWhichChain); } /// @dev Calculates the monthly Robin Hood reward /// @param a_nAmount The amount to calculate from /// @param a_nDaysSinceLaunch The number of days since contract launch /// @return The amount after applying monthly Robin Hood calculation function GetRobinHoodMonthlyAmount(uint256 a_nAmount, uint256 a_nDaysSinceLaunch) public pure returns (uint256) { uint256 nScaledAmount = a_nAmount.mul(1000000000000); uint256 nScalar = 400000000000000; // 0.25% //Month 1 - 0.25% late penalty if(a_nDaysSinceLaunch < 43) { return nScaledAmount.div(nScalar.mul(29)); } //Month 2 - Additional 0.5% penalty // 0.25% + 0.5% = .75% else if(a_nDaysSinceLaunch < 72) { nScalar = 200000000000000; // 0.5% return nScaledAmount.div(nScalar.mul(29)); } //Month 3 - Additional 0.75% penalty // 0.25% + 0.5% + .75% = 1.5% else if(a_nDaysSinceLaunch < 101) { nScalar = 133333333333333; // 0.75% return nScaledAmount.div(nScalar.mul(29)); } //Month 4 - Additional 1.5% // 0.25% + 0.5% + .75% + 1.5% = 3% else if(a_nDaysSinceLaunch < 130) { nScalar = 66666666666666; // 1.5% return nScaledAmount.div(nScalar.mul(29)); } //Month 5 - Additional 3% // 0.25% + 0.5% + .75% + 1.5% + 3% = 6% else if(a_nDaysSinceLaunch < 159) { nScalar = 33333333333333; // 3% return nScaledAmount.div(nScalar.mul(29)); } //Month 6 - Additional 6% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% = 12% else if(a_nDaysSinceLaunch < 188) { nScalar = 16666666666666; // 6% return nScaledAmount.div(nScalar.mul(29)); } //Month 7 - Additional 8% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% = 20% else if(a_nDaysSinceLaunch < 217) { nScalar = 12499999999999; // 8% return nScaledAmount.div(nScalar.mul(29)); } //Month 8 - Additional 10% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% = 30% else if(a_nDaysSinceLaunch < 246) { nScalar = 10000000000000; // 10% return nScaledAmount.div(nScalar.mul(29)); } //Month 9 - Additional 12.5% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% + 12.5% = 42.5% else if(a_nDaysSinceLaunch < 275) { nScalar = 7999999999999; // 12.5% return nScaledAmount.div(nScalar.mul(29)); } //Month 10 - Additional 15% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% + 12.5% + 15% = 57.5% else if(a_nDaysSinceLaunch < 304) { nScalar = 6666666666666; // 15% return nScaledAmount.div(nScalar.mul(29)); } //Month 11 - Additional 17.5% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% + 12.5% + 15% + 17.5% = 75% else if(a_nDaysSinceLaunch < 334) { nScalar = 5714285714290; // 17.5% return nScaledAmount.div(nScalar.mul(30)); } //Month 12 - Additional 25% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% + 12.5% + 15% + 17.5% + 25% = 100% else if(a_nDaysSinceLaunch < 364) { nScalar = 4000000000000; // 25% return nScaledAmount.div(nScalar.mul(30)); } } /// @dev Calculates the monthly late penalty /// @param a_nAmount The amount to calculate from /// @param a_nDaysSinceLaunch The number of days since contract launch /// @return The amount after applying monthly late penalty function GetMonthlyLatePenalty(uint256 a_nAmount, uint256 a_nDaysSinceLaunch) public pure returns (uint256) { if(a_nDaysSinceLaunch <= m_nClaimPhaseBufferDays) { return 0; } uint256 nScaledAmount = a_nAmount.mul(1000000000000); uint256 nPreviousMonthPenalty = 0; uint256 nScalar = 400000000000000; // 0.25% //Month 1 - 0.25% late penalty if(a_nDaysSinceLaunch <= 43) { a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(14); return nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); } //Month 2 - Additional 0.5% penalty // 0.25% + 0.5% = .75% else if(a_nDaysSinceLaunch <= 72) { nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(43); nScalar = 200000000000000; // 0.5% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 3 - Additional 0.75% penalty // 0.25% + 0.5% + .75% = 1.5% else if(a_nDaysSinceLaunch <= 101) { nScalar = 133333333333333; // 0.75% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(72); nScalar = 133333333333333; // 0.75% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 4 - Additional 1.5% // 0.25% + 0.5% + .75% + 1.5% = 3% else if(a_nDaysSinceLaunch <= 130) { nScalar = 66666666666666; // 1.5% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(101); nScalar = 66666666666666; // 1.5% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 5 - Additional 3% // 0.25% + 0.5% + .75% + 1.5% + 3% = 6% else if(a_nDaysSinceLaunch <= 159) { nScalar = 33333333333333; // 3% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(130); nScalar = 33333333333333; // 3% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 6 - Additional 6% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% = 12% else if(a_nDaysSinceLaunch <= 188) { nScalar = 16666666666666; // 6% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(159); nScalar = 16666666666666; // 6% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 7 - Additional 8% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% = 20% else if(a_nDaysSinceLaunch <= 217) { nScalar = 8333333333333; // 12% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(188); nScalar = 12499999999999; // 8% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 8 - Additional 10% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% = 30% else if(a_nDaysSinceLaunch <= 246) { nScalar = 5000000000000; // 20% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(217); nScalar = 10000000000000; // 10% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 9 - Additional 12.5% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% + 12.5% = 42.5% else if(a_nDaysSinceLaunch <= 275) { nScalar = 3333333333333; // 30% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(246); nScalar = 7999999999999; // 12.5% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 10 - Additional 15% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% + 12.5% + 15% = 57.5% else if(a_nDaysSinceLaunch <= 304) { nScalar = 2352941176472; // 42.5% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(275); nScalar = 6666666666666; // 15% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(29)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 11 - Additional 17.5% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% + 12.5% + 15% + 17.5% = 75% else if(a_nDaysSinceLaunch <= 334) { nScalar = 1739130434782; // 57.5% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(304); nScalar = 5714285714290; // 17.5% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(30)); return nScaledAmount.add(nPreviousMonthPenalty); } //Month 12 - Additional 25% // 0.25% + 0.5% + .75% + 1.5% + 3% + 6% + 8% + 10% + 12.5% + 15% + 17.5% + 25% = 100% else if(a_nDaysSinceLaunch < 364) { nScalar = 1333333333333; // 75% nPreviousMonthPenalty = nScaledAmount.div(nScalar); a_nDaysSinceLaunch = a_nDaysSinceLaunch.sub(334); nScalar = 4000000000000; // 25% nScaledAmount = nScaledAmount.mul(a_nDaysSinceLaunch).div(nScalar.mul(30)); return nScaledAmount.add(nPreviousMonthPenalty); } else { return a_nAmount; } } /// @dev Returns claim amount with deduction based on weeks since contract launch. /// @param a_nAmount Amount of claim from UTXO /// @return Amount after any late penalties function GetLateClaimAmount(uint256 a_nAmount) internal view returns (uint256) { uint256 nDaysSinceLaunch = DaysSinceLaunch(); return a_nAmount.sub(GetMonthlyLatePenalty(a_nAmount, nDaysSinceLaunch)); } /// @dev Calculates speed bonus for claiming early /// @param a_nAmount Amount of claim from UTXO /// @return Speed bonus amount function GetSpeedBonus(uint256 a_nAmount) internal view returns (uint256) { uint256 nDaysSinceLaunch = DaysSinceLaunch(); //We give a two week buffer after contract launch before penalties if(nDaysSinceLaunch < m_nClaimPhaseBufferDays) { nDaysSinceLaunch = 0; } else { nDaysSinceLaunch = nDaysSinceLaunch.sub(m_nClaimPhaseBufferDays); } uint256 nMaxDays = 350; a_nAmount = a_nAmount.div(5); return a_nAmount.mul(nMaxDays.sub(nDaysSinceLaunch)).div(nMaxDays); } /// @dev Gets the redeem amount with the blockchain ratio applied. /// @param a_nAmount Amount of UTXO in satoshis /// @param a_nWhichChain Which blockchain is claiming, 0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC /// @return Amount with blockchain ratio applied function GetRedeemRatio(uint256 a_nAmount, BlockchainType a_nWhichChain) internal view returns (uint256) { if(a_nWhichChain != BlockchainType.Bitcoin) { uint8 nWhichChain = uint8(a_nWhichChain); --nWhichChain; //Many zeros to avoid rounding errors uint256 nScalar = 100000000000000000; uint256 nRatio = nScalar.div(m_blockchainRatios[nWhichChain]); a_nAmount = a_nAmount.mul(1000000000000).div(nRatio); } return a_nAmount; } /// @dev Gets the redeem amount and bonuses based on time since contract launch /// @param a_nAmount Amount of UTXO in satoshis /// @param a_nWhichChain Which blockchain is claiming, 0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC /// @return Claim amount, bonuses and penalty function GetRedeemAmount(uint256 a_nAmount, BlockchainType a_nWhichChain) public view returns (uint256, uint256, uint256) { a_nAmount = GetRedeemRatio(a_nAmount, a_nWhichChain); uint256 nAmount = GetLateClaimAmount(a_nAmount); uint256 nBonus = GetSpeedBonus(a_nAmount); return (nAmount, nBonus, a_nAmount.sub(nAmount)); } /// @dev Verify claim ownership from signed message /// @param a_nAmount Amount of UTXO claim /// @param a_hMerkleTreeBranches Merkle tree branches from leaf to root /// @param a_addressClaiming Ethereum address within signed message /// @param a_pubKeyX First half of uncompressed ECDSA public key from signed message /// @param a_pubKeyY Second half of uncompressed ECDSA public key from signed message /// @param a_nAddressType Whether BTC/LTC is Legacy or Segwit address /// @param a_v v parameter of ECDSA signature /// @param a_r r parameter of ECDSA signature /// @param a_s s parameter of ECDSA signature /// @param a_nWhichChain Which blockchain is claiming, 0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC function ValidateOwnership( uint256 a_nAmount, bytes32[] memory a_hMerkleTreeBranches, address a_addressClaiming, bytes32 a_pubKeyX, bytes32 a_pubKeyY, AddressType a_nAddressType, uint8 a_v, bytes32 a_r, bytes32 a_s, BlockchainType a_nWhichChain ) internal { //Calculate the UTXO Merkle leaf hash for the correct chain bytes32 hMerkleLeafHash; if(a_nWhichChain != BlockchainType.Ethereum) //All Bitcoin chains and Litecoin have the same raw address format { hMerkleLeafHash = keccak256(abi.encodePacked(PublicKeyToBitcoinAddress(a_pubKeyX, a_pubKeyY, a_nAddressType), a_nAmount)); } else //Otherwise ETH { hMerkleLeafHash = keccak256(abi.encodePacked(PublicKeyToEthereumAddress(a_pubKeyX, a_pubKeyY), a_nAmount)); } //Require that the UTXO can be redeemed require(CanClaimUTXOHash(hMerkleLeafHash, a_hMerkleTreeBranches, a_nWhichChain), "UTXO Cannot be redeemed."); //Verify the ECDSA parameters match the signed message require( ECDSAVerify( a_addressClaiming, a_pubKeyX, a_pubKeyY, a_v, a_r, a_s, a_nWhichChain ), "ECDSA verification failed." ); //Save the UTXO as redeemed in the global map m_claimedUTXOsMap[uint8(a_nWhichChain)][hMerkleLeafHash] = true; } /// @dev Claim tokens from a UTXO at snapshot block /// granting CER tokens proportional to amount of UTXO. /// BCH, BSV, ETH & LTC chains get proportional BTC ratio awards. /// @param a_nAmount Amount of UTXO /// @param a_hMerkleTreeBranches Merkle tree branches from leaf to root /// @param a_addressClaiming The Ethereum address for the claimed CER tokens to be sent to /// @param a_publicKeyX X parameter of uncompressed ECDSA public key from UTXO /// @param a_publicKeyY Y parameter of uncompressed ECDSA public key from UTXO /// @param a_nAddressType Whether BTC/LTC is Legacy or Segwit address and if it was compressed /// @param a_v v parameter of ECDSA signature /// @param a_r r parameter of ECDSA signature /// @param a_s s parameter of ECDSA signature /// @param a_nWhichChain Which blockchain is claiming, 0=BTC, 1=BCH, 2=BSV, 3=ETH, 4=LTC /// @param a_referrer Optional address of referrer. Address(0) for no referral /// @return The number of tokens redeemed, if successful function Claim( uint256 a_nAmount, bytes32[] memory a_hMerkleTreeBranches, address a_addressClaiming, bytes32 a_publicKeyX, bytes32 a_publicKeyY, AddressType a_nAddressType, uint8 a_v, bytes32 a_r, bytes32 a_s, BlockchainType a_nWhichChain, address a_referrer ) public returns (uint256) { //No claims after the first 50 weeks of contract launch require(IsClaimablePhase(), "Claim is outside of claims period."); require(uint8(a_nWhichChain) >= 0 && uint8(a_nWhichChain) <= 4, "Incorrect blockchain value."); require(a_v <= 30 && a_v >= 27, "V parameter is invalid."); ValidateOwnership( a_nAmount, a_hMerkleTreeBranches, a_addressClaiming, a_publicKeyX, a_publicKeyY, a_nAddressType, a_v, a_r, a_s, a_nWhichChain ); UpdateDailyData(); m_nTotalRedeemed = m_nTotalRedeemed.add(GetRedeemRatio(a_nAmount, a_nWhichChain)); (uint256 nTokensRedeemed, uint256 nBonuses, uint256 nPenalties) = GetRedeemAmount(a_nAmount, a_nWhichChain); //Transfer coins from contracts wallet to claim wallet _transfer(address(this), a_addressClaiming, nTokensRedeemed); //Mint speed bonus to claiming address _mint(a_addressClaiming, nBonuses); //Speed bonus matched for genesis address _mint(m_genesis, nBonuses); m_nRedeemedCount = m_nRedeemedCount.add(1); if(a_referrer != address(0)) { //Grant 10% bonus token to the person being referred _mint(a_addressClaiming, nTokensRedeemed.div(10)); nBonuses = nBonuses.add(nTokensRedeemed.div(10)); //Grant 20% bonus of tokens to referrer _mint(a_referrer, nTokensRedeemed.div(5)); //Match referral bonus for genesis address (20% for referral and 10% for claimer referral = 30%) _mint(m_genesis, nTokensRedeemed.mul(1000000000000).div(3333333333333)); } emit ClaimEvent( a_nAmount, nTokensRedeemed, nBonuses, nPenalties, a_referrer != address(0) ); //Return the number of tokens redeemed return nTokensRedeemed.add(nBonuses); } /// @dev Calculates stake payouts for a given stake /// @param a_nStakeShares Number of shares to calculate payout for /// @param a_tLockTime Starting timestamp of stake /// @param a_tEndTime Ending timestamp of stake /// @return payout amount function CalculatePayout( uint256 a_nStakeShares, uint256 a_tLockTime, uint256 a_tEndTime ) public view returns (uint256) { if(m_nLastUpdatedDay == 0) return 0; uint256 nPayout = 0; uint256 tStartDay = TimestampToDaysSinceLaunch(a_tLockTime); //Calculate what day stake was closed uint256 tEndDay = TimestampToDaysSinceLaunch(a_tEndTime); //Iterate through each day and sum up the payout for(uint256 i = tStartDay; i < tEndDay; i++) { uint256 nDailyPayout = m_dailyDataMap[i].nPayoutAmount.mul(a_nStakeShares) .div(m_dailyDataMap[i].nTotalStakeShares); //Keep sum of payouts nPayout = nPayout.add(nDailyPayout); } return nPayout; } /// @dev Updates current amount of stake to apply compounding interest /// @notice This applies all of your earned interest to future payout calculations /// @param a_nStakeIndex index of stake to compound interest for function CompoundInterest( uint256 a_nStakeIndex ) external { require(m_nLastUpdatedDay != 0, "First update day has not finished."); //Get a reference to the stake to save gas from constant map lookups StakeStruct storage rStake = m_staked[msg.sender][a_nStakeIndex]; require(block.timestamp < rStake.tEndStakeCommitTime, "Stake has already matured."); UpdateDailyData(); uint256 nInterestEarned = CalculatePayout( rStake.nSharesStaked, rStake.tLastCompoundedUpdateTime, block.timestamp ); if(nInterestEarned != 0) { rStake.nCompoundedPayoutAccumulated = rStake.nCompoundedPayoutAccumulated.add(nInterestEarned); rStake.nSharesStaked = rStake.nSharesStaked.add(nInterestEarned); //InterestRateMultiplier votes m_votingMultiplierMap[rStake.nVotedOnMultiplier] = m_votingMultiplierMap[rStake.nVotedOnMultiplier].add(nInterestEarned); m_nTotalStakeShares = m_nTotalStakeShares.add(nInterestEarned); rStake.tLastCompoundedUpdateTime = block.timestamp; emit CompoundInterestEvent( nInterestEarned ); } } /// @dev Starts a stake /// @param a_nAmount Amount of token to stake /// @param a_nDays Number of days to stake /// @param a_nInterestMultiplierVote Pooled interest rate to vote for (1-10 => 5%-50% interest) function StartStake( uint256 a_nAmount, uint256 a_nDays, uint8 a_nInterestMultiplierVote ) external { require(DaysSinceLaunch() >= m_nClaimPhaseBufferDays, "Staking doesn't begin until after the buffer window"); //Verify account has enough tokens require(balanceOf(msg.sender) >= a_nAmount, "Not enough funds for stake."); //Don't allow 0 amount stakes require(a_nAmount > 0, "Stake amount must be greater than 0"); require(a_nDays >= 7, "Stake is under the minimum time required."); require(a_nInterestMultiplierVote >= 1 && a_nInterestMultiplierVote <= 10, "Interest multiplier range is 1-10."); //Calculate Unlock time uint256 tEndStakeCommitTime = block.timestamp.add(a_nDays.mul(1 days)); //Don't allow stakes over the maximum stake time require(tEndStakeCommitTime <= block.timestamp.add(m_nMaxStakingTime), "Stake time exceeds maximum."); UpdateDailyData(); //Calculate bonus interest for longer stake periods (20% bonus per year) uint256 nSharesModifier = 0; //Minimum stake time of 3 months to get amplifier bonus if(a_nDays >= 90) { //We can't have a fractional modifier such as .5 so we need to use whole numbers and divide later nSharesModifier = a_nDays.mul(2000000).div(365); } //20% bonus shares per year of committed stake time uint256 nStakeShares = a_nAmount.add(a_nAmount.mul(nSharesModifier).div(10000000)); //Create and store the stake m_staked[msg.sender].push( StakeStruct( a_nAmount, // nAmountStaked nStakeShares, // nSharesStaked 0, //Accumulated Payout from CompoundInterest block.timestamp, // tLockTime tEndStakeCommitTime, // tEndStakeCommitTime block.timestamp, //tLastCompoundedUpdateTime 0, // tTimeRemovedFromGlobalPool a_nInterestMultiplierVote, true, // bIsInGlobalPool false // bIsLatePenaltyAlreadyPooled ) ); emit StartStakeEvent( a_nAmount, a_nDays ); //InterestRateMultiplier m_votingMultiplierMap[a_nInterestMultiplierVote] = m_votingMultiplierMap[a_nInterestMultiplierVote].add(nStakeShares); //Globally track staked tokens m_nTotalStakedTokens = m_nTotalStakedTokens.add(a_nAmount); //Globally track staked shares m_nTotalStakeShares = m_nTotalStakeShares.add(nStakeShares); //Transfer staked tokens to contract wallet _transfer(msg.sender, address(this), a_nAmount); } /// @dev Calculates penalty for unstaking late /// @param a_tEndStakeCommitTime Timestamp stake matured /// @param a_tTimeRemovedFromGlobalPool Timestamp stake was removed from global pool /// @param a_nInterestEarned Interest earned from stake /// @return penalty value function CalculateLatePenalty( uint256 a_tEndStakeCommitTime, uint256 a_tTimeRemovedFromGlobalPool, uint256 a_nInterestEarned ) public pure returns (uint256) { uint256 nPenalty = 0; //One week grace period if(a_tTimeRemovedFromGlobalPool > a_tEndStakeCommitTime.add(1 weeks)) { //Penalty is 1% per day after the 1 week grace period uint256 nPenaltyPercent = DifferenceInDays(a_tEndStakeCommitTime.add(1 weeks), a_tTimeRemovedFromGlobalPool); //Cap max percent at 100 if(nPenaltyPercent > 100) { nPenaltyPercent = 100; } //Calculate penalty nPenalty = a_nInterestEarned.mul(nPenaltyPercent).div(100); } return nPenalty; } /// @dev Calculates penalty for unstaking early /// @param a_tLockTime Starting timestamp of stake /// @param a_nEndStakeCommitTime Timestamp the stake matures /// @param a_nAmount Amount that was staked /// @param a_nInterestEarned Interest earned from stake /// @return penalty value function CalculateEarlyPenalty( uint256 a_tLockTime, uint256 a_nEndStakeCommitTime, uint256 a_nAmount, uint256 a_nInterestEarned ) public view returns (uint256) { uint256 nPenalty = 0; if(block.timestamp < a_nEndStakeCommitTime) { //If they didn't stake for at least 1 full day we give them no interest //To prevent any abuse if(DifferenceInDays(a_tLockTime, block.timestamp) == 0) { nPenalty = a_nInterestEarned; } else { //Base penalty is half of earned interest nPenalty = a_nInterestEarned.div(2); } uint256 nCommittedStakeDays = DifferenceInDays(a_tLockTime, a_nEndStakeCommitTime); if(nCommittedStakeDays >= 90) { //Take another 10% per year of committed stake nPenalty = nPenalty.add(nPenalty.mul(nCommittedStakeDays).div(3650)); } //5% yearly interest converted to daily interest multiplied by stake time uint256 nMinimumPenalty = a_nAmount.mul(nCommittedStakeDays).div(7300); if(nMinimumPenalty > nPenalty) { nPenalty = nMinimumPenalty; } } return nPenalty; } /// @dev Removes completed stake from global pool /// @notice Removing finished stakes will increase the payout to other stakers. /// @param a_nStakeIndex Index of stake to process /// @param a_address Address of the staker function EndStakeForAFriend( uint256 a_nStakeIndex, address a_address ) external { //Require that the stake index doesn't go out of bounds require(m_staked[a_address].length > a_nStakeIndex, "Stake does not exist"); //Require that the stake has been matured require(block.timestamp > m_staked[a_address][a_nStakeIndex].tEndStakeCommitTime, "Stake must be matured."); ProcessStakeEnding(a_nStakeIndex, a_address, true); } /// @dev Ends a stake, even if it is before it has matured. /// @notice If stake has matured behavior is the same as EndStakeSafely /// @param a_nStakeIndex Index of stake to close function EndStakeEarly( uint256 a_nStakeIndex ) external { //Require that the stake index doesn't go out of bounds require(m_staked[msg.sender].length > a_nStakeIndex, "Stake does not exist"); ProcessStakeEnding(a_nStakeIndex, msg.sender, false); } /// @dev Ends a stake safely. Will only execute if a stake is matured. /// @param a_nStakeIndex Index of stake to close function EndStakeSafely( uint256 a_nStakeIndex ) external { //Require that the stake index doesn't go out of bounds require(m_staked[msg.sender].length > a_nStakeIndex, "Stake does not exist"); //Require that stake is matured require(block.timestamp > m_staked[msg.sender][a_nStakeIndex].tEndStakeCommitTime, "Stake must be matured."); ProcessStakeEnding(a_nStakeIndex, msg.sender, false); } function ProcessStakeEnding( uint256 a_nStakeIndex, address a_address, bool a_bWasForAFriend ) internal { UpdateDailyData(); //Get a reference to the stake to save gas from constant map lookups StakeStruct storage rStake = m_staked[a_address][a_nStakeIndex]; uint256 tEndTime = block.timestamp > rStake.tEndStakeCommitTime ? rStake.tEndStakeCommitTime : block.timestamp; //Calculate Payout uint256 nTotalPayout = CalculatePayout( rStake.nSharesStaked, rStake.tLastCompoundedUpdateTime, tEndTime ); //Add any accumulated interest payout from user calling CompoundInterest nTotalPayout = nTotalPayout.add(rStake.nCompoundedPayoutAccumulated); //Add back the original amount staked nTotalPayout = nTotalPayout.add(rStake.nAmountStaked); //Is stake still in the global pool? if(rStake.bIsInGlobalPool) { //Update global staked token tracking m_nTotalStakedTokens = m_nTotalStakedTokens.sub(rStake.nAmountStaked); //Update global stake shares tracking m_nTotalStakeShares = m_nTotalStakeShares.sub(rStake.nSharesStaked); //InterestRateMultiplier m_votingMultiplierMap[rStake.nVotedOnMultiplier] = m_votingMultiplierMap[rStake.nVotedOnMultiplier].sub(rStake.nSharesStaked); //Set time removed rStake.tTimeRemovedFromGlobalPool = block.timestamp; //Set flag that it is no longer in the global pool rStake.bIsInGlobalPool = false; if(a_bWasForAFriend) { emit EndStakeForAFriendEvent( rStake.nSharesStaked, rStake.tEndStakeCommitTime ); } } //Calculate penalties if any uint256 nPenalty = 0; if(!a_bWasForAFriend) //Can't have an early penalty if it was called by EndStakeForAFriend { nPenalty = CalculateEarlyPenalty( rStake.tLockTime, rStake.tEndStakeCommitTime, rStake.nAmountStaked, nTotalPayout.sub(rStake.nAmountStaked) ); } //Only calculate late penalty if there wasn't an early penalty if(nPenalty == 0) { nPenalty = CalculateLatePenalty( rStake.tEndStakeCommitTime, rStake.tTimeRemovedFromGlobalPool, nTotalPayout.sub(rStake.nAmountStaked) ); } //Don't payout penalty amount that has already been paid out if(nPenalty != 0 && !rStake.bIsLatePenaltyAlreadyPooled) { //Split penalty between genesis and pool m_nEarlyAndLateUnstakePool = m_nEarlyAndLateUnstakePool.add(nPenalty.div(2)); _transfer(address(this), m_genesis, nPenalty.div(2)); } if(a_bWasForAFriend) { //Set flag rStake.bIsLatePenaltyAlreadyPooled = true; } else { //Apply penalty nTotalPayout = nTotalPayout.sub(nPenalty); emit EndStakeEvent( rStake.nAmountStaked, nTotalPayout, block.timestamp < rStake.tEndStakeCommitTime ? DifferenceInDays(rStake.tLockTime, block.timestamp) : DifferenceInDays(rStake.tLockTime, rStake.tTimeRemovedFromGlobalPool), nPenalty, rStake.nSharesStaked, DifferenceInDays(rStake.tLockTime, rStake.tEndStakeCommitTime) ); //Payout staked coins from contract _transfer(address(this), a_address, nTotalPayout); //Remove stake RemoveStake(a_address, a_nStakeIndex); } } /// @dev Remove stake from array /// @param a_address address of staker /// @param a_nStakeIndex index of the stake to delete function RemoveStake( address a_address, uint256 a_nStakeIndex ) internal { uint256 nEndingIndex = m_staked[a_address].length.sub(1); //Only copy if we aren't removing the last index if(nEndingIndex != a_nStakeIndex) { //Copy last stake in array over stake we are removing m_staked[a_address][a_nStakeIndex] = m_staked[a_address][nEndingIndex]; } //Lower array length by 1 m_staked[a_address].length = nEndingIndex; } }
pragma solidity ^0.5.2; import "./IERC20.sol"; import "./SafeMath.sol"; /* The MIT License (MIT) Copyright (c) 2016 Smart Contract Solutions, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * https://eips.ethereum.org/EIPS/eip-20 * Originally based on code by FirstBlood: * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol * * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for * all accounts just by listening to said events. Note that this isn't required by the specification, and other * compliant implementations may not do it. */ contract ERC20 is IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowed; uint256 private _totalSupply; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param owner The address to query the balance of. * @return A uint256 representing the amount owned by the passed address. */ function balanceOf(address owner) public view returns (uint256) { return _balances[owner]; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowed[owner][spender]; } /** * @dev Transfer token to a specified address * @param to The address to transfer to. * @param value The amount to be transferred. */ function transfer(address to, uint256 value) public returns (bool) { _transfer(msg.sender, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); return true; } /** * @dev Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred */ function transferFrom(address from, address to, uint256 value) public returns (bool) { _transfer(from, to, value); _approve(from, msg.sender, _allowed[from][msg.sender].sub(value)); return true; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when _allowed[msg.sender][spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowed[msg.sender][spender].add(addedValue)); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when _allowed[msg.sender][spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue)); return true; } /** * @dev Transfer token for a specified addresses * @param from The address to transfer from. * @param to The address to transfer to. * @param value The amount to be transferred. */ function _transfer(address from, address to, uint256 value) internal { require(to != address(0)); _balances[from] = _balances[from].sub(value); _balances[to] = _balances[to].add(value); emit Transfer(from, to, value); } /** * @dev Internal function that mints an amount of the token and assigns it to * an account. This encapsulates the modification of balances such that the * proper events are emitted. * @param account The account that will receive the created tokens. * @param value The amount that will be created. */ function _mint(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply.add(value); _balances[account] = _balances[account].add(value); emit Transfer(address(0), account, value); } /** * @dev Internal function that burns an amount of the token of a given * account. * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burn(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @dev Approve an address to spend another addresses' tokens. * @param owner The address that owns the tokens. * @param spender The address that will spend the tokens. * @param value The number of tokens that can be spent. */ function _approve(address owner, address spender, uint256 value) internal { require(spender != address(0)); require(owner != address(0)); _allowed[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Internal function that burns an amount of the token of a given * account, deducting from the sender's allowance for said account. Uses the * internal burn function. * Emits an Approval event (reflecting the reduced allowance). * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burnFrom(address account, uint256 value) internal { _burn(account, value); _approve(account, msg.sender, _allowed[account][msg.sender].sub(value)); } }
pragma solidity ^0.5.2; /* The MIT License (MIT) Copyright (c) 2016 Smart Contract Solutions, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @title ERC20 interface * @dev see https://eips.ethereum.org/EIPS/eip-20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
pragma solidity >=0.4.25 <0.6.0; /* The MIT License (MIT) Copyright (c) 2016 Smart Contract Solutions, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @title MerkleProof * @dev Merkle proof verification based on * https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol */ library MerkleProof { /** * @dev Verifies a Merkle proof proving the existence of a leaf in a Merkle tree. Assumes that each pair of leaves * and each pair of pre-images are sorted. * @param proof Merkle proof containing sibling hashes on the branch from the leaf to the root of the Merkle tree * @param root Merkle root * @param leaf Leaf of Merkle tree */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash < proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } }
pragma solidity >=0.4.25 <0.6.0; contract Migrations { address public owner; uint public last_completed_migration; modifier restricted() { if (msg.sender == owner) _; } constructor() public { owner = msg.sender; } function setCompleted(uint completed) public restricted { last_completed_migration = completed; } function upgrade(address new_address) public restricted { Migrations upgraded = Migrations(new_address); upgraded.setCompleted(last_completed_migration); } }
pragma solidity ^0.5.2; /* The MIT License (MIT) Copyright (c) 2016 Smart Contract Solutions, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "mul: c / a != b"); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "div: b must be > 0"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "sub: b must be <= a"); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "add: c must be >= a"); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "mod: b == 0"); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"a_publicKeyX","type":"bytes32"},{"name":"a_publicKeyY","type":"bytes32"}],"name":"PublicKeyToEthereumAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a_nAmount","type":"uint256"},{"name":"a_nWhichChain","type":"uint8"}],"name":"GetRedeemAmount","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"m_EthereumStakers","outputs":[{"name":"nAmount","type":"uint256"},{"name":"nDay","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"m_blockchainRatios","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"m_staked","outputs":[{"name":"nAmountStaked","type":"uint256"},{"name":"nSharesStaked","type":"uint256"},{"name":"nCompoundedPayoutAccumulated","type":"uint256"},{"name":"tLockTime","type":"uint256"},{"name":"tEndStakeCommitTime","type":"uint256"},{"name":"tLastCompoundedUpdateTime","type":"uint256"},{"name":"tTimeRemovedFromGlobalPool","type":"uint256"},{"name":"nVotedOnMultiplier","type":"uint8"},{"name":"bIsInGlobalPool","type":"bool"},{"name":"bIsLatePenaltyAlreadyPooled","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_tTimestamp","type":"uint256"}],"name":"TimestampToDaysSinceLaunch","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_nTotalRedeemed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a_nAmount","type":"uint256"},{"name":"a_hMerkleTreeBranches","type":"bytes32[]"},{"name":"a_addressClaiming","type":"address"},{"name":"a_publicKeyX","type":"bytes32"},{"name":"a_publicKeyY","type":"bytes32"},{"name":"a_nAddressType","type":"uint8"},{"name":"a_v","type":"uint8"},{"name":"a_r","type":"bytes32"},{"name":"a_s","type":"bytes32"},{"name":"a_nWhichChain","type":"uint8"},{"name":"a_referrer","type":"address"}],"name":"Claim","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"m_nUTXOCountAtSnapshot","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DaysSinceLaunch","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"UpdateDailyData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"m_nAdjustedMaxRedeemable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"TransferContractETH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"a_nStakeShares","type":"uint256"},{"name":"a_tLockTime","type":"uint256"},{"name":"a_tEndTime","type":"uint256"}],"name":"CalculatePayout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_address","type":"address"}],"name":"GetNumberOfStakes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"m_votingMultiplierMap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_address","type":"address"},{"name":"a_nWhichChain","type":"uint8"}],"name":"GenerateSignatureMessage","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a_nStartTime","type":"uint256"},{"name":"a_nEndTime","type":"uint256"}],"name":"DifferenceInDays","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"a_nIndex","type":"uint256"}],"name":"WithdrawFromEthPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"GetCirculatingSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_hMerkleTreeBranches","type":"bytes32[]"},{"name":"a_hMerkleLeaf","type":"bytes32"},{"name":"a_nWhichChain","type":"uint8"}],"name":"VerifyProof","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_nRedeemedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_nTotalEthStaked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ExchangeEthereumAirdrops","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_addressRedeeming","type":"bytes20"},{"name":"a_nAmount","type":"uint256"},{"name":"a_hMerkleTreeBranches","type":"bytes32[]"},{"name":"a_nWhichChain","type":"uint8"}],"name":"CanClaim","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"a_nAmount","type":"uint256"},{"name":"a_nDays","type":"uint256"},{"name":"a_nInterestMultiplierVote","type":"uint8"}],"name":"StartStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"m_dailyDataMap","outputs":[{"name":"nPayoutAmount","type":"uint256"},{"name":"nTotalStakeShares","type":"uint256"},{"name":"nTotalEthStaked","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_addressClaiming","type":"address"},{"name":"a_publicKeyX","type":"bytes32"},{"name":"a_publicKeyY","type":"bytes32"},{"name":"a_v","type":"uint8"},{"name":"a_r","type":"bytes32"},{"name":"a_s","type":"bytes32"},{"name":"a_nWhichChain","type":"uint8"}],"name":"ECDSAVerify","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"StartEthStake","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"m_hMerkleTreeRootsArray","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_nTotalStakeShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GetTimeUntilNextDailyUpdate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"a_nStakeIndex","type":"uint256"},{"name":"a_address","type":"address"}],"name":"EndStakeForAFriend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"a_hMerkleLeafHash","type":"bytes32"},{"name":"a_hMerkleTreeBranches","type":"bytes32[]"},{"name":"a_nWhichChain","type":"uint8"}],"name":"CanClaimUTXOHash","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_hash","type":"bytes32"},{"name":"a_v","type":"uint8"},{"name":"a_r","type":"bytes32"},{"name":"a_s","type":"bytes32"},{"name":"a_address","type":"address"}],"name":"ValidateSignature","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_nInterestMultiplier","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"a_address","type":"address"}],"name":"GetNumberOfEthPoolStakes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_nAmount","type":"uint256"},{"name":"a_nDaysSinceLaunch","type":"uint256"}],"name":"GetMonthlyLatePenalty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"m_nTotalStakedTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"IsClaimablePhase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_nAmount","type":"uint256"},{"name":"a_nDaysSinceLaunch","type":"uint256"}],"name":"GetRobinHoodMonthlyAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"a_nStakeIndex","type":"uint256"}],"name":"EndStakeSafely","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"a_tLockTime","type":"uint256"},{"name":"a_nEndStakeCommitTime","type":"uint256"},{"name":"a_nAmount","type":"uint256"},{"name":"a_nInterestEarned","type":"uint256"}],"name":"CalculateEarlyPenalty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"a_nStakeIndex","type":"uint256"}],"name":"EndStakeEarly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_nMaxRedeemable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_publicKeyX","type":"bytes32"},{"name":"a_publicKeyY","type":"bytes32"},{"name":"a_nAddressType","type":"uint8"}],"name":"PublicKeyToBitcoinAddress","outputs":[{"name":"","type":"bytes20"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"a_nStakeIndex","type":"uint256"}],"name":"CompoundInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"m_nLastEthWithdrawalTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a_tEndStakeCommitTime","type":"uint256"},{"name":"a_tTimeRemovedFromGlobalPool","type":"uint256"},{"name":"a_nInterestEarned","type":"uint256"}],"name":"CalculateLatePenalty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"inputs":[{"name":"a_hBTCMerkleTreeRoot","type":"bytes32"},{"name":"a_hBCHMerkleTreeRoot","type":"bytes32"},{"name":"a_hBSVMerkleTreeRoot","type":"bytes32"},{"name":"a_hETHMerkleTreeRoot","type":"bytes32"},{"name":"a_hLTCMerkleTreeRoot","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nOriginalClaimAmount","type":"uint256"},{"indexed":false,"name":"nAmountGranted","type":"uint256"},{"indexed":false,"name":"nBonuses","type":"uint256"},{"indexed":false,"name":"nPenalties","type":"uint256"},{"indexed":false,"name":"bWasReferred","type":"bool"}],"name":"ClaimEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nAmount","type":"uint256"},{"indexed":false,"name":"nDays","type":"uint256"}],"name":"StartStakeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nInterestCompounded","type":"uint256"}],"name":"CompoundInterestEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nPrincipal","type":"uint256"},{"indexed":false,"name":"nPayout","type":"uint256"},{"indexed":false,"name":"nDaysServed","type":"uint256"},{"indexed":false,"name":"nPenalty","type":"uint256"},{"indexed":false,"name":"nStakeShares","type":"uint256"},{"indexed":false,"name":"nDaysCommitted","type":"uint256"}],"name":"EndStakeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nShares","type":"uint256"},{"indexed":false,"name":"tStakeEndTimeCommit","type":"uint256"}],"name":"EndStakeForAFriendEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nEthAmount","type":"uint256"}],"name":"StartEthStakeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nPayout","type":"uint256"}],"name":"EndEthStakeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
60806040526000600a819055600b819055600e600d5560148190556015805460ff199081166001179091556017919091556018805490911690553480156200004657600080fd5b5060405160a080620053a5833981018060405260a08110156200006857600080fd5b50805160208201516040830151606084015160809094015142600355600484905560058390556006829055600785905560088190556009805461ffff19166114081763ffff000019166308d700001765ffff000000001916650c22000000001767ffff000000000000191667051f00000000000017905592939192909190733f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be60196000018054600160a060020a0392909216600160a060020a0319928316179055650fd3558c866e602555601a8054821673d551234ae421e3bcba99a0da6d736074f22192ff1790556506257e0794c9602655601b8054821673564286362092d8e7936f0549571a803b203aaced17905565050e0f7a0018602755601c80548216730681d8db095565fe8a346fa0277bffde9c0edbbf17905565056a3951f38f602855601d80548216734e9ce36e442e55ecd9025b9a6e0d88485d628a671790556602c554fd4b4c62602955601e8054821673fbb1b73c4f0bda4f67dca266ce6ef42f520fbb98179055654d48f835cc10602a55601f805482167366f820a414680b5bcda5eeca5dea238543f42054179055660250e0a9c35ff0602b55602080548216732b5634c42055806a59e9107ed44d43c426e58258179055650602ef41b188602c5560218054821673689c56aef474df92d44a1b70850f808488f9769c1790556503fb6914c4e6602d55602280548216737891b20c690605f4e370d6944c8a5dbfac5a451c179055650624c278c877602e5560238054821673dc76cd25977e0a5ae17155770273ad58648900d3179055660184a1c5de2f78602f55602480549091167333683b94334eebc9bd3ea85ddbda4a86fb4614051790556502323cf7826a603055620002ff30664b95bb346fddee6401000000006200030a810204565b505050505062000445565b600160a060020a03821615156200032057600080fd5b6002546200033d9082640100000000620044f8620003c982021704565b600255600160a060020a038216600090815260208190526040902054620003739082640100000000620044f8620003c982021704565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000828201838110156200043e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6164643a2063206d757374206265203e3d206100000000000000000000000000604482015290519081900360640190fd5b9392505050565b614f5080620004556000396000f3fe6080604052600436106103b4576000357c01000000000000000000000000000000000000000000000000000000009004806370a08231116101f9578063a9059cbb1161011f578063d1c1815a116100bd578063e581528a1161008c578063e581528a14611091578063f4bcd7ad146110ec578063fd679f7114611116578063ffce9ed81461112b576103b4565b8063d1c1815a14610fdb578063dd5d7a9b14611017578063dd62ed3e14611041578063e2611b4c1461107c576103b4565b8063b85f1173116100f9578063b85f117314610f57578063bf2f94f314610f6c578063c147059e14610f81578063c5aed5c814610fb1576103b4565b8063a9059cbb14610ebb578063b272539214610ef4578063b40dd0fd14610f27576103b4565b806384bd319d1161019757806392867f381161016657806392867f3814610df457806395d89b4114610e425780639b7cdcea14610e57578063a457c2d714610e82576103b4565b806384bd319d14610cd557806385b3806914610cea5780639128ea3e14610cff57806392787c2c14610d38576103b4565b806376443755116101d35780637644375514610c1d57806379693b3514610c4757806379f2059814610ca35780637ff7073214610cab576103b4565b806370a0823114610ae1578063724b944a14610b145780637599819114610be4576103b4565b80633e1a74b6116102de5780635300aa0c1161027c5780636349253c1161024b5780636349253c146109ea57806367f9fc5c14610aa257806368902f2514610ab75780636933e23a14610acc576103b4565b80635300aa0c1461093f578063545a9d671461097b57806362691a89146109ab5780636301d238146109d5576103b4565b80634e9c3473116102b85780634e9c3473146108945780634f5a0457146108a957806351791726146108df57806351a4d44f14610912576103b4565b80633e1a74b61461085557806341ebca4a1461086a578063450df1f11461087f576103b4565b806313eb99df116103565780632f8fdead116103255780632f8fdead146106f6578063313ce567146107f2578063395093511461080757806339c4193214610840576103b4565b806313eb99df1461064d578063176448c41461068957806318160ddd1461069e57806323b872dd146106b3576103b4565b8063095ea7b311610392578063095ea7b3146104dd5780630dbcb5d41461052a5780631117cc5d1461057c57806313b71490146105bd576103b4565b806301f015e5146103b657806304ff943c1461040257806306fdde0314610453575b005b3480156103c257600080fd5b506103e6600480360360408110156103d957600080fd5b5080359060200135611161565b60408051600160a060020a039092168252519081900360200190f35b34801561040e57600080fd5b506104356004803603604081101561042557600080fd5b508035906020013560ff16611190565b60408051938452602084019290925282820152519081900360600190f35b34801561045f57600080fd5b506104686111dc565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104a257818101518382015260200161048a565b50505050905090810190601f1680156104cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e957600080fd5b506105166004803603604081101561050057600080fd5b50600160a060020a038135169060200135611213565b604080519115158252519081900360200190f35b34801561053657600080fd5b506105636004803603604081101561054d57600080fd5b50600160a060020a038135169060200135611229565b6040805192835260208301919091528051918290030190f35b34801561058857600080fd5b506105a66004803603602081101561059f57600080fd5b5035611264565b6040805161ffff9092168252519081900360200190f35b3480156105c957600080fd5b506105f6600480360360408110156105e057600080fd5b50600160a060020a03813516906020013561128f565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260ff1660e08501521515610100840152151561012083015251908190036101400190f35b34801561065957600080fd5b506106776004803603602081101561067057600080fd5b5035611306565b60408051918252519081900360200190f35b34801561069557600080fd5b50610677611330565b3480156106aa57600080fd5b50610677611336565b3480156106bf57600080fd5b50610516600480360360608110156106d657600080fd5b50600160a060020a0381358116916020810135909116906040013561133d565b34801561070257600080fd5b50610677600480360361016081101561071a57600080fd5b8135919081019060408101602082013564010000000081111561073c57600080fd5b82018360208201111561074e57600080fd5b8035906020019184602083028401116401000000008311171561077057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050600160a060020a038335811694506020840135936040810135935060ff606082013581169350608082013581169260a08301359260c08101359260e082013516916101009091013516611395565b3480156107fe57600080fd5b506106776116a3565b34801561081357600080fd5b506105166004803603604081101561082a57600080fd5b50600160a060020a0381351690602001356116a8565b34801561084c57600080fd5b506106776116e4565b34801561086157600080fd5b506106776116ec565b34801561087657600080fd5b506103b46116fc565b34801561088b57600080fd5b50610677611979565b3480156108a057600080fd5b506103b4611984565b3480156108b557600080fd5b50610677600480360360608110156108cc57600080fd5b5080359060208101359060400135611a86565b3480156108eb57600080fd5b506106776004803603602081101561090257600080fd5b5035600160a060020a0316611b13565b34801561091e57600080fd5b506106776004803603602081101561093557600080fd5b503560ff16611b2e565b34801561094b57600080fd5b506104686004803603604081101561096257600080fd5b508035600160a060020a0316906020013560ff16611b40565b34801561098757600080fd5b506106776004803603604081101561099e57600080fd5b5080359060200135611f6e565b3480156109b757600080fd5b506103b4600480360360208110156109ce57600080fd5b5035611f87565b3480156109e157600080fd5b506106776121e3565b3480156109f657600080fd5b5061051660048036036060811015610a0d57600080fd5b810190602081018135640100000000811115610a2857600080fd5b820183602082011115610a3a57600080fd5b80359060200191846020830284011164010000000083111715610a5c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550508235935050506020013560ff16612205565b348015610aae57600080fd5b506106776122be565b348015610ac357600080fd5b506106776122c4565b348015610ad857600080fd5b506103b46122ca565b348015610aed57600080fd5b5061067760048036036020811015610b0457600080fd5b5035600160a060020a031661244a565b348015610b2057600080fd5b5061051660048036036080811015610b3757600080fd5b6bffffffffffffffffffffffff1982351691602081013591810190606081016040820135640100000000811115610b6d57600080fd5b820183602082011115610b7f57600080fd5b80359060200191846020830284011164010000000083111715610ba157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903560ff1691506124659050565b348015610bf057600080fd5b506103b460048036036060811015610c0757600080fd5b508035906020810135906040013560ff166124b9565b348015610c2957600080fd5b5061043560048036036020811015610c4057600080fd5b503561293e565b348015610c5357600080fd5b50610516600480360360e0811015610c6a57600080fd5b50600160a060020a038135169060208101359060408101359060ff606082013581169160808101359160a08201359160c001351661295f565b6103b4612baf565b348015610cb757600080fd5b5061067760048036036020811015610cce57600080fd5b5035612d08565b348015610ce157600080fd5b50610677612d1c565b348015610cf657600080fd5b50610677612d22565b348015610d0b57600080fd5b506103b460048036036040811015610d2257600080fd5b5080359060200135600160a060020a0316612d69565b348015610d4457600080fd5b5061051660048036036060811015610d5b57600080fd5b81359190810190604081016020820135640100000000811115610d7d57600080fd5b820183602082011115610d8f57600080fd5b80359060200191846020830284011164010000000083111715610db157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903560ff169150612e809050565b348015610e0057600080fd5b50610516600480360360a0811015610e1757600080fd5b50803590602081013560ff169060408101359060608101359060800135600160a060020a0316612ec9565b348015610e4e57600080fd5b50610468612f51565b348015610e6357600080fd5b50610e6c612f88565b6040805160ff9092168252519081900360200190f35b348015610e8e57600080fd5b5061051660048036036040811015610ea557600080fd5b50600160a060020a038135169060200135612f91565b348015610ec757600080fd5b5061051660048036036040811015610ede57600080fd5b50600160a060020a038135169060200135612fcd565b348015610f0057600080fd5b5061067760048036036020811015610f1757600080fd5b5035600160a060020a0316612fda565b348015610f3357600080fd5b5061067760048036036040811015610f4a57600080fd5b5080359060200135612ff5565b348015610f6357600080fd5b50610677613416565b348015610f7857600080fd5b5061051661341c565b348015610f8d57600080fd5b5061067760048036036040811015610fa457600080fd5b508035906020013561342f565b348015610fbd57600080fd5b506103b460048036036020811015610fd457600080fd5b5035613627565b348015610fe757600080fd5b5061067760048036036080811015610ffe57600080fd5b508035906020810135906040810135906060013561372b565b34801561102357600080fd5b506103b46004803603602081101561103a57600080fd5b50356137c5565b34801561104d57600080fd5b506106776004803603604081101561106457600080fd5b50600160a060020a0381358116916020013516613830565b34801561108857600080fd5b5061067761385b565b34801561109d57600080fd5b506110ca600480360360608110156110b457600080fd5b508035906020810135906040013560ff16613866565b604080516bffffffffffffffffffffffff199092168252519081900360200190f35b3480156110f857600080fd5b506103b46004803603602081101561110f57600080fd5b5035613d91565b34801561112257600080fd5b50610677613f52565b34801561113757600080fd5b506106776004803603606081101561114e57600080fd5b5080359060208101359060400135613f58565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b600080600061119f8585613fb7565b945060006111ac86614045565b905060006111b98761406c565b905081816111cd898363ffffffff6140d816565b94509450945050509250925092565b60408051808201909152600881527f436572656e65756d000000000000000000000000000000000000000000000000602082015281565b600061122033848461413d565b50600192915050565b60106020528160005260406000208181548110151561124457fe5b600091825260209091206002909102018054600190910154909250905082565b6009816004811061127157fe5b60109182820401919006600202915054906101000a900461ffff1681565b600f602052816000526040600020818154811015156112aa57fe5b6000918252602090912060089091020180546001820154600283015460038401546004850154600586015460068701546007909701549598509396509194909391929160ff80821691610100810482169162010000909104168a565b600061118a62015180611324600354856140d890919063ffffffff16565b9063ffffffff6141c916565b600a5481565b6002545b90565b600061134a84848461423d565b600160a060020a03841660009081526001602090815260408083203380855292529091205461138a918691611385908663ffffffff6140d816565b61413d565b5060015b9392505050565b600061139f61341c565b15156113e457604051600080516020614dbd8339815191528152600401808060200182810382526022815260200180614e306022913960400191505060405180910390fd5b60008360048111156113f257fe5b60ff16101580156114125750600483600481111561140c57fe5b60ff1611155b151561146d5760408051600080516020614dbd833981519152815260206004820152601b60248201527f496e636f727265637420626c6f636b636861696e2076616c75652e0000000000604482015290519081900360640190fd5b601e8660ff16111580156114855750601b8660ff1610155b15156114e05760408051600080516020614dbd833981519152815260206004820152601760248201527f5620706172616d6574657220697320696e76616c69642e000000000000000000604482015290519081900360640190fd5b6114f28c8c8c8c8c8c8c8c8c8c61430a565b6114fa6116fc565b6115166115078d85613fb7565b600a549063ffffffff6144f816565b600a55600080806115278f87611190565b925092509250611538308e8561423d565b6115428d8361455a565b61156073b26165df612b1c9dc705b9872178b3f48151b24d8361455a565b600b5461157490600163ffffffff6144f816565b600b55600160a060020a0385161561160f576115a08d61159b85600a63ffffffff6141c916565b61455a565b6115c16115b484600a63ffffffff6141c916565b839063ffffffff6144f816565b91506115d88561159b85600563ffffffff6141c916565b61160f73b26165df612b1c9dc705b9872178b3f48151b24d61159b6503081a2635556113248764e8d4a5100063ffffffff61460416565b7f7b9be51c743c38f891e6bdd17e95c8ec7b1d4c6b9366940886afd4370c9e3b318f8484846000600160a060020a03168a600160a060020a0316141560405180868152602001858152602001848152602001838152602001821515151581526020019550505050505060405180910390a1611690838363ffffffff6144f816565b9f9e505050505050505050505050505050565b600881565b336000818152600160209081526040808320600160a060020a03871684529091528120549091611220918590611385908663ffffffff6144f816565b630520377f81565b60006116f742611306565b905090565b600d546117076116ec565b111561197757600061171d611c84611324611336565b9050600080905061016c600d54101561183d57600a5461174b90664b95bb346fddee9063ffffffff6140d816565b905061175981600d5461342f565b905061176b828263ffffffff6144f816565b91506117a273b26165df612b1c9dc705b9872178b3f48151b24d61159b630520377f611324600b548761460490919063ffffffff16565b6117da73b26165df612b1c9dc705b9872178b3f48151b24d61159b66355c101d1df740611324600a548761460490919063ffffffff16565b6118366117fd66355c101d1df740611324600a548661460490919063ffffffff16565b61182a61181d630520377f611324600b548861460490919063ffffffff16565b859063ffffffff6144f816565b9063ffffffff6144f816565b91506118e2565b6001600081905260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf495460025b600a60ff8216116118b55760ff81166000908152601660205260409020548210156118ad5760ff81166000908152601660205260409020549092509050815b60010161186e565b506118c98460ff841663ffffffff61460416565b6015805460ff191660ff94909416939093179092555091505b6118f63061159b848463ffffffff6140d816565b6011541561191a5760115461191290839063ffffffff6144f816565b600060115591505b5060408051606081018252918252601354602080840191825260148054858501908152600d80546000908152600e9094529483209551865592516001808701919091559251600290950194909455909255805490910190556116fc565b565b66355c101d1df74081565b303115156119e15760408051600080516020614dbd833981519152815260206004820152601260248201527f4e6f2045746820746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b60175442906119f990626ebe0063ffffffff6144f816565b1115611a3e57604051600080516020614dbd8339815191528152600401808060200182810382526025815260200180614ddd6025913960400191505060405180910390fd5b60405173be9cef4196a835f29b117108460ed6fca299b61190303180156108fc02916000818181858888f19350505050158015611a7f573d6000803e3d6000fd5b5042601755565b6000600d5460001415611a9b5750600061138e565b600080611aa785611306565b90506000611ab485611306565b9050815b81811015611b07576000818152600e6020526040812060018101549054611aea9190611324908c63ffffffff61460416565b9050611afc858263ffffffff6144f816565b945050600101611ab8565b50919695505050505050565b600160a060020a03166000908152600f602052604090205490565b60166020526000908152604090205481565b60607f303132333435363738396162636465660000000000000000000000000000000081600080856004811115611b7357fe5b10158015611b8d57506002856004811115611b8a57fe5b11155b15611bd4575060408051602e8082526060820190925281602082018180388339019050509150606060405190810160405280602e8152602001614e02602e91399150611c68565b6003856004811115611be257fe5b1415611c2a5750604080516030808252606082019092528160208201818038833901905050915060606040519081016040528060308152602001614e52603091399150611c68565b5060408051602f8082526060820190925281602082018180388339019050509150606060405190810160405280602f8152602001614d0e602f913991505b6000866c0100000000000000000000000002905060608260280160ff166040519080825280601f01601f191660200182016040528015611caf576020820181803883390190505b5090506000805b8460ff16811015611d66578581815181101515611ccf57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611d2e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611cb6565b5060005b6014811015611f6057866004858360148110611d8257fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908060020a82049150507f0100000000000000000000000000000000000000000000000000000000000000900460ff16601081101515611e0357fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611e3a57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535086848260148110611e7757fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002600f7f010000000000000000000000000000000000000000000000000000000000000002167f0100000000000000000000000000000000000000000000000000000000000000900460ff16601081101515611ef157fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611f2857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611d6a565b509098975050505050505050565b600061138e62015180611324848663ffffffff6140d816565b336000908152601060205260409020548110611ff25760408051600080516020614dbd833981519152815260206004820152601860248201527f457468207374616b6520646f6573206e6f742065786973740000000000000000604482015290519081900360640190fd5b611ffa6116fc565b33600090815260106020526040812080548390811061201557fe5b90600052602060002090600202016001015490506120316116ec565b811061207657604051600080516020614dbd8339815191528152600401808060200182810382526024815260200180614d996024913960400191505060405180910390fd5b33600090815260106020526040812080548490811061209157fe5b60009182526020808320600290920290910154848352600e90915260408220549092506120c590600a63ffffffff6141c916565b6000848152600e6020526040812060020154919250906120ef90611324848663ffffffff61460416565b90506120fb338261455a565b6040805182815290517f2f23cd84e05800a1863cafa244053689ca574c1a9a21c05fb1b7beff81fa40399181900360200190a13360009081526010602052604081205461214f90600163ffffffff6140d816565b90508581146121bf5733600090815260106020526040902080548290811061217357fe5b6000918252602080832033845260109091526040909220805460029092029092019190889081106121a057fe5b6000918252602090912082546002909202019081556001918201549101555b33600090815260106020526040902081906121da9082614c40565b50505050505050565b60006116f76121f13061244a565b6121f9611336565b9063ffffffff6140d816565b60008082600481111561221457fe5b60ff16101580156122345750600482600481111561222e57fe5b60ff1611155b151561228f5760408051600080516020614dbd833981519152815260206004820152601960248201527f496e76616c696420626c6f636b636861696e206f7074696f6e00000000000000604482015290519081900360640190fd5b6122b68460048460048111156122a157fe5b60ff16600581106122ae57fe5b01548561467f565b949350505050565b600b5481565b60145481565b6122d26116fc565b60185460ff16156122e257600080fd5b6018805460ff19166001179055600080808080805b600c81101561240657612319602582600c811061231057fe5b01546003611190565b9195509350915061234230601983600c811061233157fe5b0154600160a060020a03168661423d565b61237e601982600c811061235257fe5b0154600160a060020a031661159b61237187600a63ffffffff6141c916565b869063ffffffff6144f816565b6123b06123a361181d6503081a2635556113248864e8d4a5100063ffffffff61460416565b879063ffffffff6144f816565b95506123c661237185600563ffffffff6141c916565b94506123e4611507602583600c81106123db57fe5b01546003613fb7565b600a55600b546123fb90600163ffffffff6144f816565b600b556001016122f7565b50612425738eaf4fec503da352eb66ef1e2f75c63e5bc635e18561455a565b61244373b26165df612b1c9dc705b9872178b3f48151b24d8661455a565b5050505050565b600160a060020a031660009081526020819052604090205490565b604080516bffffffffffffffffffffffff198616602080830191909152603480830187905283518084039091018152605490920190925280519101206000906124af818585612e80565b9695505050505050565b600e6124c36116ec565b101561250857604051600080516020614dbd8339815191528152600401808060200182810382526033815260200180614d666033913960400191505060405180910390fd5b826125123361244a565b101561256d5760408051600080516020614dbd833981519152815260206004820152601b60248201527f4e6f7420656e6f7567682066756e647320666f72207374616b652e0000000000604482015290519081900360640190fd5b600083116125b457604051600080516020614dbd8339815191528152600401808060200182810382526023815260200180614f026023913960400191505060405180910390fd5b60078210156125fc57604051600080516020614dbd8339815191528152600401808060200182810382526029815260200180614d3d6029913960400191505060405180910390fd5b60018160ff16101580156126145750600a8160ff1611155b151561265957604051600080516020614dbd8339815191528152600401808060200182810382526022815260200180614e826022913960400191505060405180910390fd5b600061267e612671846201518063ffffffff61460416565b429063ffffffff6144f816565b905061269442630966018063ffffffff6144f816565b8111156126f05760408051600080516020614dbd833981519152815260206004820152601b60248201527f5374616b652074696d652065786365656473206d6178696d756d2e0000000000604482015290519081900360640190fd5b6126f86116fc565b6000605a841061271e5761271b61016d61132486621e848063ffffffff61460416565b90505b600061273a6123a362989680611324898663ffffffff61460416565b9050600f600033600160a060020a0316600160a060020a031681526020019081526020016000206101406040519081016040528088815260200183815260200160008152602001428152602001858152602001428152602001600081526020018660ff1681526020016001151581526020016000151581525090806001815401808255809150509060018203906000526020600020906008020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908360ff1602179055506101008201518160070160016101000a81548160ff0219169083151502179055506101208201518160070160026101000a81548160ff0219169083151502179055505050507f9671272c138ea6c4a23b90ff9b7a8db642d371aa76933827ccb985e7892043748686604051808381526020018281526020019250505060405180910390a160ff84166000908152601660205260409020546128ec908263ffffffff6144f816565b60ff8516600090815260166020526040902055601254612912908763ffffffff6144f816565b601255601354612928908263ffffffff6144f816565b60135561293633308861423d565b505050505050565b600e6020526000908152604090208054600182015460029092015490919083565b6000606061296d8984611b40565b90506000600384600481111561297f57fe5b14612b1a57600280836040516020018082805190602001908083835b602083106129ba5780518252601f19909201916020918201910161299b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612a1d5780518252601f1990920191602091820191016129fe565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612a5c573d6000803e3d6000fd5b5050506040513d6020811015612a7157600080fd5b50516040805160208181019390935281518082038401815290820191829052805190928291908401908083835b60208310612abd5780518252601f199092019160209182019101612a9e565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612afc573d6000803e3d6000fd5b5050506040513d6020811015612b1157600080fd5b50519050612b8b565b816040516020018082805190602001908083835b60208310612b4d5780518252601f199092019160209182019101612b2e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012090505b612ba181888888612b9c8e8e611161565b612ec9565b9a9950505050505050505050565b662386f26fc10000341015612c135760408051600080516020614dbd833981519152815260206004820181905260248201527f4554482053656e74206e6f742061626f7665206d696e696d756d2076616c7565604482015290519081900360640190fd5b600e612c1d6116ec565b1015612c6257604051600080516020614dbd833981519152815260040180806020018281038252603c815260200180614ec6603c913960400191505060405180910390fd5b612c6a6116fc565b33600090815260106020908152604091829020825180840190935234835291908101612c946116ec565b905281546001818101845560009384526020938490208351600290930201918255918301519101556040805134815290517fce909959fd63858f1ce0d2fbac69566b62dfc04a9015af3f18f7c22757b4e2ec929181900390910190a1601454612d03903463ffffffff6144f816565b601455565b60048160058110612d1557fe5b0154905081565b60135481565b600080620151809050612d63612d5662015180612d4a600354426140d890919063ffffffff16565b9063ffffffff61472d16565b829063ffffffff6140d816565b91505090565b600160a060020a0381166000908152600f60205260409020548210612ddd5760408051600080516020614dbd833981519152815260206004820152601460248201527f5374616b6520646f6573206e6f74206578697374000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381166000908152600f60205260409020805483908110612e0157fe5b90600052602060002090600802016004015442111515612e705760408051600080516020614dbd833981519152815260206004820152601660248201527f5374616b65206d757374206265206d6174757265642e00000000000000000000604482015290519081900360640190fd5b612e7c8282600161479e565b5050565b6000600c6000836004811115612e9257fe5b60ff908116825260208083019390935260409182016000908120888252909352912054161580156122b657506122b6838584612205565b600081600160a060020a031660018787878760405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612f32573d6000803e3d6000fd5b50505060206040510351600160a060020a031614905095945050505050565b60408051808201909152600381527f4345520000000000000000000000000000000000000000000000000000000000602082015281565b60155460ff1681565b336000818152600160209081526040808320600160a060020a03871684529091528120549091611220918590611385908663ffffffff6140d816565b600061122033848461423d565b600160a060020a031660009081526010602052604090205490565b6000600e82116130075750600061118a565b600061301e8464e8d4a5100063ffffffff61460416565b9050600066016bcc41e90000602b85116130735761304385600e63ffffffff6140d816565b945061306961305982601d63ffffffff61460416565b611324858863ffffffff61460416565b935050505061118a565b604885116130cf5761308b838263ffffffff6141c916565b915061309e85602b63ffffffff6140d816565b945065b5e620f4800090506130bd61305982601d63ffffffff61460416565b9250613069838363ffffffff6144f816565b60658511613121575065794415f855556130ef838263ffffffff6141c916565b915061310285604863ffffffff6140d816565b945065794415f8555590506130bd61305982601d63ffffffff61460416565b608285116131735750653ca20afc2aaa613141838263ffffffff6141c916565b915061315485606563ffffffff6140d816565b9450653ca20afc2aaa90506130bd61305982601d63ffffffff61460416565b609f85116131c55750651e51057e1555613193838263ffffffff6141c916565b91506131a685608263ffffffff6140d816565b9450651e51057e155590506130bd61305982601d63ffffffff61460416565b60bc85116132175750650f2882bf0aaa6131e5838263ffffffff6141c916565b91506131f885609f63ffffffff6140d816565b9450650f2882bf0aaa90506130bd61305982601d63ffffffff61460416565b60d985116132695750650794415f8555613237838263ffffffff6141c916565b915061324a8560bc63ffffffff6140d816565b9450650b5e620f47ff90506130bd61305982601d63ffffffff61460416565b60f685116132bb575065048c27395000613289838263ffffffff6141c916565b915061329c8560d963ffffffff6140d816565b94506509184e72a00090506130bd61305982601d63ffffffff61460416565b610113851161330e57506503081a2635556132dc838263ffffffff6141c916565b91506132ef8560f663ffffffff6140d816565b9450650746a5287fff90506130bd61305982601d63ffffffff61460416565b61013085116133625750650223d639169861332f838263ffffffff6141c916565b91506133438561011363ffffffff6140d816565b9450650610344c6aaa90506130bd61305982601d63ffffffff61460416565b61014e85116133b65750650194ec4074de613383838263ffffffff6141c916565b91506133978561013063ffffffff6140d816565b945065053275f85b7290506130bd61305982601e63ffffffff61460416565b61016c85101561340b575065013670dc15556133d8838263ffffffff6141c916565b91506133ec8561014e63ffffffff6140d816565b94506503a35294400090506130bd61305982601e63ffffffff61460416565b85935050505061118a565b60125481565b600061016c6134296116ec565b10905090565b6000806134478464e8d4a5100063ffffffff61460416565b905066016bcc41e90000602b8410156134845761347b61346e82601d63ffffffff61460416565b839063ffffffff6141c916565b9250505061118a565b60488410156134a9575065b5e620f4800061347b61346e82601d63ffffffff61460416565b60658410156134ce575065794415f8555561347b61346e82601d63ffffffff61460416565b60828410156134f35750653ca20afc2aaa61347b61346e82601d63ffffffff61460416565b609f8410156135185750651e51057e155561347b61346e82601d63ffffffff61460416565b60bc84101561353d5750650f2882bf0aaa61347b61346e82601d63ffffffff61460416565b60d98410156135625750650b5e620f47ff61347b61346e82601d63ffffffff61460416565b60f684101561358757506509184e72a00061347b61346e82601d63ffffffff61460416565b6101138410156135ad5750650746a5287fff61347b61346e82601d63ffffffff61460416565b6101308410156135d35750650610344c6aaa61347b61346e82601d63ffffffff61460416565b61014e8410156135f9575065053275f85b7261347b61346e82601e63ffffffff61460416565b61016c84101561361f57506503a35294400061347b61346e82601e63ffffffff61460416565b505092915050565b336000908152600f602052604090205481106136925760408051600080516020614dbd833981519152815260206004820152601460248201527f5374616b6520646f6573206e6f74206578697374000000000000000000000000604482015290519081900360640190fd5b336000908152600f602052604090208054829081106136ad57fe5b9060005260206000209060080201600401544211151561371c5760408051600080516020614dbd833981519152815260206004820152601660248201527f5374616b65206d757374206265206d6174757265642e00000000000000000000604482015290519081900360640190fd5b6137288133600061479e565b50565b600080428511156137bc576137408642611f6e565b151561374d575081613761565b61375e83600263ffffffff6141c916565b90505b600061376d8787611f6e565b9050605a8110613793576137906115b4610e42611324858563ffffffff61460416565b91505b60006137ab611c84611324888563ffffffff61460416565b9050828111156137b9578092505b50505b95945050505050565b336000908152600f6020526040902054811061371c5760408051600080516020614dbd833981519152815260206004820152601460248201527f5374616b6520646f6573206e6f74206578697374000000000000000000000000604482015290519081900360640190fd5b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b664b95bb346fddee81565b60008080600184600381111561387857fe5b148061388f5750600384600381111561388d57fe5b145b15613a285760018516156138a45760036138a7565b60025b9050600360028288604051602001808360ff1660ff167f0100000000000000000000000000000000000000000000000000000000000000028152600101828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061392c5780518252601f19909201916020918201910161390d565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561396b573d6000803e3d6000fd5b5050506040513d602081101561398057600080fd5b50516040805160208181019390935281518082038401815290820191829052805190928291908401908083835b602083106139cc5780518252601f1990920191602091820191016139ad565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613a0b573d6000803e3d6000fd5b505050604051516c01000000000000000000000000029150613ba6565b50604080517f0400000000000000000000000000000000000000000000000000000000000000602080830191909152602182018890526041808301889052835180840390910181526061909201928390528151600493600393600293909282918401908083835b60208310613aae5780518252601f199092019160209182019101613a8f565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613aed573d6000803e3d6000fd5b5050506040513d6020811015613b0257600080fd5b50516040805160208181019390935281518082038401815290820191829052805190928291908401908083835b60208310613b4e5780518252601f199092019160209182019101613b2f565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613b8d573d6000803e3d6000fd5b505050604051516c010000000000000000000000000291505b6000846003811115613bb457fe5b1480613bcb57506001846003811115613bc957fe5b145b15613bd85750905061138e565b6002846003811115613be657fe5b1480613bfd57506003846003811115613bfb57fe5b145b15613d8857604080517e140000000000000000000000000000000000000000000000000000000000006020808301919091526bffffffffffffffffffffffff198516602283015282516016818403018152603690920192839052815160039360029392909182918401908083835b60208310613c8a5780518252601f199092019160209182019101613c6b565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613cc9573d6000803e3d6000fd5b5050506040513d6020811015613cde57600080fd5b50516040805160208181019390935281518082038401815290820191829052805190928291908401908083835b60208310613d2a5780518252601f199092019160209182019101613d0b565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613d69573d6000803e3d6000fd5b505050604051516c01000000000000000000000000029250505061138e565b50509392505050565b600d541515613dd957604051600080516020614dbd8339815191528152600401808060200182810382526022815260200180614ea46022913960400191505060405180910390fd5b336000908152600f60205260408120805483908110613df457fe5b90600052602060002090600802019050806004015442101515613e665760408051600080516020614dbd833981519152815260206004820152601a60248201527f5374616b652068617320616c7265616479206d6174757265642e000000000000604482015290519081900360640190fd5b613e6e6116fc565b6000613e838260010154836005015442611a86565b90508015613f4d576002820154613ea0908263ffffffff6144f816565b60028301556001820154613eba908263ffffffff6144f816565b6001830155600782015460ff16600090815260166020526040902054613ee6908263ffffffff6144f816565b600783015460ff16600090815260166020526040902055601354613f10908263ffffffff6144f816565b6013554260058301556040805182815290517fcf93184ea171546a9b5a1f0ce649dbe2112412533d72500bb74255a4457c0d789181900360200190a15b505050565b60175481565b600080613f6e8562093a8063ffffffff6144f816565b8411156122b6576000613f93613f8d8762093a8063ffffffff6144f816565b86611f6e565b90506064811115613fa2575060645b6124af6064611324868463ffffffff61460416565b600080826004811115613fc657fe5b1461403e576000826004811115613fd957fe5b60001901905067016345785d8a0000600061401d600960ff851660048110613ffd57fe5b6010810491909101548491600f166002026101000a900461ffff166141c9565b9050614038816113248864e8d4a5100063ffffffff61460416565b95505050505b5090919050565b6000806140506116ec565b905061138e61405f8483612ff5565b849063ffffffff6140d816565b6000806140776116ec565b9050600e81101561408a5750600061409e565b61409b81600e63ffffffff6140d816565b90505b61015e6140b284600563ffffffff6141c916565b93506122b6816113246140cb828663ffffffff6140d816565b879063ffffffff61460416565b6000828211156141375760408051600080516020614dbd833981519152815260206004820152601360248201527f7375623a2062206d757374206265203c3d206100000000000000000000000000604482015290519081900360640190fd5b50900390565b600160a060020a038216151561415257600080fd5b600160a060020a038316151561416757600080fd5b600160a060020a03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008082116142275760408051600080516020614dbd833981519152815260206004820152601260248201527f6469763a2062206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b6000828481151561423457fe5b04949350505050565b600160a060020a038216151561425257600080fd5b600160a060020a03831660009081526020819052604090205461427b908263ffffffff6140d816565b600160a060020a0380851660009081526020819052604080822093909355908416815220546142b0908263ffffffff6144f816565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000600382600481111561431a57fe5b1461437d5761432a888888613866565b8b60405160200180836bffffffffffffffffffffffff19166bffffffffffffffffffffffff19168152601401828152602001925050506040516020818303038152906040528051906020012090506143d9565b6143878888611161565b8b6040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040528051906020012090505b6143e4818b84612e80565b151561443f5760408051600080516020614dbd833981519152815260206004820152601860248201527f5554584f2043616e6e6f742062652072656465656d65642e0000000000000000604482015290519081900360640190fd5b61444e8989898888888861295f565b15156144a95760408051600080516020614dbd833981519152815260206004820152601a60248201527f454344534120766572696669636174696f6e206661696c65642e000000000000604482015290519081900360640190fd5b6001600c60008460048111156144bb57fe5b60ff1681526020808201929092526040908101600090812094815293909152909120805460ff191691151591909117905550505050505050505050565b60008282018381101561138e5760408051600080516020614dbd833981519152815260206004820152601360248201527f6164643a2063206d757374206265203e3d206100000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216151561456f57600080fd5b600254614582908263ffffffff6144f816565b600255600160a060020a0382166000908152602081905260409020546145ae908263ffffffff6144f816565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008215156146155750600061118a565b82820282848281151561462457fe5b041461138e5760408051600080516020614dbd833981519152815260206004820152600f60248201527f6d756c3a2063202f206120213d20620000000000000000000000000000000000604482015290519081900360640190fd5b600081815b8551811015614722576000868281518110151561469d57fe5b906020019060200201519050808310156146e75782816040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250614719565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b50600101614684565b509092149392505050565b600081151561478b5760408051600080516020614dbd833981519152815260206004820152600b60248201527f6d6f643a2062203d3d2030000000000000000000000000000000000000000000604482015290519081900360640190fd5b818381151561479657fe5b069392505050565b6147a66116fc565b600160a060020a0382166000908152600f602052604081208054859081106147ca57fe5b906000526020600020906008020190506000816004015442116147ed57426147f3565b81600401545b9050600061480a8360010154846005015484611a86565b90506148238360020154826144f890919063ffffffff16565b835490915061483990829063ffffffff6144f816565b6007840154909150610100900460ff16156149225782546012546148629163ffffffff6140d816565b601255600183015460135461487c9163ffffffff6140d816565b6013556001830154600784015460ff166000908152601660205260409020546148aa9163ffffffff6140d816565b60078401805460ff16600090815260166020526040902091909155426006850155805461ff00191690558315614922577f2d751a305886e8f29f32da5b106880589a961fe1f85fe5dd6844e96b89af2f0083600101548460040154604051808381526020018281526020019250505060405180910390a15b60008415156149555760038401546004850154855461495292919061494d868263ffffffff6140d816565b61372b565b90505b80151561498857614985846004015485600601546149808760000154866140d890919063ffffffff16565b613f58565b90505b80158015906149a25750600784015462010000900460ff16155b156149fc576149ca6149bb82600263ffffffff6141c916565b6011549063ffffffff6144f816565b6011556149fc3073b26165df612b1c9dc705b9872178b3f48151b24d6149f784600263ffffffff6141c916565b61423d565b8415614a1a5760078401805462ff00001916620100001790556121da565b614a2a828263ffffffff6140d816565b91507fd642043aee195f1d3f9b848830fb73fc38551e597d71cec1c737e4cd63ddfc1284600001548386600401544210614a7557614a7087600301548860060154611f6e565b614a83565b614a83876003015442611f6e565b848860010154614a9b8a600301548b60040154611f6e565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190a1614ad830878461423d565b6121da8688600160a060020a0382166000908152600f6020526040812054614b0790600163ffffffff6140d816565b9050818114614c1657600160a060020a0383166000908152600f60205260409020805482908110614b3457fe5b9060005260206000209060080201600f600085600160a060020a0316600160a060020a0316815260200190815260200160002083815481101515614b7457fe5b6000918252602090912082546008909202019081556001808301549082015560028083015490820155600380830154908201556004808301549082015560058083015490820155600680830154908201556007918201805492909101805460ff191660ff93841617808255825461010090819004851615150261ff00199091161780825591546201000090819004909316151590920262ff0000199091161790555b600160a060020a0383166000908152600f602052604090208190614c3a9082614c6c565b50505050565b815481835581811115613f4d57600202816002028360005260206000209182019101613f4d9190614c98565b815481835581811115613f4d57600802816008028360005260206000209182019101613f4d9190614cbc565b61133a91905b80821115614cb85760008082556001820155600201614c9e565b5090565b61133a91905b80821115614cb85760008082556001820181905560028201819055600382018190556004820181905560058201819055600682015560078101805462ffffff19169055600801614cc256fe194c697465636f696e205369676e6564204d6573736167653a0a3c436c61696d5f436572656e65756d5f746f5f30785374616b6520697320756e64657220746865206d696e696d756d2074696d652072657175697265642e5374616b696e6720646f65736e277420626567696e20756e74696c20616674657220746865206275666665722077696e646f774d757374207761697420756e74696c206e6578742064617920746f20776974686472617708c379a00000000000000000000000000000000000000000000000000000000043616e206f6e6c79207769746864726177206f6e63652065766572792033206d6f6e74687318426974636f696e205369676e6564204d6573736167653a0a3c436c61696d5f436572656e65756d5f746f5f3078436c61696d206973206f757473696465206f6620636c61696d7320706572696f642e19457468657265756d205369676e6564204d6573736167653a0a3630436c61696d5f436572656e65756d5f746f5f3078496e746572657374206d756c7469706c6965722072616e676520697320312d31302e4669727374207570646174652064617920686173206e6f742066696e69736865642e45746820506f6f6c207374616b696e6720646f65736e277420626567696e20756e74696c20616674657220746865206275666665722077696e646f775374616b6520616d6f756e74206d7573742062652067726561746572207468616e2030a165627a7a723058204d892470f374fc86409f6a049f46995c56dedc2f4938bf6efdc426f38d4b49ad0029ed75cf5df074fdf60702bfbf75049d53ebe942e09ad9fe1b1467df516dd3fb5b197a2e2ef397adfa946697c886b08258297cc3f404e00243bab1197e22b3dfadede6b23f247125725e4bc5d6a1780c5278032508ba4a5d475daf91622aa1fe257023649ffe4d83823ac2f3fa1303affde4de4737b07d9d4830270206f246be77aaa30c59d92230d02247a811c2812e378a4ffb29e64a54407d00fc6d7b269f33
Deployed Bytecode
0x6080604052600436106103b4576000357c01000000000000000000000000000000000000000000000000000000009004806370a08231116101f9578063a9059cbb1161011f578063d1c1815a116100bd578063e581528a1161008c578063e581528a14611091578063f4bcd7ad146110ec578063fd679f7114611116578063ffce9ed81461112b576103b4565b8063d1c1815a14610fdb578063dd5d7a9b14611017578063dd62ed3e14611041578063e2611b4c1461107c576103b4565b8063b85f1173116100f9578063b85f117314610f57578063bf2f94f314610f6c578063c147059e14610f81578063c5aed5c814610fb1576103b4565b8063a9059cbb14610ebb578063b272539214610ef4578063b40dd0fd14610f27576103b4565b806384bd319d1161019757806392867f381161016657806392867f3814610df457806395d89b4114610e425780639b7cdcea14610e57578063a457c2d714610e82576103b4565b806384bd319d14610cd557806385b3806914610cea5780639128ea3e14610cff57806392787c2c14610d38576103b4565b806376443755116101d35780637644375514610c1d57806379693b3514610c4757806379f2059814610ca35780637ff7073214610cab576103b4565b806370a0823114610ae1578063724b944a14610b145780637599819114610be4576103b4565b80633e1a74b6116102de5780635300aa0c1161027c5780636349253c1161024b5780636349253c146109ea57806367f9fc5c14610aa257806368902f2514610ab75780636933e23a14610acc576103b4565b80635300aa0c1461093f578063545a9d671461097b57806362691a89146109ab5780636301d238146109d5576103b4565b80634e9c3473116102b85780634e9c3473146108945780634f5a0457146108a957806351791726146108df57806351a4d44f14610912576103b4565b80633e1a74b61461085557806341ebca4a1461086a578063450df1f11461087f576103b4565b806313eb99df116103565780632f8fdead116103255780632f8fdead146106f6578063313ce567146107f2578063395093511461080757806339c4193214610840576103b4565b806313eb99df1461064d578063176448c41461068957806318160ddd1461069e57806323b872dd146106b3576103b4565b8063095ea7b311610392578063095ea7b3146104dd5780630dbcb5d41461052a5780631117cc5d1461057c57806313b71490146105bd576103b4565b806301f015e5146103b657806304ff943c1461040257806306fdde0314610453575b005b3480156103c257600080fd5b506103e6600480360360408110156103d957600080fd5b5080359060200135611161565b60408051600160a060020a039092168252519081900360200190f35b34801561040e57600080fd5b506104356004803603604081101561042557600080fd5b508035906020013560ff16611190565b60408051938452602084019290925282820152519081900360600190f35b34801561045f57600080fd5b506104686111dc565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104a257818101518382015260200161048a565b50505050905090810190601f1680156104cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e957600080fd5b506105166004803603604081101561050057600080fd5b50600160a060020a038135169060200135611213565b604080519115158252519081900360200190f35b34801561053657600080fd5b506105636004803603604081101561054d57600080fd5b50600160a060020a038135169060200135611229565b6040805192835260208301919091528051918290030190f35b34801561058857600080fd5b506105a66004803603602081101561059f57600080fd5b5035611264565b6040805161ffff9092168252519081900360200190f35b3480156105c957600080fd5b506105f6600480360360408110156105e057600080fd5b50600160a060020a03813516906020013561128f565b604080519a8b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260ff1660e08501521515610100840152151561012083015251908190036101400190f35b34801561065957600080fd5b506106776004803603602081101561067057600080fd5b5035611306565b60408051918252519081900360200190f35b34801561069557600080fd5b50610677611330565b3480156106aa57600080fd5b50610677611336565b3480156106bf57600080fd5b50610516600480360360608110156106d657600080fd5b50600160a060020a0381358116916020810135909116906040013561133d565b34801561070257600080fd5b50610677600480360361016081101561071a57600080fd5b8135919081019060408101602082013564010000000081111561073c57600080fd5b82018360208201111561074e57600080fd5b8035906020019184602083028401116401000000008311171561077057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050600160a060020a038335811694506020840135936040810135935060ff606082013581169350608082013581169260a08301359260c08101359260e082013516916101009091013516611395565b3480156107fe57600080fd5b506106776116a3565b34801561081357600080fd5b506105166004803603604081101561082a57600080fd5b50600160a060020a0381351690602001356116a8565b34801561084c57600080fd5b506106776116e4565b34801561086157600080fd5b506106776116ec565b34801561087657600080fd5b506103b46116fc565b34801561088b57600080fd5b50610677611979565b3480156108a057600080fd5b506103b4611984565b3480156108b557600080fd5b50610677600480360360608110156108cc57600080fd5b5080359060208101359060400135611a86565b3480156108eb57600080fd5b506106776004803603602081101561090257600080fd5b5035600160a060020a0316611b13565b34801561091e57600080fd5b506106776004803603602081101561093557600080fd5b503560ff16611b2e565b34801561094b57600080fd5b506104686004803603604081101561096257600080fd5b508035600160a060020a0316906020013560ff16611b40565b34801561098757600080fd5b506106776004803603604081101561099e57600080fd5b5080359060200135611f6e565b3480156109b757600080fd5b506103b4600480360360208110156109ce57600080fd5b5035611f87565b3480156109e157600080fd5b506106776121e3565b3480156109f657600080fd5b5061051660048036036060811015610a0d57600080fd5b810190602081018135640100000000811115610a2857600080fd5b820183602082011115610a3a57600080fd5b80359060200191846020830284011164010000000083111715610a5c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550508235935050506020013560ff16612205565b348015610aae57600080fd5b506106776122be565b348015610ac357600080fd5b506106776122c4565b348015610ad857600080fd5b506103b46122ca565b348015610aed57600080fd5b5061067760048036036020811015610b0457600080fd5b5035600160a060020a031661244a565b348015610b2057600080fd5b5061051660048036036080811015610b3757600080fd5b6bffffffffffffffffffffffff1982351691602081013591810190606081016040820135640100000000811115610b6d57600080fd5b820183602082011115610b7f57600080fd5b80359060200191846020830284011164010000000083111715610ba157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903560ff1691506124659050565b348015610bf057600080fd5b506103b460048036036060811015610c0757600080fd5b508035906020810135906040013560ff166124b9565b348015610c2957600080fd5b5061043560048036036020811015610c4057600080fd5b503561293e565b348015610c5357600080fd5b50610516600480360360e0811015610c6a57600080fd5b50600160a060020a038135169060208101359060408101359060ff606082013581169160808101359160a08201359160c001351661295f565b6103b4612baf565b348015610cb757600080fd5b5061067760048036036020811015610cce57600080fd5b5035612d08565b348015610ce157600080fd5b50610677612d1c565b348015610cf657600080fd5b50610677612d22565b348015610d0b57600080fd5b506103b460048036036040811015610d2257600080fd5b5080359060200135600160a060020a0316612d69565b348015610d4457600080fd5b5061051660048036036060811015610d5b57600080fd5b81359190810190604081016020820135640100000000811115610d7d57600080fd5b820183602082011115610d8f57600080fd5b80359060200191846020830284011164010000000083111715610db157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903560ff169150612e809050565b348015610e0057600080fd5b50610516600480360360a0811015610e1757600080fd5b50803590602081013560ff169060408101359060608101359060800135600160a060020a0316612ec9565b348015610e4e57600080fd5b50610468612f51565b348015610e6357600080fd5b50610e6c612f88565b6040805160ff9092168252519081900360200190f35b348015610e8e57600080fd5b5061051660048036036040811015610ea557600080fd5b50600160a060020a038135169060200135612f91565b348015610ec757600080fd5b5061051660048036036040811015610ede57600080fd5b50600160a060020a038135169060200135612fcd565b348015610f0057600080fd5b5061067760048036036020811015610f1757600080fd5b5035600160a060020a0316612fda565b348015610f3357600080fd5b5061067760048036036040811015610f4a57600080fd5b5080359060200135612ff5565b348015610f6357600080fd5b50610677613416565b348015610f7857600080fd5b5061051661341c565b348015610f8d57600080fd5b5061067760048036036040811015610fa457600080fd5b508035906020013561342f565b348015610fbd57600080fd5b506103b460048036036020811015610fd457600080fd5b5035613627565b348015610fe757600080fd5b5061067760048036036080811015610ffe57600080fd5b508035906020810135906040810135906060013561372b565b34801561102357600080fd5b506103b46004803603602081101561103a57600080fd5b50356137c5565b34801561104d57600080fd5b506106776004803603604081101561106457600080fd5b50600160a060020a0381358116916020013516613830565b34801561108857600080fd5b5061067761385b565b34801561109d57600080fd5b506110ca600480360360608110156110b457600080fd5b508035906020810135906040013560ff16613866565b604080516bffffffffffffffffffffffff199092168252519081900360200190f35b3480156110f857600080fd5b506103b46004803603602081101561110f57600080fd5b5035613d91565b34801561112257600080fd5b50610677613f52565b34801561113757600080fd5b506106776004803603606081101561114e57600080fd5b5080359060208101359060400135613f58565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b600080600061119f8585613fb7565b945060006111ac86614045565b905060006111b98761406c565b905081816111cd898363ffffffff6140d816565b94509450945050509250925092565b60408051808201909152600881527f436572656e65756d000000000000000000000000000000000000000000000000602082015281565b600061122033848461413d565b50600192915050565b60106020528160005260406000208181548110151561124457fe5b600091825260209091206002909102018054600190910154909250905082565b6009816004811061127157fe5b60109182820401919006600202915054906101000a900461ffff1681565b600f602052816000526040600020818154811015156112aa57fe5b6000918252602090912060089091020180546001820154600283015460038401546004850154600586015460068701546007909701549598509396509194909391929160ff80821691610100810482169162010000909104168a565b600061118a62015180611324600354856140d890919063ffffffff16565b9063ffffffff6141c916565b600a5481565b6002545b90565b600061134a84848461423d565b600160a060020a03841660009081526001602090815260408083203380855292529091205461138a918691611385908663ffffffff6140d816565b61413d565b5060015b9392505050565b600061139f61341c565b15156113e457604051600080516020614dbd8339815191528152600401808060200182810382526022815260200180614e306022913960400191505060405180910390fd5b60008360048111156113f257fe5b60ff16101580156114125750600483600481111561140c57fe5b60ff1611155b151561146d5760408051600080516020614dbd833981519152815260206004820152601b60248201527f496e636f727265637420626c6f636b636861696e2076616c75652e0000000000604482015290519081900360640190fd5b601e8660ff16111580156114855750601b8660ff1610155b15156114e05760408051600080516020614dbd833981519152815260206004820152601760248201527f5620706172616d6574657220697320696e76616c69642e000000000000000000604482015290519081900360640190fd5b6114f28c8c8c8c8c8c8c8c8c8c61430a565b6114fa6116fc565b6115166115078d85613fb7565b600a549063ffffffff6144f816565b600a55600080806115278f87611190565b925092509250611538308e8561423d565b6115428d8361455a565b61156073b26165df612b1c9dc705b9872178b3f48151b24d8361455a565b600b5461157490600163ffffffff6144f816565b600b55600160a060020a0385161561160f576115a08d61159b85600a63ffffffff6141c916565b61455a565b6115c16115b484600a63ffffffff6141c916565b839063ffffffff6144f816565b91506115d88561159b85600563ffffffff6141c916565b61160f73b26165df612b1c9dc705b9872178b3f48151b24d61159b6503081a2635556113248764e8d4a5100063ffffffff61460416565b7f7b9be51c743c38f891e6bdd17e95c8ec7b1d4c6b9366940886afd4370c9e3b318f8484846000600160a060020a03168a600160a060020a0316141560405180868152602001858152602001848152602001838152602001821515151581526020019550505050505060405180910390a1611690838363ffffffff6144f816565b9f9e505050505050505050505050505050565b600881565b336000818152600160209081526040808320600160a060020a03871684529091528120549091611220918590611385908663ffffffff6144f816565b630520377f81565b60006116f742611306565b905090565b600d546117076116ec565b111561197757600061171d611c84611324611336565b9050600080905061016c600d54101561183d57600a5461174b90664b95bb346fddee9063ffffffff6140d816565b905061175981600d5461342f565b905061176b828263ffffffff6144f816565b91506117a273b26165df612b1c9dc705b9872178b3f48151b24d61159b630520377f611324600b548761460490919063ffffffff16565b6117da73b26165df612b1c9dc705b9872178b3f48151b24d61159b66355c101d1df740611324600a548761460490919063ffffffff16565b6118366117fd66355c101d1df740611324600a548661460490919063ffffffff16565b61182a61181d630520377f611324600b548861460490919063ffffffff16565b859063ffffffff6144f816565b9063ffffffff6144f816565b91506118e2565b6001600081905260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf495460025b600a60ff8216116118b55760ff81166000908152601660205260409020548210156118ad5760ff81166000908152601660205260409020549092509050815b60010161186e565b506118c98460ff841663ffffffff61460416565b6015805460ff191660ff94909416939093179092555091505b6118f63061159b848463ffffffff6140d816565b6011541561191a5760115461191290839063ffffffff6144f816565b600060115591505b5060408051606081018252918252601354602080840191825260148054858501908152600d80546000908152600e9094529483209551865592516001808701919091559251600290950194909455909255805490910190556116fc565b565b66355c101d1df74081565b303115156119e15760408051600080516020614dbd833981519152815260206004820152601260248201527f4e6f2045746820746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b60175442906119f990626ebe0063ffffffff6144f816565b1115611a3e57604051600080516020614dbd8339815191528152600401808060200182810382526025815260200180614ddd6025913960400191505060405180910390fd5b60405173be9cef4196a835f29b117108460ed6fca299b61190303180156108fc02916000818181858888f19350505050158015611a7f573d6000803e3d6000fd5b5042601755565b6000600d5460001415611a9b5750600061138e565b600080611aa785611306565b90506000611ab485611306565b9050815b81811015611b07576000818152600e6020526040812060018101549054611aea9190611324908c63ffffffff61460416565b9050611afc858263ffffffff6144f816565b945050600101611ab8565b50919695505050505050565b600160a060020a03166000908152600f602052604090205490565b60166020526000908152604090205481565b60607f303132333435363738396162636465660000000000000000000000000000000081600080856004811115611b7357fe5b10158015611b8d57506002856004811115611b8a57fe5b11155b15611bd4575060408051602e8082526060820190925281602082018180388339019050509150606060405190810160405280602e8152602001614e02602e91399150611c68565b6003856004811115611be257fe5b1415611c2a5750604080516030808252606082019092528160208201818038833901905050915060606040519081016040528060308152602001614e52603091399150611c68565b5060408051602f8082526060820190925281602082018180388339019050509150606060405190810160405280602f8152602001614d0e602f913991505b6000866c0100000000000000000000000002905060608260280160ff166040519080825280601f01601f191660200182016040528015611caf576020820181803883390190505b5090506000805b8460ff16811015611d66578581815181101515611ccf57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611d2e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611cb6565b5060005b6014811015611f6057866004858360148110611d8257fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908060020a82049150507f0100000000000000000000000000000000000000000000000000000000000000900460ff16601081101515611e0357fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611e3a57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535086848260148110611e7757fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002600f7f010000000000000000000000000000000000000000000000000000000000000002167f0100000000000000000000000000000000000000000000000000000000000000900460ff16601081101515611ef157fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515611f2857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611d6a565b509098975050505050505050565b600061138e62015180611324848663ffffffff6140d816565b336000908152601060205260409020548110611ff25760408051600080516020614dbd833981519152815260206004820152601860248201527f457468207374616b6520646f6573206e6f742065786973740000000000000000604482015290519081900360640190fd5b611ffa6116fc565b33600090815260106020526040812080548390811061201557fe5b90600052602060002090600202016001015490506120316116ec565b811061207657604051600080516020614dbd8339815191528152600401808060200182810382526024815260200180614d996024913960400191505060405180910390fd5b33600090815260106020526040812080548490811061209157fe5b60009182526020808320600290920290910154848352600e90915260408220549092506120c590600a63ffffffff6141c916565b6000848152600e6020526040812060020154919250906120ef90611324848663ffffffff61460416565b90506120fb338261455a565b6040805182815290517f2f23cd84e05800a1863cafa244053689ca574c1a9a21c05fb1b7beff81fa40399181900360200190a13360009081526010602052604081205461214f90600163ffffffff6140d816565b90508581146121bf5733600090815260106020526040902080548290811061217357fe5b6000918252602080832033845260109091526040909220805460029092029092019190889081106121a057fe5b6000918252602090912082546002909202019081556001918201549101555b33600090815260106020526040902081906121da9082614c40565b50505050505050565b60006116f76121f13061244a565b6121f9611336565b9063ffffffff6140d816565b60008082600481111561221457fe5b60ff16101580156122345750600482600481111561222e57fe5b60ff1611155b151561228f5760408051600080516020614dbd833981519152815260206004820152601960248201527f496e76616c696420626c6f636b636861696e206f7074696f6e00000000000000604482015290519081900360640190fd5b6122b68460048460048111156122a157fe5b60ff16600581106122ae57fe5b01548561467f565b949350505050565b600b5481565b60145481565b6122d26116fc565b60185460ff16156122e257600080fd5b6018805460ff19166001179055600080808080805b600c81101561240657612319602582600c811061231057fe5b01546003611190565b9195509350915061234230601983600c811061233157fe5b0154600160a060020a03168661423d565b61237e601982600c811061235257fe5b0154600160a060020a031661159b61237187600a63ffffffff6141c916565b869063ffffffff6144f816565b6123b06123a361181d6503081a2635556113248864e8d4a5100063ffffffff61460416565b879063ffffffff6144f816565b95506123c661237185600563ffffffff6141c916565b94506123e4611507602583600c81106123db57fe5b01546003613fb7565b600a55600b546123fb90600163ffffffff6144f816565b600b556001016122f7565b50612425738eaf4fec503da352eb66ef1e2f75c63e5bc635e18561455a565b61244373b26165df612b1c9dc705b9872178b3f48151b24d8661455a565b5050505050565b600160a060020a031660009081526020819052604090205490565b604080516bffffffffffffffffffffffff198616602080830191909152603480830187905283518084039091018152605490920190925280519101206000906124af818585612e80565b9695505050505050565b600e6124c36116ec565b101561250857604051600080516020614dbd8339815191528152600401808060200182810382526033815260200180614d666033913960400191505060405180910390fd5b826125123361244a565b101561256d5760408051600080516020614dbd833981519152815260206004820152601b60248201527f4e6f7420656e6f7567682066756e647320666f72207374616b652e0000000000604482015290519081900360640190fd5b600083116125b457604051600080516020614dbd8339815191528152600401808060200182810382526023815260200180614f026023913960400191505060405180910390fd5b60078210156125fc57604051600080516020614dbd8339815191528152600401808060200182810382526029815260200180614d3d6029913960400191505060405180910390fd5b60018160ff16101580156126145750600a8160ff1611155b151561265957604051600080516020614dbd8339815191528152600401808060200182810382526022815260200180614e826022913960400191505060405180910390fd5b600061267e612671846201518063ffffffff61460416565b429063ffffffff6144f816565b905061269442630966018063ffffffff6144f816565b8111156126f05760408051600080516020614dbd833981519152815260206004820152601b60248201527f5374616b652074696d652065786365656473206d6178696d756d2e0000000000604482015290519081900360640190fd5b6126f86116fc565b6000605a841061271e5761271b61016d61132486621e848063ffffffff61460416565b90505b600061273a6123a362989680611324898663ffffffff61460416565b9050600f600033600160a060020a0316600160a060020a031681526020019081526020016000206101406040519081016040528088815260200183815260200160008152602001428152602001858152602001428152602001600081526020018660ff1681526020016001151581526020016000151581525090806001815401808255809150509060018203906000526020600020906008020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908360ff1602179055506101008201518160070160016101000a81548160ff0219169083151502179055506101208201518160070160026101000a81548160ff0219169083151502179055505050507f9671272c138ea6c4a23b90ff9b7a8db642d371aa76933827ccb985e7892043748686604051808381526020018281526020019250505060405180910390a160ff84166000908152601660205260409020546128ec908263ffffffff6144f816565b60ff8516600090815260166020526040902055601254612912908763ffffffff6144f816565b601255601354612928908263ffffffff6144f816565b60135561293633308861423d565b505050505050565b600e6020526000908152604090208054600182015460029092015490919083565b6000606061296d8984611b40565b90506000600384600481111561297f57fe5b14612b1a57600280836040516020018082805190602001908083835b602083106129ba5780518252601f19909201916020918201910161299b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612a1d5780518252601f1990920191602091820191016129fe565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612a5c573d6000803e3d6000fd5b5050506040513d6020811015612a7157600080fd5b50516040805160208181019390935281518082038401815290820191829052805190928291908401908083835b60208310612abd5780518252601f199092019160209182019101612a9e565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612afc573d6000803e3d6000fd5b5050506040513d6020811015612b1157600080fd5b50519050612b8b565b816040516020018082805190602001908083835b60208310612b4d5780518252601f199092019160209182019101612b2e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012090505b612ba181888888612b9c8e8e611161565b612ec9565b9a9950505050505050505050565b662386f26fc10000341015612c135760408051600080516020614dbd833981519152815260206004820181905260248201527f4554482053656e74206e6f742061626f7665206d696e696d756d2076616c7565604482015290519081900360640190fd5b600e612c1d6116ec565b1015612c6257604051600080516020614dbd833981519152815260040180806020018281038252603c815260200180614ec6603c913960400191505060405180910390fd5b612c6a6116fc565b33600090815260106020908152604091829020825180840190935234835291908101612c946116ec565b905281546001818101845560009384526020938490208351600290930201918255918301519101556040805134815290517fce909959fd63858f1ce0d2fbac69566b62dfc04a9015af3f18f7c22757b4e2ec929181900390910190a1601454612d03903463ffffffff6144f816565b601455565b60048160058110612d1557fe5b0154905081565b60135481565b600080620151809050612d63612d5662015180612d4a600354426140d890919063ffffffff16565b9063ffffffff61472d16565b829063ffffffff6140d816565b91505090565b600160a060020a0381166000908152600f60205260409020548210612ddd5760408051600080516020614dbd833981519152815260206004820152601460248201527f5374616b6520646f6573206e6f74206578697374000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381166000908152600f60205260409020805483908110612e0157fe5b90600052602060002090600802016004015442111515612e705760408051600080516020614dbd833981519152815260206004820152601660248201527f5374616b65206d757374206265206d6174757265642e00000000000000000000604482015290519081900360640190fd5b612e7c8282600161479e565b5050565b6000600c6000836004811115612e9257fe5b60ff908116825260208083019390935260409182016000908120888252909352912054161580156122b657506122b6838584612205565b600081600160a060020a031660018787878760405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612f32573d6000803e3d6000fd5b50505060206040510351600160a060020a031614905095945050505050565b60408051808201909152600381527f4345520000000000000000000000000000000000000000000000000000000000602082015281565b60155460ff1681565b336000818152600160209081526040808320600160a060020a03871684529091528120549091611220918590611385908663ffffffff6140d816565b600061122033848461423d565b600160a060020a031660009081526010602052604090205490565b6000600e82116130075750600061118a565b600061301e8464e8d4a5100063ffffffff61460416565b9050600066016bcc41e90000602b85116130735761304385600e63ffffffff6140d816565b945061306961305982601d63ffffffff61460416565b611324858863ffffffff61460416565b935050505061118a565b604885116130cf5761308b838263ffffffff6141c916565b915061309e85602b63ffffffff6140d816565b945065b5e620f4800090506130bd61305982601d63ffffffff61460416565b9250613069838363ffffffff6144f816565b60658511613121575065794415f855556130ef838263ffffffff6141c916565b915061310285604863ffffffff6140d816565b945065794415f8555590506130bd61305982601d63ffffffff61460416565b608285116131735750653ca20afc2aaa613141838263ffffffff6141c916565b915061315485606563ffffffff6140d816565b9450653ca20afc2aaa90506130bd61305982601d63ffffffff61460416565b609f85116131c55750651e51057e1555613193838263ffffffff6141c916565b91506131a685608263ffffffff6140d816565b9450651e51057e155590506130bd61305982601d63ffffffff61460416565b60bc85116132175750650f2882bf0aaa6131e5838263ffffffff6141c916565b91506131f885609f63ffffffff6140d816565b9450650f2882bf0aaa90506130bd61305982601d63ffffffff61460416565b60d985116132695750650794415f8555613237838263ffffffff6141c916565b915061324a8560bc63ffffffff6140d816565b9450650b5e620f47ff90506130bd61305982601d63ffffffff61460416565b60f685116132bb575065048c27395000613289838263ffffffff6141c916565b915061329c8560d963ffffffff6140d816565b94506509184e72a00090506130bd61305982601d63ffffffff61460416565b610113851161330e57506503081a2635556132dc838263ffffffff6141c916565b91506132ef8560f663ffffffff6140d816565b9450650746a5287fff90506130bd61305982601d63ffffffff61460416565b61013085116133625750650223d639169861332f838263ffffffff6141c916565b91506133438561011363ffffffff6140d816565b9450650610344c6aaa90506130bd61305982601d63ffffffff61460416565b61014e85116133b65750650194ec4074de613383838263ffffffff6141c916565b91506133978561013063ffffffff6140d816565b945065053275f85b7290506130bd61305982601e63ffffffff61460416565b61016c85101561340b575065013670dc15556133d8838263ffffffff6141c916565b91506133ec8561014e63ffffffff6140d816565b94506503a35294400090506130bd61305982601e63ffffffff61460416565b85935050505061118a565b60125481565b600061016c6134296116ec565b10905090565b6000806134478464e8d4a5100063ffffffff61460416565b905066016bcc41e90000602b8410156134845761347b61346e82601d63ffffffff61460416565b839063ffffffff6141c916565b9250505061118a565b60488410156134a9575065b5e620f4800061347b61346e82601d63ffffffff61460416565b60658410156134ce575065794415f8555561347b61346e82601d63ffffffff61460416565b60828410156134f35750653ca20afc2aaa61347b61346e82601d63ffffffff61460416565b609f8410156135185750651e51057e155561347b61346e82601d63ffffffff61460416565b60bc84101561353d5750650f2882bf0aaa61347b61346e82601d63ffffffff61460416565b60d98410156135625750650b5e620f47ff61347b61346e82601d63ffffffff61460416565b60f684101561358757506509184e72a00061347b61346e82601d63ffffffff61460416565b6101138410156135ad5750650746a5287fff61347b61346e82601d63ffffffff61460416565b6101308410156135d35750650610344c6aaa61347b61346e82601d63ffffffff61460416565b61014e8410156135f9575065053275f85b7261347b61346e82601e63ffffffff61460416565b61016c84101561361f57506503a35294400061347b61346e82601e63ffffffff61460416565b505092915050565b336000908152600f602052604090205481106136925760408051600080516020614dbd833981519152815260206004820152601460248201527f5374616b6520646f6573206e6f74206578697374000000000000000000000000604482015290519081900360640190fd5b336000908152600f602052604090208054829081106136ad57fe5b9060005260206000209060080201600401544211151561371c5760408051600080516020614dbd833981519152815260206004820152601660248201527f5374616b65206d757374206265206d6174757265642e00000000000000000000604482015290519081900360640190fd5b6137288133600061479e565b50565b600080428511156137bc576137408642611f6e565b151561374d575081613761565b61375e83600263ffffffff6141c916565b90505b600061376d8787611f6e565b9050605a8110613793576137906115b4610e42611324858563ffffffff61460416565b91505b60006137ab611c84611324888563ffffffff61460416565b9050828111156137b9578092505b50505b95945050505050565b336000908152600f6020526040902054811061371c5760408051600080516020614dbd833981519152815260206004820152601460248201527f5374616b6520646f6573206e6f74206578697374000000000000000000000000604482015290519081900360640190fd5b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b664b95bb346fddee81565b60008080600184600381111561387857fe5b148061388f5750600384600381111561388d57fe5b145b15613a285760018516156138a45760036138a7565b60025b9050600360028288604051602001808360ff1660ff167f0100000000000000000000000000000000000000000000000000000000000000028152600101828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061392c5780518252601f19909201916020918201910161390d565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561396b573d6000803e3d6000fd5b5050506040513d602081101561398057600080fd5b50516040805160208181019390935281518082038401815290820191829052805190928291908401908083835b602083106139cc5780518252601f1990920191602091820191016139ad565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613a0b573d6000803e3d6000fd5b505050604051516c01000000000000000000000000029150613ba6565b50604080517f0400000000000000000000000000000000000000000000000000000000000000602080830191909152602182018890526041808301889052835180840390910181526061909201928390528151600493600393600293909282918401908083835b60208310613aae5780518252601f199092019160209182019101613a8f565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613aed573d6000803e3d6000fd5b5050506040513d6020811015613b0257600080fd5b50516040805160208181019390935281518082038401815290820191829052805190928291908401908083835b60208310613b4e5780518252601f199092019160209182019101613b2f565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613b8d573d6000803e3d6000fd5b505050604051516c010000000000000000000000000291505b6000846003811115613bb457fe5b1480613bcb57506001846003811115613bc957fe5b145b15613bd85750905061138e565b6002846003811115613be657fe5b1480613bfd57506003846003811115613bfb57fe5b145b15613d8857604080517e140000000000000000000000000000000000000000000000000000000000006020808301919091526bffffffffffffffffffffffff198516602283015282516016818403018152603690920192839052815160039360029392909182918401908083835b60208310613c8a5780518252601f199092019160209182019101613c6b565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613cc9573d6000803e3d6000fd5b5050506040513d6020811015613cde57600080fd5b50516040805160208181019390935281518082038401815290820191829052805190928291908401908083835b60208310613d2a5780518252601f199092019160209182019101613d0b565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015613d69573d6000803e3d6000fd5b505050604051516c01000000000000000000000000029250505061138e565b50509392505050565b600d541515613dd957604051600080516020614dbd8339815191528152600401808060200182810382526022815260200180614ea46022913960400191505060405180910390fd5b336000908152600f60205260408120805483908110613df457fe5b90600052602060002090600802019050806004015442101515613e665760408051600080516020614dbd833981519152815260206004820152601a60248201527f5374616b652068617320616c7265616479206d6174757265642e000000000000604482015290519081900360640190fd5b613e6e6116fc565b6000613e838260010154836005015442611a86565b90508015613f4d576002820154613ea0908263ffffffff6144f816565b60028301556001820154613eba908263ffffffff6144f816565b6001830155600782015460ff16600090815260166020526040902054613ee6908263ffffffff6144f816565b600783015460ff16600090815260166020526040902055601354613f10908263ffffffff6144f816565b6013554260058301556040805182815290517fcf93184ea171546a9b5a1f0ce649dbe2112412533d72500bb74255a4457c0d789181900360200190a15b505050565b60175481565b600080613f6e8562093a8063ffffffff6144f816565b8411156122b6576000613f93613f8d8762093a8063ffffffff6144f816565b86611f6e565b90506064811115613fa2575060645b6124af6064611324868463ffffffff61460416565b600080826004811115613fc657fe5b1461403e576000826004811115613fd957fe5b60001901905067016345785d8a0000600061401d600960ff851660048110613ffd57fe5b6010810491909101548491600f166002026101000a900461ffff166141c9565b9050614038816113248864e8d4a5100063ffffffff61460416565b95505050505b5090919050565b6000806140506116ec565b905061138e61405f8483612ff5565b849063ffffffff6140d816565b6000806140776116ec565b9050600e81101561408a5750600061409e565b61409b81600e63ffffffff6140d816565b90505b61015e6140b284600563ffffffff6141c916565b93506122b6816113246140cb828663ffffffff6140d816565b879063ffffffff61460416565b6000828211156141375760408051600080516020614dbd833981519152815260206004820152601360248201527f7375623a2062206d757374206265203c3d206100000000000000000000000000604482015290519081900360640190fd5b50900390565b600160a060020a038216151561415257600080fd5b600160a060020a038316151561416757600080fd5b600160a060020a03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008082116142275760408051600080516020614dbd833981519152815260206004820152601260248201527f6469763a2062206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b6000828481151561423457fe5b04949350505050565b600160a060020a038216151561425257600080fd5b600160a060020a03831660009081526020819052604090205461427b908263ffffffff6140d816565b600160a060020a0380851660009081526020819052604080822093909355908416815220546142b0908263ffffffff6144f816565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000600382600481111561431a57fe5b1461437d5761432a888888613866565b8b60405160200180836bffffffffffffffffffffffff19166bffffffffffffffffffffffff19168152601401828152602001925050506040516020818303038152906040528051906020012090506143d9565b6143878888611161565b8b6040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040528051906020012090505b6143e4818b84612e80565b151561443f5760408051600080516020614dbd833981519152815260206004820152601860248201527f5554584f2043616e6e6f742062652072656465656d65642e0000000000000000604482015290519081900360640190fd5b61444e8989898888888861295f565b15156144a95760408051600080516020614dbd833981519152815260206004820152601a60248201527f454344534120766572696669636174696f6e206661696c65642e000000000000604482015290519081900360640190fd5b6001600c60008460048111156144bb57fe5b60ff1681526020808201929092526040908101600090812094815293909152909120805460ff191691151591909117905550505050505050505050565b60008282018381101561138e5760408051600080516020614dbd833981519152815260206004820152601360248201527f6164643a2063206d757374206265203e3d206100000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216151561456f57600080fd5b600254614582908263ffffffff6144f816565b600255600160a060020a0382166000908152602081905260409020546145ae908263ffffffff6144f816565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008215156146155750600061118a565b82820282848281151561462457fe5b041461138e5760408051600080516020614dbd833981519152815260206004820152600f60248201527f6d756c3a2063202f206120213d20620000000000000000000000000000000000604482015290519081900360640190fd5b600081815b8551811015614722576000868281518110151561469d57fe5b906020019060200201519050808310156146e75782816040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250614719565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b50600101614684565b509092149392505050565b600081151561478b5760408051600080516020614dbd833981519152815260206004820152600b60248201527f6d6f643a2062203d3d2030000000000000000000000000000000000000000000604482015290519081900360640190fd5b818381151561479657fe5b069392505050565b6147a66116fc565b600160a060020a0382166000908152600f602052604081208054859081106147ca57fe5b906000526020600020906008020190506000816004015442116147ed57426147f3565b81600401545b9050600061480a8360010154846005015484611a86565b90506148238360020154826144f890919063ffffffff16565b835490915061483990829063ffffffff6144f816565b6007840154909150610100900460ff16156149225782546012546148629163ffffffff6140d816565b601255600183015460135461487c9163ffffffff6140d816565b6013556001830154600784015460ff166000908152601660205260409020546148aa9163ffffffff6140d816565b60078401805460ff16600090815260166020526040902091909155426006850155805461ff00191690558315614922577f2d751a305886e8f29f32da5b106880589a961fe1f85fe5dd6844e96b89af2f0083600101548460040154604051808381526020018281526020019250505060405180910390a15b60008415156149555760038401546004850154855461495292919061494d868263ffffffff6140d816565b61372b565b90505b80151561498857614985846004015485600601546149808760000154866140d890919063ffffffff16565b613f58565b90505b80158015906149a25750600784015462010000900460ff16155b156149fc576149ca6149bb82600263ffffffff6141c916565b6011549063ffffffff6144f816565b6011556149fc3073b26165df612b1c9dc705b9872178b3f48151b24d6149f784600263ffffffff6141c916565b61423d565b8415614a1a5760078401805462ff00001916620100001790556121da565b614a2a828263ffffffff6140d816565b91507fd642043aee195f1d3f9b848830fb73fc38551e597d71cec1c737e4cd63ddfc1284600001548386600401544210614a7557614a7087600301548860060154611f6e565b614a83565b614a83876003015442611f6e565b848860010154614a9b8a600301548b60040154611f6e565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190a1614ad830878461423d565b6121da8688600160a060020a0382166000908152600f6020526040812054614b0790600163ffffffff6140d816565b9050818114614c1657600160a060020a0383166000908152600f60205260409020805482908110614b3457fe5b9060005260206000209060080201600f600085600160a060020a0316600160a060020a0316815260200190815260200160002083815481101515614b7457fe5b6000918252602090912082546008909202019081556001808301549082015560028083015490820155600380830154908201556004808301549082015560058083015490820155600680830154908201556007918201805492909101805460ff191660ff93841617808255825461010090819004851615150261ff00199091161780825591546201000090819004909316151590920262ff0000199091161790555b600160a060020a0383166000908152600f602052604090208190614c3a9082614c6c565b50505050565b815481835581811115613f4d57600202816002028360005260206000209182019101613f4d9190614c98565b815481835581811115613f4d57600802816008028360005260206000209182019101613f4d9190614cbc565b61133a91905b80821115614cb85760008082556001820155600201614c9e565b5090565b61133a91905b80821115614cb85760008082556001820181905560028201819055600382018190556004820181905560058201819055600682015560078101805462ffffff19169055600801614cc256fe194c697465636f696e205369676e6564204d6573736167653a0a3c436c61696d5f436572656e65756d5f746f5f30785374616b6520697320756e64657220746865206d696e696d756d2074696d652072657175697265642e5374616b696e6720646f65736e277420626567696e20756e74696c20616674657220746865206275666665722077696e646f774d757374207761697420756e74696c206e6578742064617920746f20776974686472617708c379a00000000000000000000000000000000000000000000000000000000043616e206f6e6c79207769746864726177206f6e63652065766572792033206d6f6e74687318426974636f696e205369676e6564204d6573736167653a0a3c436c61696d5f436572656e65756d5f746f5f3078436c61696d206973206f757473696465206f6620636c61696d7320706572696f642e19457468657265756d205369676e6564204d6573736167653a0a3630436c61696d5f436572656e65756d5f746f5f3078496e746572657374206d756c7469706c6965722072616e676520697320312d31302e4669727374207570646174652064617920686173206e6f742066696e69736865642e45746820506f6f6c207374616b696e6720646f65736e277420626567696e20756e74696c20616674657220746865206275666665722077696e646f775374616b6520616d6f756e74206d7573742062652067726561746572207468616e2030a165627a7a723058204d892470f374fc86409f6a049f46995c56dedc2f4938bf6efdc426f38d4b49ad0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
ed75cf5df074fdf60702bfbf75049d53ebe942e09ad9fe1b1467df516dd3fb5b197a2e2ef397adfa946697c886b08258297cc3f404e00243bab1197e22b3dfadede6b23f247125725e4bc5d6a1780c5278032508ba4a5d475daf91622aa1fe257023649ffe4d83823ac2f3fa1303affde4de4737b07d9d4830270206f246be77aaa30c59d92230d02247a811c2812e378a4ffb29e64a54407d00fc6d7b269f33
-----Decoded View---------------
Arg [0] : a_hBTCMerkleTreeRoot (bytes32): 0xed75cf5df074fdf60702bfbf75049d53ebe942e09ad9fe1b1467df516dd3fb5b
Arg [1] : a_hBCHMerkleTreeRoot (bytes32): 0x197a2e2ef397adfa946697c886b08258297cc3f404e00243bab1197e22b3dfad
Arg [2] : a_hBSVMerkleTreeRoot (bytes32): 0xede6b23f247125725e4bc5d6a1780c5278032508ba4a5d475daf91622aa1fe25
Arg [3] : a_hETHMerkleTreeRoot (bytes32): 0x7023649ffe4d83823ac2f3fa1303affde4de4737b07d9d4830270206f246be77
Arg [4] : a_hLTCMerkleTreeRoot (bytes32): 0xaaa30c59d92230d02247a811c2812e378a4ffb29e64a54407d00fc6d7b269f33
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : ed75cf5df074fdf60702bfbf75049d53ebe942e09ad9fe1b1467df516dd3fb5b
Arg [1] : 197a2e2ef397adfa946697c886b08258297cc3f404e00243bab1197e22b3dfad
Arg [2] : ede6b23f247125725e4bc5d6a1780c5278032508ba4a5d475daf91622aa1fe25
Arg [3] : 7023649ffe4d83823ac2f3fa1303affde4de4737b07d9d4830270206f246be77
Arg [4] : aaa30c59d92230d02247a811c2812e378a4ffb29e64a54407d00fc6d7b269f33
Deployed Bytecode Sourcemap
188:4753:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10572:248:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10572:248:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10572:248:2;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;10572:248:2;;;;;;;;;;;;;;26746:342;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26746:342:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26746:342:2;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2914:40:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2914:40:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2914:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3816:145:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3816:145:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3816:145:3;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2955:61:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2955:61:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2955:61:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1337:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1337:35:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1337:35:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;2829:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2829:49:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2829:49:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2245:168:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2245:168:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2245:168:2;;:::i;:::-;;;;;;;;;;;;;;;;1658:35:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1658:35:1;;;:::i;2011:89:3:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2011:89:3;;;:::i;4424:224::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4424:224:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4424:224:3;;;;;;;;;;;;;;;;;:::i;30182:2112:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30182:2112:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;30182:2112:2;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;30182:2112:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30182:2112:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30182:2112:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30182:2112:2;;-1:-1:-1;;;;;;;30182:2112:2;;;;;-1:-1:-1;30182:2112:2;;;;;;;;;;-1:-1:-1;30182:2112:2;;;;;;;;-1:-1:-1;30182:2112:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2999:33:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2999:33:0;;;:::i;5162:200:3:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5162:200:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5162:200:3;;;;;;;;:::i;516:57:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;516:57:1;;;:::i;2536:121:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2536:121:2;;;:::i;5542:2369::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5542:2369:2;;;:::i;835:68:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;835:68:1;;;:::i;4969:319:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4969:319:2;;;:::i;32552:717::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32552:717:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32552:717:2;;;;;;;;;;;;:::i;958:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;958:126:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;958:126:2;-1:-1:-1;;;;;958:126:2;;:::i;3624:54:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3624:54:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3624:54:1;;;;:::i;12517:1334:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12517:1334:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12517:1334:2;;-1:-1:-1;;;;;12517:1334:2;;;;;;;;:::i;1887:171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1887:171:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1887:171:2;;;;;;;:::i;3740:1123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3740:1123:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3740:1123:2;;:::i;8022:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8022:126:2;;;:::i;8509:378::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8509:378:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8509:378:2;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8509:378:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8509:378:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8509:378:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;8509:378:2;;-1:-1:-1;;8509:378:2;;;-1:-1:-1;;;8509:378:2;;;;;;:::i;1697:35:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1697:35:1;;;:::i;3320:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3320:36:1;;;:::i;3318:1621:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3318:1621:0;;;:::i;2312:104:3:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2312:104:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2312:104:3;-1:-1:-1;;;;;2312:104:3;;:::i;15676:503:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15676:503:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;15676:503:2;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;15676:503:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15676:503:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;15676:503:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;15676:503:2;;-1:-1:-1;;;15676:503:2;;;;;-1:-1:-1;15676:503:2;;-1:-1:-1;15676:503:2:i;34791:2446::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34791:2446:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34791:2446:2;;;;;;;;;;;;;;:::i;2226:56:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2226:56:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2226:56:1;;:::i;9509:773:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9509:773:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;9509:773:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2977:563::-;;;:::i;395:41:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;395:41:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;395:41:1;;:::i;3239:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3239:34:1;;;:::i;1503:180:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1503:180:2;;;:::i;39835:447::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39835:447:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39835:447:2;;;;;;-1:-1:-1;;;;;39835:447:2;;:::i;14856:426::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14856:426:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14856:426:2;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;14856:426:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14856:426:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;14856:426:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;14856:426:2;;-1:-1:-1;;;14856:426:2;;;;;-1:-1:-1;14856:426:2;;-1:-1:-1;14856:426:2:i;14225:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14225:244:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;14225:244:2;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14225:244:2;;:::i;2958:37:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2958:37:0;;;:::i;3439:38:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3439:38:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5881:210:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5881:210:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5881:210:3;;;;;;;;:::i;3043:137::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3043:137:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3043:137:3;;;;;;;;:::i;1246:142:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1246:142:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1246:142:2;-1:-1:-1;;;;;1246:142:2;;:::i;19340:5387::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19340:5387:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19340:5387:2;;;;;;;:::i;3200:35:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3200:35:1;;;:::i;2798:99:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2798:99:2;;;:::i;16429:2676::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16429:2676:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16429:2676:2;;;;;;;:::i;40866:414::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40866:414:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40866:414:2;;:::i;38520:1080::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38520:1080:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;38520:1080:2;;;;;;;;;;;;;;;;;:::i;40472:266::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40472:266:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40472:266:2;;:::i;2747:129:3:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2747:129:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2747:129:3;;;;;;;;;;:::i;630:60:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;630:60:1;;;:::i;11153:1075:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11153:1075:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11153:1075:2;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11153:1075:2;;;;;;;;;;;;;;33497:1074;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33497:1074:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33497:1074:2;;:::i;3940:43:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3940:43:1;;;:::i;37522:698:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37522:698:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37522:698:2;;;;;;;;;;;;:::i;10572:248::-;10724:44;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;10724:44:2;;;;;;;10714:55;;;;;10572:248;;;;;:::o;26746:342::-;26841:7;26850;26859;26887:40;26902:9;26913:13;26887:14;:40::i;:::-;26875:52;;26934:15;26952:29;26971:9;26952:18;:29::i;:::-;26934:47;;26987:14;27004:24;27018:9;27004:13;:24::i;:::-;26987:41;-1:-1:-1;27043:7:2;26987:41;27060:22;:9;27043:7;27060:22;:13;:22;:::i;:::-;27035:48;;;;;;;;26746:342;;;;;:::o;2914:40:0:-;;;;;;;;;;;;;;;;;;;:::o;3816:145:3:-;3881:4;3897:36;3906:10;3918:7;3927:5;3897:8;:36::i;:::-;-1:-1:-1;3950:4:3;3816:145;;;;:::o;2955:61:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2955:61:1;-1:-1:-1;2955:61:1;:::o;1337:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2829:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2829:49:1;;-1:-1:-1;2829:49:1;;;;;;;;;;;;;;;;;;;;;;;;:::o;2245:168:2:-;2332:7;2356:51;2400:6;2356:39;2373:21;;2356:12;:16;;:39;;;;:::i;:::-;:43;:51;:43;:51;:::i;1658:35:1:-;;;;:::o;2011:89:3:-;2081:12;;2011:89;;:::o;4424:224::-;4503:4;4519:26;4529:4;4535:2;4539:5;4519:9;:26::i;:::-;-1:-1:-1;;;;;4582:14:3;;;;;;:8;:14;;;;;;;;4570:10;4582:26;;;;;;;;;4555:65;;4564:4;;4582:37;;4613:5;4582:37;:30;:37;:::i;:::-;4555:8;:65::i;:::-;-1:-1:-1;4637:4:3;4424:224;;;;;;:::o;30182:2112:2:-;30506:7;30590:18;:16;:18::i;:::-;30582:65;;;;;;-1:-1:-1;;;;;;;;;;;30582:65:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30686:1;30668:13;30662:20;;;;;;;;:25;;;;:54;;;;;30715:1;30697:13;30691:20;;;;;;;;:25;;;;30662:54;30654:94;;;;;;;-1:-1:-1;;;;;;;;;;;30654:94:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;30770:2;30763:3;:9;;;;:22;;;;;30783:2;30776:3;:9;;;;30763:22;30755:58;;;;;;;-1:-1:-1;;;;;;;;;;;30755:58:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;30820:210;30845:9;30862:21;30891:17;30916:12;30936;30956:14;30978:3;30989;31000;31011:13;30820:17;:210::i;:::-;31037:17;:15;:17::i;:::-;31080:62;31101:40;31116:9;31127:13;31101:14;:40::i;:::-;31080:16;;;:62;:20;:62;:::i;:::-;31061:16;:81;31150:23;;;31215:41;31231:9;31242:13;31215:15;:41::i;:::-;31149:107;;;;;;31320:60;31338:4;31345:17;31364:15;31320:9;:60::i;:::-;31430:34;31436:17;31455:8;31430:5;:34::i;:::-;31514:26;965:42:1;31531:8:2;31514:5;:26::i;:::-;31566:16;;:23;;31587:1;31566:23;:20;:23;:::i;:::-;31547:16;:42;-1:-1:-1;;;;;31599:24:2;;;31596:477;;31688:49;31694:17;31713:23;:15;31733:2;31713:23;:19;:23;:::i;:::-;31688:5;:49::i;:::-;31753:37;31766:23;:15;31786:2;31766:23;:19;:23;:::i;:::-;31753:8;;:37;:12;:37;:::i;:::-;31742:48;-1:-1:-1;31845:41:2;31851:10;31863:22;:15;31883:1;31863:22;:19;:22;:::i;31845:41::-;31995:71;965:42:1;32012:53:2;32051:13;32012:34;:15;32032:13;32012:34;:19;:34;:::i;31995:71::-;32084:119;32102:9;32119:15;32142:8;32155:10;32195:1;-1:-1:-1;;;;;32173:24:2;:10;-1:-1:-1;;;;;32173:24:2;;;32084:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32260:29;:15;32280:8;32260:29;:19;:29;:::i;:::-;32253:36;30182:2112;-1:-1:-1;;;;;;;;;;;;;;;30182:2112:2:o;2999:33:0:-;3031:1;2999:33;:::o;5162:200:3:-;5267:10;5242:4;5288:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;5288:29:3;;;;;;;;;;5242:4;;5258:76;;5279:7;;5288:45;;5322:10;5288:45;:33;:45;:::i;516:57:1:-;565:8;516:57;:::o;2536:121:2:-;2584:7;2608:43;2635:15;2608:26;:43::i;:::-;2600:52;;2536:121;:::o;5542:2369::-;5626:17;;5606;:15;:17::i;:::-;:37;5583:2324;;;5713:20;5736:23;5754:4;5736:13;:11;:13::i;:23::-;5713:46;;5768:23;5794:1;5768:27;;5924:3;5904:17;;:23;5901:1455;;;5981:16;;5960:38;;673:17:1;;5960:38:2;:20;:38;:::i;:::-;5942:56;;6022:61;6048:15;6065:17;;6022:25;:61::i;:::-;6004:79;-1:-1:-1;6109:33:2;:12;6004:79;6109:33;:16;:33;:::i;:::-;6094:48;;6212:80;965:42:1;6229:62:2;565:8:1;6229:34:2;6246:16;;6229:12;:16;;:34;;;;:::i;6212:80::-;6312:82;965:42:1;6329:64:2;886:17:1;6329:34:2;6346:16;;6329:12;:16;;:34;;;;:::i;6312:82::-;6434:312;6672:64;886:17:1;6672:34:2;6689:16;;6672:12;:16;;:34;;;;:::i;:64::-;6434:162;6524:62;565:8:1;6524:34:2;6541:16;;6524:12;:16;;:34;;;;:::i;:62::-;6434:12;;:162;:16;:162;:::i;:::-;:166;:312;:166;:312;:::i;:::-;6419:327;;5901:1455;;;6962:1;6938:21;6990:24;;;:21;:24;;;;7033:1;7021:173;7041:2;7036:7;;;;7021:173;;7064:24;;;;;;;:21;:24;;;;;;:37;-1:-1:-1;7061:127:2;;;7129:24;;;;;;;:21;:24;;;;;;7151:1;;-1:-1:-1;7129:24:2;-1:-1:-1;7151:1:2;7061:127;7045:3;;7021:173;;;-1:-1:-1;7215:33:2;:12;:33;;;;:16;:33;:::i;:::-;7311:21;:39;;-1:-1:-1;;7311:39:2;;;;;;;;;;;;;-1:-1:-1;7311:39:2;-1:-1:-1;5901:1455:2;7405:55;7419:4;7426:33;:12;7443:15;7426:33;:16;:33;:::i;7405:55::-;7525:26;;:31;7522:187;;7602:26;;7585:44;;:12;;:44;:16;:44;:::i;:::-;7702:1;7673:26;:30;7570:59;-1:-1:-1;7522:187:2;-1:-1:-1;7777:96:2;;;;;;;;;;;7823:19;;7777:96;;;;;;;7848:17;;;7777:96;;;;;;7756:17;;;-1:-1:-1;7741:33:2;;;:14;:33;;;;;;:132;;;;;;;;;;;;;;;;;;;;;;;;7879:21;;;5645:19;;;;;;;5583:2324;;;5542:2369::o;835:68:1:-;886:17;835:68;:::o;4969:319:2:-;5032:4;5024:21;:26;;5016:57;;;;;-1:-1:-1;;;;;;;;;;;5016:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;5086:24;;5128:15;;5086:38;;5115:8;5086:38;:28;:38;:::i;:::-;:57;;5078:107;;;;-1:-1:-1;;;;;;;;;;;5078:107:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5192:44;;1088:42:1;;5222:4:2;5214:21;5192:44;;;;;;;;;5214:21;1088:42:1;5192:44:2;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;5268:15:2;5241:24;:42;4969:319::o;32552:717::-;32679:7;32696:17;;32717:1;32696:22;32693:38;;;-1:-1:-1;32730:1:2;32723:8;;32693:38;32738:15;;32782:39;32809:11;32782:26;:39::i;:::-;32762:59;;32870:15;32888:38;32915:10;32888:26;:38::i;:::-;32870:56;-1:-1:-1;33002:9:2;32986:258;33017:7;33013:1;:11;32986:258;;;33041:20;33129:17;;;:14;:17;;;;;:35;;;;33064:31;;:101;;33129:35;33064:51;;33100:14;33064:51;:35;:51;:::i;:101::-;33041:124;-1:-1:-1;33212:25:2;:7;33041:124;33212:25;:11;:25;:::i;:::-;33202:35;-1:-1:-1;;33026:3:2;;32986:258;;;-1:-1:-1;33257:7:2;;32552:717;-1:-1:-1;;;;;;32552:717:2:o;958:126::-;-1:-1:-1;;;;;1054:19:2;1033:7;1054:19;;;:8;:19;;;;;:26;;958:126::o;3624:54:1:-;;;;;;;;;;;;;:::o;12517:1334:2:-;12632:12;12651:38;12632:12;12651:17;;12783:13;:39;;;;;;;;;;:84;;;;-1:-1:-1;12843:24:2;12826:13;:41;;;;;;;;;;12783:84;12780:638;;;-1:-1:-1;12916:24:2;;;12897:2;12916:24;;;;;;;;;12897:2;12916:24;;;21:6:-1;;104:10;12916:24:2;87:34:-1;135:17;;-1:-1;12916:24:2;12907:33;;12948:64;;;;;;;;;;;;;;;;;;;;12780:638;;;13049:23;13032:13;:40;;;;;;;;;13029:389;;;-1:-1:-1;13138:24:2;;;13119:2;13138:24;;;;;;;;;13119:2;13138:24;;;21:6:-1;;104:10;13138:24:2;87:34:-1;135:17;;-1:-1;13138:24:2;13129:33;;13170:63;;;;;;;;;;;;;;;;;;;;13029:389;;;-1:-1:-1;13314:24:2;;;13295:2;13314:24;;;;;;;;;13295:2;13314:24;;;21:6:-1;;104:10;13314:24:2;87:34:-1;135:17;;-1:-1;13314:24:2;13305:33;;13346:65;;;;;;;;;;;;;;;;;;;;13029:389;13422:20;13453:9;13445:18;;13422:41;;13467:20;13500:13;13516:2;13500:18;13490:29;;;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;13490:29:2;87:34:-1;135:17;;-1:-1;13490:29:2;-1:-1:-1;13467:52:2;-1:-1:-1;13523:15:2;;13547:86;13567:13;13563:17;;:1;:17;13547:86;;;13617:6;13624:1;13617:9;;;;;;;;;;;;;;;;;;;;13596:7;13604:9;;;;;;13596:18;;;;;;;;;;;;;;:30;;;;;;;;;;-1:-1:-1;13582:3:2;;13547:86;;;-1:-1:-1;13641:6:2;13637:192;13657:2;13653:1;:6;13637:192;;;13697:9;13740:1;13721:12;13734:1;13721:15;;;;;;;;;;:20;;;;52:12:-1;49:1;45:20;29:14;25:41;7:59;;13721:20:2;13715:27;;;13707:36;;13697:47;;;;;;;;;;;;13676:7;13684:9;;;;;;13676:18;;;;;;;;;;;;;;:68;;;;;;;;;;-1:-1:-1;13773:9:2;13797:12;13810:1;13797:15;;;;;;;;;;13815:4;13797:22;;;13791:29;;;13783:38;;13773:49;;;;;;;;;;;;13752:7;13760:9;;;;;;13752:18;;;;;;;;;;;;;;:70;;;;;;;;;;-1:-1:-1;13661:3:2;;13637:192;;;-1:-1:-1;13840:7:2;;12517:1334;-1:-1:-1;;;;;;;;12517:1334:2:o;1887:171::-;1988:7;2012:40;2045:6;2012:28;:10;2027:12;2012:28;:14;:28;:::i;3740:1123::-;3885:10;3867:29;;;;:17;:29;;;;;:36;:47;-1:-1:-1;3859:84:2;;;;;-1:-1:-1;;;;;;;;;;;3859:84:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;3948:17;:15;:17::i;:::-;4003:10;3970:12;3985:29;;;:17;:29;;;;;:39;;4015:8;;3985:39;;;;;;;;;;;;;;;;:44;;;3970:59;;4049:17;:15;:17::i;:::-;4042:24;;4034:73;;;;-1:-1:-1;;;;;;;;;;;4034:73:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4148:10;4112:15;4130:29;;;:17;:29;;;;;:39;;4160:8;;4130:39;;;;;;;;;;;;;;;;;;;;;:47;4206:20;;;:14;:20;;;;;;:34;4130:47;;-1:-1:-1;4206:42:2;;4245:2;4206:42;:38;:42;:::i;:::-;4259:22;4319:20;;;:14;:20;;;;;:36;;;4182:66;;-1:-1:-1;4259:22:2;4284:72;;:26;4182:66;4302:7;4284:26;:17;:26;:::i;:72::-;4259:97;;4361:33;4367:10;4379:14;4361:5;:33::i;:::-;4404:44;;;;;;;;;;;;;;;;;4494:10;4453:20;4476:29;;;:17;:29;;;;;:36;:43;;4517:1;4476:43;:40;:43;:::i;:::-;4453:66;-1:-1:-1;4582:24:2;;;4579:193;;4740:10;4722:29;;;;:17;:29;;;;;:43;;4752:12;;4722:43;;;;;;;;;;;;;;4698:10;4680:29;;:17;:29;;;;;;;:39;;4722:43;;;;;;;;4680:29;4710:8;;4680:39;;;;;;;;;;;;;;:85;;:39;;;;;:85;;;;;;;;;;;4579:193;4826:10;4808:29;;;;:17;:29;;;;;4847:12;;4808:51;;4847:12;4808:51;:::i;:::-;;3740:1123;;;;;;:::o;8022:126::-;8077:7;8100:43;8118:24;8136:4;8118:9;:24::i;:::-;8100:13;:11;:13::i;:::-;:17;:43;:17;:43;:::i;8509:378::-;8660:4;8705:1;8687:13;8681:20;;;;;;;;:25;;;;:54;;;;;8734:1;8716:13;8710:20;;;;;;;;:25;;;;8681:54;8673:92;;;;;;;-1:-1:-1;;;;;;;;;;;8673:92:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;8779:103;8798:21;8821:23;8851:13;8845:20;;;;;;;;8821:45;;;;;;;;;;;8868:13;8779:18;:103::i;:::-;8772:110;8509:378;-1:-1:-1;;;;8509:378:2:o;1697:35:1:-;;;;:::o;3320:36::-;;;;:::o;3318:1621:0:-;3368:17;:15;:17::i;:::-;3398:25;;;;:34;3390:43;;;;;;3437:25;:32;;-1:-1:-1;;3437:32:0;3465:4;3437:32;;;:25;;;;;;3781:951;3802:2;3798:1;:6;3781:951;;;3860:69;3876:24;3901:1;3876:27;;;;;;;;;3905:23;3860:15;:69::i;:::-;3818:111;;-1:-1:-1;3818:111:0;-1:-1:-1;3818:111:0;-1:-1:-1;3993:72:0;4011:4;4018:26;4045:1;4018:29;;;;;;;;;-1:-1:-1;;;;;4018:29:0;4049:15;3993:9;:72::i;:::-;4136:75;4142:26;4169:1;4142:29;;;;;;;;;-1:-1:-1;;;;;4142:29:0;4173:37;4186:23;:15;4206:2;4186:23;:19;:23;:::i;:::-;4173:8;;:37;:12;:37;:::i;4136:75::-;4353:88;4373:67;4386:53;4425:13;4386:34;:15;4406:13;4386:34;:19;:34;:::i;4373:67::-;4353:15;;:88;:19;:88;:::i;:::-;4335:106;-1:-1:-1;4515:50:0;4542:22;:15;4562:1;4542:22;:19;:22;:::i;4515:50::-;4490:75;-1:-1:-1;4590:90:0;4611:68;4626:24;4651:1;4626:27;;;;;;;;;4655:23;4611:14;:68::i;4590:90::-;4571:16;:109;4704:16;;:23;;4725:1;4704:23;:20;:23;:::i;:::-;4685:16;:42;3806:3;;3781:951;;;;4790:54;1239:42:1;4821:22:0;4790:5;:54::i;:::-;4902:33;965:42:1;4919:15:0;4902:5;:33::i;:::-;3318:1621;;;;;:::o;2312:104:3:-;-1:-1:-1;;;;;2393:16:3;2367:7;2393:16;;;;;;;;;;;;2312:104::o;15676:503:2:-;15978:71;;;-1:-1:-1;;15978:71:2;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15978:71:2;;;;;;;15961:94;;;;;15852:4;;16103:71;15961:94;16137:21;16160:13;16103:16;:71::i;:::-;16096:78;15676:503;-1:-1:-1;;;;;;15676:503:2:o;34791:2446::-;3934:2:1;34916:17:2;:15;:17::i;:::-;:44;;34908:108;;;;-1:-1:-1;;;;;;;;;;;34908:108:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35095:9;35070:21;35080:10;35070:9;:21::i;:::-;:34;;35062:74;;;;;-1:-1:-1;;;;;;;;;;;35062:74:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;35197:1;35185:13;;35177:61;;;;-1:-1:-1;;;;;;;;;;;35177:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35262:1;35251:12;;;35243:66;;;;-1:-1:-1;;;;;;;;;;;35243:66:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35351:1;35322:25;:30;;;;:65;;;;;35385:2;35356:25;:31;;;;35322:65;35314:112;;;;;;-1:-1:-1;;;;;;;;;;;35314:112:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35459:27;35489:40;35509:19;:7;35521:6;35509:19;:11;:19;:::i;:::-;35489:15;;:40;:19;:40;:::i;:::-;35459:70;-1:-1:-1;35620:38:2;:15;3760:12:1;35620:38:2;:19;:38;:::i;:::-;35597:61;;;35589:101;;;;;-1:-1:-1;;;;;;;;;;;35589:101:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;35697:17;:15;:17::i;:::-;35794:23;35898:2;35887:13;;35884:178;;36028:29;36053:3;36028:20;:7;36040;36028:20;:11;:20;:::i;:29::-;36010:47;;35884:178;36124:20;36147:59;36161:44;36196:8;36161:30;:9;36175:15;36161:30;:13;:30;:::i;36147:59::-;36124:82;;36246:8;:20;36255:10;-1:-1:-1;;;;;36246:20:2;-1:-1:-1;;;;;36246:20:2;;;;;;;;;;;;36279:430;;;;;;;;;36300:9;36279:430;;;;36336:12;36279:430;;;;36371:1;36279:430;;;;36425:15;36279:430;;;;36463:19;36279:430;;;;36511:15;36279:430;;;;36564:1;36279:430;;;;36601:25;36279:430;;;;;;36632:4;36279:430;;;;;;36665:5;36279:430;;;;;36246:469;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;36246:469:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36727:53;36750:9;36767:7;36727:53;;;;;;;;;;;;;;;;;;;;;;;;36863:48;;;;;;;:21;:48;;;;;;:66;;36916:12;36863:66;:52;:66;:::i;:::-;36812:48;;;;;;;:21;:48;;;;;:117;36994:20;;:35;;37019:9;36994:35;:24;:35;:::i;:::-;36971:20;:58;37093:19;;:37;;37117:12;37093:37;:23;:37;:::i;:::-;37071:19;:59;37185:47;37195:10;37215:4;37222:9;37185;:47::i;:::-;34791:2446;;;;;;:::o;2226:56:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9509:773:2:-;9721:4;9734:25;9762:58;9787:17;9806:13;9762:24;:58::i;:::-;9734:86;-1:-1:-1;9827:13:2;9866:23;9849:13;:40;;;;;;;;;9846:287;;9968:64;9992:38;10016:12;9999:30;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9999:30:2;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9999:30:2;;;9992:38;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;9992:38:2;;;;;;;-1:-1:-1;263:2;;-1:-1;;9992:38:2;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9992:38:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9992:38:2;9975:56;;;9992:38;9975:56;;;;;;;;;26:21:-1;;;22:32;;6:49;;9975:56:2;;;;;;;9968:64;;9975:56;;;;9968:64;;;;;9975:56;9968:64;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;9968:64:2;;;;;;;-1:-1:-1;263:2;;-1:-1;;9968:64:2;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9968:64:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9968:64:2;;-1:-1:-1;9846:287:2;;;10112:12;10095:30;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10095:30:2;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10095:30:2;;;10085:41;;;;;;10077:49;;9846:287;10146:131;10171:5;10184:3;10195;10206;10217:54;10244:12;10258;10217:26;:54::i;:::-;10146:17;:131::i;:::-;10139:138;9509:773;-1:-1:-1;;;;;;;;;;9509:773:2:o;2977:563::-;3087:10;3074:9;:23;;3066:68;;;;;-1:-1:-1;;;;;;;;;;;3066:68:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3934:2:1;3147:17:2;:15;:17::i;:::-;:44;;3139:117;;;;-1:-1:-1;;;;;;;;;;;3139:117:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3261:17;:15;:17::i;:::-;3301:10;3283:29;;;;:17;:29;;;;;;;;;3325:96;;;;;;;;3349:9;3325:96;;3283:29;3325:96;;;3383:17;:15;:17::i;:::-;3325:96;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;3283:144:2;;;;;;;;;;;;;;;;;;;;;;;;;3437:41;;;3463:9;3437:41;;;;;;;;;;;;;;;3503:17;;:32;;3525:9;3503:32;:21;:32;:::i;:::-;3483:17;:52;2977:563::o;395:41:1:-;;;;;;;;;;;;;-1:-1:-1;395:41:1;:::o;3239:34::-;;;;:::o;1503:180:2:-;1565:7;1581:12;1596:6;1581:21;;1613:66;1622:56;1671:6;1623:42;1643:21;;1623:15;:19;;:42;;;;:::i;:::-;1622:48;:56;:48;:56;:::i;:::-;1613:4;;:66;:8;:66;:::i;:::-;1606:73;;;1503:180;:::o;39835:447::-;-1:-1:-1;;;;;39995:19:2;;;;;;:8;:19;;;;;:26;:42;-1:-1:-1;39987:75:2;;;;;-1:-1:-1;;;;;;;;;;;39987:75:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40141:19:2;;;;;;:8;:19;;;;;:34;;40161:13;;40141:34;;;;;;;;;;;;;;;;:54;;;40123:15;:72;40115:107;;;;;;;-1:-1:-1;;;;;;;;;;;40115:107:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;40227:50;40246:13;40261:9;40272:4;40227:18;:50::i;:::-;39835:447;;:::o;14856:426::-;15016:4;15131:17;:39;15155:13;15149:20;;;;;;;;15131:39;;;;;;;;;;;;;;;;;;-1:-1:-1;15131:39:2;;;:58;;;;;;;;;;:67;;;15130:141;;;15203:68;15215:21;15238:17;15257:13;15203:11;:68::i;14225:244::-;14369:4;14455:9;-1:-1:-1;;;;;14389:75:2;:62;14406:6;14420:3;14431;14442;14389:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14389:62:2;;;;;;;;-1:-1:-1;;;;;14389:75:2;;14382:82;;14225:244;;;;;;;:::o;2958:37:0:-;;;;;;;;;;;;;;;;;;;:::o;3439:38:1:-;;;;;;:::o;5881:210:3:-;5991:10;5966:4;6012:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;6012:29:3;;;;;;;;;;5966:4;;5982:81;;6003:7;;6012:50;;6046:15;6012:50;:33;:50;:::i;3043:137::-;3104:4;3120:32;3130:10;3142:2;3146:5;3120:9;:32::i;1246:142:2:-;-1:-1:-1;;;;;1349:28:2;1328:7;1349:28;;;:17;:28;;;;;:35;;1246:142::o;19340:5387::-;19439:7;3934:2:1;19456:45:2;;19453:70;;-1:-1:-1;19517:1:2;19510:8;;19453:70;19527:21;19551:28;:9;19565:13;19551:28;:13;:28;:::i;:::-;19527:52;-1:-1:-1;19583:29:2;19638:15;19724:2;19702:24;;19699:5025;;19756:26;:18;19779:2;19756:26;:22;:26;:::i;:::-;19735:47;-1:-1:-1;19794:58:2;19836:15;:7;19848:2;19836:15;:11;:15;:::i;:::-;19794:37;:13;19812:18;19794:37;:17;:37;:::i;:58::-;19787:65;;;;;;;19699:5025;19953:2;19931:24;;19928:4796;;19988:26;:13;20006:7;19988:26;:17;:26;:::i;:::-;19964:50;-1:-1:-1;20040:26:2;:18;20063:2;20040:26;:22;:26;:::i;:::-;20019:47;-1:-1:-1;20081:15:2;;-1:-1:-1;20125:58:2;20167:15;20081;20179:2;20167:15;:11;:15;:::i;20125:58::-;20109:74;-1:-1:-1;20195:40:2;20109:74;20213:21;20195:40;:17;:40;:::i;19928:4796::-;20344:3;20322:25;;20319:4405;;-1:-1:-1;20366:15:2;20419:26;:13;20366:15;20419:26;:17;:26;:::i;:::-;20395:50;-1:-1:-1;20471:26:2;:18;20494:2;20471:26;:22;:26;:::i;:::-;20450:47;-1:-1:-1;20512:15:2;;-1:-1:-1;20557:58:2;20599:15;20512;20611:2;20599:15;:11;:15;:::i;20319:4405::-;20772:3;20750:25;;20747:3977;;-1:-1:-1;20794:14:2;20845:26;:13;20794:14;20845:26;:17;:26;:::i;:::-;20821:50;-1:-1:-1;20897:27:2;:18;20920:3;20897:27;:22;:27;:::i;:::-;20876:48;-1:-1:-1;20939:14:2;;-1:-1:-1;20982:58:2;21024:15;20939:14;21036:2;21024:15;:11;:15;:::i;20747:3977::-;21200:3;21178:25;;21175:3549;;-1:-1:-1;21222:14:2;21271:26;:13;21222:14;21271:26;:17;:26;:::i;:::-;21247:50;-1:-1:-1;21323:27:2;:18;21346:3;21323:27;:22;:27;:::i;:::-;21302:48;-1:-1:-1;21365:14:2;;-1:-1:-1;21406:58:2;21448:15;21365:14;21460:2;21448:15;:11;:15;:::i;21175:3549::-;21630:3;21608:25;;21605:3119;;-1:-1:-1;21652:14:2;21701:26;:13;21652:14;21701:26;:17;:26;:::i;:::-;21677:50;-1:-1:-1;21753:27:2;:18;21776:3;21753:27;:22;:27;:::i;:::-;21732:48;-1:-1:-1;21795:14:2;;-1:-1:-1;21836:58:2;21878:15;21795:14;21890:2;21878:15;:11;:15;:::i;21605:3119::-;22065:3;22043:25;;22040:2684;;-1:-1:-1;22087:13:2;22136:26;:13;22087;22136:26;:17;:26;:::i;:::-;22112:50;-1:-1:-1;22188:27:2;:18;22211:3;22188:27;:22;:27;:::i;:::-;22167:48;-1:-1:-1;22230:14:2;;-1:-1:-1;22271:58:2;22313:15;22230:14;22325:2;22313:15;:11;:15;:::i;22040:2684::-;22507:3;22485:25;;22482:2242;;-1:-1:-1;22529:13:2;22578:26;:13;22529;22578:26;:17;:26;:::i;:::-;22554:50;-1:-1:-1;22630:27:2;:18;22653:3;22630:27;:22;:27;:::i;:::-;22609:48;-1:-1:-1;22672:14:2;;-1:-1:-1;22714:58:2;22756:15;22672:14;22768:2;22756:15;:11;:15;:::i;22482:2242::-;22962:3;22940:25;;22937:1787;;-1:-1:-1;22984:13:2;23033:26;:13;22984;23033:26;:17;:26;:::i;:::-;23009:50;-1:-1:-1;23085:27:2;:18;23108:3;23085:27;:22;:27;:::i;:::-;23064:48;-1:-1:-1;23127:13:2;;-1:-1:-1;23170:58:2;23212:15;23127:13;23224:2;23212:15;:11;:15;:::i;22937:1787::-;23423:3;23401:25;;23398:1326;;-1:-1:-1;23445:13:2;23496:26;:13;23445;23496:26;:17;:26;:::i;:::-;23472:50;-1:-1:-1;23548:27:2;:18;23571:3;23548:27;:22;:27;:::i;:::-;23527:48;-1:-1:-1;23590:13:2;;-1:-1:-1;23631:58:2;23673:15;23590:13;23685:2;23673:15;:11;:15;:::i;23398:1326::-;23892:3;23870:25;;23867:857;;-1:-1:-1;23914:13:2;23965:26;:13;23914;23965:26;:17;:26;:::i;:::-;23941:50;-1:-1:-1;24017:27:2;:18;24040:3;24017:27;:22;:27;:::i;:::-;23996:48;-1:-1:-1;24059:13:2;;-1:-1:-1;24102:58:2;24144:15;24059:13;24156:2;24144:15;:11;:15;:::i;23867:857::-;24367:3;24346:18;:24;24343:381;;;-1:-1:-1;24389:13:2;24438:26;:13;24389;24438:26;:17;:26;:::i;:::-;24414:50;-1:-1:-1;24490:27:2;:18;24513:3;24490:27;:22;:27;:::i;:::-;24469:48;-1:-1:-1;24532:13:2;;-1:-1:-1;24573:58:2;24615:15;24532:13;24627:2;24615:15;:11;:15;:::i;24343:381::-;24710:9;24703:16;;;;;;;3200:35:1;;;;:::o;2798:99:2:-;2847:4;2888:3;2868:17;:15;:17::i;:::-;:23;2860:32;;2798:99;:::o;16429:2676::-;16532:7;;16570:28;:9;16584:13;16570:28;:13;:28;:::i;:::-;16546:52;-1:-1:-1;16620:15:2;16705:2;16684:23;;16681:2421;;;16723:34;16741:15;:7;16753:2;16741:15;:11;:15;:::i;:::-;16723:13;;:34;:17;:34;:::i;:::-;16716:41;;;;;;16681:2421;16857:2;16836:18;:23;16833:2269;;;-1:-1:-1;16878:15:2;16913:34;16931:15;16878;16943:2;16931:15;:11;:15;:::i;16833:2269::-;17055:3;17034:18;:24;17031:2071;;;-1:-1:-1;17077:15:2;17113:34;17131:15;17077;17143:2;17131:15;:11;:15;:::i;17031:2071::-;17251:3;17230:18;:24;17227:1875;;;-1:-1:-1;17273:14:2;17307:34;17325:15;17273:14;17337:2;17325:15;:11;:15;:::i;17227:1875::-;17448:3;17427:18;:24;17424:1678;;;-1:-1:-1;17470:14:2;17502:34;17520:15;17470:14;17532:2;17520:15;:11;:15;:::i;17424:1678::-;17649:3;17628:18;:24;17625:1477;;;-1:-1:-1;17671:14:2;17703:34;17721:15;17671:14;17733:2;17721:15;:11;:15;:::i;17625:1477::-;17855:3;17834:18;:24;17831:1271;;;-1:-1:-1;17877:14:2;17909:34;17927:15;17877:14;17939:2;17927:15;:11;:15;:::i;17831:1271::-;18068:3;18047:18;:24;18044:1058;;;-1:-1:-1;18090:14:2;18123:34;18141:15;18090:14;18153:2;18141:15;:11;:15;:::i;18044:1058::-;18294:3;18273:18;:24;18270:832;;;-1:-1:-1;18316:13:2;18350:34;18368:15;18316:13;18380:2;18368:15;:11;:15;:::i;18270:832::-;18526:3;18505:18;:24;18502:600;;;-1:-1:-1;18548:13:2;18580:34;18598:15;18548:13;18610:2;18598:15;:11;:15;:::i;18502:600::-;18764:3;18743:18;:24;18740:362;;;-1:-1:-1;18786:13:2;18820:34;18838:15;18786:13;18850:2;18838:15;:11;:15;:::i;18740:362::-;19009:3;18988:18;:24;18985:117;;;-1:-1:-1;19031:13:2;19063:34;19081:15;19031:13;19093:2;19081:15;:11;:15;:::i;18985:117::-;16429:2676;;;;;;:::o;40866:414::-;41010:10;41001:20;;;;:8;:20;;;;;:27;:43;-1:-1:-1;40993:76:2;;;;;-1:-1:-1;;;;;;;;;;;40993:76:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;41143:10;41134:20;;;;:8;:20;;;;;:35;;41155:13;;41134:35;;;;;;;;;;;;;;;;:55;;;41116:15;:73;41108:108;;;;;;;-1:-1:-1;;;;;;;;;;;41108:108:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;41223:52;41242:13;41257:10;41269:5;41223:18;:52::i;:::-;40866:414;:::o;38520:1080::-;38684:7;;38730:15;:39;-1:-1:-1;38727:847:2;;;38882:46;38899:11;38912:15;38882:16;:46::i;:::-;:51;38879:204;;;-1:-1:-1;38955:17:2;38879:204;;;39053:24;:17;39075:1;39053:24;:21;:24;:::i;:::-;39042:35;;38879:204;39088:27;39118:52;39135:11;39148:21;39118:16;:52::i;:::-;39088:82;-1:-1:-1;39202:2:2;39179:25;;39176:164;;39277:57;39290:43;39328:4;39290:33;:8;39303:19;39290:33;:12;:33;:::i;39277:57::-;39266:68;;39176:164;39422:23;39448:44;39487:4;39448:34;:9;39462:19;39448:34;:13;:34;:::i;:44::-;39422:70;;39519:8;39501:15;:26;39498:72;;;39549:15;39538:26;;39498:72;38727:847;;;39587:8;38520:1080;-1:-1:-1;;;;;38520:1080:2:o;40472:266::-;40615:10;40606:20;;;;:8;:20;;;;;:27;:43;-1:-1:-1;40598:76:2;;;;;-1:-1:-1;;;;;;;;;;;40598:76:2;;;;;;;;;;;;;;;;;;;;;;;;;;;2747:129:3;-1:-1:-1;;;;;2845:15:3;;;2819:7;2845:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;2747:129::o;630:60:1:-;673:17;630:60;:::o;11153:1075:2:-;11297:7;;;11380:28;11362:14;:46;;;;;;;;;:96;;;-1:-1:-1;11430:28:2;11412:14;:46;;;;;;;;;11362:96;11359:507;;;11520:21;:25;;11519:32;:46;;11561:4;11519:46;;;11554:4;11519:46;11505:60;;11585:80;11612:51;11636:11;11649:12;11619:43;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11619:43:2;;;11612:51;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;11612:51:2;;;;;;;-1:-1:-1;263:2;;-1:-1;;11612:51:2;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11612:51:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11612:51:2;11595:69;;;11612:51;11595:69;;;;;;;;;26:21:-1;;;22:32;;6:49;;11595:69:2;;;;;;;11585:80;;11595:69;;;;11585:80;;;;;11595:69;11585:80;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;11585:80:2;;;;;;;-1:-1:-1;263:2;;-1:-1;;11585:80:2;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11585:80:2;;;;;;;;11573:92;;11359:507;;;-1:-1:-1;11799:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11799:57:2;;;;;;;;11792:65;;11741:4;;11765:94;;11792:65;;11799:57;;;;11792:65;;;;11799:57;11792:65;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;11792:65:2;;;;;;;-1:-1:-1;263:2;;-1:-1;;11792:65:2;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11792:65:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11792:65:2;11775:83;;;11792:65;11775:83;;;;;;;;;26:21:-1;;;22:32;;6:49;;11775:83:2;;;;;;;11765:94;;11775:83;;;;11765:94;;;;;11775:83;11765:94;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;11765:94:2;;;;;;;-1:-1:-1;263:2;;-1:-1;;11765:94:2;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11765:94:2;;;;;;;;11753:106;;11359:507;11893:30;11875:14;:48;;;;;;;;;:98;;;-1:-1:-1;11945:28:2;11927:14;:46;;;;;;;;;11875:98;11872:352;;;-1:-1:-1;11994:9:2;-1:-1:-1;11987:16:2;;11872:352;12041:30;12023:14;:48;;;;;;;;;:98;;;-1:-1:-1;12093:28:2;12075:14;:46;;;;;;;;;12023:98;12020:204;;;12176:38;;;;;;;;;;;;-1:-1:-1;;12176:38:2;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;12176:38:2;;;;;;;;12169:46;;12142:75;;12169:46;;12176:38;;;;;12169:46;;;;12176:38;12169:46;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;12169:46:2;;;;;;;-1:-1:-1;263:2;;-1:-1;;12169:46:2;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12169:46:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12169:46:2;12152:64;;;12169:46;12152:64;;;;;;;;;26:21:-1;;;22:32;;6:49;;12152:64:2;;;;;;;12142:75;;12152:64;;;;12142:75;;;;;12152:64;12142:75;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;12142:75:2;;;;;;;-1:-1:-1;263:2;;-1:-1;;12142:75:2;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12142:75:2;;;;;;;;12135:82;;;;;;12020:204;11153:1075;;;;;;;:::o;33497:1074::-;33573:17;;:22;;33565:69;;;;-1:-1:-1;;;;;;;;;;;33565:69:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33752:10;33714:26;33743:20;;;:8;:20;;;;;:35;;33764:13;;33743:35;;;;;;;;;;;;;;;;33714:64;;33809:6;:26;;;33791:15;:44;33783:83;;;;;;;-1:-1:-1;;;;;;;;;;;33783:83:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;33871:17;:15;:17::i;:::-;33893:23;33919:102;33939:6;:20;;;33965:6;:32;;;34002:15;33919;:102::i;:::-;33893:128;-1:-1:-1;34029:20:2;;34026:541;;34096:35;;;;:56;;34136:15;34096:56;:39;:56;:::i;:::-;34058:35;;;:94;34180:20;;;;:41;;34205:15;34180:41;:24;:41;:::i;:::-;34157:20;;;:64;34334:25;;;;;;34312:48;;;;:21;:48;;;;;;:69;;34365:15;34312:69;:52;:69;:::i;:::-;34283:25;;;;;;34261:48;;;;:21;:48;;;;;:120;34409:19;;:40;;34433:15;34409:40;:23;:40;:::i;:::-;34387:19;:62;34489:15;34454:32;;;:50;34515:47;;;;;;;;;;;;;;;;;34026:541;33497:1074;;;:::o;3940:43:1:-;;;;:::o;37522:698:2:-;37685:7;;37788:34;:21;37814:7;37788:34;:25;:34;:::i;:::-;37757:28;:65;37754:440;;;37894:23;37920:82;37937:34;:21;37963:7;37937:34;:25;:34;:::i;:::-;37973:28;37920:16;:82::i;:::-;37894:108;;38057:3;38039:15;:21;38036:62;;;-1:-1:-1;38089:3:2;38036:62;38140:47;38183:3;38140:38;:17;38162:15;38140:38;:21;:38;:::i;26015:456::-;26111:7;;26128:13;:39;;;;;;;;;26125:322;;26176:17;26202:13;26196:20;;;;;;;;-1:-1:-1;;26221:13:2;;-1:-1:-1;26299:18:2;26281:15;26340:44;26352:18;:31;;;;;;;;;;;;;;;;;;26340:7;;26352:31;;;;;;;;;;26340:11;:44::i;:::-;26323:61;-1:-1:-1;26402:40:2;26323:61;26402:28;:9;26416:13;26402:28;:13;:28;:::i;:40::-;26390:52;;26125:322;;;;-1:-1:-1;26458:9:2;;26015:456;-1:-1:-1;26015:456:2:o;24907:209::-;24977:7;24991:24;25018:17;:15;:17::i;:::-;24991:44;;25047:65;25061:50;25083:9;25094:16;25061:21;:50::i;:::-;25047:9;;:65;:13;:65;:::i;25255:499::-;25320:7;25334:24;25361:17;:15;:17::i;:::-;25334:44;;3934:2:1;25455:16:2;:42;25452:163;;;-1:-1:-1;25525:1:2;25452:163;;;25565:45;:16;3934:2:1;25565:45:2;:20;:45;:::i;:::-;25546:64;;25452:163;25640:3;25661:16;:9;25675:1;25661:16;:13;:16;:::i;:::-;25649:28;-1:-1:-1;25690:59:2;25740:8;25690:45;25704:30;25740:8;25717:16;25704:30;:12;:30;:::i;:::-;25690:9;;:45;:13;:45;:::i;2356:168:7:-;2414:7;2441:6;;;;2433:38;;;;;-1:-1:-1;;;;;;;;;;;2433:38:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2493:5:7;;;2356:168::o;7926:248:3:-;-1:-1:-1;;;;;8018:21:3;;;;8010:30;;;;;;-1:-1:-1;;;;;8058:19:3;;;;8050:28;;;;;;-1:-1:-1;;;;;8089:15:3;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;:32;;;8136:31;;;;;;;;;;;;;;;;;7926:248;;;:::o;1905:318:7:-;1963:7;2056:5;;;2048:36;;;;;-1:-1:-1;;;;;;;;;;;2048:36:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;2094:9;2110:1;2106;:5;;;;;;;;;1905:318;-1:-1:-1;;;;1905:318:7:o;6310:256:3:-;-1:-1:-1;;;;;6397:16:3;;;;6389:25;;;;;;-1:-1:-1;;;;;6443:15:3;;:9;:15;;;;;;;;;;;:26;;6463:5;6443:26;:19;:26;:::i;:::-;-1:-1:-1;;;;;6425:15:3;;;:9;:15;;;;;;;;;;;:44;;;;6495:13;;;;;;;:24;;6513:5;6495:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;6479:13:3;;;:9;:13;;;;;;;;;;;;:40;;;;6534:25;;;;;;;6479:13;;6534:25;;;;;;;;;;;;;6310:256;;;:::o;27807:1352:2:-;28177:23;28226;28209:13;:40;;;;;;;;;28206:404;;28376:63;28402:9;28413;28424:14;28376:25;:63::i;:::-;28441:9;28359:92;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28359:92:2;;;28349:103;;;;;;28331:121;;28206:404;;;28542:48;28569:9;28580;28542:26;:48::i;:::-;28592:9;28525:77;;;;;;-1:-1:-1;;;;;28525:77:2;-1:-1:-1;;;;;28525:77:2;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28525:77:2;;;28515:88;;;;;;28497:106;;28206:404;28668:71;28685:15;28702:21;28725:13;28668:16;:71::i;:::-;28660:108;;;;;;;-1:-1:-1;;;;;;;;;;;28660:108:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;28849:146;28870:17;28897:9;28916;28935:3;28948;28961;28974:13;28849:11;:146::i;:::-;28834:200;;;;;;;-1:-1:-1;;;;;;;;;;;28834:200:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;29150:4;29091:17;:39;29115:13;29109:20;;;;;;;;29091:39;;;;;;;;;;;;;;;;-1:-1:-1;29091:39:2;;;:56;;;;;;;;;;:63;;-1:-1:-1;;29091:63:2;;;;;;;;;;-1:-1:-1;;;;;;;;;;27807:1352:2:o;2607:168:7:-;2665:7;2696:5;;;2719:6;;;;2711:38;;;;;-1:-1:-1;;;;;;;;;;;2711:38:7;;;;;;;;;;;;;;;;;;;;;;;;;;;6909:263:3;-1:-1:-1;;;;;6983:21:3;;;;6975:30;;;;;;7031:12;;:23;;7048:5;7031:23;:16;:23;:::i;:::-;7016:12;:38;-1:-1:-1;;;;;7085:18:3;;:9;:18;;;;;;;;;;;:29;;7108:5;7085:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;7064:18:3;;:9;:18;;;;;;;;;;;:50;;;;7129:36;;;;;;;7064:18;;:9;;7129:36;;;;;;;;;;6909:263;;:::o;1335:440:7:-;1393:7;1633:6;;1629:45;;;-1:-1:-1;1662:1:7;1655:8;;1629:45;1696:5;;;1700:1;1696;:5;1719;;;;;;;;:10;1711:38;;;;;-1:-1:-1;;;;;;;;;;;1711:38:7;;;;;;;;;;;;;;;;;;;;;;;;;;;1691:778:5;1782:4;1821;1782;1836:514;1860:5;:12;1856:1;:16;1836:514;;;1893:20;1916:5;1922:1;1916:8;;;;;;;;;;;;;;;;;;1893:31;;1958:12;1943;:27;1939:401;;;2110:12;2124;2093:44;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2093:44:5;;;2083:55;;;;;;2068:70;;1939:401;;;2297:12;2311;2280:44;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2280:44:5;;;2270:55;;;;;;2255:70;;1939:401;-1:-1:-1;1874:3:5;;1836:514;;;-1:-1:-1;2442:20:5;;;;1691:778;-1:-1:-1;;;1691:778:5:o;2930:136:7:-;2988:7;3015:6;;;3007:30;;;;;-1:-1:-1;;;;;;;;;;;3007:30:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;3058:1;3054;:5;;;;;;;;;2930:136;-1:-1:-1;;;2930:136:7:o;41283:3148:2:-;41402:17;:15;:17::i;:::-;-1:-1:-1;;;;;41528:19:2;;41499:26;41528:19;;;:8;:19;;;;;:34;;41548:13;;41528:34;;;;;;;;;;;;;;;;41499:63;;41569:16;41606:6;:26;;;41588:15;:44;:94;;41667:15;41588:94;;;41638:6;:26;;;41588:94;41569:113;;41708:20;41731:94;41751:6;:20;;;41776:6;:32;;;41813:8;41731:15;:94::i;:::-;41708:117;;41920:53;41937:6;:35;;;41920:12;:16;;:53;;;;:::i;:::-;42050:20;;41905:68;;-1:-1:-1;42033:38:2;;41905:68;;42033:38;:16;:38;:::i;:::-;42118:22;;;;42018:53;;-1:-1:-1;42118:22:2;;;;;42115:726;;;42238:20;;42213;;:46;;;:24;:46;:::i;:::-;42190:20;:69;42352:20;;;;42328:19;;:45;;;:23;:45;:::i;:::-;42306:19;:67;42511:20;;;;42480:25;;;;;;42458:48;;;;:21;:48;;;;;;:74;;;:52;:74;:::i;:::-;42429:25;;;;;;;42407:48;;;;:21;:48;;;;;:125;;;;42596:15;42560:33;;;:51;42671:30;;-1:-1:-1;;42671:30:2;;;42707:130;;;;42742:89;42772:6;:20;;;42799:6;:26;;;42742:89;;;;;;;;;;;;;;;;;;;;;;;;42707:130;42876:16;42903:17;;42900:265;;;43037:16;;;;43059:26;;;;43091:20;;43010:150;;43037:16;43059:26;43117:38;:12;43091:20;43117:38;:16;:38;:::i;:::-;43010:21;:150::i;:::-;42999:161;;42900:265;43237:13;;43234:181;;;43270:140;43296:6;:26;;;43328:6;:33;;;43367:38;43384:6;:20;;;43367:12;:16;;:38;;;;:::i;:::-;43270:20;:140::i;:::-;43259:151;;43234:181;43485:13;;;;;:52;;-1:-1:-1;43503:34:2;;;;;;;;;43502:35;43485:52;43482:246;;;43619:47;43650:15;:8;43663:1;43650:15;:12;:15;:::i;:::-;43619:26;;;:47;:30;:47;:::i;:::-;43590:26;:76;43671:52;43689:4;965:42:1;43707:15:2;:8;43720:1;43707:15;:12;:15;:::i;:::-;43671:9;:52::i;:::-;43735:16;43732:696;;;43774:34;;;:41;;-1:-1:-1;;43774:41:2;;;;;43732:696;;;43869:26;:12;43886:8;43869:26;:16;:26;:::i;:::-;43854:41;;43906:362;43925:6;:20;;;43951:12;43991:6;:26;;;43973:15;:44;:182;;44086:69;44103:6;:16;;;44121:6;:33;;;44086:16;:69::i;:::-;43973:182;;;44026:51;44043:6;:16;;;44061:15;44026:16;:51::i;:::-;44161:8;44175:6;:20;;;44201:62;44218:6;:16;;;44236:6;:26;;;44201:16;:62::i;:::-;43906:362;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44313:49;44331:4;44338:9;44349:12;44313:9;:49::i;:::-;44386:37;44398:9;44409:13;-1:-1:-1;;;;;44681:19:2;;44658:20;44681:19;;;:8;:19;;;;;:26;:33;;44712:1;44681:33;:30;:33;:::i;:::-;44658:56;-1:-1:-1;44777:29:2;;;44774:183;;-1:-1:-1;;;;;44917:19:2;;;;;;:8;:19;;;;;:33;;44937:12;;44917:33;;;;;;;;;;;;;;;;44880:8;:19;44889:9;-1:-1:-1;;;;;44880:19:2;-1:-1:-1;;;;;44880:19:2;;;;;;;;;;;;44900:13;44880:34;;;;;;;;;;;;;;;;;;:70;;:34;;;;;:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44880:70:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44880:70:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44880:70:2;;;;;;44774:183;-1:-1:-1;;;;;44993:19:2;;;;;;:8;:19;;;;;45022:12;;44993:41;;45022:12;44993:41;:::i;:::-;;44567:472;;;:::o;188:4753:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;188:4753:0;;;;;;
Swarm Source
bzzr://4d892470f374fc86409f6a049f46995c56dedc2f4938bf6efdc426f38d4b49ad
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.