ERC-20
Data
Overview
Max Total Supply
7,635,614,243.7293 WRK
Holders
1,092 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 4 Decimals)
Balance
1,740,859.1488 WRKValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BlockWRKICO
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion, Audited
Contract Source Code (Solidity)Audit Report
/** *Submitted for verification at Etherscan.io on 2019-05-14 */ // File: openzeppelin-solidity\contracts\token\ERC20\ERC20Basic.sol pragma solidity 0.4.24; /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * See https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } // File: openzeppelin-solidity\contracts\token\ERC20\ERC20.sol /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address _owner, address _spender) public view returns (uint256); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); function approve(address _spender, uint256 _value) public returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: contracts\ERC865Basic.sol /** * @title ERC865Basic * @dev Simpler version of the ERC865 interface from https://github.com/adilharis2001/ERC865Demo * @author jsdavis28 * @notice ERC865Token allows for users to pay gas costs to a delegate in an ERC20 token * https://github.com/ethereum/EIPs/issues/865 */ contract ERC865Basic is ERC20 { function _transferPreSigned( bytes _signature, address _from, address _to, uint256 _value, uint256 _fee, uint256 _nonce ) internal; event TransferPreSigned( address indexed delegate, address indexed from, address indexed to, uint256 value); } // File: openzeppelin-solidity\contracts\math\SafeMath.sol /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting '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; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } // File: openzeppelin-solidity\contracts\token\ERC20\BasicToken.sol /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) internal balances; uint256 internal totalSupply_; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return totalSupply_; } /** * @dev Transfer token for 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) { require(_value <= balances[msg.sender]); require(_to != address(0)); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } } // File: openzeppelin-solidity\contracts\token\ERC20\StandardToken.sol /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * https://github.com/ethereum/EIPs/issues/20 * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal allowed; /** * @dev Transfer tokens from one address to another * @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) { require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); require(_to != address(0)); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); emit Transfer(_from, _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) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } /** * @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 Increase the amount of tokens that an owner allowed to a spender. * approve should be called when allowed[_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 * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval( address _spender, uint256 _addedValue ) public returns (bool) { allowed[msg.sender][_spender] = ( allowed[msg.sender][_spender].add(_addedValue)); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when allowed[_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 * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval( address _spender, uint256 _subtractedValue ) public returns (bool) { uint256 oldValue = allowed[msg.sender][_spender]; if (_subtractedValue >= oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } // File: contracts\ERC865BasicToken.sol /** * @title ERC865BasicToken * @dev Simpler version of the ERC865 token from https://github.com/adilharis2001/ERC865Demo * @author jsdavis28 * @notice ERC865Token allows for users to pay gas costs to a delegate in an ERC20 token * https://github.com/ethereum/EIPs/issues/865 */ contract ERC865BasicToken is ERC865Basic, StandardToken { /** * @dev Sets internal variables for contract */ address internal feeAccount; mapping(bytes => bool) internal signatures; /** * @dev Allows a delegate to submit a transaction on behalf of the token holder. * @param _signature The signature, issued by the token holder. * @param _to The recipient's address. * @param _value The amount of tokens to be transferred. * @param _fee The amount of tokens paid to the delegate for gas costs. * @param _nonce The transaction number. */ function _transferPreSigned( bytes _signature, address _from, address _to, uint256 _value, uint256 _fee, uint256 _nonce ) internal { //Pre-validate transaction require(_to != address(0)); require(signatures[_signature] == false); //Create a hash of the transaction details bytes32 hashedTx = _transferPreSignedHashing(_to, _value, _fee, _nonce); //Obtain the token holder's address and check balance address from = _recover(hashedTx, _signature); require(from == _from); uint256 total = _value.add(_fee); require(total <= balances[from]); //Transfer tokens balances[from] = balances[from].sub(_value).sub(_fee); balances[_to] = balances[_to].add(_value); balances[feeAccount] = balances[feeAccount].add(_fee); //Mark transaction as completed signatures[_signature] = true; //TransferPreSigned ERC865 events emit TransferPreSigned(msg.sender, from, _to, _value); emit TransferPreSigned(msg.sender, from, feeAccount, _fee); //Transfer ERC20 events emit Transfer(from, _to, _value); emit Transfer(from, feeAccount, _fee); } /** * @dev Creates a hash of the transaction information passed to transferPresigned. * @param _to address The address which you want to transfer to. * @param _value uint256 The amount of tokens to be transferred. * @param _fee uint256 The amount of tokens paid to msg.sender, by the owner. * @param _nonce uint256 Presigned transaction number. * @return A copy of the hashed message signed by the token holder, with prefix added. */ function _transferPreSignedHashing( address _to, uint256 _value, uint256 _fee, uint256 _nonce ) internal pure returns (bytes32) { //Create a copy of the hashed message signed by the token holder bytes32 hash = keccak256(abi.encodePacked(_to, _value, _fee,_nonce)); //Add prefix to hash return _prefix(hash); } /** * @dev Adds prefix to the hashed message signed by the token holder. * @param _hash The hashed message (keccak256) to be prefixed. * @return Prefixed hashed message to return from _transferPreSignedHashing. */ function _prefix(bytes32 _hash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)); } /** * @dev Validate the transaction information and recover the token holder's address. * @param _hash A prefixed version of the hash used in the original signed message. * @param _sig The signature submitted by the token holder. * @return The token holder/transaction signer's address. */ function _recover(bytes32 _hash, bytes _sig) internal pure returns (address) { bytes32 r; bytes32 s; uint8 v; //Check the signature length if (_sig.length != 65) { return (address(0)); } //Split the signature into r, s and v variables assembly { r := mload(add(_sig, 32)) s := mload(add(_sig, 64)) v := byte(0, mload(add(_sig, 96))) } //Version of signature should be 27 or 28, but 0 and 1 are also possible if (v < 27) { v += 27; } //If the version is correct, return the signer address if (v != 27 && v != 28) { return (address(0)); } else { return ecrecover(_hash, v, r, s); } } } // File: contracts\TaxedToken.sol /** * @title Taxed token * @dev Version of BasicToken that allows for a fee on token transfers. * See https://github.com/OpenZeppelin/openzeppelin-solidity/pull/788 * @author jsdavis28 */ contract TaxedToken is ERC865BasicToken { /** * @dev Sets taxRate fee as public */ uint8 public taxRate; /** * @dev Transfer tokens to a specified account after diverting a fee to a central account. * @param _to The receiving address. * @param _value The number of tokens to transfer. */ function transfer( address _to, uint256 _value ) public returns (bool) { require(_to != address(0)); require(_value <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender].sub(_value); uint256 fee = _value.mul(taxRate).div(100); uint256 taxedValue = _value.sub(fee); balances[_to] = balances[_to].add(taxedValue); emit Transfer(msg.sender, _to, taxedValue); balances[feeAccount] = balances[feeAccount].add(fee); emit Transfer(msg.sender, feeAccount, fee); return true; } /** * @dev Provides a taxed transfer on StandardToken's transferFrom() function * @param _from The address providing allowance to spend * @param _to The receiving address. * @param _value The number of tokens to transfer. */ function transferFrom( address _from, address _to, uint256 _value ) public returns (bool) { require(_to != address(0)); require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); balances[_from] = balances[_from].sub(_value); uint256 fee = _value.mul(taxRate).div(100); uint256 taxedValue = _value.sub(fee); balances[_to] = balances[_to].add(taxedValue); emit Transfer(_from, _to, taxedValue); balances[feeAccount] = balances[feeAccount].add(fee); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); emit Transfer(_from, feeAccount, fee); return true; } } // File: openzeppelin-solidity\contracts\ownership\Ownable.sol /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } // File: contracts\Authorizable.sol /** * @title Authorizable * @dev The Authorizable contract allows the owner to set a number of additional * acccounts with limited administrative privileges to simplify user permissions. * Only the contract owner can add or remove authorized accounts. * @author jsdavis28 */ contract Authorizable is Ownable { using SafeMath for uint256; address[] public authorized; mapping(address => bool) internal authorizedIndex; uint8 public numAuthorized; /** * @dev The Authorizable constructor sets the owner as authorized */ constructor() public { authorized.length = 2; authorized[1] = msg.sender; authorizedIndex[msg.sender] = true; numAuthorized = 1; } /** * @dev Throws if called by any account other than an authorized account. */ modifier onlyAuthorized { require(isAuthorized(msg.sender)); _; } /** * @dev Allows the current owner to add an authorized account. * @param _account The address being added as authorized. */ function addAuthorized(address _account) public onlyOwner { if (authorizedIndex[_account] == false) { authorizedIndex[_account] = true; authorized.length++; authorized[authorized.length.sub(1)] = _account; numAuthorized++; } } /** * @dev Validates whether an account is authorized for enhanced permissions. * @param _account The address being evaluated. */ function isAuthorized(address _account) public constant returns (bool) { if (authorizedIndex[_account] == true) { return true; } return false; } /** * @dev Allows the current owner to remove an authorized account. * @param _account The address to remove from authorized. */ function removeAuthorized(address _account) public onlyOwner { require(isAuthorized(_account)); authorizedIndex[_account] = false; numAuthorized--; } } // File: contracts\BlockWRKToken.sol /** * @title BlockWRKToken * @dev BlockWRKToken contains administrative features that allow the BlockWRK * application to interface with the BlockWRK token, an ERC20-compliant token * that integrates taxed token and ERC865 functionality. * @author jsdavis28 */ contract BlockWRKToken is TaxedToken, Authorizable { /** * @dev Sets token information. */ string public name = "BlockWRK"; string public symbol = "WRK"; uint8 public decimals = 4; uint256 public INITIAL_SUPPLY; /** * @dev Sets public variables for BlockWRK token. */ address public distributionPoolWallet; address public inAppPurchaseWallet; address public reservedTokenWallet; uint256 public premineDistributionPool; uint256 public premineReserved; /** * @dev Sets private variables for custom token functions. */ uint256 internal decimalValue = 10000; constructor() public { feeAccount = 0xeCced56A201d1A6D1Da31A060868F96ACdba99B3; distributionPoolWallet = 0xAB3Edd46E9D52e1b3131757e1Ed87FA885f48019; inAppPurchaseWallet = 0x97eae8151487e054112E27D8c2eE5f17B3C6A83c; reservedTokenWallet = 0xd6E4E287a4aE2E9d8BF7f0323f440acC0d5AD301; premineDistributionPool = decimalValue.mul(5600000000); premineReserved = decimalValue.mul(2000000000); INITIAL_SUPPLY = premineDistributionPool.add(premineReserved); balances[distributionPoolWallet] = premineDistributionPool; emit Transfer(address(this), distributionPoolWallet, premineDistributionPool); balances[reservedTokenWallet] = premineReserved; emit Transfer(address(this), reservedTokenWallet, premineReserved); totalSupply_ = INITIAL_SUPPLY; taxRate = 2; } /** * @dev Allows App to distribute WRK tokens to users. * This function will be called by authorized from within the App. * @param _to The recipient's BlockWRK address. * @param _value The amount of WRK to transfer. */ function inAppTokenDistribution( address _to, uint256 _value ) public onlyAuthorized { require(_value <= balances[distributionPoolWallet]); require(_to != address(0)); balances[distributionPoolWallet] = balances[distributionPoolWallet].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(distributionPoolWallet, _to, _value); } /** * @dev Allows App to process fiat payments for WRK tokens, charging a fee in WRK. * This function will be called by authorized from within the App. * @param _to The buyer's BlockWRK address. * @param _value The amount of WRK to transfer. * @param _fee The fee charged in WRK for token purchase. */ function inAppTokenPurchase( address _to, uint256 _value, uint256 _fee ) public onlyAuthorized { require(_value <= balances[inAppPurchaseWallet]); require(_to != address(0)); balances[inAppPurchaseWallet] = balances[inAppPurchaseWallet].sub(_value); uint256 netAmount = _value.sub(_fee); balances[_to] = balances[_to].add(netAmount); emit Transfer(inAppPurchaseWallet, _to, netAmount); balances[feeAccount] = balances[feeAccount].add(_fee); emit Transfer(inAppPurchaseWallet, feeAccount, _fee); } /** * @dev Allows owner to set the percentage fee charged by TaxedToken on external transfers. * @param _newRate The amount to be set. */ function setTaxRate(uint8 _newRate) public onlyOwner { taxRate = _newRate; } /** * @dev Allows owner to set the fee account to receive transfer fees. * @param _newAddress The address to be set. */ function setFeeAccount(address _newAddress) public onlyOwner { require(_newAddress != address(0)); feeAccount = _newAddress; } /** * @dev Allows owner to set the wallet that holds WRK for sale via in-app purchases with fiat. * @param _newAddress The address to be set. */ function setInAppPurchaseWallet(address _newAddress) public onlyOwner { require(_newAddress != address(0)); inAppPurchaseWallet = _newAddress; } /** * @dev Allows authorized to act as a delegate to transfer a pre-signed transaction for ERC865 * @param _signature The pre-signed message. * @param _from The token sender. * @param _to The token recipient. * @param _value The amount of WRK to send the recipient. * @param _fee The fee to be paid in WRK (calculated by App off-chain). * @param _nonce The transaction number (stored in App off-chain). */ function transactionHandler( bytes _signature, address _from, address _to, uint256 _value, uint256 _fee, uint256 _nonce ) public onlyAuthorized { _transferPreSigned(_signature, _from, _to, _value, _fee, _nonce); } } // File: contracts\BlockWRKICO.sol /** * @title BlockWRKICO * @notice This contract manages the sale of WRK tokens for the BlockWRK ICO. * @dev This contract incorporates elements of OpenZeppelin crowdsale contracts with some modifications. * @author jsdavis28 */ contract BlockWRKICO is BlockWRKToken { /** * @dev Sets public variables for BlockWRK ICO */ address public salesWallet; uint256 public cap; uint256 public closingTime; uint256 public currentTierRate; uint256 public openingTime; uint256 public weiRaised; /** * @dev Sets private variables for custom token functions. */ uint256 internal availableInCurrentTier; uint256 internal availableInSale; uint256 internal totalPremineVolume; uint256 internal totalSaleVolume; uint256 internal totalTokenVolume; uint256 internal tier1Rate; uint256 internal tier2Rate; uint256 internal tier3Rate; uint256 internal tier4Rate; uint256 internal tier5Rate; uint256 internal tier6Rate; uint256 internal tier7Rate; uint256 internal tier8Rate; uint256 internal tier9Rate; uint256 internal tier10Rate; uint256 internal tier1Volume; uint256 internal tier2Volume; uint256 internal tier3Volume; uint256 internal tier4Volume; uint256 internal tier5Volume; uint256 internal tier6Volume; uint256 internal tier7Volume; uint256 internal tier8Volume; uint256 internal tier9Volume; uint256 internal tier10Volume; constructor() public { cap = 9999999999999999999999999999999999999999999999; salesWallet = 0xA0E021fC3538ed52F9a3D79249ff1D3A67f91C42; openingTime = 1557856800; closingTime = 1589479200; totalPremineVolume = 76000000000000; totalSaleVolume = 43000000000000; totalTokenVolume = 119000000000000; availableInSale = totalSaleVolume; tier1Rate = 100000; tier2Rate = 10000; tier3Rate = 2000; tier4Rate = 1250; tier5Rate = 625; tier6Rate = 312; tier7Rate = 156; tier8Rate = 117; tier9Rate = 104; tier10Rate = 100; tier1Volume = totalPremineVolume.add(1000000000000); tier2Volume = tier1Volume.add(2000000000000); tier3Volume = tier2Volume.add(5000000000000); tier4Volume = tier3Volume.add(5000000000000); tier5Volume = tier4Volume.add(5000000000000); tier6Volume = tier5Volume.add(5000000000000); tier7Volume = tier6Volume.add(5000000000000); tier8Volume = tier7Volume.add(5000000000000); tier9Volume = tier8Volume.add(5000000000000); tier10Volume = tier9Volume.add(5000000000000); } /** * Event for token purchase logging * @param purchaser who paid for the tokens * @param beneficiary who got the tokens * @param value weis paid for purchase * @param amount amount of tokens purchased */ event TokenPurchase( address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount ); /** * Event marking the transfer of any remaining WRK to the distribution pool post-ICO * @param wallet The address remaining sale tokens are delivered * @param amount The remaining tokens after the sale has closed */ event CloseoutSale(address indexed wallet, uint256 amount); // ----------------------------------------- // Crowdsale external interface // ----------------------------------------- /** * @dev fallback function */ function () external payable { buyTokens(msg.sender); } /** * @dev Allows ICO participants to purchase WRK tokens * @param _beneficiary The address of the ICO participant */ function buyTokens(address _beneficiary) public payable { uint256 weiAmount = msg.value; _preValidatePurchase(_beneficiary, weiAmount); //Calculate number of tokens to issue uint256 tokens = _calculateTokens(weiAmount); //Calculate new amount of Wei raised weiRaised = weiRaised.add(weiAmount); //Process token purchase and forward funcds to salesWallet _processPurchase(_beneficiary, tokens); _forwardFunds(); emit TokenPurchase(msg.sender, _beneficiary, weiAmount, tokens); } /** * @dev Checks whether the cap has been reached. * @return Whether the cap was reached */ function capReached() public view returns (bool) { return weiRaised >= cap; } /** * @dev Checks whether the period in which the crowdsale is open has already elapsed. * @return Whether crowdsale period has elapsed */ function hasClosed() public view returns (bool) { // solium-disable-next-line security/no-block-members return block.timestamp > closingTime; } // ----------------------------------------- // Internal interface (extensible) // ----------------------------------------- /** * @dev Calculates total number of tokens to sell, accounting for varied rates per tier. * @param _amountWei Total amount of Wei sent by ICO participant * @return Total number of tokens to send to buyer */ function _calculateTokens(uint256 _amountWei) internal returns (uint256) { //Tokens pending in sale uint256 tokenAmountPending; //Tokens to be sold uint256 tokenAmountToIssue; //Note: tierCaps must take into account reserved and distribution pool tokens //Determine tokens remaining in tier and set current token rate uint256 tokensRemainingInTier = _getRemainingTokens(totalSupply_); //Calculate new tokens pending sale uint256 newTokens = _getTokenAmount(_amountWei); //Check if _newTokens exceeds _tokensRemainingInTier bool nextTier = true; while (nextTier) { if (newTokens > tokensRemainingInTier) { //Get tokens sold in current tier and add to pending total supply tokenAmountPending = tokensRemainingInTier; uint256 newTotal = totalSupply_.add(tokenAmountPending); //Save number of tokens pending from current tier tokenAmountToIssue = tokenAmountToIssue.add(tokenAmountPending); //Calculate Wei spent in current tier and set remaining Wei for next tier uint256 pendingAmountWei = tokenAmountPending.div(currentTierRate); uint256 remainingWei = _amountWei.sub(pendingAmountWei); //Calculate number of tokens in next tier tokensRemainingInTier = _getRemainingTokens(newTotal); newTokens = _getTokenAmount(remainingWei); } else { tokenAmountToIssue = tokenAmountToIssue.add(newTokens); nextTier = false; _setAvailableInCurrentTier(tokensRemainingInTier, newTokens); _setAvailableInSale(newTokens); } } //Return amount of tokens to be issued in this sale return tokenAmountToIssue; } /** * @dev Source of tokens. * @param _beneficiary Address performing the token purchase * @param _tokenAmount Number of tokens to be emitted */ function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal { totalSupply_ = totalSupply_.add(_tokenAmount); balances[_beneficiary] = balances[_beneficiary].add(_tokenAmount); } /** * @dev Determines how ETH is stored/forwarded on purchases. */ function _forwardFunds() internal { salesWallet.transfer(msg.value); } /** * @dev Performs a binary search of the sale tiers to determine current sales volume and rate. * @param _tokensSold The total number of tokens sold in the ICO prior to this tx * @return The remaining number of tokens for sale in the current sale tier */ function _getRemainingTokens(uint256 _tokensSold) internal returns (uint256) { //Deteremine the current sale tier, set current rate and find remaining tokens in tier uint256 remaining; if (_tokensSold < tier5Volume) { if (_tokensSold < tier3Volume) { if (_tokensSold < tier1Volume) { _setCurrentTierRate(tier1Rate); remaining = tier1Volume.sub(_tokensSold); } else if (_tokensSold < tier2Volume) { _setCurrentTierRate(tier2Rate); remaining = tier2Volume.sub(_tokensSold); } else { _setCurrentTierRate(tier3Rate); remaining = tier3Volume.sub(_tokensSold); } } else { if (_tokensSold < tier4Volume) { _setCurrentTierRate(tier4Rate); remaining = tier4Volume.sub(_tokensSold); } else { _setCurrentTierRate(tier5Rate); remaining = tier5Volume.sub(_tokensSold); } } } else { if (_tokensSold < tier8Volume) { if (_tokensSold < tier6Volume) { _setCurrentTierRate(tier6Rate); remaining = tier6Volume.sub(_tokensSold); } else if (_tokensSold < tier7Volume) { _setCurrentTierRate(tier7Rate); remaining = tier7Volume.sub(_tokensSold); } else { _setCurrentTierRate(tier8Rate); remaining = tier8Volume.sub(_tokensSold); } } else { if (_tokensSold < tier9Volume) { _setCurrentTierRate(tier9Rate); remaining = tier9Volume.sub(_tokensSold); } else { _setCurrentTierRate(tier10Rate); remaining = tier10Volume.sub(_tokensSold); } } } return remaining; } /** * @dev Override to extend the way in which ether is converted to tokens. * @param _weiAmount Value in wei to be converted into tokens * @return Number of tokens that can be purchased with the specified _weiAmount */ function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) { return _weiAmount.mul(currentTierRate).mul(decimalValue).div(1 ether); } /** * @dev Validation of an incoming purchase. * @param _beneficiary Address performing the token purchase * @param _weiAmount Value in wei involved in the purchase */ function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal view { require(_beneficiary != address(0)); require(_weiAmount != 0); require(weiRaised.add(_weiAmount) <= cap); // solium-disable-next-line security/no-block-members require(block.timestamp >= openingTime && block.timestamp <= closingTime); } /** * @dev Executed when a purchase has been validated and is ready to be executed. Not necessarily emits/sends tokens. * @param _beneficiary Address receiving the tokens * @param _tokenAmount Number of tokens to be purchased */ function _processPurchase(address _beneficiary, uint256 _tokenAmount) internal { _deliverTokens(_beneficiary, _tokenAmount); } /** * @dev Calculates remaining tokens available in the current tier after a sale is processed * @param _tierPreviousRemaining Number of tokens remaining prior to sale * @param _newIssue Number of tokens to be purchased */ function _setAvailableInCurrentTier(uint256 _tierPreviousRemaining, uint256 _newIssue) internal { availableInCurrentTier = _tierPreviousRemaining.sub(_newIssue); } /** * @dev Calculates remaining tokens available in the ICO after a sale is processed * @param _newIssue Number of tokens to be purchased */ function _setAvailableInSale(uint256 _newIssue) internal { availableInSale = totalSaleVolume.sub(_newIssue); } /** * @dev Sets the current tier rate based on sale volume * @param _rate The new rate */ function _setCurrentTierRate(uint256 _rate) internal { currentTierRate = _rate; } /** * @dev Returns the remaining number of tokens for sale * @return Total remaining tokens available for sale */ function tokensRemainingInSale() public view returns (uint256) { return availableInSale; } /** * @dev Returns the remaining number of tokens for sale in the current tier * @return Total remaining tokens available for sale in the current tier */ function tokensRemainingInTier() public view returns (uint256) { return availableInCurrentTier; } /** * @dev Allows the owner to transfer any remaining tokens not sold to a wallet * @return Total remaining tokens available for sale */ function transferRemainingTokens() public onlyOwner { //require that sale is closed require(hasClosed()); //require that tokens are still remaining after close require(availableInSale > 0); //send remaining tokens to distribution pool wallet balances[distributionPoolWallet] = balances[distributionPoolWallet].add(availableInSale); emit CloseoutSale(distributionPoolWallet, availableInSale); } }
Contract Security Audit
- Quillhash - October 18th, 2018 - Security Audit Report
[{"constant":true,"inputs":[],"name":"premineReserved","outputs":[{"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":"uint256"}],"name":"authorized","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasClosed","outputs":[{"name":"","type":"bool"}],"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":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint256"}],"name":"inAppTokenPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentTierRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"removeAuthorized","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setFeeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"closingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"capReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensRemainingInSale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"transferRemainingTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRate","type":"uint8"}],"name":"setTaxRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"inAppTokenDistribution","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":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"taxRate","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setInAppPurchaseWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reservedTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"premineDistributionPool","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numAuthorized","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","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":"openingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"addAuthorized","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_signature","type":"bytes"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_nonce","type":"uint256"}],"name":"transactionHandler","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"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":"inAppPurchaseWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"distributionPoolWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"salesWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensRemainingInTier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"isAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"CloseoutSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"delegate","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"TransferPreSigned","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"},{"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"}]
Contract Creation Code
60806040526040805190810160405280600881526020017f426c6f636b57524b00000000000000000000000000000000000000000000000081525060099080519060200190620000519291906200092b565b506040805190810160405280600381526020017f57524b0000000000000000000000000000000000000000000000000000000000815250600a90805190602001906200009f9291906200092b565b506004600b60006101000a81548160ff021916908360ff160217905550612710601255348015620000cf57600080fd5b5033600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600681620001229190620009b2565b5033600660018154811015156200013557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860006101000a81548160ff021916908360ff16021790555073ecced56a201d1a6d1da31a060868f96acdba99b3600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ab3edd46e9d52e1b3131757e1ed87fa885f48019600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507397eae8151487e054112e27d8c2ee5f17b3c6a83c600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d6e4e287a4ae2e9d8bf7f0323f440acc0d5ad301600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200036f64014dc93800601254620008d264010000000002620033dd179091906401000000009004565b6010819055506200039e6377359400601254620008d264010000000002620033dd179091906401000000009004565b601181905550620003cb6011546010546200090e640100000000026200332f179091906401000000009004565b600c81905550601054600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6010546040518082815260200191505060405180910390a3601154600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6011546040518082815260200191505060405180910390a3600c546001819055506002600560006101000a81548160ff021916908360ff1602179055507301c06a5ec5433c60ddaa16406f5a3fffffffffff60148190555073a0e021fc3538ed52f9a3d79249ff1d3a67f91c42601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550635cdb0220601781905550635ebd872060158190555065451f2100c000601b8190555065271bb7b9b000601c81905550656c3ad8ba7000601d81905550601c54601a81905550620186a0601e81905550612710601f819055506107d06020819055506104e2602181905550610271602281905550610138602381905550609c6024819055506075602581905550606860268190555060646027819055506200070d64e8d4a51000601b546200090e640100000000026200332f179091906401000000009004565b6028819055506200073e6501d1a94a20006028546200090e640100000000026200332f179091906401000000009004565b6029819055506200076f65048c273950006029546200090e640100000000026200332f179091906401000000009004565b602a81905550620007a065048c27395000602a546200090e640100000000026200332f179091906401000000009004565b602b81905550620007d165048c27395000602b546200090e640100000000026200332f179091906401000000009004565b602c819055506200080265048c27395000602c546200090e640100000000026200332f179091906401000000009004565b602d819055506200083365048c27395000602d546200090e640100000000026200332f179091906401000000009004565b602e819055506200086465048c27395000602e546200090e640100000000026200332f179091906401000000009004565b602f819055506200089565048c27395000602f546200090e640100000000026200332f179091906401000000009004565b603081905550620008c665048c273950006030546200090e640100000000026200332f179091906401000000009004565b60318190555062000a09565b600080831415620008e7576000905062000908565b8183029050818382811515620008f957fe5b041415156200090457fe5b8090505b92915050565b600081830190508281101515156200092257fe5b80905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200096e57805160ff19168380011785556200099f565b828001600101855582156200099f579182015b828111156200099e57825182559160200191906001019062000981565b5b509050620009ae9190620009e1565b5090565b815481835581811115620009dc57818360005260206000209182019101620009db9190620009e1565b5b505050565b62000a0691905b8082111562000a02576000816000905550600101620009e8565b5090565b90565b61419d8062000a196000396000f30060806040526004361061021a576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305f7939a1461022557806306fdde0314610250578063095ea7b3146102e05780630d48669a146103455780631515bc2b146103b257806318160ddd146103e15780631bfd816b1461040c57806323b872dd146104635780632ff2e9dc146104e8578063313ce56714610513578063355274ea14610544578063379b4ed01461056f5780634042b66f1461059a578063485d7d94146105c55780634b023cf8146106085780634b6753bc1461064b5780634f935945146106765780635946748c146106a557806363cc4aa2146106d057806366188463146106e75780636c791e041461074c578063705388631461077c57806370a08231146107c9578063715018a614610820578063771a3a1d146108375780637b5f4f5b146108685780637dd6ab72146108ab578063819d95c1146109025780638da5cb5b1461092d57806395d89b4114610984578063a31f898214610a14578063a9059cbb14610a45578063b7a8807c14610aaa578063cf1c316a14610ad5578063d6d2229114610b18578063d73dd62314610bdf578063dd62ed3e14610c44578063e3175c4d14610cbb578063e5ee34a214610d12578063ec8ac4d814610d69578063edf4d84714610d9f578063f2fde38b14610df6578063f4dab3ff14610e39578063fe9fbb8014610e64575b61022333610ebf565b005b34801561023157600080fd5b5061023a610f79565b6040518082815260200191505060405180910390f35b34801561025c57600080fd5b50610265610f7f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a557808201518184015260208101905061028a565b50505050905090810190601f1680156102d25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ec57600080fd5b5061032b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061101d565b604051808215151515815260200191505060405180910390f35b34801561035157600080fd5b506103706004803603810190808035906020019092919050505061110f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103be57600080fd5b506103c761114d565b604051808215151515815260200191505060405180910390f35b3480156103ed57600080fd5b506103f6611159565b6040518082815260200191505060405180910390f35b34801561041857600080fd5b50610461600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611163565b005b34801561046f57600080fd5b506104ce600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115b0565b604051808215151515815260200191505060405180910390f35b3480156104f457600080fd5b506104fd611b1c565b6040518082815260200191505060405180910390f35b34801561051f57600080fd5b50610528611b22565b604051808260ff1660ff16815260200191505060405180910390f35b34801561055057600080fd5b50610559611b35565b6040518082815260200191505060405180910390f35b34801561057b57600080fd5b50610584611b3b565b6040518082815260200191505060405180910390f35b3480156105a657600080fd5b506105af611b41565b6040518082815260200191505060405180910390f35b3480156105d157600080fd5b50610606600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b47565b005b34801561061457600080fd5b50610649600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c45565b005b34801561065757600080fd5b50610660611d21565b6040518082815260200191505060405180910390f35b34801561068257600080fd5b5061068b611d27565b604051808215151515815260200191505060405180910390f35b3480156106b157600080fd5b506106ba611d36565b6040518082815260200191505060405180910390f35b3480156106dc57600080fd5b506106e5611d40565b005b3480156106f357600080fd5b50610732600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f0d565b604051808215151515815260200191505060405180910390f35b34801561075857600080fd5b5061077a600480360381019080803560ff16906020019092919050505061219f565b005b34801561078857600080fd5b506107c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612219565b005b3480156107d557600080fd5b5061080a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124cd565b6040518082815260200191505060405180910390f35b34801561082c57600080fd5b50610835612515565b005b34801561084357600080fd5b5061084c61261a565b604051808260ff1660ff16815260200191505060405180910390f35b34801561087457600080fd5b506108a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061262d565b005b3480156108b757600080fd5b506108c0612709565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090e57600080fd5b5061091761272f565b6040518082815260200191505060405180910390f35b34801561093957600080fd5b50610942612735565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561099057600080fd5b5061099961275b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109d95780820151818401526020810190506109be565b50505050905090810190601f168015610a065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a2057600080fd5b50610a296127f9565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a5157600080fd5b50610a90600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061280c565b604051808215151515815260200191505060405180910390f35b348015610ab657600080fd5b50610abf612bdd565b6040518082815260200191505060405180910390f35b348015610ae157600080fd5b50610b16600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612be3565b005b348015610b2457600080fd5b50610bdd600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050612dab565b005b348015610beb57600080fd5b50610c2a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dd5565b604051808215151515815260200191505060405180910390f35b348015610c5057600080fd5b50610ca5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fd1565b6040518082815260200191505060405180910390f35b348015610cc757600080fd5b50610cd0613058565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d1e57600080fd5b50610d2761307e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d9d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ebf565b005b348015610dab57600080fd5b50610db46130a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e0257600080fd5b50610e37600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130ca565b005b348015610e4557600080fd5b50610e4e613132565b6040518082815260200191505060405180910390f35b348015610e7057600080fd5b50610ea5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061313c565b604051808215151515815260200191505060405180910390f35b600080349150610ecf83836131aa565b610ed88261323e565b9050610eef8260185461332f90919063ffffffff16565b601881905550610eff838261334b565b610f07613359565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188484604051808381526020018281526020019250505060405180910390a3505050565b60115481565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60068181548110151561111e57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006015544211905090565b6000600154905090565b600061116e3361313c565b151561117957600080fd5b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483111515156111e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561122457600080fd5b61129783600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061130e82846133c490919063ffffffff16565b9050611361816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a361149d82600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115f057600080fd5b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561163d57600080fd5b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111515156116c857600080fd5b611719846000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117936064611785600560009054906101000a900460ff1660ff16876133dd90919063ffffffff16565b61341590919063ffffffff16565b91506117a882856133c490919063ffffffff16565b90506117fb816000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a361191582600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0884600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001925050509392505050565b600c5481565b600b60009054906101000a900460ff1681565b60145481565b60165481565b60185481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ba357600080fd5b611bac8161313c565b1515611bb757600080fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506008600081819054906101000a900460ff16809291906001900391906101000a81548160ff021916908360ff1602179055505050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ca157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cdd57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60155481565b60006014546018541015905090565b6000601a54905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d9c57600080fd5b611da461114d565b1515611daf57600080fd5b6000601a54111515611dc057600080fd5b611e35601a54600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1227f9baa9c17a74ae4200a9a412668d5892cbf9f1cc63bdcd07cc1be0634192601a546040518082815260200191505060405180910390a2565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808310151561201f576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120b3565b61203283826133c490919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121fb57600080fd5b80600560006101000a81548160ff021916908360ff16021790555050565b6122223361313c565b151561222d57600080fd5b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115151561229c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156122d857600080fd5b61234b81600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612400816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561257157600080fd5b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560009054906101000a900460ff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561268957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126c557600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127f15780601f106127c6576101008083540402835291602001916127f1565b820191906000526020600020905b8154815290600101906020018083116127d457829003601f168201915b505050505081565b600860009054906101000a900460ff1681565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561284c57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561289957600080fd5b6128ea846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506129646064612956600560009054906101000a900460ff1660ff16876133dd90919063ffffffff16565b61341590919063ffffffff16565b915061297982856133c490919063ffffffff16565b90506129cc816000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3612ae682600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019250505092915050565b60175481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c3f57600080fd5b60001515600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415612da8576001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060068054809190600101612d049190614120565b50806006612d2160016006805490506133c490919063ffffffff16565b815481101515612d2d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff160217905550505b50565b612db43361313c565b1515612dbf57600080fd5b612dcd86868686868661342b565b505050505050565b6000612e6682600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561312657600080fd5b61312f81613a50565b50565b6000601954905090565b600060011515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156131a057600190506131a5565b600090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156131e657600080fd5b600081141515156131f657600080fd5b60145461320e8260185461332f90919063ffffffff16565b1115151561321b57600080fd5b601754421015801561322f57506015544211155b151561323a57600080fd5b5050565b6000806000806000806000806000613257600154613b4c565b95506132628a613d3c565b9450600193505b831561331f57858511156132ed5785975061328f8860015461332f90919063ffffffff16565b92506132a4888861332f90919063ffffffff16565b96506132bb6016548961341590919063ffffffff16565b91506132d0828b6133c490919063ffffffff16565b90506132db83613b4c565b95506132e681613d3c565b945061331a565b613300858861332f90919063ffffffff16565b9650600093506133108686613d88565b61331985613da5565b5b613269565b8698505050505050505050919050565b6000818301905082811015151561334257fe5b80905092915050565b6133558282613dc3565b5050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156133c1573d6000803e3d6000fd5b50565b60008282111515156133d257fe5b818303905092915050565b6000808314156133f0576000905061340f565b818302905081838281151561340157fe5b0414151561340b57fe5b8090505b92915050565b6000818381151561342257fe5b04905092915050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415151561346b57600080fd5b6000151560048a6040518082805190602001908083835b6020831015156134a75780518252602082019150602081019050602083039250613482565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900460ff1615151415156134f657600080fd5b61350287878787613e75565b925061350e838a613f63565b91508773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151561354a57600080fd5b61355d858761332f90919063ffffffff16565b90506000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111515156135ac57600080fd5b61360f85613601886000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6133c490919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136a2866000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061375785600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160048a6040518082805190602001908083835b6020831015156137f557805182526020820191506020810190506020830392506137d0565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548160ff0219169083151502179055508673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f339e733e8f3d5b80a99579a1bd0d885dd3d96783439f354abebcd98f88b6462c896040518082815260200191505060405180910390a4600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f339e733e8f3d5b80a99579a1bd0d885dd3d96783439f354abebcd98f88b6462c886040518082815260200191505060405180910390a48673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040518082815260200191505060405180910390a3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613a8c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080602c54831015613c4857602a54831015613bee57602854831015613b9457613b78601e5461405b565b613b8d836028546133c490919063ffffffff16565b9050613be9565b602954831015613bc557613ba9601f5461405b565b613bbe836029546133c490919063ffffffff16565b9050613be8565b613bd060205461405b565b613be583602a546133c490919063ffffffff16565b90505b5b613c43565b602b54831015613c1f57613c0360215461405b565b613c1883602b546133c490919063ffffffff16565b9050613c42565b613c2a60225461405b565b613c3f83602c546133c490919063ffffffff16565b90505b5b613d33565b602f54831015613cdd57602d54831015613c8357613c6760235461405b565b613c7c83602d546133c490919063ffffffff16565b9050613cd8565b602e54831015613cb457613c9860245461405b565b613cad83602e546133c490919063ffffffff16565b9050613cd7565b613cbf60255461405b565b613cd483602f546133c490919063ffffffff16565b90505b5b613d32565b603054831015613d0e57613cf260265461405b565b613d07836030546133c490919063ffffffff16565b9050613d31565b613d1960275461405b565b613d2e836031546133c490919063ffffffff16565b90505b5b5b80915050919050565b6000613d81670de0b6b3a7640000613d73601254613d65601654876133dd90919063ffffffff16565b6133dd90919063ffffffff16565b61341590919063ffffffff16565b9050919050565b613d9b81836133c490919063ffffffff16565b6019819055505050565b613dba81601c546133c490919063ffffffff16565b601a8190555050565b613dd88160015461332f90919063ffffffff16565b600181905550613e2f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008085858585604051602001808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018281526020019450505050506040516020818303038152906040526040518082805190602001908083835b602083101515613f205780518252602082019150602081019050602083039250613efb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050613f5881614065565b915050949350505050565b60008060008060418551141515613f7d5760009350614052565b6020850151925060408501519150606085015160001a9050601b8160ff161015613fa857601b810190505b601b8160ff1614158015613fc05750601c8160ff1614155b15613fce5760009350614052565b600186828585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015614045573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b8060168190555050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156140ec57805182526020820191506020810190506020830392506140c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050919050565b81548183558181111561414757818360005260206000209182019101614146919061414c565b5b505050565b61416e91905b8082111561416a576000816000905550600101614152565b5090565b905600a165627a7a72305820f6c48654dbdf5d07f556060f1719a80abb203dac97e4fce2e43b511dd59fdf030029
Deployed Bytecode
0x60806040526004361061021a576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305f7939a1461022557806306fdde0314610250578063095ea7b3146102e05780630d48669a146103455780631515bc2b146103b257806318160ddd146103e15780631bfd816b1461040c57806323b872dd146104635780632ff2e9dc146104e8578063313ce56714610513578063355274ea14610544578063379b4ed01461056f5780634042b66f1461059a578063485d7d94146105c55780634b023cf8146106085780634b6753bc1461064b5780634f935945146106765780635946748c146106a557806363cc4aa2146106d057806366188463146106e75780636c791e041461074c578063705388631461077c57806370a08231146107c9578063715018a614610820578063771a3a1d146108375780637b5f4f5b146108685780637dd6ab72146108ab578063819d95c1146109025780638da5cb5b1461092d57806395d89b4114610984578063a31f898214610a14578063a9059cbb14610a45578063b7a8807c14610aaa578063cf1c316a14610ad5578063d6d2229114610b18578063d73dd62314610bdf578063dd62ed3e14610c44578063e3175c4d14610cbb578063e5ee34a214610d12578063ec8ac4d814610d69578063edf4d84714610d9f578063f2fde38b14610df6578063f4dab3ff14610e39578063fe9fbb8014610e64575b61022333610ebf565b005b34801561023157600080fd5b5061023a610f79565b6040518082815260200191505060405180910390f35b34801561025c57600080fd5b50610265610f7f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a557808201518184015260208101905061028a565b50505050905090810190601f1680156102d25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ec57600080fd5b5061032b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061101d565b604051808215151515815260200191505060405180910390f35b34801561035157600080fd5b506103706004803603810190808035906020019092919050505061110f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103be57600080fd5b506103c761114d565b604051808215151515815260200191505060405180910390f35b3480156103ed57600080fd5b506103f6611159565b6040518082815260200191505060405180910390f35b34801561041857600080fd5b50610461600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611163565b005b34801561046f57600080fd5b506104ce600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115b0565b604051808215151515815260200191505060405180910390f35b3480156104f457600080fd5b506104fd611b1c565b6040518082815260200191505060405180910390f35b34801561051f57600080fd5b50610528611b22565b604051808260ff1660ff16815260200191505060405180910390f35b34801561055057600080fd5b50610559611b35565b6040518082815260200191505060405180910390f35b34801561057b57600080fd5b50610584611b3b565b6040518082815260200191505060405180910390f35b3480156105a657600080fd5b506105af611b41565b6040518082815260200191505060405180910390f35b3480156105d157600080fd5b50610606600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b47565b005b34801561061457600080fd5b50610649600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c45565b005b34801561065757600080fd5b50610660611d21565b6040518082815260200191505060405180910390f35b34801561068257600080fd5b5061068b611d27565b604051808215151515815260200191505060405180910390f35b3480156106b157600080fd5b506106ba611d36565b6040518082815260200191505060405180910390f35b3480156106dc57600080fd5b506106e5611d40565b005b3480156106f357600080fd5b50610732600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f0d565b604051808215151515815260200191505060405180910390f35b34801561075857600080fd5b5061077a600480360381019080803560ff16906020019092919050505061219f565b005b34801561078857600080fd5b506107c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612219565b005b3480156107d557600080fd5b5061080a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124cd565b6040518082815260200191505060405180910390f35b34801561082c57600080fd5b50610835612515565b005b34801561084357600080fd5b5061084c61261a565b604051808260ff1660ff16815260200191505060405180910390f35b34801561087457600080fd5b506108a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061262d565b005b3480156108b757600080fd5b506108c0612709565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090e57600080fd5b5061091761272f565b6040518082815260200191505060405180910390f35b34801561093957600080fd5b50610942612735565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561099057600080fd5b5061099961275b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109d95780820151818401526020810190506109be565b50505050905090810190601f168015610a065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a2057600080fd5b50610a296127f9565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a5157600080fd5b50610a90600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061280c565b604051808215151515815260200191505060405180910390f35b348015610ab657600080fd5b50610abf612bdd565b6040518082815260200191505060405180910390f35b348015610ae157600080fd5b50610b16600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612be3565b005b348015610b2457600080fd5b50610bdd600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050612dab565b005b348015610beb57600080fd5b50610c2a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dd5565b604051808215151515815260200191505060405180910390f35b348015610c5057600080fd5b50610ca5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fd1565b6040518082815260200191505060405180910390f35b348015610cc757600080fd5b50610cd0613058565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d1e57600080fd5b50610d2761307e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d9d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ebf565b005b348015610dab57600080fd5b50610db46130a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e0257600080fd5b50610e37600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130ca565b005b348015610e4557600080fd5b50610e4e613132565b6040518082815260200191505060405180910390f35b348015610e7057600080fd5b50610ea5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061313c565b604051808215151515815260200191505060405180910390f35b600080349150610ecf83836131aa565b610ed88261323e565b9050610eef8260185461332f90919063ffffffff16565b601881905550610eff838261334b565b610f07613359565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188484604051808381526020018281526020019250505060405180910390a3505050565b60115481565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60068181548110151561111e57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006015544211905090565b6000600154905090565b600061116e3361313c565b151561117957600080fd5b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483111515156111e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561122457600080fd5b61129783600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061130e82846133c490919063ffffffff16565b9050611361816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a361149d82600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115f057600080fd5b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561163d57600080fd5b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111515156116c857600080fd5b611719846000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117936064611785600560009054906101000a900460ff1660ff16876133dd90919063ffffffff16565b61341590919063ffffffff16565b91506117a882856133c490919063ffffffff16565b90506117fb816000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a361191582600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0884600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001925050509392505050565b600c5481565b600b60009054906101000a900460ff1681565b60145481565b60165481565b60185481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ba357600080fd5b611bac8161313c565b1515611bb757600080fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506008600081819054906101000a900460ff16809291906001900391906101000a81548160ff021916908360ff1602179055505050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ca157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cdd57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60155481565b60006014546018541015905090565b6000601a54905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d9c57600080fd5b611da461114d565b1515611daf57600080fd5b6000601a54111515611dc057600080fd5b611e35601a54600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1227f9baa9c17a74ae4200a9a412668d5892cbf9f1cc63bdcd07cc1be0634192601a546040518082815260200191505060405180910390a2565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808310151561201f576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120b3565b61203283826133c490919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121fb57600080fd5b80600560006101000a81548160ff021916908360ff16021790555050565b6122223361313c565b151561222d57600080fd5b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115151561229c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156122d857600080fd5b61234b81600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612400816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561257157600080fd5b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560009054906101000a900460ff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561268957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126c557600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127f15780601f106127c6576101008083540402835291602001916127f1565b820191906000526020600020905b8154815290600101906020018083116127d457829003601f168201915b505050505081565b600860009054906101000a900460ff1681565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561284c57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561289957600080fd5b6128ea846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506129646064612956600560009054906101000a900460ff1660ff16876133dd90919063ffffffff16565b61341590919063ffffffff16565b915061297982856133c490919063ffffffff16565b90506129cc816000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3612ae682600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019250505092915050565b60175481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c3f57600080fd5b60001515600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415612da8576001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060068054809190600101612d049190614120565b50806006612d2160016006805490506133c490919063ffffffff16565b815481101515612d2d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff160217905550505b50565b612db43361313c565b1515612dbf57600080fd5b612dcd86868686868661342b565b505050505050565b6000612e6682600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561312657600080fd5b61312f81613a50565b50565b6000601954905090565b600060011515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156131a057600190506131a5565b600090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156131e657600080fd5b600081141515156131f657600080fd5b60145461320e8260185461332f90919063ffffffff16565b1115151561321b57600080fd5b601754421015801561322f57506015544211155b151561323a57600080fd5b5050565b6000806000806000806000806000613257600154613b4c565b95506132628a613d3c565b9450600193505b831561331f57858511156132ed5785975061328f8860015461332f90919063ffffffff16565b92506132a4888861332f90919063ffffffff16565b96506132bb6016548961341590919063ffffffff16565b91506132d0828b6133c490919063ffffffff16565b90506132db83613b4c565b95506132e681613d3c565b945061331a565b613300858861332f90919063ffffffff16565b9650600093506133108686613d88565b61331985613da5565b5b613269565b8698505050505050505050919050565b6000818301905082811015151561334257fe5b80905092915050565b6133558282613dc3565b5050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156133c1573d6000803e3d6000fd5b50565b60008282111515156133d257fe5b818303905092915050565b6000808314156133f0576000905061340f565b818302905081838281151561340157fe5b0414151561340b57fe5b8090505b92915050565b6000818381151561342257fe5b04905092915050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415151561346b57600080fd5b6000151560048a6040518082805190602001908083835b6020831015156134a75780518252602082019150602081019050602083039250613482565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900460ff1615151415156134f657600080fd5b61350287878787613e75565b925061350e838a613f63565b91508773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151561354a57600080fd5b61355d858761332f90919063ffffffff16565b90506000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111515156135ac57600080fd5b61360f85613601886000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6133c490919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136a2866000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061375785600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160048a6040518082805190602001908083835b6020831015156137f557805182526020820191506020810190506020830392506137d0565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548160ff0219169083151502179055508673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f339e733e8f3d5b80a99579a1bd0d885dd3d96783439f354abebcd98f88b6462c896040518082815260200191505060405180910390a4600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f339e733e8f3d5b80a99579a1bd0d885dd3d96783439f354abebcd98f88b6462c886040518082815260200191505060405180910390a48673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040518082815260200191505060405180910390a3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613a8c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080602c54831015613c4857602a54831015613bee57602854831015613b9457613b78601e5461405b565b613b8d836028546133c490919063ffffffff16565b9050613be9565b602954831015613bc557613ba9601f5461405b565b613bbe836029546133c490919063ffffffff16565b9050613be8565b613bd060205461405b565b613be583602a546133c490919063ffffffff16565b90505b5b613c43565b602b54831015613c1f57613c0360215461405b565b613c1883602b546133c490919063ffffffff16565b9050613c42565b613c2a60225461405b565b613c3f83602c546133c490919063ffffffff16565b90505b5b613d33565b602f54831015613cdd57602d54831015613c8357613c6760235461405b565b613c7c83602d546133c490919063ffffffff16565b9050613cd8565b602e54831015613cb457613c9860245461405b565b613cad83602e546133c490919063ffffffff16565b9050613cd7565b613cbf60255461405b565b613cd483602f546133c490919063ffffffff16565b90505b5b613d32565b603054831015613d0e57613cf260265461405b565b613d07836030546133c490919063ffffffff16565b9050613d31565b613d1960275461405b565b613d2e836031546133c490919063ffffffff16565b90505b5b5b80915050919050565b6000613d81670de0b6b3a7640000613d73601254613d65601654876133dd90919063ffffffff16565b6133dd90919063ffffffff16565b61341590919063ffffffff16565b9050919050565b613d9b81836133c490919063ffffffff16565b6019819055505050565b613dba81601c546133c490919063ffffffff16565b601a8190555050565b613dd88160015461332f90919063ffffffff16565b600181905550613e2f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008085858585604051602001808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018281526020019450505050506040516020818303038152906040526040518082805190602001908083835b602083101515613f205780518252602082019150602081019050602083039250613efb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050613f5881614065565b915050949350505050565b60008060008060418551141515613f7d5760009350614052565b6020850151925060408501519150606085015160001a9050601b8160ff161015613fa857601b810190505b601b8160ff1614158015613fc05750601c8160ff1614155b15613fce5760009350614052565b600186828585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015614045573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b8060168190555050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156140ec57805182526020820191506020810190506020830392506140c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050919050565b81548183558181111561414757818360005260206000209182019101614146919061414c565b5b505050565b61416e91905b8082111561416a576000816000905550600101614152565b5090565b905600a165627a7a72305820f6c48654dbdf5d07f556060f1719a80abb203dac97e4fce2e43b511dd59fdf030029
Deployed Bytecode Sourcemap
25233:13697:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28762:21;28772:10;28762:9;:21::i;:::-;25233:13697;20544:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20544:30:0;;;;;;;;;;;;;;;;;;;;;;;20157:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20157:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20157:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6425:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6425:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18004:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18004:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29886:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29886:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3674:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3674:85:0;;;;;;;;;;;;;;;;;;;;;;;22639:630;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22639:630:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15038:768;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15038:768:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20262:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20262:29:0;;;;;;;;;;;;;;;;;;;;;;;20230:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20230:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25381:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25381:18:0;;;;;;;;;;;;;;;;;;;;;;;25439:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25439:30:0;;;;;;;;;;;;;;;;;;;;;;;25509:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25509:24:0;;;;;;;;;;;;;;;;;;;;;;;19537:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19537:182:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23679:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23679:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25406:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25406:26:0;;;;;;;;;;;;;;;;;;;;;;;29622:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29622:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37885:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37885:104:0;;;;;;;;;;;;;;;;;;;;;;;38454:473;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38454:473:0;;;;;;8344:447;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8344:447:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23438:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23438:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21845:443;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21845:443:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4458:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4458:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16891:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16891:114:0;;;;;;13898:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13898:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24004:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24004:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20458:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20458:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20499:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20499:38:0;;;;;;;;;;;;;;;;;;;;;;;16096:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16096:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20195:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20195:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20195:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18094:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18094:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14139:631;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14139:631:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25476:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25476:26:0;;;;;;;;;;;;;;;;;;;;;;;18739:289;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18739:289:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24638:309;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24638:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7569:307;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7569:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6944:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6944:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20417:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20417:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20373:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20373:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28940:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;25348:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25348:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17173:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17173:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38174:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38174:111:0;;;;;;;;;;;;;;;;;;;;;;;19189:188;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19189:188:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28940:558;29005:17;29144:14;29025:9;29005:29;;29043:45;29064:12;29078:9;29043:20;:45::i;:::-;29161:27;29178:9;29161:16;:27::i;:::-;29144:44;;29255:24;29269:9;29255;;:13;;:24;;;;:::i;:::-;29243:9;:36;;;;29356:38;29373:12;29387:6;29356:16;:38::i;:::-;29403:15;:13;:15::i;:::-;29458:12;29432:58;;29446:10;29432:58;;;29472:9;29483:6;29432:58;;;;;;;;;;;;;;;;;;;;;;;;28940:558;;;:::o;20544:30::-;;;;:::o;20157:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6425:192::-;6492:4;6537:6;6505:7;:19;6513:10;6505:19;;;;;;;;;;;;;;;:29;6525:8;6505:29;;;;;;;;;;;;;;;:38;;;;6576:8;6555:38;;6564:10;6555:38;;;6586:6;6555:38;;;;;;;;;;;;;;;;;;6607:4;6600:11;;6425:192;;;;:::o;18004:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29886:169::-;29928:4;30035:11;;30017:15;:29;30010:36;;29886:169;:::o;3674:85::-;3718:7;3741:12;;3734:19;;3674:85;:::o;22639:630::-;22982:17;18537:24;18550:10;18537:12;:24::i;:::-;18529:33;;;;;;;;22818:8;:29;22827:19;;;;;;;;;;;22818:29;;;;;;;;;;;;;;;;22808:6;:39;;22800:48;;;;;;;;22882:1;22867:17;;:3;:17;;;;22859:26;;;;;;;;22930:41;22964:6;22930:8;:29;22939:19;;;;;;;;;;;22930:29;;;;;;;;;;;;;;;;:33;;:41;;;;:::i;:::-;22898:8;:29;22907:19;;;;;;;;;;;22898:29;;;;;;;;;;;;;;;:73;;;;23002:16;23013:4;23002:6;:10;;:16;;;;:::i;:::-;22982:36;;23045:28;23063:9;23045:8;:13;23054:3;23045:13;;;;;;;;;;;;;;;;:17;;:28;;;;:::i;:::-;23029:8;:13;23038:3;23029:13;;;;;;;;;;;;;;;:44;;;;23119:3;23089:45;;23098:19;;;;;;;;;;;23089:45;;;23124:9;23089:45;;;;;;;;;;;;;;;;;;23168:30;23193:4;23168:8;:20;23177:10;;;;;;;;;;;23168:20;;;;;;;;;;;;;;;;:24;;:30;;;;:::i;:::-;23145:8;:20;23154:10;;;;;;;;;;;23145:20;;;;;;;;;;;;;;;:53;;;;23244:10;;;;;;;;;;;23214:47;;23223:19;;;;;;;;;;;23214:47;;;23256:4;23214:47;;;;;;;;;;;;;;;;;;22639:630;;;;:::o;15038:768::-;15172:4;15390:11;15443:18;15217:1;15202:17;;:3;:17;;;;15194:26;;;;;;;;15249:8;:15;15258:5;15249:15;;;;;;;;;;;;;;;;15239:6;:25;;15231:34;;;;;;;;15294:7;:14;15302:5;15294:14;;;;;;;;;;;;;;;:26;15309:10;15294:26;;;;;;;;;;;;;;;;15284:6;:36;;15276:45;;;;;;;;15352:27;15372:6;15352:8;:15;15361:5;15352:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;15334:8;:15;15343:5;15334:15;;;;;;;;;;;;;;;:45;;;;15404:28;15428:3;15404:19;15415:7;;;;;;;;;;;15404:19;;:6;:10;;:19;;;;:::i;:::-;:23;;:28;;;;:::i;:::-;15390:42;;15464:15;15475:3;15464:6;:10;;:15;;;;:::i;:::-;15443:36;;15508:29;15526:10;15508:8;:13;15517:3;15508:13;;;;;;;;;;;;;;;;:17;;:29;;;;:::i;:::-;15492:8;:13;15501:3;15492:13;;;;;;;;;;;;;;;:45;;;;15569:3;15553:32;;15562:5;15553:32;;;15574:10;15553:32;;;;;;;;;;;;;;;;;;15619:29;15644:3;15619:8;:20;15628:10;;;;;;;;;;;15619:20;;;;;;;;;;;;;;;;:24;;:29;;;;:::i;:::-;15596:8;:20;15605:10;;;;;;;;;;;15596:20;;;;;;;;;;;;;;;:52;;;;15688:38;15719:6;15688:7;:14;15696:5;15688:14;;;;;;;;;;;;;;;:26;15703:10;15688:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;15659:7;:14;15667:5;15659:14;;;;;;;;;;;;;;;:26;15674:10;15659:26;;;;;;;;;;;;;;;:67;;;;15758:10;;;;;;;;;;;15742:32;;15751:5;15742:32;;;15770:3;15742:32;;;;;;;;;;;;;;;;;;15794:4;15787:11;;15038:768;;;;;;;:::o;20262:29::-;;;;:::o;20230:25::-;;;;;;;;;;;;;:::o;25381:18::-;;;;:::o;25439:30::-;;;;:::o;25509:24::-;;;;:::o;19537:182::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;19617:22;19630:8;19617:12;:22::i;:::-;19609:31;;;;;;;;19680:5;19652:15;:25;19668:8;19652:25;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;19696:13;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19537:182;:::o;23679:149::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;23782:1;23759:25;;:11;:25;;;;23751:34;;;;;;;;23809:11;23796:10;;:24;;;;;;;;;;;;;;;;;;23679:149;:::o;25406:26::-;;;;:::o;29622:89::-;29665:4;29700:3;;29687:9;;:16;;29680:23;;29622:89;:::o;37885:104::-;37939:7;37966:15;;37959:22;;37885:104;:::o;38454:473::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;38566:11;:9;:11::i;:::-;38558:20;;;;;;;;38682:1;38664:15;;:19;38656:28;;;;;;;;38795:53;38832:15;;38795:8;:32;38804:22;;;;;;;;;;;38795:32;;;;;;;;;;;;;;;;:36;;:53;;;;:::i;:::-;38760:8;:32;38769:22;;;;;;;;;;;38760:32;;;;;;;;;;;;;;;:88;;;;38878:22;;;;;;;;;;;38865:53;;;38902:15;;38865:53;;;;;;;;;;;;;;;;;;38454:473::o;8344:447::-;8455:4;8471:16;8490:7;:19;8498:10;8490:19;;;;;;;;;;;;;;;:29;8510:8;8490:29;;;;;;;;;;;;;;;;8471:48;;8550:8;8530:16;:28;;8526:169;;;8601:1;8569:7;:19;8577:10;8569:19;;;;;;;;;;;;;;;:29;8589:8;8569:29;;;;;;;;;;;;;;;:33;;;;8526:169;;;8657:30;8670:16;8657:8;:12;;:30;;;;:::i;:::-;8625:7;:19;8633:10;8625:19;;;;;;;;;;;;;;;:29;8645:8;8625:29;;;;;;;;;;;;;;;:62;;;;8526:169;8727:8;8706:61;;8715:10;8706:61;;;8737:7;:19;8745:10;8737:19;;;;;;;;;;;;;;;:29;8757:8;8737:29;;;;;;;;;;;;;;;;8706:61;;;;;;;;;;;;;;;;;;8781:4;8774:11;;8344:447;;;;;:::o;23438:90::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;23512:8;23502:7;;:18;;;;;;;;;;;;;;;;;;23438:90;:::o;21845:443::-;18537:24;18550:10;18537:12;:24::i;:::-;18529:33;;;;;;;;22005:8;:32;22014:22;;;;;;;;;;;22005:32;;;;;;;;;;;;;;;;21995:6;:42;;21987:51;;;;;;;;22072:1;22057:17;;:3;:17;;;;22049:26;;;;;;;;22123:44;22160:6;22123:8;:32;22132:22;;;;;;;;;;;22123:32;;;;;;;;;;;;;;;;:36;;:44;;;;:::i;:::-;22088:8;:32;22097:22;;;;;;;;;;;22088:32;;;;;;;;;;;;;;;:79;;;;22194:25;22212:6;22194:8;:13;22203:3;22194:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;22178:8;:13;22187:3;22178:13;;;;;;;;;;;;;;;:41;;;;22268:3;22235:45;;22244:22;;;;;;;;;;;22235:45;;;22273:6;22235:45;;;;;;;;;;;;;;;;;;21845:443;;:::o;4458:101::-;4514:7;4537:8;:16;4546:6;4537:16;;;;;;;;;;;;;;;;4530:23;;4458:101;;;:::o;16891:114::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;16968:5;;;;;;;;;;;16949:25;;;;;;;;;;;;16997:1;16981:5;;:18;;;;;;;;;;;;;;;;;;16891:114::o;13898:20::-;;;;;;;;;;;;;:::o;24004:167::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;24116:1;24093:25;;:11;:25;;;;24085:34;;;;;;;;24152:11;24130:19;;:33;;;;;;;;;;;;;;;;;;24004:167;:::o;20458:34::-;;;;;;;;;;;;;:::o;20499:38::-;;;;:::o;16096:20::-;;;;;;;;;;;;;:::o;20195:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18094:26::-;;;;;;;;;;;;;:::o;14139:631::-;14245:4;14422:11;14475:18;14290:1;14275:17;;:3;:17;;;;14267:26;;;;;;;;14322:8;:20;14331:10;14322:20;;;;;;;;;;;;;;;;14312:6;:30;;14304:39;;;;;;;;14379:32;14404:6;14379:8;:20;14388:10;14379:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;14356:8;:20;14365:10;14356:20;;;;;;;;;;;;;;;:55;;;;14436:28;14460:3;14436:19;14447:7;;;;;;;;;;;14436:19;;:6;:10;;:19;;;;:::i;:::-;:23;;:28;;;;:::i;:::-;14422:42;;14496:15;14507:3;14496:6;:10;;:15;;;;:::i;:::-;14475:36;;14540:29;14558:10;14540:8;:13;14549:3;14540:13;;;;;;;;;;;;;;;;:17;;:29;;;;:::i;:::-;14524:8;:13;14533:3;14524:13;;;;;;;;;;;;;;;:45;;;;14606:3;14585:37;;14594:10;14585:37;;;14611:10;14585:37;;;;;;;;;;;;;;;;;;14656:29;14681:3;14656:8;:20;14665:10;;;;;;;;;;;14656:20;;;;;;;;;;;;;;;;:24;;:29;;;;:::i;:::-;14633:8;:20;14642:10;;;;;;;;;;;14633:20;;;;;;;;;;;;;;;:52;;;;14722:10;;;;;;;;;;;14701:37;;14710:10;14701:37;;;14734:3;14701:37;;;;;;;;;;;;;;;;;;14758:4;14751:11;;14139:631;;;;;;:::o;25476:26::-;;;;:::o;18739:289::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;18841:5;18812:34;;:15;:25;18828:8;18812:25;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;18808:213;;;18888:4;18860:15;:25;18876:8;18860:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;18904:10;:19;;;;;;;;;;;:::i;:::-;;18974:8;18935:10;18946:24;18968:1;18946:10;:17;;;;:21;;:24;;;;:::i;:::-;18935:36;;;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;18994:13;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18808:213;18739:289;:::o;24638:309::-;18537:24;18550:10;18537:12;:24::i;:::-;18529:33;;;;;;;;24875:64;24894:10;24906:5;24913:3;24918:6;24926:4;24932:6;24875:18;:64::i;:::-;24638:309;;;;;;:::o;7569:307::-;7675:4;7732:46;7766:11;7732:7;:19;7740:10;7732:19;;;;;;;;;;;;;;;:29;7752:8;7732:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;7691:7;:19;7699:10;7691:19;;;;;;;;;;;;;;;:29;7711:8;7691:29;;;;;;;;;;;;;;;:88;;;;7812:8;7791:61;;7800:10;7791:61;;;7822:7;:19;7830:10;7822:19;;;;;;;;;;;;;;;:29;7842:8;7822:29;;;;;;;;;;;;;;;;7791:61;;;;;;;;;;;;;;;;;;7866:4;7859:11;;7569:307;;;;:::o;6944:162::-;7049:7;7075;:15;7083:6;7075:15;;;;;;;;;;;;;;;:25;7091:8;7075:25;;;;;;;;;;;;;;;;7068:32;;6944:162;;;;:::o;20417:34::-;;;;;;;;;;;;;:::o;20373:37::-;;;;;;;;;;;;;:::o;25348:26::-;;;;;;;;;;;;;:::o;17173:105::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;17243:29;17262:9;17243:18;:29::i;:::-;17173:105;:::o;38174:111::-;38228:7;38255:22;;38248:29;;38174:111;:::o;19189:188::-;19254:4;19304;19275:33;;:15;:25;19291:8;19275:25;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;19271:74;;;19329:4;19322:11;;;;19271:74;19364:5;19357:12;;19189:188;;;;:::o;36011:374::-;36140:1;36116:26;;:12;:26;;;;36108:35;;;;;;;;36176:1;36162:10;:15;;36154:24;;;;;;;;36226:3;;36197:25;36211:10;36197:9;;:13;;:25;;;;:::i;:::-;:32;;36189:41;;;;;;;;36331:11;;36312:15;:30;;:64;;;;;36365:11;;36346:15;:30;;36312:64;36304:73;;;;;;;;36011:374;;:::o;30447:1937::-;30511:7;30565:26;30633;30832:29;30955:17;31077:13;31342:16;31660:24;31745:20;30864:33;30884:12;;30864:19;:33::i;:::-;30832:65;;30975:27;30991:10;30975:15;:27::i;:::-;30955:47;;31093:4;31077:20;;31108:1170;31115:8;31108:1170;;;31156:21;31144:9;:33;31140:1127;;;31302:21;31281:42;;31361:36;31378:18;31361:12;;:16;;:36;;;;:::i;:::-;31342:55;;31506:42;31529:18;31506;:22;;:42;;;;:::i;:::-;31485:63;;31687:39;31710:15;;31687:18;:22;;:39;;;;:::i;:::-;31660:66;;31768:32;31783:16;31768:10;:14;;:32;;;;:::i;:::-;31745:55;;31904:29;31924:8;31904:19;:29::i;:::-;31880:53;;31964:29;31980:12;31964:15;:29::i;:::-;31952:41;;31140:1127;;;32055:33;32078:9;32055:18;:22;;:33;;;;:::i;:::-;32034:54;;32118:5;32107:16;;32142:60;32169:21;32192:9;32142:26;:60::i;:::-;32221:30;32241:9;32221:19;:30::i;:::-;31140:1127;31108:1170;;;32358:18;32351:25;;30447:1937;;;;;;;;;;;:::o;3151:132::-;3211:9;3238:2;3233;:7;3229:11;;3259:2;3254:1;:7;;3247:15;;;;;;3276:1;3269:8;;3151:132;;;;:::o;36651:140::-;36741:42;36756:12;36770;36741:14;:42::i;:::-;36651:140;;:::o;32875:84::-;32920:11;;;;;;;;;;;:20;;:31;32941:9;32920:31;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32920:31:0;32875:84::o;2965:119::-;3025:7;3054:2;3048;:8;;3041:16;;;;;;3076:2;3071;:7;3064:14;;2965:119;;;;:::o;2082:391::-;2142:9;2378:1;2372:2;:7;2368:38;;;2397:1;2390:8;;;;2368:38;2423:2;2418;:7;2414:11;;2449:2;2443;2439:1;:6;;;;;;;;:12;2432:20;;;;;;2466:1;2459:8;;2082:391;;;;;:::o;2560:288::-;2620:7;2840:2;2835;:7;;;;;;;;2828:14;;2560:288;;;;:::o;9756:1316::-;10149:16;10296:12;10385:13;10030:1;10015:17;;:3;:17;;;;10007:26;;;;;;;;10078:5;10052:31;;:10;10063;10052:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;10052:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;10044:40;;;;;;;;10168:52;10194:3;10199:6;10207:4;10213:6;10168:25;:52::i;:::-;10149:71;;10311:30;10320:8;10330:10;10311:8;:30::i;:::-;10296:45;;10368:5;10360:13;;:4;:13;;;10352:22;;;;;;;;10401:16;10412:4;10401:6;:10;;:16;;;;:::i;:::-;10385:32;;10445:8;:14;10454:4;10445:14;;;;;;;;;;;;;;;;10436:5;:23;;10428:32;;;;;;;;10517:36;10548:4;10517:26;10536:6;10517:8;:14;10526:4;10517:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;:30;;:36;;;;:::i;:::-;10500:8;:14;10509:4;10500:14;;;;;;;;;;;;;;;:53;;;;10580:25;10598:6;10580:8;:13;10589:3;10580:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;10564:8;:13;10573:3;10564:13;;;;;;;;;;;;;;;:41;;;;10639:30;10664:4;10639:8;:20;10648:10;;;;;;;;;;;10639:20;;;;;;;;;;;;;;;;:24;;:30;;;;:::i;:::-;10616:8;:20;10625:10;;;;;;;;;;;10616:20;;;;;;;;;;;;;;;:53;;;;10748:4;10723:10;10734;10723:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;10723:22:0;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;10849:3;10813:48;;10843:4;10813:48;;10831:10;10813:48;;;10854:6;10813:48;;;;;;;;;;;;;;;;;;10913:10;;;;;;;;;;;10877:53;;10907:4;10877:53;;10895:10;10877:53;;;10925:4;10877:53;;;;;;;;;;;;;;;;;;11004:3;10989:27;;10998:4;10989:27;;;11009:6;10989:27;;;;;;;;;;;;;;;;;;11047:10;;;;;;;;;;;11032:32;;11041:4;11032:32;;;11059:4;11032:32;;;;;;;;;;;;;;;;;;9756:1316;;;;;;;;;:::o;17419:175::-;17511:1;17490:23;;:9;:23;;;;17482:32;;;;;;;;17554:9;17526:38;;17547:5;;;;;;;;;;;17526:38;;;;;;;;;;;;17579:9;17571:5;;:17;;;;;;;;;;;;;;;;;;17419:175;:::o;33253:2131::-;33321:7;33437:17;33483:11;;33469;:25;33465:1883;;;33529:11;;33515;:25;33511:896;;;33579:11;;33565;:25;33561:482;;;33615:30;33635:9;;33615:19;:30::i;:::-;33680:28;33696:11;33680;;:15;;:28;;;;:::i;:::-;33668:40;;33561:482;;;33752:11;;33738;:25;33734:309;;;33788:30;33808:9;;33788:19;:30::i;:::-;33853:28;33869:11;33853;;:15;;:28;;;;:::i;:::-;33841:40;;33734:309;;;33930:30;33950:9;;33930:19;:30::i;:::-;33995:28;34011:11;33995;;:15;;:28;;;;:::i;:::-;33983:40;;33734:309;33561:482;33511:896;;;34101:11;;34087;:25;34083:309;;;34137:30;34157:9;;34137:19;:30::i;:::-;34202:28;34218:11;34202;;:15;;:28;;;;:::i;:::-;34190:40;;34083:309;;;34279:30;34299:9;;34279:19;:30::i;:::-;34344:28;34360:11;34344;;:15;;:28;;;;:::i;:::-;34332:40;;34083:309;33511:896;33465:1883;;;34457:11;;34443;:25;34439:898;;;34507:11;;34493;:25;34489:482;;;34543:30;34563:9;;34543:19;:30::i;:::-;34608:28;34624:11;34608;;:15;;:28;;;;:::i;:::-;34596:40;;34489:482;;;34680:11;;34666;:25;34662:309;;;34716:30;34736:9;;34716:19;:30::i;:::-;34781:28;34797:11;34781;;:15;;:28;;;;:::i;:::-;34769:40;;34662:309;;;34858:30;34878:9;;34858:19;:30::i;:::-;34923:28;34939:11;34923;;:15;;:28;;;;:::i;:::-;34911:40;;34662:309;34489:482;34439:898;;;35029:11;;35015;:25;35011:311;;;35065:30;35085:9;;35065:19;:30::i;:::-;35130:28;35146:11;35130;;:15;;:28;;;;:::i;:::-;35118:40;;35011:311;;;35207:31;35227:10;;35207:19;:31::i;:::-;35273:29;35290:11;35273:12;;:16;;:29;;;;:::i;:::-;35261:41;;35011:311;34439:898;33465:1883;35367:9;35360:16;;33253:2131;;;;:::o;35641:165::-;35709:7;35736:62;35790:7;35736:49;35772:12;;35736:31;35751:15;;35736:10;:14;;:31;;;;:::i;:::-;:35;;:49;;;;:::i;:::-;:53;;:62;;;;:::i;:::-;35729:69;;35641:165;;;:::o;37051:177::-;37183:37;37210:9;37183:22;:26;;:37;;;;:::i;:::-;37158:22;:62;;;;37051:177;;:::o;37400:124::-;37486:30;37506:9;37486:15;;:19;;:30;;;;:::i;:::-;37468:15;:48;;;;37400:124;:::o;32566:217::-;32669:30;32686:12;32669;;:16;;:30;;;;:::i;:::-;32654:12;:45;;;;32735:40;32762:12;32735:8;:22;32744:12;32735:22;;;;;;;;;;;;;;;;:26;;:40;;;;:::i;:::-;32710:8;:22;32719:12;32710:22;;;;;;;;;;;;;;;:65;;;;32566:217;;:::o;11561:416::-;11739:7;11838:12;11880:3;11885:6;11893:4;11898:6;11863:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11863:42:0;;;11853:53;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;11853:53:0;;;;;;;;;;;;;;;;11838:68;;11956:13;11964:4;11956:7;:13::i;:::-;11949:20;;11561:416;;;;;;;:::o;12721:829::-;12789:7;12809:9;12829;12849:7;12926:2;12911:4;:11;:17;;12907:69;;;12961:1;12945:19;;;;12907:69;13090:2;13084:4;13080:13;13074:20;13069:25;;13129:2;13123:4;13119:13;13113:20;13108:25;;13176:2;13170:4;13166:13;13160:20;13157:1;13152:29;13147:34;;13294:2;13290:1;:6;;;13286:46;;;13318:2;13313:7;;;;13286:46;13417:2;13412:1;:7;;;;:18;;;;;13428:2;13423:1;:7;;;;13412:18;13408:135;;;13463:1;13447:19;;;;13408:135;13506:25;13516:5;13523:1;13526;13529;13506:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13506:25:0;;;;;;;;13499:32;;12721:829;;;;;;;;:::o;37645:95::-;37727:5;37709:15;:23;;;;37645:95;:::o;12228:160::-;12283:7;12373:5;12320:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12320:59:0;;;12310:70;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;12310:70:0;;;;;;;;;;;;;;;;12303:77;;12228:160;;;:::o;25233:13697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://f6c48654dbdf5d07f556060f1719a80abb203dac97e4fce2e43b511dd59fdf03
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.