ETH Price: $2,489.99 (-1.11%)

Token

ArtID Security (ARTIDS)
 

Overview

Max Total Supply

1,257,472.368223275721381839 ARTIDS

Holders

39

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
50,000 ARTIDS

Value
$0.00
0x3e813ebf3fa38b783a107662930264b4a018b120
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

ArtID's mission is to provide certainties within the discovery and experience of contemporary art and empowering a new generation of artists and collectors.

# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x4aab76C4...128E2Af6f
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
StokrToken

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-01-30
*/

pragma solidity 0.5.12;


/// @title SafeMath
/// @dev Math operations with safety checks that throw on error
library SafeMath {

    /// @dev Add two integers
    function add(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;

        assert(c >= a);

        return c;
    }

    /// @dev Subtract two integers
    function sub(uint a, uint b) internal pure returns (uint) {
        assert(b <= a);

        return a - b;
    }

    /// @dev Multiply tow integers
    function mul(uint a, uint b) internal pure returns (uint) {
        if (a == 0) {
            return 0;
        }

        uint c = a * b;

        assert(c / a == b);

        return c;
    }

    /// @dev Floor divide two integers
    function div(uint a, uint b) internal pure returns (uint) {
        return a / b;
    }

}

// File: contracts/ownership/Ownable.sol

pragma solidity 0.5.12;

/// @title Ownable
/// @dev Provide a simple access control with a single authority: the owner
contract Ownable {

    // Ethereum address of current owner
    address public owner;

    // Ethereum address of the next owner
    // (has to claim ownership first to become effective owner)
    address public newOwner;

    // @dev Log event on ownership transferred
    // @param previousOwner Ethereum address of previous owner
    // @param newOwner Ethereum address of new owner
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /// @dev Forbid call by anyone but owner
    modifier onlyOwner() {
        require(msg.sender == owner, "Restricted to owner");
        _;
    }

    /// @dev Deployer account becomes initial owner
    constructor() public {
        owner = msg.sender;
    }

    /// @dev  Transfer ownership to a new Ethereum account (safe method)
    ///       Note: the new owner has to claim his ownership to become effective owner.
    /// @param _newOwner  Ethereum address to transfer ownership to
    function transferOwnership(address _newOwner) public onlyOwner {
        require(_newOwner != address(0x0), "New owner is zero");

        newOwner = _newOwner;
    }

    /// @dev  Transfer ownership to a new Ethereum account (unsafe method)
    ///       Note: It's strongly recommended to use the safe variant via transferOwnership
    ///             and claimOwnership, to prevent accidental transfers to a wrong address.
    /// @param _newOwner  Ethereum address to transfer ownership to
    function transferOwnershipUnsafe(address _newOwner) public onlyOwner {
        require(_newOwner != address(0x0), "New owner is zero");

        _transferOwnership(_newOwner);
    }

    /// @dev  Become effective owner (if dedicated so by previous owner)
    function claimOwnership() public {
        require(msg.sender == newOwner, "Restricted to new owner");

        _transferOwnership(msg.sender);
    }

    /// @dev  Transfer ownership (internal method)
    /// @param _newOwner  Ethereum address to transfer ownership to
    function _transferOwnership(address _newOwner) private {
        if (_newOwner != owner) {
            emit OwnershipTransferred(owner, _newOwner);

            owner = _newOwner;
        }
        newOwner = address(0x0);
    }

}

// File: contracts/whitelist/Whitelist.sol

pragma solidity 0.5.12;



/// @title Whitelist
/// @author STOKR
contract Whitelist is Ownable {

    // Set of admins
    mapping(address => bool) public admins;

    // Set of Whitelisted addresses
    mapping(address => bool) public isWhitelisted;

    /// @dev Log entry on admin added to set
    /// @param admin An Ethereum address
    event AdminAdded(address indexed admin);

    /// @dev Log entry on admin removed from set
    /// @param admin An Ethereum address
    event AdminRemoved(address indexed admin);

    /// @dev Log entry on investor added set
    /// @param admin An Ethereum address
    /// @param investor An Ethereum address
    event InvestorAdded(address indexed admin, address indexed investor);

    /// @dev Log entry on investor removed from set
    /// @param admin An Ethereum address
    /// @param investor An Ethereum address
    event InvestorRemoved(address indexed admin, address indexed investor);

    /// @dev Only admin
    modifier onlyAdmin() {
        require(admins[msg.sender], "Restricted to whitelist admin");
        _;
    }

    /// @dev Add admin to set
    /// @param _admin An Ethereum address
    function addAdmin(address _admin) public onlyOwner {
        require(_admin != address(0x0), "Whitelist admin is zero");

        if (!admins[_admin]) {
            admins[_admin] = true;

            emit AdminAdded(_admin);
        }
    }

    /// @dev Remove admin from set
    /// @param _admin An Ethereum address
    function removeAdmin(address _admin) public onlyOwner {
        require(_admin != address(0x0), "Whitelist admin is zero");  // Necessary?

        if (admins[_admin]) {
            admins[_admin] = false;

            emit AdminRemoved(_admin);
        }
    }

    /// @dev Add investor to set of whitelisted addresses
    /// @param _investors A list where each entry is an Ethereum address
    function addToWhitelist(address[] calldata _investors) external onlyAdmin {
        for (uint256 i = 0; i < _investors.length; i++) {
            if (!isWhitelisted[_investors[i]]) {
                isWhitelisted[_investors[i]] = true;

                emit InvestorAdded(msg.sender, _investors[i]);
            }
        }
    }

    /// @dev Remove investor from set of whitelisted addresses
    /// @param _investors A list where each entry is an Ethereum address
    function removeFromWhitelist(address[] calldata _investors) external onlyAdmin {
        for (uint256 i = 0; i < _investors.length; i++) {
            if (isWhitelisted[_investors[i]]) {
                isWhitelisted[_investors[i]] = false;

                emit InvestorRemoved(msg.sender, _investors[i]);
            }
        }
    }

}

// File: contracts/whitelist/Whitelisted.sol

pragma solidity 0.5.12;




/// @title Whitelisted
/// @author STOKR
contract Whitelisted is Ownable {

    Whitelist public whitelist;

    /// @dev  Log entry on change of whitelist contract instance
    /// @param previous  Ethereum address of previous whitelist
    /// @param current   Ethereum address of new whitelist
    event WhitelistChange(address indexed previous, address indexed current);

    /// @dev Ensure only whitelisted addresses can call
    modifier onlyWhitelisted(address _address) {
        require(whitelist.isWhitelisted(_address), "Address is not whitelisted");
        _;
    }

    /// @dev Constructor
    /// @param _whitelist address of whitelist contract
    constructor(Whitelist _whitelist) public {
        setWhitelist(_whitelist);
    }

    /// @dev Set the address of whitelist
    /// @param _newWhitelist An Ethereum address
    function setWhitelist(Whitelist _newWhitelist) public onlyOwner {
        require(address(_newWhitelist) != address(0x0), "Whitelist address is zero");

        if (address(_newWhitelist) != address(whitelist)) {
            emit WhitelistChange(address(whitelist), address(_newWhitelist));

            whitelist = Whitelist(_newWhitelist);
        }
    }

}

// File: contracts/token/ERC20.sol

pragma solidity 0.5.12;


/// @title ERC20 interface
/// @dev see https://github.com/ethereum/EIPs/issues/20
interface ERC20 {

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);

    function totalSupply() external view returns (uint);
    function balanceOf(address _owner) external view returns (uint);
    function allowance(address _owner, address _spender) external view returns (uint);
    function approve(address _spender, uint _value) external returns (bool);
    function transfer(address _to, uint _value) external returns (bool);
    function transferFrom(address _from, address _to, uint _value) external returns (bool);

}

// File: contracts/token/ProfitSharing.sol

pragma solidity 0.5.12;




/// @title ProfitSharing
/// @author STOKR
contract ProfitSharing is Ownable {

    using SafeMath for uint;


    // An InvestorAccount object keeps track of the investor's
    // - balance: amount of tokens he/she holds (always up-to-date)
    // - profitShare: amount of wei this token owed him/her at the last update
    // - lastTotalProfits: determines when his/her profitShare was updated
    // Note, this construction requires:
    // - totalProfits to never decrease
    // - totalSupply to be fixed
    // - profitShare of all involved parties to get updated prior to any token transfer
    // - lastTotalProfits to be set to current totalProfits upon profitShare update
    struct InvestorAccount {
        uint balance;           // token balance
        uint lastTotalProfits;  // totalProfits [wei] at the time of last profit share update
        uint profitShare;       // profit share [wei] of last update
    }


    // Investor account database
    mapping(address => InvestorAccount) public accounts;

    // Authority who is allowed to deposit profits [wei] on this
    address public profitDepositor;

    // Authority who is allowed to distribute profit shares [wei] to investors
    // (so, that they don't need to withdraw it by themselves)
    address public profitDistributor;

    // Amount of total profits [wei] stored to this token
    // In contrast to the wei balance (which may be reduced due to profit share withdrawal)
    // this value will never decrease
    uint public totalProfits;

    // As long as the total supply isn't fixed, i.e. new tokens can appear out of thin air,
    // the investors' profit shares aren't determined
    bool public totalSupplyIsFixed;

    // Total amount of tokens
    uint internal totalSupply_;


    /// @dev  Log entry on change of profit deposit authority
    /// @param previous  Ethereum address of previous profit depositor
    /// @param current   Ethereum address of new profit depositor
    event ProfitDepositorChange(
        address indexed previous,
        address indexed current
    );

    /// @dev  Log entry on change of profit distribution authority
    /// @param previous  Ethereum address of previous profit distributor
    /// @param current   Ethereum address of new profit distributor
    event ProfitDistributorChange(
        address indexed previous,
        address indexed current
    );

    /// @dev Log entry on profit deposit
    /// @param depositor Profit depositor's address
    /// @param amount Deposited profits in wei
    event ProfitDeposit(
        address indexed depositor,
        uint amount
    );

    /// @dev Log entry on profit share update
    /// @param investor Investor's address
    /// @param amount New wei amount the token owes the investor
    event ProfitShareUpdate(
        address indexed investor,
        uint amount
    );

    /// @dev Log entry on profit withdrawal
    /// @param investor Investor's address
    /// @param amount Wei amount the investor withdrew from this token
    event ProfitShareWithdrawal(
        address indexed investor,
        address indexed beneficiary,
        uint amount
    );


    /// @dev Restrict operation to profit deposit authority only
    modifier onlyProfitDepositor() {
        require(msg.sender == profitDepositor, "Restricted to profit depositor");
        _;
    }

    /// @dev Restrict operation to profit distribution authority only
    modifier onlyProfitDistributor() {
        require(msg.sender == profitDistributor, "Restricted to profit distributor");
        _;
    }

    /// @dev Restrict operation to when total supply doesn't change anymore
    modifier onlyWhenTotalSupplyIsFixed() {
        require(totalSupplyIsFixed, "Total supply may change");
        _;
    }

    /// @dev Constructor
    /// @param _profitDepositor Profit deposit authority
    constructor(address _profitDepositor, address _profitDistributor) public {
        setProfitDepositor(_profitDepositor);
        setProfitDistributor(_profitDistributor);
    }

    /// @dev Profit deposit if possible via fallback function
    function () external payable {
        require(msg.data.length == 0, "Fallback call with data");

        depositProfit();
    }

    /// @dev Change profit depositor
    /// @param _newProfitDepositor An Ethereum address
    function setProfitDepositor(address _newProfitDepositor) public onlyOwner {
        require(_newProfitDepositor != address(0x0), "New profit depositor is zero");

        if (_newProfitDepositor != profitDepositor) {
            emit ProfitDepositorChange(profitDepositor, _newProfitDepositor);

            profitDepositor = _newProfitDepositor;
        }
    }

    /// @dev Change profit distributor
    /// @param _newProfitDistributor An Ethereum address
    function setProfitDistributor(address _newProfitDistributor) public onlyOwner {
        require(_newProfitDistributor != address(0x0), "New profit distributor is zero");

        if (_newProfitDistributor != profitDistributor) {
            emit ProfitDistributorChange(profitDistributor, _newProfitDistributor);

            profitDistributor = _newProfitDistributor;
        }
    }

    /// @dev Deposit profit
    function depositProfit() public payable onlyProfitDepositor onlyWhenTotalSupplyIsFixed {
        require(totalSupply_ > 0, "Total supply is zero");

        totalProfits = totalProfits.add(msg.value);

        emit ProfitDeposit(msg.sender, msg.value);
    }

    /// @dev Profit share owing
    /// @param _investor An Ethereum address
    /// @return A positive number
    function profitShareOwing(address _investor) public view returns (uint) {
        if (!totalSupplyIsFixed || totalSupply_ == 0) {
            return 0;
        }

        InvestorAccount memory account = accounts[_investor];

        return totalProfits.sub(account.lastTotalProfits)
                           .mul(account.balance)
                           .div(totalSupply_)
                           .add(account.profitShare);
    }

    /// @dev Update profit share
    /// @param _investor An Ethereum address
    function updateProfitShare(address _investor) public onlyWhenTotalSupplyIsFixed {
        uint newProfitShare = profitShareOwing(_investor);

        accounts[_investor].lastTotalProfits = totalProfits;
        accounts[_investor].profitShare = newProfitShare;

        emit ProfitShareUpdate(_investor, newProfitShare);
    }

    /// @dev Withdraw profit share
    function withdrawProfitShare() public {
        _withdrawProfitShare(msg.sender, msg.sender);
    }

    function withdrawProfitShareTo(address payable _beneficiary) public {
        _withdrawProfitShare(msg.sender, _beneficiary);
    }

    /// @dev Withdraw profit share
    function withdrawProfitShares(address payable[] calldata _investors)
        external
        onlyProfitDistributor
    {
        for (uint i = 0; i < _investors.length; ++i) {
            _withdrawProfitShare(_investors[i], _investors[i]);
        }
    }

    /// @dev Withdraw profit share
    function _withdrawProfitShare(address _investor, address payable _beneficiary) internal {
        updateProfitShare(_investor);

        uint withdrawnProfitShare = accounts[_investor].profitShare;

        accounts[_investor].profitShare = 0;
        _beneficiary.transfer(withdrawnProfitShare);

        emit ProfitShareWithdrawal(_investor, _beneficiary, withdrawnProfitShare);
    }

}

// File: contracts/token/MintableToken.sol

pragma solidity 0.5.12;





/// @title MintableToken
/// @author STOKR
/// @dev Extension of the ERC20 compliant ProfitSharing Token
///      that allows the creation of tokens via minting for a
///      limited time period (until minting gets finished).
contract MintableToken is ERC20, ProfitSharing, Whitelisted {

    address public minter;
    uint public numberOfInvestors = 0;

    /// @dev Log entry on mint
    /// @param to Beneficiary who received the newly minted tokens
    /// @param amount The amount of minted token units
    event Minted(address indexed to, uint amount);

    /// @dev Log entry on mint finished
    event MintFinished();

    /// @dev Restrict an operation to be callable only by the minter
    modifier onlyMinter() {
        require(msg.sender == minter, "Restricted to minter");
        _;
    }

    /// @dev Restrict an operation to be executable only while minting was not finished
    modifier canMint() {
        require(!totalSupplyIsFixed, "Total supply has been fixed");
        _;
    }

    /// @dev Set minter authority
    /// @param _minter Ethereum address of minter authority
    function setMinter(address _minter) public onlyOwner {
        require(minter == address(0x0), "Minter has already been set");
        require(_minter != address(0x0), "Minter is zero");

        minter = _minter;
    }

    /// @dev Mint tokens, i.e. create tokens out of thin air
    /// @param _to Beneficiary who will receive the newly minted tokens
    /// @param _amount The amount of minted token units
    function mint(address _to, uint _amount) public onlyMinter canMint onlyWhitelisted(_to) {
        if (accounts[_to].balance == 0) {
            numberOfInvestors++;
        }

        totalSupply_ = totalSupply_.add(_amount);
        accounts[_to].balance = accounts[_to].balance.add(_amount);

        emit Minted(_to, _amount);
        emit Transfer(address(0x0), _to, _amount);
    }

    /// @dev Finish minting -- this should be irreversible
    function finishMinting() public onlyMinter canMint {
        totalSupplyIsFixed = true;

        emit MintFinished();
    }

}

// File: contracts/crowdsale/RateSourceInterface.sol

pragma solidity 0.5.12;


/// @title RateSource
/// @author STOKR
interface RateSource {

    /// @dev The current price of an Ether in EUR cents
    /// @return Current ether rate
    function etherRate() external view returns (uint);

}

// File: contracts/crowdsale/MintingCrowdsale.sol

pragma solidity 0.5.12;






/// @title MintingCrowdsale
/// @author STOKR
contract MintingCrowdsale is Ownable {
    using SafeMath for uint;

    // Maximum Time of offering period after extension
    uint constant MAXOFFERINGPERIOD = 80 days;

    // Ether rate oracle contract providing the price of an Ether in EUR cents
    RateSource public rateSource;

    // The token to be sold
    // In the following, the term "token unit" always refers to the smallest
    // and non-divisible quantum. Thus, token unit amounts are always integers.
    // One token is expected to consist of 10^18 token units.
    MintableToken public token;

    // Token amounts in token units
    // The public and the private sale are both capped (i.e. two distinct token pools)
    // The tokenRemaining variables keep track of how many token units are available
    // for the respective type of sale
    uint public tokenCapOfPublicSale;
    uint public tokenCapOfPrivateSale;
    uint public tokenRemainingForPublicSale;
    uint public tokenRemainingForPrivateSale;

    // Prices are in Euro cents (i.e. 1/100 EUR)
    uint public tokenPrice;

    // The minimum amount of tokens a purchaser has to buy via one transaction
    uint public tokenPurchaseMinimum;

    // The maximum total amount of tokens a purchaser may buy during start phase
    uint public tokenPurchaseLimit;

    // Total token purchased by investor (while purchase amount is limited)
    mapping(address => uint) public tokenPurchased;

    // Public sale period
    uint public openingTime;
    uint public closingTime;
    uint public limitEndTime;

    // Ethereum address where invested funds will be transferred to
    address payable public companyWallet;

    // Amount and receiver of reserved tokens
    uint public tokenReservePerMill;
    address public reserveAccount;

    // Wether this crowdsale was finalized or not
    bool public isFinalized = false;


    /// @dev Log entry upon token distribution event
    /// @param beneficiary Ethereum address of token recipient
    /// @param amount Number of token units
    /// @param isPublicSale Whether the distribution was via public sale
    event TokenDistribution(address indexed beneficiary, uint amount, bool isPublicSale);

    /// @dev Log entry upon token purchase event
    /// @param buyer Ethereum address of token purchaser
    /// @param value Worth in wei of purchased token amount
    /// @param amount Number of token units
    event TokenPurchase(address indexed buyer, uint value, uint amount);

    /// @dev Log entry upon rate change event
    /// @param previous Previous closing time of sale
    /// @param current Current closing time of sale
    event ClosingTimeChange(uint previous, uint current);

    /// @dev Log entry upon finalization event
    event Finalization();


    /// @dev Constructor
    /// @param _rateSource Ether rate oracle contract
    /// @param _token The token to be sold
    /// @param _tokenCapOfPublicSale Maximum number of token units to mint in public sale
    /// @param _tokenCapOfPrivateSale Maximum number of token units to mint in private sale
    /// @param _tokenPurchaseMinimum Minimum amount of tokens an investor has to buy at once
    /// @param _tokenPurchaseLimit Maximum total token amounts individually buyable in limit phase
    /// @param _tokenPrice Price of a token in EUR cent
    /// @param _openingTime Block (Unix) timestamp of sale opening time
    /// @param _closingTime Block (Unix) timestamp of sale closing time
    /// @param _limitEndTime Block (Unix) timestamp until token purchases are limited
    /// @param _companyWallet Ethereum account who will receive sent ether
    /// @param _tokenReservePerMill Per mill amount of sold tokens to mint for reserve account
    /// @param _reserveAccount Ethereum address of reserve tokens recipient
    constructor(
        RateSource _rateSource,
        MintableToken _token,
        uint _tokenCapOfPublicSale,
        uint _tokenCapOfPrivateSale,
        uint _tokenPurchaseMinimum,
        uint _tokenPurchaseLimit,
        uint _tokenReservePerMill,
        uint _tokenPrice,
        uint _openingTime,
        uint _closingTime,
        uint _limitEndTime,
        address payable _companyWallet,
        address _reserveAccount
    )
        public
    {
        require(address(_rateSource) != address(0x0), "Rate source is zero");
        require(address(_token) != address(0x0), "Token address is zero");
        require(_token.minter() == address(0x0), "Token has another minter");
        require(_tokenCapOfPublicSale > 0, "Cap of public sale is zero");
        require(_tokenCapOfPrivateSale > 0, "Cap of private sale is zero");
        require(_tokenPurchaseMinimum <= _tokenCapOfPublicSale
                && _tokenPurchaseMinimum <= _tokenCapOfPrivateSale,
                "Purchase minimum exceeds cap");
        require(_tokenPrice > 0, "Token price is zero");
        require(_openingTime >= now, "Opening lies in the past");
        require(_closingTime >= _openingTime, "Closing lies before opening");
        require(_companyWallet != address(0x0), "Company wallet is zero");
        require(_reserveAccount != address(0x0), "Reserve account is zero");


        // Note: There are no time related requirements regarding limitEndTime.
        //       If it's below openingTime, token purchases will never be limited.
        //       If it's above closingTime, token purchases will always be limited.
        if (_limitEndTime > _openingTime) {
            // But, if there's a purchase limitation phase, the limit must be at
            // least the purchase minimum or above to make purchases possible.
            require(_tokenPurchaseLimit >= _tokenPurchaseMinimum,
                    "Purchase limit is below minimum");
        }

        // Utilize safe math to ensure the sum of three token pools does't overflow
        _tokenCapOfPublicSale.add(_tokenCapOfPrivateSale).mul(_tokenReservePerMill);

        rateSource = _rateSource;
        token = _token;
        tokenCapOfPublicSale = _tokenCapOfPublicSale;
        tokenCapOfPrivateSale = _tokenCapOfPrivateSale;
        tokenPurchaseMinimum = _tokenPurchaseMinimum;
        tokenPurchaseLimit= _tokenPurchaseLimit;
        tokenReservePerMill = _tokenReservePerMill;
        tokenPrice = _tokenPrice;
        openingTime = _openingTime;
        closingTime = _closingTime;
        limitEndTime = _limitEndTime;
        companyWallet = _companyWallet;
        reserveAccount = _reserveAccount;

        tokenRemainingForPublicSale = _tokenCapOfPublicSale;
        tokenRemainingForPrivateSale = _tokenCapOfPrivateSale;
    }



    /// @dev Fallback function: buys tokens
    function () external payable {
        require(msg.data.length == 0, "Fallback call with data");

        buyTokens();
    }

    /// @dev Distribute tokens purchased off-chain via public sale
    ///      Note: additional requirements are enforced in internal function.
    /// @param beneficiaries List of recipients' Ethereum addresses
    /// @param amounts List of token units each recipient will receive
    function distributeTokensViaPublicSale(
        address[] memory beneficiaries,
        uint[] memory amounts
    )
        public
    {
        tokenRemainingForPublicSale =
            distributeTokens(tokenRemainingForPublicSale, beneficiaries, amounts, true);
    }

    /// @dev Distribute tokens purchased off-chain via private sale
    ///      Note: additional requirements are enforced in internal function.
    /// @param beneficiaries List of recipients' Ethereum addresses
    /// @param amounts List of token units each recipient will receive
    function distributeTokensViaPrivateSale(
        address[] memory beneficiaries,
        uint[] memory amounts
    )
        public
    {
        tokenRemainingForPrivateSale =
            distributeTokens(tokenRemainingForPrivateSale, beneficiaries, amounts, false);
    }

    /// @dev Check whether the sale has closed
    /// @return True iff sale closing time has passed
    function hasClosed() public view returns (bool) {
        return now >= closingTime;
    }

    /// @dev Check wether the sale is open
    /// @return True iff sale opening time has passed and sale is not closed yet
    function isOpen() public view returns (bool) {
        return now >= openingTime && !hasClosed();
    }

    /// @dev Determine the remaining open time of sale
    /// @return Time in seconds until sale gets closed, or 0 if sale was closed
    function timeRemaining() public view returns (uint) {
        if (hasClosed()) {
            return 0;
        }

        return closingTime - now;
    }

    /// @dev Determine the amount of sold tokens (off-chain and on-chain)
    /// @return Token units amount
    function tokenSold() public view returns (uint) {
        return (tokenCapOfPublicSale - tokenRemainingForPublicSale)
             + (tokenCapOfPrivateSale - tokenRemainingForPrivateSale);
    }

    /// @dev Purchase tokens
    function buyTokens() public payable {
        require(isOpen(), "Sale is not open");

        uint etherRate = rateSource.etherRate();

        require(etherRate > 0, "Ether rate is zero");

        // Units:  [1e-18*ether] * [cent/ether] / [cent/token] => [1e-18*token]
        uint amount = msg.value.mul(etherRate).div(tokenPrice);

        require(amount <= tokenRemainingForPublicSale, "Not enough tokens available");
        require(amount >= tokenPurchaseMinimum, "Investment is too low");

        // Is the total amount an investor can purchase with Ether limited?
        if (now < limitEndTime) {
            uint purchased = tokenPurchased[msg.sender].add(amount);

            require(purchased <= tokenPurchaseLimit, "Purchase limit reached");

            tokenPurchased[msg.sender] = purchased;
        }

        tokenRemainingForPublicSale = tokenRemainingForPublicSale.sub(amount);

        token.mint(msg.sender, amount);
        forwardFunds();

        emit TokenPurchase(msg.sender, msg.value, amount);
    }

    /// @dev Extend the offering period of the crowd sale.
    /// @param _newClosingTime new closingTime of the crowdsale
    function changeClosingTime(uint _newClosingTime) public onlyOwner {
        require(!hasClosed(), "Sale has already ended");
        require(_newClosingTime > now, "ClosingTime not in the future");
        require(_newClosingTime > openingTime, "New offering is zero");
        require(_newClosingTime - openingTime <= MAXOFFERINGPERIOD, "New offering too long");

        emit ClosingTimeChange(closingTime, _newClosingTime);

        closingTime = _newClosingTime;
    }

    /// @dev Finalize, i.e. end token minting phase and enable token transfers
    function finalize() public onlyOwner {
        require(!isFinalized, "Sale has already been finalized");
        require(hasClosed(), "Sale has not closed");

        if (tokenReservePerMill > 0) {
            token.mint(reserveAccount, tokenSold().mul(tokenReservePerMill).div(1000));
        }
        token.finishMinting();
        isFinalized = true;

        emit Finalization();
    }

    /// @dev Distribute tokens purchased off-chain (in Euro) to investors
    /// @param tokenRemaining Token units available for sale
    /// @param beneficiaries Ethereum addresses of purchasers
    /// @param amounts Token unit amounts to deliver to each investor
    /// @return Token units available for sale after distribution
    function distributeTokens(
        uint tokenRemaining,
        address[] memory beneficiaries,
        uint[] memory amounts,
        bool isPublicSale
    )
        internal
        onlyOwner
        returns (uint)
    {
        require(!isFinalized, "Sale has been finalized");
        require(beneficiaries.length == amounts.length, "Lengths are different");

        for (uint i = 0; i < beneficiaries.length; ++i) {
            address beneficiary = beneficiaries[i];
            uint amount = amounts[i];

            require(amount <= tokenRemaining, "Not enough tokens available");

            tokenRemaining = tokenRemaining.sub(amount);
            token.mint(beneficiary, amount);

            emit TokenDistribution(beneficiary, amount, isPublicSale);
        }

        return tokenRemaining;
    }

    /// @dev Forward invested ether to company wallet
    function forwardFunds() internal {
        companyWallet.transfer(address(this).balance);
    }

}

// File: contracts/token/TokenRecoverable.sol

pragma solidity 0.5.12;



/// @title TokenRecoverable
/// @author STOKR
contract TokenRecoverable is Ownable {

    // Address that can do the TokenRecovery
    address public tokenRecoverer;

    /// @dev  Event emitted when the TokenRecoverer changes
    /// @param previous  Ethereum address of previous token recoverer
    /// @param current   Ethereum address of new token recoverer
    event TokenRecovererChange(address indexed previous, address indexed current);

    /// @dev Event emitted in case of a TokenRecovery
    /// @param oldAddress Ethereum address of old account
    /// @param newAddress Ethereum address of new account
    event TokenRecovery(address indexed oldAddress, address indexed newAddress);

    /// @dev Restrict operation to token recoverer
    modifier onlyTokenRecoverer() {
        require(msg.sender == tokenRecoverer, "Restricted to token recoverer");
        _;
    }

    /// @dev Constructor
    /// @param _tokenRecoverer Ethereum address of token recoverer
    constructor(address _tokenRecoverer) public {
        setTokenRecoverer(_tokenRecoverer);
    }

    /// @dev Set token recoverer
    /// @param _newTokenRecoverer Ethereum address of new token recoverer
    function setTokenRecoverer(address _newTokenRecoverer) public onlyOwner {
        require(_newTokenRecoverer != address(0x0), "New token recoverer is zero");

        if (_newTokenRecoverer != tokenRecoverer) {
            emit TokenRecovererChange(tokenRecoverer, _newTokenRecoverer);

            tokenRecoverer = _newTokenRecoverer;
        }
    }

    /// @dev Recover token
    /// @param _oldAddress address
    /// @param _newAddress address
    function recoverToken(address _oldAddress, address _newAddress) public;

}

// File: contracts/token/StokrToken.sol

pragma solidity 0.5.12;





/// @title StokrToken
/// @author Stokr
contract StokrToken is MintableToken, TokenRecoverable {

    string public name;
    string public symbol;
    uint8 public constant decimals = 18;

    mapping(address => mapping(address => uint)) internal allowance_;

    /// @dev Log entry on self destruction of the token
    event TokenDestroyed();

    /// @dev Constructor
    /// @param _whitelist       Ethereum address of whitelist contract
    /// @param _tokenRecoverer  Ethereum address of token recoverer
    constructor(
        string memory _name,
        string memory _symbol,
        Whitelist _whitelist,
        address _profitDepositor,
        address _profitDistributor,
        address _tokenRecoverer
    )
        public
        Whitelisted(_whitelist)
        ProfitSharing(_profitDepositor, _profitDistributor)
        TokenRecoverable(_tokenRecoverer)
    {
        name = _name;
        symbol = _symbol;
    }

    /// @dev  Self destruct can only be called by crowdsale contract in case the goal wasn't reached
    function destruct() public onlyMinter {
        emit TokenDestroyed();
        selfdestruct(address(uint160(owner)));
    }

    /// @dev Recover token
    /// @param _oldAddress  address of old account
    /// @param _newAddress  address of new account
    function recoverToken(address _oldAddress, address _newAddress)
        public
        onlyTokenRecoverer
        onlyWhitelisted(_newAddress)
    {
        // Ensure that new address is *not* an existing account.
        // Check for account.profitShare is not needed because of following implication:
        //   (account.lastTotalProfits == 0) ==> (account.profitShare == 0)
        require(accounts[_newAddress].balance == 0 && accounts[_newAddress].lastTotalProfits == 0,
                "New address exists already");

        updateProfitShare(_oldAddress);

        accounts[_newAddress] = accounts[_oldAddress];
        delete accounts[_oldAddress];

        emit TokenRecovery(_oldAddress, _newAddress);
        emit Transfer(_oldAddress, _newAddress, accounts[_newAddress].balance);
    }

    /// @dev  Total supply of this token
    /// @return  Token amount
    function totalSupply() public view returns (uint) {
        return totalSupply_;
    }

    /// @dev  Token balance
    /// @param _investor  Ethereum address of token holder
    /// @return           Token amount
    function balanceOf(address _investor) public view returns (uint) {
        return accounts[_investor].balance;
    }

    /// @dev  Allowed token amount a third party trustee may transfer
    /// @param _investor  Ethereum address of token holder
    /// @param _spender   Ethereum address of third party
    /// @return           Allowed token amount
    function allowance(address _investor, address _spender) public view returns (uint) {
        return allowance_[_investor][_spender];
    }

    /// @dev  Approve a third party trustee to transfer tokens
    ///       Note: additional requirements are enforced within internal function.
    /// @param _spender  Ethereum address of third party
    /// @param _value    Maximum token amount that is allowed to get transferred
    /// @return          Always true
    function approve(address _spender, uint _value) public returns (bool) {
        return _approve(msg.sender, _spender, _value);
    }

    /// @dev  Increase the amount of tokens a third party trustee may transfer
    ///       Note: additional requirements are enforces within internal function.
    /// @param _spender  Ethereum address of third party
    /// @param _amount   Additional token amount that is allowed to get transferred
    /// @return          Always true
    function increaseAllowance(address _spender, uint _amount) public returns (bool) {
        require(allowance_[msg.sender][_spender] + _amount >= _amount, "Allowance overflow");

        return _approve(msg.sender, _spender, allowance_[msg.sender][_spender].add(_amount));
    }

    /// @dev  Decrease the amount of tokens a third party trustee may transfer
    ///       Note: additional requirements are enforces within internal function.
    /// @param _spender  Ethereum address of third party
    /// @param _amount   Reduced token amount that is allowed to get transferred
    /// @return          Always true
    function decreaseAllowance(address _spender, uint _amount) public returns (bool) {
        require(_amount <= allowance_[msg.sender][_spender], "Amount exceeds allowance");

        return _approve(msg.sender, _spender, allowance_[msg.sender][_spender].sub(_amount));
    }

    /// @dev  Check if a token transfer is possible
    /// @param _from   Ethereum address of token sender
    /// @param _to     Ethereum address of token recipient
    /// @param _value  Token amount to transfer
    /// @return        True iff a transfer with given pramaters would succeed
    function canTransfer(address _from, address _to, uint _value)
        public view returns (bool)
    {
        return totalSupplyIsFixed
            && _from != address(0x0)
            && _to != address(0x0)
            && _value <= accounts[_from].balance
            && whitelist.isWhitelisted(_from)
            && whitelist.isWhitelisted(_to);
    }

    /// @dev  Check if a token transfer by third party is possible
    /// @param _spender  Ethereum address of third party trustee
    /// @param _from     Ethereum address of token holder
    /// @param _to       Ethereum address of token recipient
    /// @param _value    Token amount to transfer
    /// @return          True iff a transfer with given pramaters would succeed
    function canTransferFrom(address _spender, address _from, address _to, uint _value)
        public view returns (bool)
    {
        return canTransfer(_from, _to, _value) && _value <= allowance_[_from][_spender];
    }

    /// @dev  Token transfer
    ///       Note: additional requirements are enforces within internal function.
    /// @param _to     Ethereum address of token recipient
    /// @param _value  Token amount to transfer
    /// @return        Always true
    function transfer(address _to, uint _value) public returns (bool) {
        return _transfer(msg.sender, _to, _value);
    }

    /// @dev  Token transfer by a third party
    ///       Note: additional requirements are enforces within internal function.
    /// @param _from   Ethereum address of token holder
    /// @param _to     Ethereum address of token recipient
    /// @param _value  Token amount to transfer
    /// @return        Always true
    function transferFrom(address _from, address _to, uint _value) public returns (bool) {
        require(_value <= allowance_[_from][msg.sender], "Amount exceeds allowance");

        return _approve(_from, msg.sender, allowance_[_from][msg.sender].sub(_value))
            && _transfer(_from, _to, _value);
    }

    /// @dev  Approve a third party trustee to transfer tokens (internal implementation)
    /// @param _from     Ethereum address of token holder
    /// @param _spender  Ethereum address of third party
    /// @param _value    Maximum token amount the trustee is allowed to transfer
    /// @return          Always true
    function _approve(address _from, address _spender, uint _value)
        internal
        onlyWhitelisted(_from)
        onlyWhenTotalSupplyIsFixed
        returns (bool)
    {
        allowance_[_from][_spender] = _value;

        emit Approval(_from, _spender, _value);

        return true;
    }

    /// @dev  Token transfer (internal implementation)
    /// @param _from   Ethereum address of token sender
    /// @param _to     Ethereum address of token recipient
    /// @param _value  Token amount to transfer
    /// @return        Always true
    function _transfer(address _from, address _to, uint _value)
        internal
        onlyWhitelisted(_from)
        onlyWhitelisted(_to)
        onlyWhenTotalSupplyIsFixed
        returns (bool)
    {
        require(_to != address(0x0), "Recipient is zero");
        require(_value <= accounts[_from].balance, "Amount exceeds balance");

        updateProfitShare(_from);
        updateProfitShare(_to);

        accounts[_from].balance = accounts[_from].balance.sub(_value);
        accounts[_to].balance = accounts[_to].balance.add(_value);

        emit Transfer(_from, _to, _value);

        return true;
    }

}

// File: contracts/crowdsale/StokrCrowdsale.sol

pragma solidity 0.5.12;




/// @title StokrCrowdsale
/// @author STOKR
contract StokrCrowdsale is MintingCrowdsale {

    // Soft cap in token units
    uint public tokenGoal;

    // As long as the goal is not reached funds of purchases are held back
    // and investments are assigned to investors here to enable a refunding
    // if the goal is missed upon finalization
    mapping(address => uint) public investments;


    // Log entry upon investor refund event
    event InvestorRefund(address indexed investor, uint value);


    /// @dev Constructor
    /// @param _token The token
    /// @param _tokenCapOfPublicSale Available token units for public sale
    /// @param _tokenCapOfPrivateSale Available token units for private sale
    /// @param _tokenGoal Minimum number of sold token units to be successful
    /// @param _tokenPurchaseMinimum Minimum amount of tokens an investor has to buy at once
    /// @param _tokenPurchaseLimit Maximum total token amounts individually buyable in limit phase
    /// @param _tokenReservePerMill Additional reserve tokens in per mill of sold tokens
    /// @param _tokenPrice Price of a token in EUR cent
    /// @param _rateSource Ethereum address of ether rate setting authority
    /// @param _openingTime Block (Unix) timestamp of sale opening time
    /// @param _closingTime Block (Unix) timestamp of sale closing time
    /// @param _limitEndTime Block (Unix) timestamp until token purchases are limited
    /// @param _companyWallet Ethereum account who will receive sent ether
    /// @param _reserveAccount An address
    constructor(
        RateSource _rateSource,
        StokrToken _token,
        uint _tokenCapOfPublicSale,
        uint _tokenCapOfPrivateSale,
        uint _tokenGoal,
        uint _tokenPurchaseMinimum,
        uint _tokenPurchaseLimit,
        uint _tokenReservePerMill,
        uint _tokenPrice,
        uint _openingTime,
        uint _closingTime,
        uint _limitEndTime,
        address payable _companyWallet,
        address _reserveAccount
    )
        public
        MintingCrowdsale(
            _rateSource,
            _token,
            _tokenCapOfPublicSale,
            _tokenCapOfPrivateSale,
            _tokenPurchaseMinimum,
            _tokenPurchaseLimit,
            _tokenReservePerMill,
            _tokenPrice,
            _openingTime,
            _closingTime,
            _limitEndTime,
            _companyWallet,
            _reserveAccount
        )
    {
        require(
            _tokenGoal <= _tokenCapOfPublicSale + _tokenCapOfPrivateSale,
            "Goal is not attainable"
        );

        tokenGoal = _tokenGoal;
    }

    /// @dev Wether the goal of sold tokens was reached or not
    /// @return True if the sale can be considered successful
    function goalReached() public view returns (bool) {
        return tokenSold() >= tokenGoal;
    }

    /// @dev Investors can claim refunds here if crowdsale was unsuccessful
    function distributeRefunds(address payable[] calldata _investors) external {
        for (uint i = 0; i < _investors.length; ++i) {
            refundInvestor(_investors[i]);
        }
    }

    /// @dev Investors can claim refunds here if crowdsale was unsuccessful
    function claimRefund() public {
        refundInvestor(msg.sender);
    }

    /// @dev Overwritten. Kill the token if goal was missed
    function finalize() public onlyOwner {
        super.finalize();

        if (!goalReached()) {
            StokrToken(address(token)).destruct();
        }
    }

    function distributeTokensViaPublicSale(
        address[] memory beneficiaries,
        uint[] memory amounts
    )
        public
    {
        super.distributeTokensViaPublicSale(beneficiaries, amounts);
        // The goal may get reached due to token distribution,
        // so forward any accumulated funds to the company wallet.
        forwardFunds();
    }

    function distributeTokensViaPrivateSale(
        address[] memory beneficiaries,
        uint[] memory amounts
    )
        public
    {
        super.distributeTokensViaPrivateSale(beneficiaries, amounts);
        // The goal may get reached due to token distribution,
        // so forward any accumulated funds to the company wallet.
        forwardFunds();
    }

    /// @dev Overwritten. Funds are held back until goal was reached
    function forwardFunds() internal {
        if (goalReached()) {
            super.forwardFunds();
        }
        else {
            investments[msg.sender] = investments[msg.sender].add(msg.value);
        }
    }

    /// @dev Refund an investor if the sale was not successful
    /// @param _investor Ethereum address of investor
    function refundInvestor(address payable _investor) internal {
        require(isFinalized, "Sale has not been finalized");
        require(!goalReached(), "Goal was reached");

        uint investment = investments[_investor];

        if (investment > 0) {
            investments[_investor] = 0;
            _investor.transfer(investment);

            emit InvestorRefund(_investor, investment);
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"contract Whitelist","name":"_whitelist","type":"address"},{"internalType":"address","name":"_profitDepositor","type":"address"},{"internalType":"address","name":"_profitDistributor","type":"address"},{"internalType":"address","name":"_tokenRecoverer","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProfitDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"current","type":"address"}],"name":"ProfitDepositorChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"current","type":"address"}],"name":"ProfitDistributorChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProfitShareUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"investor","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProfitShareWithdrawal","type":"event"},{"anonymous":false,"inputs":[],"name":"TokenDestroyed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"current","type":"address"}],"name":"TokenRecovererChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"TokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previous","type":"address"},{"indexed":true,"internalType":"address","name":"current","type":"address"}],"name":"WhitelistChange","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accounts","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"lastTotalProfits","type":"uint256"},{"internalType":"uint256","name":"profitShare","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_investor","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_investor","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"canTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"canTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"depositProfit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"destruct","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numberOfInvestors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"profitDepositor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"profitDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_investor","type":"address"}],"name":"profitShareOwing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_oldAddress","type":"address"},{"internalType":"address","name":"_newAddress","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newProfitDepositor","type":"address"}],"name":"setProfitDepositor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newProfitDistributor","type":"address"}],"name":"setProfitDistributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newTokenRecoverer","type":"address"}],"name":"setTokenRecoverer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract Whitelist","name":"_newWhitelist","type":"address"}],"name":"setWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenRecoverer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalProfits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupplyIsFixed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnershipUnsafe","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_investor","type":"address"}],"name":"updateProfitShare","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"whitelist","outputs":[{"internalType":"contract Whitelist","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawProfitShare","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"}],"name":"withdrawProfitShareTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable[]","name":"_investors","type":"address[]"}],"name":"withdrawProfitShares","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000600a553480156200001657600080fd5b506040516200591238038062005912833981810160405260c08110156200003c57600080fd5b81019080805160405193929190846401000000008211156200005d57600080fd5b838201915060208201858111156200007457600080fd5b82518660018202830111640100000000821117156200009257600080fd5b8083526020830192505050908051906020019080838360005b83811015620000c8578082015181840152602081019050620000ab565b50505050905090810190601f168015620000f65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011a57600080fd5b838201915060208201858111156200013157600080fd5b82518660018202830111640100000000821117156200014f57600080fd5b8083526020830192505050908051906020019080838360005b838110156200018557808201518184015260208101905062000168565b50505050905090810190601f168015620001b35780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919080519060200190929190805190602001909291908051906020019092919050505080848484336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200023a82620002af60201b60201c565b6200024b816200052d60201b60201c565b50506200025e81620007ab60201b60201c565b50620002708162000a2960201b60201c565b5085600c90805190602001906200028992919062000ca7565b5084600d9080519060200190620002a292919062000ca7565b5050505050505062000d56565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000372576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e65772070726f666974206465706f7369746f72206973207a65726f0000000081525060200191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146200052a578073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4fdc16b3739cf80464626c98a53f8eea115ac9f94694287afc84b9dd1102cc2860405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620005f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4e65772070726f666974206469737472696275746f72206973207a65726f000081525060200191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620007a8578073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f024c8e1d8737257a61b74ae4e70b314f3dc339e5a5c43de51344fca0b393358660405160405180910390a380600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200086e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f57686974656c6973742061646472657373206973207a65726f0000000000000081525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000a26578073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f10afc05abeac7c59bbc9efaa96af76388095ae1028cb85e59f676d20a7dbf64760405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000aec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000b90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e657720746f6b656e207265636f7665726572206973207a65726f000000000081525060200191505060405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000ca4578073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff693c6449c4445af5f6bd9eaf2f1d405209024c25d65eb2321805553df1bb6a060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cea57805160ff191683800117855562000d1b565b8280016001018555821562000d1b579182015b8281111562000d1a57825182559160200191906001019062000cfd565b5b50905062000d2a919062000d2e565b5090565b62000d5391905b8082111562000d4f57600081600090555060010162000d35565b5090565b90565b614bac8062000d666000396000f3fe6080604052600436106102515760003560e01c8063854cff2f11610139578063b445abe1116100b6578063e46638e61161007a578063e46638e614610f08578063e77a14be14610f9b578063e86dde5614610fec578063f2fde38b1461101b578063fca3b5aa1461106c578063feaea586146110bd57610251565b8063b445abe114610d59578063bd998cb314610db0578063d4ee1d9014610ddb578063d9ad01c414610e32578063dd62ed3e14610e8357610251565b806395d89b41116100fd57806395d89b4114610b3b578063a457c2d714610bcb578063a824c9d214610c3e578063a9059cbb14610c8f578063b1efee8414610d0257610251565b8063854cff2f146109865780638d82eab8146109d75780638da5cb5b14610a3c578063924a96f014610a9357806393e59dc114610ae457610251565b80632b68b9c6116101d257806351213f481161019657806351213f48146107895780635e5c06e2146107da57806370a082311461084d5780637157797f146108b257806371d60d8f146109655780637d64bcb41461096f57610251565b80632b68b9c61461065c578063313ce5671461067357806339509351146106a457806340c10f19146107175780634e71e0c81461077257610251565b80631ac2765d116102195780631ac2765d146104705780631af2c9fd146104f65780631e4c2fe31461052157806323b872dd14610572578063268808c61461060557610251565b806306fdde03146102d45780630754617214610364578063095ea7b3146103bb57806318160ddd1461042e5780631aa8a09214610459575b600080369050146102ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f46616c6c6261636b2063616c6c2077697468206461746100000000000000000081525060200191505060405180910390fd5b6102d261112e565b005b3480156102e057600080fd5b506102e9611356565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561032957808201518184015260208101905061030e565b50505050905090810190601f1680156103565780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037057600080fd5b506103796113f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103c757600080fd5b50610414600480360360408110156103de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061141a565b604051808215151515815260200191505060405180910390f35b34801561043a57600080fd5b5061044361142f565b6040518082815260200191505060405180910390f35b34801561046557600080fd5b5061046e611439565b005b34801561047c57600080fd5b506104f46004803603602081101561049357600080fd5b81019080803590602001906401000000008111156104b057600080fd5b8201836020820111156104c257600080fd5b803590602001918460208302840111640100000000831117156104e457600080fd5b9091929391929390505050611445565b005b34801561050257600080fd5b5061050b611583565b6040518082815260200191505060405180910390f35b34801561052d57600080fd5b506105706004803603602081101561054457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611589565b005b34801561057e57600080fd5b506105eb6004803603606081101561059557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611596565b604051808215151515815260200191505060405180910390f35b34801561061157600080fd5b5061061a61173f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561066857600080fd5b50610671611765565b005b34801561067f57600080fd5b5061068861188e565b604051808260ff1660ff16815260200191505060405180910390f35b3480156106b057600080fd5b506106fd600480360360408110156106c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611893565b604051808215151515815260200191505060405180910390f35b34801561072357600080fd5b506107706004803603604081101561073a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a2a565b005b34801561077e57600080fd5b50610787611e8a565b005b34801561079557600080fd5b506107d8600480360360208110156107ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f58565b005b3480156107e657600080fd5b50610829600480360360208110156107fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121d3565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561085957600080fd5b5061089c6004803603602081101561087057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121fd565b6040518082815260200191505060405180910390f35b3480156108be57600080fd5b5061094b600480360360808110156108d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612249565b604051808215151515815260200191505060405180910390f35b61096d61112e565b005b34801561097b57600080fd5b506109846122e8565b005b34801561099257600080fd5b506109d5600480360360208110156109a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612477565b005b3480156109e357600080fd5b50610a26600480360360208110156109fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126f2565b6040518082815260200191505060405180910390f35b348015610a4857600080fd5b50610a516127f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9f57600080fd5b50610ae260048036036020811015610ab657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612819565b005b348015610af057600080fd5b50610af9612a94565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b4757600080fd5b50610b50612aba565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b90578082015181840152602081019050610b75565b50505050905090810190601f168015610bbd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610bd757600080fd5b50610c2460048036036040811015610bee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b58565b604051808215151515815260200191505060405180910390f35b348015610c4a57600080fd5b50610c8d60048036036020811015610c6157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ced565b005b348015610c9b57600080fd5b50610ce860048036036040811015610cb257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e5e565b604051808215151515815260200191505060405180910390f35b348015610d0e57600080fd5b50610d17612e73565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d6557600080fd5b50610d6e612e99565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dbc57600080fd5b50610dc5612ebf565b6040518082815260200191505060405180910390f35b348015610de757600080fd5b50610df0612ec5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e3e57600080fd5b50610e8160048036036020811015610e5557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612eeb565b005b348015610e8f57600080fd5b50610ef260048036036040811015610ea657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613166565b6040518082815260200191505060405180910390f35b348015610f1457600080fd5b50610f8160048036036060811015610f2b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506131ed565b604051808215151515815260200191505060405180910390f35b348015610fa757600080fd5b50610fea60048036036020811015610fbe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061348c565b005b348015610ff857600080fd5b506110016135fd565b604051808215151515815260200191505060405180910390f35b34801561102757600080fd5b5061106a6004803603602081101561103e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613610565b005b34801561107857600080fd5b506110bb6004803603602081101561108f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137b9565b005b3480156110c957600080fd5b5061112c600480360360408110156110e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a26565b005b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5265737472696374656420746f2070726f666974206465706f7369746f72000081525060200191505060405180910390fd5b600660009054906101000a900460ff16611273576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f546f74616c20737570706c79206d6179206368616e676500000000000000000081525060200191505060405180910390fd5b6000600754116112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f74616c20737570706c79206973207a65726f00000000000000000000000081525060200191505060405180910390fd5b61130034600554613f4490919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167f1ecaf5d6abf37d825612fa02d0f7a9db7b880595f4dbf94c8e645d2b1bee37d4346040518082815260200191505060405180910390a2565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ec5780601f106113c1576101008083540402835291602001916113ec565b820191906000526020600020905b8154815290600101906020018083116113cf57829003601f168201915b505050505081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611427338484613f60565b905092915050565b6000600754905090565b6114433333614223565b565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5265737472696374656420746f2070726f666974206469737472696275746f7281525060200191505060405180910390fd5b60008090505b8282905081101561157e5761157383838381811061152857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1684848481811061155157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16614223565b80600101905061150e565b505050565b600a5481565b6115933382614223565b50565b6000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561168a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f416d6f756e74206578636565647320616c6c6f77616e6365000000000000000081525060200191505060405180910390fd5b611723843361171e85600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461436c90919063ffffffff16565b613f60565b80156117365750611735848484614383565b5b90509392505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5265737472696374656420746f206d696e74657200000000000000000000000081525060200191505060405180910390fd5b7f95581ace7737226d280f9814ae6267c15c73e513c71c48a432da5b991223891060405160405180910390a16000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b601281565b60008182600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011015611989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f416c6c6f77616e6365206f766572666c6f77000000000000000000000000000081525060200191505060405180910390fd5b611a223384611a1d85600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613f4490919063ffffffff16565b613f60565b905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5265737472696374656420746f206d696e74657200000000000000000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff1615611b70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f74616c20737570706c7920686173206265656e206669786564000000000081525060200191505060405180910390fd5b81600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611c1057600080fd5b505afa158015611c24573d6000803e3d6000fd5b505050506040513d6020811015611c3a57600080fd5b8101908080519060200190929190505050611cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415611d1b57600a600081548092919060010191905055505b611d3082600754613f4490919063ffffffff16565b600781905550611d8b82600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613f4490919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508273ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5265737472696374656420746f206e6577206f776e657200000000000000000081525060200191505060405180910390fd5b611f56336149b6565b565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461201a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e657720746f6b656e207265636f7665726572206973207a65726f000000000081525060200191505060405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121d0578073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff693c6449c4445af5f6bd9eaf2f1d405209024c25d65eb2321805553df1bb6a060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60006122568484846131ed565b80156122de5750600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211155b9050949350505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5265737472696374656420746f206d696e74657200000000000000000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff161561242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f74616c20737570706c7920686173206265656e206669786564000000000081525060200191505060405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612539576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f57686974656c6973742061646472657373206973207a65726f0000000000000081525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126ef578073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f10afc05abeac7c59bbc9efaa96af76388095ae1028cb85e59f676d20a7dbf64760405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000600660009054906101000a900460ff16158061271257506000600754145b1561272057600090506127ef565b612728614b56565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506127eb81604001516127dd6007546127cf85600001516127c1876020015160055461436c90919063ffffffff16565b614b0b90919063ffffffff16565b614b4290919063ffffffff16565b613f4490919063ffffffff16565b9150505b919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561297e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4e65772070726f666974206469737472696275746f72206973207a65726f000081525060200191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a91578073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f024c8e1d8737257a61b74ae4e70b314f3dc339e5a5c43de51344fca0b393358660405160405180910390a380600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b505780601f10612b2557610100808354040283529160200191612b50565b820191906000526020600020905b815481529060010190602001808311612b3357829003601f168201915b505050505081565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115612c4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f416d6f756e74206578636565647320616c6c6f77616e6365000000000000000081525060200191505060405180910390fd5b612ce53384612ce085600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461436c90919063ffffffff16565b613f60565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612daf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6577206f776e6572206973207a65726f00000000000000000000000000000081525060200191505060405180910390fd5b612e5b816149b6565b50565b6000612e6b338484614383565b905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612fad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e65772070726f666974206465706f7369746f72206973207a65726f0000000081525060200191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613163578073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4fdc16b3739cf80464626c98a53f8eea115ac9f94694287afc84b9dd1102cc2860405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600660009054906101000a900460ff1680156132385750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156132715750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156132bf5750600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548211155b80156133a15750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561336557600080fd5b505afa158015613379573d6000803e3d6000fd5b505050506040513d602081101561338f57600080fd5b81019080805190602001909291905050505b80156134835750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561344757600080fd5b505afa15801561345b573d6000803e3d6000fd5b505050506040513d602081101561347157600080fd5b81019080805190602001909291905050505b90509392505050565b600660009054906101000a900460ff1661350e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f546f74616c20737570706c79206d6179206368616e676500000000000000000081525060200191505060405180910390fd5b6000613519826126f2565b9050600554600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167f0bb36062f5e51c9cb6f165015f6e178eaa498868b42a1f797f2b864ddaca59ee826040518082815260200191505060405180910390a25050565b600660009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146136d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613775576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6577206f776e6572206973207a65726f00000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461387b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461393f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d696e7465722068617320616c7265616479206265656e20736574000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156139e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4d696e746572206973207a65726f00000000000000000000000000000000000081525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5265737472696374656420746f20746f6b656e207265636f766572657200000081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613b8957600080fd5b505afa158015613b9d573d6000803e3d6000fd5b505050506040513d6020811015613bb357600080fd5b8101908080519060200190929190505050613c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154148015613cca57506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154145b613d3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e657720616464726573732065786973747320616c726561647900000000000081525060200191505060405180910390fd5b613d458361348c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015481600001556001820154816001015560028201548160020155905050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055600282016000905550508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f83ddb032791a0e182e3dd293d85ca1da7411793659d2c8bd8fbe346e38a7265160405160405180910390a38173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518082815260200191505060405180910390a3505050565b600080828401905083811015613f5657fe5b8091505092915050565b600083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561400257600080fd5b505afa158015614016573d6000803e3d6000fd5b505050506040513d602081101561402c57600080fd5b81019080805190602001909291905050506140af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff16614131576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f546f74616c20737570706c79206d6179206368616e676500000000000000000081525060200191505060405180910390fd5b82600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150509392505050565b61422c8261348c565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614301573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f182fd1cdcccc248c64c7d44f15aaa1374c533a4e902ef27c9d5afd6ae6665a43836040518082815260200191505060405180910390a3505050565b60008282111561437857fe5b818303905092915050565b600083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561442557600080fd5b505afa158015614439573d6000803e3d6000fd5b505050506040513d602081101561444f57600080fd5b81019080805190602001909291905050506144d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b83600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561457257600080fd5b505afa158015614586573d6000803e3d6000fd5b505050506040513d602081101561459c57600080fd5b810190808051906020019092919050505061461f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff166146a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f546f74616c20737570706c79206d6179206368616e676500000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415614744576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f526563697069656e74206973207a65726f00000000000000000000000000000081525060200191505060405180910390fd5b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548411156147fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e7420657863656564732062616c616e63650000000000000000000081525060200191505060405180910390fd5b6148058661348c565b61480e8561348c565b61486384600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461436c90919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506148fe84600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613f4490919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a36001925050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ac6578073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080831415614b1e5760009050614b3c565b6000828402905082848281614b2f57fe5b0414614b3757fe5b809150505b92915050565b6000818381614b4d57fe5b04905092915050565b6040518060600160405280600081526020016000815260200160008152509056fea265627a7a72315820d9c87a8a5ae219dbe74808e7359f463bdc9a730dfb2a658251f935a6fbab0d0464736f6c634300050c003200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000b251fe6a1a8c5559b0d532b00775eb39aa433d560000000000000000000000003a4f0ae1ab1c48bf2db78246a17c536dc328c38e000000000000000000000000c1d70999ba324e2a6d003324a4f0923ac872b86300000000000000000000000042978457b7c8230cd7980ffb984e1ac59583ab0600000000000000000000000000000000000000000000000000000000000000175061726b696e476f20536563757269747920546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000004474f545300000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c8063854cff2f11610139578063b445abe1116100b6578063e46638e61161007a578063e46638e614610f08578063e77a14be14610f9b578063e86dde5614610fec578063f2fde38b1461101b578063fca3b5aa1461106c578063feaea586146110bd57610251565b8063b445abe114610d59578063bd998cb314610db0578063d4ee1d9014610ddb578063d9ad01c414610e32578063dd62ed3e14610e8357610251565b806395d89b41116100fd57806395d89b4114610b3b578063a457c2d714610bcb578063a824c9d214610c3e578063a9059cbb14610c8f578063b1efee8414610d0257610251565b8063854cff2f146109865780638d82eab8146109d75780638da5cb5b14610a3c578063924a96f014610a9357806393e59dc114610ae457610251565b80632b68b9c6116101d257806351213f481161019657806351213f48146107895780635e5c06e2146107da57806370a082311461084d5780637157797f146108b257806371d60d8f146109655780637d64bcb41461096f57610251565b80632b68b9c61461065c578063313ce5671461067357806339509351146106a457806340c10f19146107175780634e71e0c81461077257610251565b80631ac2765d116102195780631ac2765d146104705780631af2c9fd146104f65780631e4c2fe31461052157806323b872dd14610572578063268808c61461060557610251565b806306fdde03146102d45780630754617214610364578063095ea7b3146103bb57806318160ddd1461042e5780631aa8a09214610459575b600080369050146102ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f46616c6c6261636b2063616c6c2077697468206461746100000000000000000081525060200191505060405180910390fd5b6102d261112e565b005b3480156102e057600080fd5b506102e9611356565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561032957808201518184015260208101905061030e565b50505050905090810190601f1680156103565780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037057600080fd5b506103796113f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103c757600080fd5b50610414600480360360408110156103de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061141a565b604051808215151515815260200191505060405180910390f35b34801561043a57600080fd5b5061044361142f565b6040518082815260200191505060405180910390f35b34801561046557600080fd5b5061046e611439565b005b34801561047c57600080fd5b506104f46004803603602081101561049357600080fd5b81019080803590602001906401000000008111156104b057600080fd5b8201836020820111156104c257600080fd5b803590602001918460208302840111640100000000831117156104e457600080fd5b9091929391929390505050611445565b005b34801561050257600080fd5b5061050b611583565b6040518082815260200191505060405180910390f35b34801561052d57600080fd5b506105706004803603602081101561054457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611589565b005b34801561057e57600080fd5b506105eb6004803603606081101561059557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611596565b604051808215151515815260200191505060405180910390f35b34801561061157600080fd5b5061061a61173f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561066857600080fd5b50610671611765565b005b34801561067f57600080fd5b5061068861188e565b604051808260ff1660ff16815260200191505060405180910390f35b3480156106b057600080fd5b506106fd600480360360408110156106c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611893565b604051808215151515815260200191505060405180910390f35b34801561072357600080fd5b506107706004803603604081101561073a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a2a565b005b34801561077e57600080fd5b50610787611e8a565b005b34801561079557600080fd5b506107d8600480360360208110156107ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f58565b005b3480156107e657600080fd5b50610829600480360360208110156107fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121d3565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561085957600080fd5b5061089c6004803603602081101561087057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121fd565b6040518082815260200191505060405180910390f35b3480156108be57600080fd5b5061094b600480360360808110156108d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612249565b604051808215151515815260200191505060405180910390f35b61096d61112e565b005b34801561097b57600080fd5b506109846122e8565b005b34801561099257600080fd5b506109d5600480360360208110156109a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612477565b005b3480156109e357600080fd5b50610a26600480360360208110156109fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126f2565b6040518082815260200191505060405180910390f35b348015610a4857600080fd5b50610a516127f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9f57600080fd5b50610ae260048036036020811015610ab657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612819565b005b348015610af057600080fd5b50610af9612a94565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b4757600080fd5b50610b50612aba565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b90578082015181840152602081019050610b75565b50505050905090810190601f168015610bbd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610bd757600080fd5b50610c2460048036036040811015610bee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b58565b604051808215151515815260200191505060405180910390f35b348015610c4a57600080fd5b50610c8d60048036036020811015610c6157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ced565b005b348015610c9b57600080fd5b50610ce860048036036040811015610cb257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e5e565b604051808215151515815260200191505060405180910390f35b348015610d0e57600080fd5b50610d17612e73565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d6557600080fd5b50610d6e612e99565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dbc57600080fd5b50610dc5612ebf565b6040518082815260200191505060405180910390f35b348015610de757600080fd5b50610df0612ec5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e3e57600080fd5b50610e8160048036036020811015610e5557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612eeb565b005b348015610e8f57600080fd5b50610ef260048036036040811015610ea657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613166565b6040518082815260200191505060405180910390f35b348015610f1457600080fd5b50610f8160048036036060811015610f2b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506131ed565b604051808215151515815260200191505060405180910390f35b348015610fa757600080fd5b50610fea60048036036020811015610fbe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061348c565b005b348015610ff857600080fd5b506110016135fd565b604051808215151515815260200191505060405180910390f35b34801561102757600080fd5b5061106a6004803603602081101561103e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613610565b005b34801561107857600080fd5b506110bb6004803603602081101561108f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137b9565b005b3480156110c957600080fd5b5061112c600480360360408110156110e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a26565b005b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5265737472696374656420746f2070726f666974206465706f7369746f72000081525060200191505060405180910390fd5b600660009054906101000a900460ff16611273576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f546f74616c20737570706c79206d6179206368616e676500000000000000000081525060200191505060405180910390fd5b6000600754116112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f74616c20737570706c79206973207a65726f00000000000000000000000081525060200191505060405180910390fd5b61130034600554613f4490919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167f1ecaf5d6abf37d825612fa02d0f7a9db7b880595f4dbf94c8e645d2b1bee37d4346040518082815260200191505060405180910390a2565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ec5780601f106113c1576101008083540402835291602001916113ec565b820191906000526020600020905b8154815290600101906020018083116113cf57829003601f168201915b505050505081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611427338484613f60565b905092915050565b6000600754905090565b6114433333614223565b565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5265737472696374656420746f2070726f666974206469737472696275746f7281525060200191505060405180910390fd5b60008090505b8282905081101561157e5761157383838381811061152857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1684848481811061155157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16614223565b80600101905061150e565b505050565b600a5481565b6115933382614223565b50565b6000600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561168a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f416d6f756e74206578636565647320616c6c6f77616e6365000000000000000081525060200191505060405180910390fd5b611723843361171e85600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461436c90919063ffffffff16565b613f60565b80156117365750611735848484614383565b5b90509392505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5265737472696374656420746f206d696e74657200000000000000000000000081525060200191505060405180910390fd5b7f95581ace7737226d280f9814ae6267c15c73e513c71c48a432da5b991223891060405160405180910390a16000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b601281565b60008182600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011015611989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f416c6c6f77616e6365206f766572666c6f77000000000000000000000000000081525060200191505060405180910390fd5b611a223384611a1d85600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613f4490919063ffffffff16565b613f60565b905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5265737472696374656420746f206d696e74657200000000000000000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff1615611b70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f74616c20737570706c7920686173206265656e206669786564000000000081525060200191505060405180910390fd5b81600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611c1057600080fd5b505afa158015611c24573d6000803e3d6000fd5b505050506040513d6020811015611c3a57600080fd5b8101908080519060200190929190505050611cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415611d1b57600a600081548092919060010191905055505b611d3082600754613f4490919063ffffffff16565b600781905550611d8b82600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613f4490919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508273ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5265737472696374656420746f206e6577206f776e657200000000000000000081525060200191505060405180910390fd5b611f56336149b6565b565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461201a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e657720746f6b656e207265636f7665726572206973207a65726f000000000081525060200191505060405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121d0578073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff693c6449c4445af5f6bd9eaf2f1d405209024c25d65eb2321805553df1bb6a060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60006122568484846131ed565b80156122de5750600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211155b9050949350505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5265737472696374656420746f206d696e74657200000000000000000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff161561242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f74616c20737570706c7920686173206265656e206669786564000000000081525060200191505060405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612539576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f57686974656c6973742061646472657373206973207a65726f0000000000000081525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126ef578073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f10afc05abeac7c59bbc9efaa96af76388095ae1028cb85e59f676d20a7dbf64760405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000600660009054906101000a900460ff16158061271257506000600754145b1561272057600090506127ef565b612728614b56565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506127eb81604001516127dd6007546127cf85600001516127c1876020015160055461436c90919063ffffffff16565b614b0b90919063ffffffff16565b614b4290919063ffffffff16565b613f4490919063ffffffff16565b9150505b919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561297e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4e65772070726f666974206469737472696275746f72206973207a65726f000081525060200191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a91578073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f024c8e1d8737257a61b74ae4e70b314f3dc339e5a5c43de51344fca0b393358660405160405180910390a380600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b505780601f10612b2557610100808354040283529160200191612b50565b820191906000526020600020905b815481529060010190602001808311612b3357829003601f168201915b505050505081565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115612c4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f416d6f756e74206578636565647320616c6c6f77616e6365000000000000000081525060200191505060405180910390fd5b612ce53384612ce085600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461436c90919063ffffffff16565b613f60565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612daf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6577206f776e6572206973207a65726f00000000000000000000000000000081525060200191505060405180910390fd5b612e5b816149b6565b50565b6000612e6b338484614383565b905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612fad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e65772070726f666974206465706f7369746f72206973207a65726f0000000081525060200191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613163578073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4fdc16b3739cf80464626c98a53f8eea115ac9f94694287afc84b9dd1102cc2860405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600660009054906101000a900460ff1680156132385750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156132715750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156132bf5750600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548211155b80156133a15750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561336557600080fd5b505afa158015613379573d6000803e3d6000fd5b505050506040513d602081101561338f57600080fd5b81019080805190602001909291905050505b80156134835750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561344757600080fd5b505afa15801561345b573d6000803e3d6000fd5b505050506040513d602081101561347157600080fd5b81019080805190602001909291905050505b90509392505050565b600660009054906101000a900460ff1661350e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f546f74616c20737570706c79206d6179206368616e676500000000000000000081525060200191505060405180910390fd5b6000613519826126f2565b9050600554600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167f0bb36062f5e51c9cb6f165015f6e178eaa498868b42a1f797f2b864ddaca59ee826040518082815260200191505060405180910390a25050565b600660009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146136d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613775576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6577206f776e6572206973207a65726f00000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461387b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5265737472696374656420746f206f776e65720000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461393f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4d696e7465722068617320616c7265616479206265656e20736574000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156139e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4d696e746572206973207a65726f00000000000000000000000000000000000081525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5265737472696374656420746f20746f6b656e207265636f766572657200000081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613b8957600080fd5b505afa158015613b9d573d6000803e3d6000fd5b505050506040513d6020811015613bb357600080fd5b8101908080519060200190929190505050613c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154148015613cca57506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154145b613d3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e657720616464726573732065786973747320616c726561647900000000000081525060200191505060405180910390fd5b613d458361348c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015481600001556001820154816001015560028201548160020155905050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055600282016000905550508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f83ddb032791a0e182e3dd293d85ca1da7411793659d2c8bd8fbe346e38a7265160405160405180910390a38173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518082815260200191505060405180910390a3505050565b600080828401905083811015613f5657fe5b8091505092915050565b600083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561400257600080fd5b505afa158015614016573d6000803e3d6000fd5b505050506040513d602081101561402c57600080fd5b81019080805190602001909291905050506140af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff16614131576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f546f74616c20737570706c79206d6179206368616e676500000000000000000081525060200191505060405180910390fd5b82600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150509392505050565b61422c8261348c565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614301573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f182fd1cdcccc248c64c7d44f15aaa1374c533a4e902ef27c9d5afd6ae6665a43836040518082815260200191505060405180910390a3505050565b60008282111561437857fe5b818303905092915050565b600083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561442557600080fd5b505afa158015614439573d6000803e3d6000fd5b505050506040513d602081101561444f57600080fd5b81019080805190602001909291905050506144d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b83600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633af32abf826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561457257600080fd5b505afa158015614586573d6000803e3d6000fd5b505050506040513d602081101561459c57600080fd5b810190808051906020019092919050505061461f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f41646472657373206973206e6f742077686974656c697374656400000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff166146a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f546f74616c20737570706c79206d6179206368616e676500000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415614744576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f526563697069656e74206973207a65726f00000000000000000000000000000081525060200191505060405180910390fd5b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548411156147fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f416d6f756e7420657863656564732062616c616e63650000000000000000000081525060200191505060405180910390fd5b6148058661348c565b61480e8561348c565b61486384600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461436c90919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506148fe84600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613f4490919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a36001925050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ac6578073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080831415614b1e5760009050614b3c565b6000828402905082848281614b2f57fe5b0414614b3757fe5b809150505b92915050565b6000818381614b4d57fe5b04905092915050565b6040518060600160405280600081526020016000815260200160008152509056fea265627a7a72315820d9c87a8a5ae219dbe74808e7359f463bdc9a730dfb2a658251f935a6fbab0d0464736f6c634300050c0032

Deployed Bytecode Sourcemap

33392:8541:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12675:1;12656:8;;:15;;:20;12648:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12717:15;:13;:15::i;:::-;33392:8541;33456:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33456:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;33456:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16426:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16426:21:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36652:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36652:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36652:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35589:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35589:88:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15047:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15047:101:0;;;:::i;:::-;;15333:263;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15333:263:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15333:263:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;15333:263:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15333:263:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;15333:263:0;;;;;;;;;;;;:::i;:::-;;16454:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16454:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15156:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15156:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15156:133:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;40068:316;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40068:316:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40068:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31647:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31647:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34424:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34424:126:0;;;:::i;:::-;;33508:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33508:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37139:281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37139:281:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37139:281:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17686:396;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17686:396:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17686:396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2835:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2835:153:0;;;:::i;:::-;;32725:359;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32725:359:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32725:359:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;9381:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9381:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9381:51:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35814:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35814:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35814:118:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39111:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39111:223:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;39111:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13747:264;;;:::i;:::-;;18150:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18150:127:0;;;:::i;:::-;;7137:365;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7137:365:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7137:365:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14133:449;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14133:449:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14133:449:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1099:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1099:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13318:392;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13318:392:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13318:392:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;6351:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6351:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33481:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33481:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;33481:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37770:277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37770:277:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37770:277:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2568:185;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2568:185:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2568:185:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;39601:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39601:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39601:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9507:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9507:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9690:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9690:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9922:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9922:24:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1236:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1236:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12842:370;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12842:370:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12842:370:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;36178:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36178:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36178:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38353:363;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38353:363:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38353:363:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14670:333;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14670:333:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14670:333:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;10103:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10103:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2059:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2059:170:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2059:170:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;17262:224;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17262:224:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17262:224:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;34690:818;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34690:818:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34690:818:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13747:264;11769:15;;;;;;;;;;;11755:29;;:10;:29;;;11747:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12200:18;;;;;;;;;;;12192:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13868:1;13853:12;;:16;13845:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13922:27;13939:9;13922:12;;:16;;:27;;;;:::i;:::-;13907:12;:42;;;;13981:10;13967:36;;;13993:9;13967:36;;;;;;;;;;;;;;;;;;13747:264::o;33456:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16426:21::-;;;;;;;;;;;;;:::o;36652:134::-;36716:4;36740:38;36749:10;36761:8;36771:6;36740:8;:38::i;:::-;36733:45;;36652:134;;;;:::o;35589:88::-;35633:4;35657:12;;35650:19;;35589:88;:::o;15047:101::-;15096:44;15117:10;15129;15096:20;:44::i;:::-;15047:101::o;15333:263::-;11984:17;;;;;;;;;;;11970:31;;:10;:31;;;11962:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15472:6;15481:1;15472:10;;15467:122;15488:10;;:17;;15484:1;:21;15467:122;;;15527:50;15548:10;;15559:1;15548:13;;;;;;;;;;;;;;;15563:10;;15574:1;15563:13;;;;;;;;;;;;;;;15527:20;:50::i;:::-;15507:3;;;;;15467:122;;;;15333:263;;:::o;16454:33::-;;;;:::o;15156:133::-;15235:46;15256:10;15268:12;15235:20;:46::i;:::-;15156:133;:::o;40068:316::-;40147:4;40182:10;:17;40193:5;40182:17;;;;;;;;;;;;;;;:29;40200:10;40182:29;;;;;;;;;;;;;;;;40172:6;:39;;40164:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40260:70;40269:5;40276:10;40288:41;40322:6;40288:10;:17;40299:5;40288:17;;;;;;;;;;;;;;;:29;40306:10;40288:29;;;;;;;;;;;;;;;;:33;;:41;;;;:::i;:::-;40260:8;:70::i;:::-;:116;;;;;40347:29;40357:5;40364:3;40369:6;40347:9;:29::i;:::-;40260:116;40253:123;;40068:316;;;;;:::o;31647:29::-;;;;;;;;;;;;;:::o;34424:126::-;16901:6;;;;;;;;;;;16887:20;;:10;:20;;;16879:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34478:16;;;;;;;;;;34534:5;;;;;;;;;;;34505:37;;;33508:35;33541:2;33508:35;:::o;37139:281::-;37214:4;37285:7;37274;37239:10;:22;37250:10;37239:22;;;;;;;;;;;;;;;:32;37262:8;37239:32;;;;;;;;;;;;;;;;:42;:53;;37231:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37335:77;37344:10;37356:8;37366:45;37403:7;37366:10;:22;37377:10;37366:22;;;;;;;;;;;;;;;:32;37389:8;37366:32;;;;;;;;;;;;;;;;:36;;:45;;;;:::i;:::-;37335:8;:77::i;:::-;37328:84;;37139:281;;;;:::o;17686:396::-;16901:6;;;;;;;;;;;16887:20;;:10;:20;;;16879:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17088:18;;;;;;;;;;;17087:19;17079:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17769:3;6777:9;;;;;;;;;;;:23;;;6801:8;6777:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6777:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6777:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6777:33:0;;;;;;;;;;;;;;;;6769:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17814:1;17789:8;:13;17798:3;17789:13;;;;;;;;;;;;;;;:21;;;:26;17785:78;;;17832:17;;:19;;;;;;;;;;;;;17785:78;17890:25;17907:7;17890:12;;:16;;:25;;;;:::i;:::-;17875:12;:40;;;;17950:34;17976:7;17950:8;:13;17959:3;17950:13;;;;;;;;;;;;;;;:21;;;:25;;:34;;;;:::i;:::-;17926:8;:13;17935:3;17926:13;;;;;;;;;;;;;;;:21;;:58;;;;18009:3;18002:20;;;18014:7;18002:20;;;;;;;;;;;;;;;;;;18061:3;18038:36;;18055:3;18038:36;;;18066:7;18038:36;;;;;;;;;;;;;;;;;;17149:1;17686:396;;:::o;2835:153::-;2901:8;;;;;;;;;;;2887:22;;:10;:22;;;2879:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2950:30;2969:10;2950:18;:30::i;:::-;2835:153::o;32725:359::-;1651:5;;;;;;;;;;;1637:19;;:10;:19;;;1629:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32846:3;32816:34;;:18;:34;;;;32808:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32921:14;;;;;;;;;;;32899:36;;:18;:36;;;32895:182;;32994:18;32957:56;;32978:14;;;;;;;;;;;32957:56;;;;;;;;;;;;33047:18;33030:14;;:35;;;;;;;;;;;;;;;;;;32895:182;32725:359;:::o;9381:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35814:118::-;35873:4;35897:8;:19;35906:9;35897:19;;;;;;;;;;;;;;;:27;;;35890:34;;35814:118;;;:::o;39111:223::-;39225:4;39254:31;39266:5;39273:3;39278:6;39254:11;:31::i;:::-;:72;;;;;39299:10;:17;39310:5;39299:17;;;;;;;;;;;;;;;:27;39317:8;39299:27;;;;;;;;;;;;;;;;39289:6;:37;;39254:72;39247:79;;39111:223;;;;;;:::o;18150:127::-;16901:6;;;;;;;;;;;16887:20;;:10;:20;;;16879:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17088:18;;;;;;;;;;;17087:19;17079:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18233:4;18212:18;;:25;;;;;;;;;;;;;;;;;;18255:14;;;;;;;;;;18150:127::o;7137:365::-;1651:5;;;;;;;;;;;1637:19;;:10;:19;;;1629:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7254:3;7220:38;;7228:13;7220:38;;;;7212:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7339:9;;;;;;;;;;;7305:44;;7313:13;7305:44;;;7301:194;;7415:13;7371:59;;7395:9;;;;;;;;;;;7371:59;;;;;;;;;;;;7469:13;7447:9;;:36;;;;;;;;;;;;;;;;;;7301:194;7137:365;:::o;14133:449::-;14199:4;14221:18;;;;;;;;;;;14220:19;:40;;;;14259:1;14243:12;;:17;14220:40;14216:81;;;14284:1;14277:8;;;;14216:81;14309:30;;:::i;:::-;14342:8;:19;14351:9;14342:19;;;;;;;;;;;;;;;14309:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14381:193;14554:7;:19;;;14381:139;14507:12;;14381:92;14457:7;:15;;;14381:42;14398:7;:24;;;14381:12;;:16;;:42;;;;:::i;:::-;:75;;:92;;;;:::i;:::-;:125;;:139;;;;:::i;:::-;:172;;:193;;;;:::i;:::-;14374:200;;;14133:449;;;;:::o;1099:20::-;;;;;;;;;;;;;:::o;13318:392::-;1651:5;;;;;;;;;;;1637:19;;:10;:19;;;1629:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13448:3;13415:37;;:21;:37;;;;13407:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13529:17;;;;;;;;;;;13504:42;;:21;:42;;;13500:203;;13611:21;13568:65;;13592:17;;;;;;;;;;;13568:65;;;;;;;;;;;;13670:21;13650:17;;:41;;;;;;;;;;;;;;;;;;13500:203;13318:392;:::o;6351:26::-;;;;;;;;;;;;;:::o;33481:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37770:277::-;37845:4;37881:10;:22;37892:10;37881:22;;;;;;;;;;;;;;;:32;37904:8;37881:32;;;;;;;;;;;;;;;;37870:7;:43;;37862:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37962:77;37971:10;37983:8;37993:45;38030:7;37993:10;:22;38004:10;37993:22;;;;;;;;;;;;;;;:32;38016:8;37993:32;;;;;;;;;;;;;;;;:36;;:45;;;;:::i;:::-;37962:8;:77::i;:::-;37955:84;;37770:277;;;;:::o;2568:185::-;1651:5;;;;;;;;;;;1637:19;;:10;:19;;;1629:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2677:3;2656:25;;:9;:25;;;;2648:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2716:29;2735:9;2716:18;:29::i;:::-;2568:185;:::o;39601:126::-;39661:4;39685:34;39695:10;39707:3;39712:6;39685:9;:34::i;:::-;39678:41;;39601:126;;;;:::o;9507:30::-;;;;;;;;;;;;;:::o;9690:32::-;;;;;;;;;;;;;:::o;9922:24::-;;;;:::o;1236:23::-;;;;;;;;;;;;;:::o;12842:370::-;1651:5;;;;;;;;;;;1637:19;;:10;:19;;;1629:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12966:3;12935:35;;:19;:35;;;;12927:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13043:15;;;;;;;;;;;13020:38;;:19;:38;;;13016:189;;13119:19;13080:59;;13102:15;;;;;;;;;;;13080:59;;;;;;;;;;;;13174:19;13156:15;;:37;;;;;;;;;;;;;;;;;;13016:189;12842:370;:::o;36178:140::-;36255:4;36279:10;:21;36290:9;36279:21;;;;;;;;;;;;;;;:31;36301:8;36279:31;;;;;;;;;;;;;;;;36272:38;;36178:140;;;;:::o;38353:363::-;38445:4;38474:18;;;;;;;;;;;:56;;;;;38526:3;38509:21;;:5;:21;;;;38474:56;:92;;;;;38562:3;38547:19;;:3;:19;;;;38474:92;:142;;;;;38593:8;:15;38602:5;38593:15;;;;;;;;;;;;;;;:23;;;38583:6;:33;;38474:142;:189;;;;;38633:9;;;;;;;;;;;:23;;;38657:5;38633:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38633:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38633:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38633:30:0;;;;;;;;;;;;;;;;38474:189;:234;;;;;38680:9;;;;;;;;;;;:23;;;38704:3;38680:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38680:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38680:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38680:28:0;;;;;;;;;;;;;;;;38474:234;38467:241;;38353:363;;;;;:::o;14670:333::-;12200:18;;;;;;;;;;;12192:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14761:19;14783:27;14800:9;14783:16;:27::i;:::-;14761:49;;14862:12;;14823:8;:19;14832:9;14823:19;;;;;;;;;;;;;;;:36;;:51;;;;14919:14;14885:8;:19;14894:9;14885:19;;;;;;;;;;;;;;;:31;;:48;;;;14969:9;14951:44;;;14980:14;14951:44;;;;;;;;;;;;;;;;;;12257:1;14670:333;:::o;10103:30::-;;;;;;;;;;;;;:::o;2059:170::-;1651:5;;;;;;;;;;;1637:19;;:10;:19;;;1629:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2162:3;2141:25;;:9;:25;;;;2133:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2212:9;2201:8;;:20;;;;;;;;;;;;;;;;;;2059:170;:::o;17262:224::-;1651:5;;;;;;;;;;;1637:19;;:10;:19;;;1629:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17352:3;17334:22;;:6;;;;;;;;;;;:22;;;17326:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17426:3;17407:23;;:7;:23;;;;17399:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17471:7;17462:6;;:16;;;;;;;;;;;;;;;;;;17262:224;:::o;34690:818::-;32341:14;;;;;;;;;;;32327:28;;:10;:28;;;32319:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34823:11;6777:9;;;;;;;;;;;:23;;;6801:8;6777:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6777:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6777:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6777:33:0;;;;;;;;;;;;;;;;6769:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35126:1;35093:8;:21;35102:11;35093:21;;;;;;;;;;;;;;;:29;;;:34;:81;;;;;35173:1;35131:8;:21;35140:11;35131:21;;;;;;;;;;;;;;;:38;;;:43;35093:81;35085:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35235:30;35253:11;35235:17;:30::i;:::-;35302:8;:21;35311:11;35302:21;;;;;;;;;;;;;;;35278:8;:21;35287:11;35278:21;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;35341:8;:21;35350:11;35341:21;;;;;;;;;;;;;;;;35334:28;;;;;;;;;;;;;;;;;;;;35407:11;35380:39;;35394:11;35380:39;;;;;;;;;;;;35457:11;35435:65;;35444:11;35435:65;;;35470:8;:21;35479:11;35470:21;;;;;;;;;;;;;;;:29;;;35435:65;;;;;;;;;;;;;;;;;;32400:1;34690:818;;:::o;172:139::-;224:4;241:6;254:1;250;:5;241:14;;280:1;275;:6;;268:14;;;;302:1;295:8;;;172:139;;;;:::o;40719:309::-;40887:4;40826:5;6777:9;;;;;;;;;;;:23;;;6801:8;6777:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6777:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6777:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6777:33:0;;;;;;;;;;;;;;;;6769:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12200:18;;;;;;;;;;;12192:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40939:6;40909:10;:17;40920:5;40909:17;;;;;;;;;;;;;;;:27;40927:8;40909:27;;;;;;;;;;;;;;;:36;;;;40979:8;40963:33;;40972:5;40963:33;;;40989:6;40963:33;;;;;;;;;;;;;;;;;;41016:4;41009:11;;40719:309;;;;;;:::o;15640:395::-;15739:28;15757:9;15739:17;:28::i;:::-;15780:25;15808:8;:19;15817:9;15808:19;;;;;;;;;;;;;;;:31;;;15780:59;;15886:1;15852:8;:19;15861:9;15852:19;;;;;;;;;;;;;;;:31;;:35;;;;15898:12;:21;;:43;15920:20;15898:43;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15898:43:0;15992:12;15959:68;;15981:9;15959:68;;;16006:20;15959:68;;;;;;;;;;;;;;;;;;15640:395;;;:::o;355:116::-;407:4;436:1;431;:6;;424:14;;;;462:1;458;:5;451:12;;355:116;;;;:::o;41294:634::-;41488:4;41397:5;6777:9;;;;;;;;;;;:23;;;6801:8;6777:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6777:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6777:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6777:33:0;;;;;;;;;;;;;;;;6769:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41429:3;6777:9;;;;;;;;;;;:23;;;6801:8;6777:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6777:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6777:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6777:33:0;;;;;;;;;;;;;;;;6769:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12200:18;;;;;;;;;;;12192:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41533:3;41518:19;;:3;:19;;;;41510:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41588:8;:15;41597:5;41588:15;;;;;;;;;;;;;;;:23;;;41578:6;:33;;41570:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41651:24;41669:5;41651:17;:24::i;:::-;41686:22;41704:3;41686:17;:22::i;:::-;41747:35;41775:6;41747:8;:15;41756:5;41747:15;;;;;;;;;;;;;;;:23;;;:27;;:35;;;;:::i;:::-;41721:8;:15;41730:5;41721:15;;;;;;;;;;;;;;;:23;;:61;;;;41817:33;41843:6;41817:8;:13;41826:3;41817:13;;;;;;;;;;;;;;;:21;;;:25;;:33;;;;:::i;:::-;41793:8;:13;41802:3;41793:13;;;;;;;;;;;;;;;:21;;:57;;;;41884:3;41868:28;;41877:5;41868:28;;;41889:6;41868:28;;;;;;;;;;;;;;;;;;41916:4;41909:11;;6852:1;41294:634;;;;;;:::o;3117:235::-;3200:5;;;;;;;;;;;3187:18;;:9;:18;;;3183:128;;3255:9;3227:38;;3248:5;;;;;;;;;;;3227:38;;;;;;;;;;;;3290:9;3282:5;;:17;;;;;;;;;;;;;;;;;;3183:128;3340:3;3321:8;;:23;;;;;;;;;;;;;;;;;;3117:235;:::o;515:202::-;567:4;593:1;588;:6;584:47;;;618:1;611:8;;;;584:47;643:6;656:1;652;:5;643:14;;686:1;681;677;:5;;;;;;:10;670:18;;;;708:1;701:8;;;515:202;;;;;:::o;765:89::-;817:4;845:1;841;:5;;;;;;834:12;;765:89;;;;:::o;33392:8541::-;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://d9c87a8a5ae219dbe74808e7359f463bdc9a730dfb2a658251f935a6fbab0d04
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.