Overview
Max Total Supply
7,635,614,243.7293 WRK
Holders
1,092 (0.00%)
Transfers
-
0
Market
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 4 Decimals)
Loading...
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
Contract ABI
API[{"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.
Add Token to MetaMask (Web3)