Sponsored:   Ubex.com - World roadshow: Seoul Sep 17-19, Singapore Sep 19-20, Dubai 18-23. Meet us!.
Contract Overview | Envion
Balance: 2,441.670957359648584628 Ether
Ether Value: $517,585.41 (@ $211.98/ETH)
Transactions: 103163 txns
Token Tracker: Envion (EVN)
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xc068ead86c8f732753d6959a5a4b58b354280480at txn 0x8f25b982c38ac299d5f9edfeefb722df7bbe4dbaf35490b54492c1472431aee0
Token Balance:
 Latest 25 txns From a total of 103163 Transactions
(+2 PendingTxns)

TxHash Age From To Value [TxFee]
0x0c206b1c61bd579a59081313ecd4e91ce865222db9a86edb0e810b880e67d048(pending)0xac8a9a6c1c23d07a4c217023bff25900701c22ac  IN  0xd780ae2bf04cd96e577d3d014762f831d97129d00 Ether(Pending)
0x60195b79b5f37c69f5d9c64ce9ab75dfb5871a69b12750a302d48b69bb938119(pending)0x7f4d5d2425455cf0f629f55a9c2e5a94f454ca79  IN  0xd780ae2bf04cd96e577d3d014762f831d97129d00 Ether(Pending)
0x74edb23fe8bdb7a08691fe2fed118e4d41aca80ea21458b607e5e1fca0c0facb44 mins ago0x04e96973e792744bf1634cc8014de338df8a5ba2  IN   Envion0 Ether0.00037236
0x851d535ebfe690ea14f93789a69873b9daa9e201841b5ee3ccc5e8918799b1aa6 hrs 37 mins ago0xaffccb166efa74e0a22b944d8232993b2c843b77  IN   Envion0 Ether0.000182964
0x7efac70d2faa6f3a6af8c6d0bc2cb56ce95a761da45726115209052e92abeaa68 hrs 52 mins ago0x9b2ebf68dfe1d60b9f706e654894602f9750a277  IN   Envion0 Ether0.001017784
0x65d4b66f17154f2d34a77be5959059db38d07c691072ee5a412ea038f34e207a9 hrs 1 min ago0x9b2ebf68dfe1d60b9f706e654894602f9750a277  IN   Envion0 Ether0.00414223
0x8e78f303a7f8ca44279b94d75461c103da40bbb9afa8d1d926bca92c38fd7cbf11 hrs 2 mins ago0x001f2a761a940c820c0240d24645f76c2baca5c6  IN   Envion0 Ether0.00027832
0x02a14e353a65789ac86e983dd76fbe6f34a9c08de8a3683376ba50dfb1ac4edf11 hrs 27 mins ago0x1a2def5b88936a02dd0da76a40b78fdaf4913629  IN   Envion0 Ether0.000411669
0x0b7d946064d246299c2f257a39f5b45b9c52302120cc4e1d2160764e7377cd4414 hrs 35 mins ago0x5adaf66a3084281fb03856be96240abecfdf26b3  IN   Envion0 Ether0.000529242
0x30d5f3e8bd337474662b30d88ab825f71378495d1b8c5ee72f90f3fa3e8b5fe314 hrs 38 mins ago0x5adaf66a3084281fb03856be96240abecfdf26b3  IN   Envion0 Ether0.0008730675
0xf9908264235cac54c47f630d5bd617bc18d26717eabf513e4e9d3942464737b814 hrs 50 mins ago0x5adaf66a3084281fb03856be96240abecfdf26b3  IN   Envion0 Ether0.000232818
0xe945a9110e6dfa6e07282c48c9036f5dc55a7b0996b5e1020254c2d0e256377315 hrs 4 mins ago0x2fbc720aed7c117e9d67ee85151a4fb95ea46cfc  IN   Envion0 Ether0.003547976
0x36474a76927e7bfd3905325b18d897dfaa9fee70b0de9a6893bccd7d21e9b2a615 hrs 34 mins ago0x27d86019289fdfef83ea9fbf42d2de0a12a857f6  IN   Envion0 Ether0.00101516
0xf8be5d437734fdacbc3de27168c9a3038c72a0bc47791c714696e1c759d6f34916 hrs ago0xc8a3aa36cc29d24338ebbac82942cb16e7db2c5a  IN   Envion0 Ether0.000365416
0x507ac5ebd4f40d8af8204b5192349463f0533f040f8a21dbcc8e27df0c94035816 hrs 51 mins ago0xf4ec1093041a8a12db27bbac051501db9a351679  IN   Envion0 Ether0.000148944
0x2996ad4151903ded3c3b73b34d5d885688e1e872b62b23a8dfcf5b136bb06f321 day 3 hrs ago0xe4dde314f5f30d36180f6bc305734ffe5637d370  IN   Envion0 Ether0.0001266024
0x490c63f5d209dfaa48488cb0c72a8ac55d71a48286153892cd432e07041fcd591 day 5 hrs ago0x8d42e1d89584536462e908e84a78a2c5be8122a7  IN   Envion0 Ether0.000182964
0xd17fbacc33e8bfa6cede42c29573a74dceeb1858818ea62ecfc47fb40ce2304a1 day 5 hrs ago0x7de8af7c01b8d688dd342d12df688ad8c067a2d8  IN   Envion0 Ether0.0001264956
0x36cfb4802f607b62af98c636dce500e47617c59866bd0fd2d47603754b71ed7c1 day 8 hrs ago0x7de8af7c01b8d688dd342d12df688ad8c067a2d8  IN   Envion0 Ether0.000153328
0x5adc32dc3adc78cb3bde6f78a69c63a7bb0599ed9c4d4daa27b2e7169c4b86a31 day 8 hrs ago0x7de8af7c01b8d688dd342d12df688ad8c067a2d8  IN   Envion0 Ether0.000153328
0xdced51426816cbb94d5be3db8113fa0885006a74e86eb1497c41903cf9cd97d11 day 12 hrs ago0x2f73cba4a9190f2add2848a21bdaab34794926ea  IN   Envion0 Ether0.000229345
0x74f3893087618acadcb78e961c131eb5d9e13f37e6398e325afb1c5d651886021 day 12 hrs ago0x6c866606ef4f0c922665cc8e729ab72afacc2e6b  IN   Envion0 Ether0.00027412
0x6b11465bc1ee0aee9610bafc5a2aa6c8ffe8e297f2a8dfed9243c5b930c31d6a1 day 12 hrs ago0x5adaf66a3084281fb03856be96240abecfdf26b3  IN   Envion0 Ether0.000103476
0x526b1871d0c02800a23bdecf2efd499682a41db05ea3bcef1aa87f7bae2031631 day 12 hrs ago0x5adaf66a3084281fb03856be96240abecfdf26b3  IN   Envion0 Ether0.000155212
0xf8cdb379c0fc4af6d3fff42e4df6ec1cdda559eb6a71bba4b4d9cc158dd587bf1 day 13 hrs agoHitBTC_2  IN   Envion0 Ether0.0003162411
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click Here To View More View All
ParentTxHash Block Age From To Value
0x25862dd650edc526af190841e27ff244e49691b65ff1163679ff42505f9544d3614075936 days 13 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x29a4819d653c66045793e7a30c1b42613a9d9a4f742 Ether
0x6182cfd6ac2a3cc2865b642a5edac577a9cbc626fd786be12083413b4e4a5fd1614071536 days 14 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x29a4819d653c66045793e7a30c1b42613a9d9a4f8,000 Ether
0x9f6125e2d3a3fd470ad723b68c8df1022a89bf75971ff8c312ed22ca82dccff1614069236 days 14 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x29a4819d653c66045793e7a30c1b42613a9d9a4f1,000 Ether
0xb9c1a62503bfe0023e388cff78564b74fe61ce275ce7705c3f04ca35eea26d26614059436 days 14 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x29a4819d653c66045793e7a30c1b42613a9d9a4f100 Ether
0x2674bddfe13b6fb9f998fadd069cfcdf79ed4f4bcca168318f7461e7a206d798614041236 days 15 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00xf91d6c994333e07b29d103f0cf0f93d86c5243bc1 Ether
0x6b96780434bc27455eec7377192395da0e2ee841f5adf35bca078c13d77824875258963187 days 19 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x5360b7a71db9aa771ffb99ff2640429a9ad52000189.99 Ether
0xd31fe47e51ba1e70bfac6a95dd49685aef8d2b909a5cabcc6258b2c0512d4af95060430221 days 11 hrs ago0x1522900b6dafac587d499a862861c0869be6e4280xd780ae2bf04cd96e577d3d014762f831d97129d00.225 Ether
0xf105a568d9e851afeaf4cffda3f22811a39a52a7cd94aa235331c00cece491585005536230 days 17 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x8bac85953664753a58d3c34287cdf096caa3fbbf34,260.693974360090757049 Ether
0x0af2f3b77ededc5319868c83cad8b68a74184f7a34d9d27672c75475e45113d34928573243 days 19 hrs ago0x1522900b6dafac587d499a862861c0869be6e4280xd780ae2bf04cd96e577d3d014762f831d97129d02.3 Ether
0x7bcb3a6e4a5b008ec40ff0a65f529366848349ae9024ba890cf4043d366e95da4914451246 days 8 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xb5a4f2a2c68c230e36bc859b1e0cac0639191ee672cf9805554281d5dbbd7c9d4913591246 days 12 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x1a93d7270095dead3f66d1995cad5380d3af4b88acfee77a7f5f557416bdd24a4910727247 days 1 hr ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x96d67dbb8c45e7204b07bfa83b5e25b97dcf2912cdc72559c6971543fcc464634910486247 days 2 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xed626b61065d0aab13e6ceea030a4eb359d0e974df7d48eaaacd08d5084f17644910238247 days 3 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x8e3ecc28a460e943804c430fefe550e2312ecc32d54f1a3e3b7ad6fd138abb124909994247 days 4 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xb61db4de9af1f48e8fa2a993513bce4a521ddd5e7e2a775a115bb27b97326e0b4909771247 days 5 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xe57392af4782ae67c3407e18fb5448bf1b34b0e4a8fccffcd4bc5c90212aa8b04909556247 days 6 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xc3f82f7db54880c848a6c2ba2c42125bcfc8a2cb3a6530252be3c7929db885bd4907196247 days 16 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xcdde8d26c4e03f9393c73d9ba098bba6d19c9fae01e6d28e685946f98f0305bf4906946247 days 17 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x9b81987f321cc7b76c4aacc521f67036a8e22ea24f1253eda0eb986b4eff53444906721247 days 18 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x2607f6e94d4e54e26c15a8dc6bbc427369999423416f4cbe67a61c1cba42def04906494247 days 19 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xd980fc1aca7d4e9f9c43c4e7452ac424d34f57bd1fa6527debdc5b605bcdff864906200247 days 20 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x92a2c6f83d575fd2ba5b720f8d0670f00049ae72794227d6d80ce1103b842c5c4905948247 days 21 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x2af016925a6eeff3dcecda657a71ad4e0df6c371fb55e1da886516600d9243234905697247 days 22 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x5ed944aafb01f26dfa95efc76eefbb4a8514d47e45a51e3bb00a0775c16910fe4905466247 days 23 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), NestedArrayFunctionCallDecoder (medium-severity), ZeroFunctionSelector (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: EVNToken
Compiler Text: v0.4.15+commit.bbb8e64f
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.15;

/**
 * @title Safe math operations that throw error on overflow.
 *
 * Credit: Taking ideas from FirstBlood token
 */
library SafeMath {

    /** 
     * @dev Safely add two numbers.
     *
     * @param x First operant.
     * @param y Second operant.
     * @return The result of x+y.
     */
    function add(uint256 x, uint256 y)
    internal constant
    returns(uint256) {
        uint256 z = x + y;
        assert((z >= x) && (z >= y));
        return z;
    }

    /** 
     * @dev Safely substract two numbers.
     *
     * @param x First operant.
     * @param y Second operant.
     * @return The result of x-y.
     */
    function sub(uint256 x, uint256 y)
    internal constant
    returns(uint256) {
        assert(x >= y);
        uint256 z = x - y;
        return z;
    }

    /** 
     * @dev Safely multiply two numbers.
     *
     * @param x First operant.
     * @param y Second operant.
     * @return The result of x*y.
     */
    function mul(uint256 x, uint256 y)
    internal constant
    returns(uint256) {
        uint256 z = x * y;
        assert((x == 0) || (z/x == y));
        return z;
    }

    /**
    * @dev Parse a floating point number from String to uint, e.g. "250.56" to "25056"
     */
    function parse(string s) 
    internal constant 
    returns (uint256) 
    {
    bytes memory b = bytes(s);
    uint result = 0;
    for (uint i = 0; i < b.length; i++) {
        if (b[i] >= 48 && b[i] <= 57) {
            result = result * 10 + (uint(b[i]) - 48); 
        }
    }
    return result; 
}
}

/**
 * @title The abstract ERC-20 Token Standard definition.
 *
 * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
 */
contract Token {
    /// @dev Returns the total token supply.
    uint256 public totalSupply;

    function balanceOf(address _owner) public constant returns (uint256 balance);
    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
    function allowance(address _owner, address _spender) public constant returns (uint256 remaining);

    /// @dev MUST trigger when tokens are transferred, including zero value transfers.
    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    /// @dev MUST trigger on any successful call to approve(address _spender, uint256 _value).
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

/**
 * @title Default implementation of the ERC-20 Token Standard.
 */
contract StandardToken is Token {

    mapping (address => uint256) balances;
    mapping (address => mapping (address => uint256)) allowed;

    modifier onlyPayloadSize(uint numwords) {
        assert(msg.data.length == numwords * 32 + 4);
        _;
    }

    /**
     * @dev Transfers _value amount of tokens to address _to, and MUST fire the Transfer event. 
     * @dev The function SHOULD throw if the _from account balance does not have enough tokens to spend.
     *
     * @dev A token contract which creates new tokens SHOULD trigger a Transfer event with the _from address set to 0x0 when tokens are created.
     *
     * Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event.
     *
     * @param _to The receiver of the tokens.
     * @param _value The amount of tokens to send.
     * @return True on success, false otherwise.
     */
    function transfer(address _to, uint256 _value)
    public
    returns (bool success) {
        if (balances[msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) {
            balances[msg.sender] = SafeMath.sub(balances[msg.sender], _value);
            balances[_to] = SafeMath.add(balances[_to], _value);
            Transfer(msg.sender, _to, _value);
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Transfers _value amount of tokens from address _from to address _to, and MUST fire the Transfer event.
     *
     * @dev The transferFrom method is used for a withdraw workflow, allowing contracts to transfer tokens on your behalf. 
     * @dev This can be used for example to allow a contract to transfer tokens on your behalf and/or to charge fees in 
     * @dev sub-currencies. The function SHOULD throw unless the _from account has deliberately authorized the sender of 
     * @dev the message via some mechanism.
     *
     * Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event.
     *
     * @param _from The sender of the tokens.
     * @param _to The receiver of the tokens.
     * @param _value The amount of tokens to send.
     * @return True on success, false otherwise.
     */
    function transferFrom(address _from, address _to, uint256 _value)
    public
    returns (bool success) {
        if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) {
            balances[_to] = SafeMath.add(balances[_to], _value);
            balances[_from] = SafeMath.sub(balances[_from], _value);
            allowed[_from][msg.sender] = SafeMath.sub(allowed[_from][msg.sender], _value);
            Transfer(_from, _to, _value);
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns the account balance of another account with address _owner.
     *
     * @param _owner The address of the account to check.
     * @return The account balance.
     */
    function balanceOf(address _owner)
    public constant
    returns (uint256 balance) {
        return balances[_owner];
    }

    /**
     * @dev Allows _spender to withdraw from your account multiple times, up to the _value amount. 
     * @dev If this function is called again it overwrites the current allowance with _value.
     *
     * @dev NOTE: To prevent attack vectors like the one described in [1] and discussed in [2], clients 
     * @dev SHOULD make sure to create user interfaces in such a way that they set the allowance first 
     * @dev to 0 before setting it to another value for the same spender. THOUGH The contract itself 
     * @dev shouldn't enforce it, to allow backwards compatilibilty with contracts deployed before.
     * @dev [1] https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/
     * @dev [2] https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * @param _spender The address which will spend the funds.
     * @param _value The amount of tokens to be spent.
     * @return True on success, false otherwise.
     */
    function approve(address _spender, uint256 _value)
    public
    onlyPayloadSize(2)
    returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    /**
     * @dev Returns the amount which _spender is still allowed to withdraw from _owner.
     *
     * @param _owner The address of the sender.
     * @param _spender The address of the receiver.
     * @return The allowed withdrawal amount.
     */
    function allowance(address _owner, address _spender)
    public constant
    onlyPayloadSize(2)
    returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }
}


// <ORACLIZE_API>
/*
Copyright (c) 2015-2016 Oraclize SRL
Copyright (c) 2016 Oraclize LTD



Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:



The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.



THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

contract OraclizeI {
    address public cbAddress;
    function query(uint _timestamp, string _datasource, string _arg) payable returns (bytes32 _id);
    function query_withGasLimit(uint _timestamp, string _datasource, string _arg, uint _gaslimit) payable returns (bytes32 _id);
    function query2(uint _timestamp, string _datasource, string _arg1, string _arg2) payable returns (bytes32 _id);
    function query2_withGasLimit(uint _timestamp, string _datasource, string _arg1, string _arg2, uint _gaslimit) payable returns (bytes32 _id);
    function queryN(uint _timestamp, string _datasource, bytes _argN) payable returns (bytes32 _id);
    function queryN_withGasLimit(uint _timestamp, string _datasource, bytes _argN, uint _gaslimit) payable returns (bytes32 _id);
    function getPrice(string _datasource) returns (uint _dsprice);
    function getPrice(string _datasource, uint gaslimit) returns (uint _dsprice);
    function useCoupon(string _coupon);
    function setProofType(byte _proofType);
    function setConfig(bytes32 _config);
    function setCustomGasPrice(uint _gasPrice);
    function randomDS_getSessionPubKeyHash() returns(bytes32);
}
contract OraclizeAddrResolverI {
    function getAddress() returns (address _addr);
}
contract usingOraclize {
    uint constant day = 60*60*24;
    uint constant week = 60*60*24*7;
    uint constant month = 60*60*24*30;
    byte constant proofType_NONE = 0x00;
    byte constant proofType_TLSNotary = 0x10;
    byte constant proofType_Android = 0x20;
    byte constant proofType_Ledger = 0x30;
    byte constant proofType_Native = 0xF0;
    byte constant proofStorage_IPFS = 0x01;
    uint8 constant networkID_auto = 0;
    uint8 constant networkID_mainnet = 1;
    uint8 constant networkID_testnet = 2;
    uint8 constant networkID_morden = 2;
    uint8 constant networkID_consensys = 161;

    OraclizeAddrResolverI OAR;

    OraclizeI oraclize;
    modifier oraclizeAPI {
        if((address(OAR)==0)||(getCodeSize(address(OAR))==0)) oraclize_setNetwork(networkID_auto);
        oraclize = OraclizeI(OAR.getAddress());
        _;
    }
    modifier coupon(string code){
        oraclize = OraclizeI(OAR.getAddress());
        oraclize.useCoupon(code);
        _;
    }

    function oraclize_setNetwork(uint8 networkID) internal returns(bool){
        if (getCodeSize(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed)>0){ //mainnet
            OAR = OraclizeAddrResolverI(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed);
            oraclize_setNetworkName("eth_mainnet");
            return true;
        }
        if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1)>0){ //ropsten testnet
            OAR = OraclizeAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1);
            oraclize_setNetworkName("eth_ropsten3");
            return true;
        }
        if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e)>0){ //kovan testnet
            OAR = OraclizeAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e);
            oraclize_setNetworkName("eth_kovan");
            return true;
        }
        if (getCodeSize(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48)>0){ //rinkeby testnet
            OAR = OraclizeAddrResolverI(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48);
            oraclize_setNetworkName("eth_rinkeby");
            return true;
        }
        if (getCodeSize(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475)>0){ //ethereum-bridge
            OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475);
            return true;
        }
        if (getCodeSize(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF)>0){ //ether.camp ide
            OAR = OraclizeAddrResolverI(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF);
            return true;
        }
        if (getCodeSize(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA)>0){ //browser-solidity
            OAR = OraclizeAddrResolverI(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA);
            return true;
        }
        return false;
    }

    function __callback(bytes32 myid, string result) {
        __callback(myid, result, new bytes(0));
    }
    function __callback(bytes32 myid, string result, bytes proof) {
    }
    
    function oraclize_useCoupon(string code) oraclizeAPI internal {
        oraclize.useCoupon(code);
    }

    function oraclize_getPrice(string datasource) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource);
    }

    function oraclize_getPrice(string datasource, uint gaslimit) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource, gaslimit);
    }
    
    function oraclize_query(string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(0, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(timestamp, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(timestamp, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(0, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(0, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(timestamp, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(timestamp, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(0, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];       
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];       
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }

    function oraclize_cbAddress() oraclizeAPI internal returns (address){
        return oraclize.cbAddress();
    }
    function oraclize_setProof(byte proofP) oraclizeAPI internal {
        return oraclize.setProofType(proofP);
    }
    function oraclize_setCustomGasPrice(uint gasPrice) oraclizeAPI internal {
        return oraclize.setCustomGasPrice(gasPrice);
    }
    function oraclize_setConfig(bytes32 config) oraclizeAPI internal {
        return oraclize.setConfig(config);
    }
    
    function oraclize_randomDS_getSessionPubKeyHash() oraclizeAPI internal returns (bytes32){
        return oraclize.randomDS_getSessionPubKeyHash();
    }

    function getCodeSize(address _addr) constant internal returns(uint _size) {
        assembly {
            _size := extcodesize(_addr)
        }
    }

    function parseAddr(string _a) internal returns (address){
        bytes memory tmp = bytes(_a);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i=2; i<2+2*20; i+=2){
            iaddr *= 256;
            b1 = uint160(tmp[i]);
            b2 = uint160(tmp[i+1]);
            if ((b1 >= 97)&&(b1 <= 102)) b1 -= 87;
            else if ((b1 >= 65)&&(b1 <= 70)) b1 -= 55;
            else if ((b1 >= 48)&&(b1 <= 57)) b1 -= 48;
            if ((b2 >= 97)&&(b2 <= 102)) b2 -= 87;
            else if ((b2 >= 65)&&(b2 <= 70)) b2 -= 55;
            else if ((b2 >= 48)&&(b2 <= 57)) b2 -= 48;
            iaddr += (b1*16+b2);
        }
        return address(iaddr);
    }

    function strCompare(string _a, string _b) internal returns (int) {
        bytes memory a = bytes(_a);
        bytes memory b = bytes(_b);
        uint minLength = a.length;
        if (b.length < minLength) minLength = b.length;
        for (uint i = 0; i < minLength; i ++)
            if (a[i] < b[i])
                return -1;
            else if (a[i] > b[i])
                return 1;
        if (a.length < b.length)
            return -1;
        else if (a.length > b.length)
            return 1;
        else
            return 0;
    }

    function indexOf(string _haystack, string _needle) internal returns (int) {
        bytes memory h = bytes(_haystack);
        bytes memory n = bytes(_needle);
        if(h.length < 1 || n.length < 1 || (n.length > h.length))
            return -1;
        else if(h.length > (2**128 -1))
            return -1;
        else
        {
            uint subindex = 0;
            for (uint i = 0; i < h.length; i ++)
            {
                if (h[i] == n[0])
                {
                    subindex = 1;
                    while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex])
                    {
                        subindex++;
                    }
                    if(subindex == n.length)
                        return int(i);
                }
            }
            return -1;
        }
    }

    function strConcat(string _a, string _b, string _c, string _d, string _e) internal returns (string) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
        for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
        for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
        for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
        for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
        return string(babcde);
    }

    function strConcat(string _a, string _b, string _c, string _d) internal returns (string) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string _a, string _b, string _c) internal returns (string) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string _a, string _b) internal returns (string) {
        return strConcat(_a, _b, "", "", "");
    }

    // parseInt
    function parseInt(string _a) internal returns (uint) {
        return parseInt(_a, 0);
    }

    // parseInt(parseFloat*10^_b)
    function parseInt(string _a, uint _b) internal returns (uint) {
        bytes memory bresult = bytes(_a);
        uint mint = 0;
        bool decimals = false;
        for (uint i=0; i<bresult.length; i++){
            if ((bresult[i] >= 48)&&(bresult[i] <= 57)){
                if (decimals){
                   if (_b == 0) break;
                    else _b--;
                }
                mint *= 10;
                mint += uint(bresult[i]) - 48;
            } else if (bresult[i] == 46) decimals = true;
        }
        if (_b > 0) mint *= 10**_b;
        return mint;
    }

    function uint2str(uint i) internal returns (string){
        if (i == 0) return "0";
        uint j = i;
        uint len;
        while (j != 0){
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (i != 0){
            bstr[k--] = byte(48 + i % 10);
            i /= 10;
        }
        return string(bstr);
    }
    
    function stra2cbor(string[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }

    function ba2cbor(bytes[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }
        
        
    string oraclize_network_name;
    function oraclize_setNetworkName(string _network_name) internal {
        oraclize_network_name = _network_name;
    }
    
    function oraclize_getNetworkName() internal returns (string) {
        return oraclize_network_name;
    }
    
    function oraclize_newRandomDSQuery(uint _delay, uint _nbytes, uint _customGasLimit) internal returns (bytes32){
        if ((_nbytes == 0)||(_nbytes > 32)) throw;
        bytes memory nbytes = new bytes(1);
        nbytes[0] = byte(_nbytes);
        bytes memory unonce = new bytes(32);
        bytes memory sessionKeyHash = new bytes(32);
        bytes32 sessionKeyHash_bytes32 = oraclize_randomDS_getSessionPubKeyHash();
        assembly {
            mstore(unonce, 0x20)
            mstore(add(unonce, 0x20), xor(blockhash(sub(number, 1)), xor(coinbase, timestamp)))
            mstore(sessionKeyHash, 0x20)
            mstore(add(sessionKeyHash, 0x20), sessionKeyHash_bytes32)
        }
        bytes[3] memory args = [unonce, nbytes, sessionKeyHash]; 
        bytes32 queryId = oraclize_query(_delay, "random", args, _customGasLimit);
        oraclize_randomDS_setCommitment(queryId, sha3(bytes8(_delay), args[1], sha256(args[0]), args[2]));
        return queryId;
    }
    
    function oraclize_randomDS_setCommitment(bytes32 queryId, bytes32 commitment) internal {
        oraclize_randomDS_args[queryId] = commitment;
    }
    
    mapping(bytes32=>bytes32) oraclize_randomDS_args;
    mapping(bytes32=>bool) oraclize_randomDS_sessionKeysHashVerified;

    function verifySig(bytes32 tosignh, bytes dersig, bytes pubkey) internal returns (bool){
        bool sigok;
        address signer;
        
        bytes32 sigr;
        bytes32 sigs;
        
        bytes memory sigr_ = new bytes(32);
        uint offset = 4+(uint(dersig[3]) - 0x20);
        sigr_ = copyBytes(dersig, offset, 32, sigr_, 0);
        bytes memory sigs_ = new bytes(32);
        offset += 32 + 2;
        sigs_ = copyBytes(dersig, offset+(uint(dersig[offset-1]) - 0x20), 32, sigs_, 0);

        assembly {
            sigr := mload(add(sigr_, 32))
            sigs := mload(add(sigs_, 32))
        }
        
        
        (sigok, signer) = safer_ecrecover(tosignh, 27, sigr, sigs);
        if (address(sha3(pubkey)) == signer) return true;
        else {
            (sigok, signer) = safer_ecrecover(tosignh, 28, sigr, sigs);
            return (address(sha3(pubkey)) == signer);
        }
    }

    function oraclize_randomDS_proofVerify__sessionKeyValidity(bytes proof, uint sig2offset) internal returns (bool) {
        bool sigok;
        
        // Step 6: verify the attestation signature, APPKEY1 must sign the sessionKey from the correct ledger app (CODEHASH)
        bytes memory sig2 = new bytes(uint(proof[sig2offset+1])+2);
        copyBytes(proof, sig2offset, sig2.length, sig2, 0);
        
        bytes memory appkey1_pubkey = new bytes(64);
        copyBytes(proof, 3+1, 64, appkey1_pubkey, 0);
        
        bytes memory tosign2 = new bytes(1+65+32);
        tosign2[0] = 1; //role
        copyBytes(proof, sig2offset-65, 65, tosign2, 1);
        bytes memory CODEHASH = hex"fd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c";
        copyBytes(CODEHASH, 0, 32, tosign2, 1+65);
        sigok = verifySig(sha256(tosign2), sig2, appkey1_pubkey);
        
        if (sigok == false) return false;
        
        
        // Step 7: verify the APPKEY1 provenance (must be signed by Ledger)
        bytes memory LEDGERKEY = hex"7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4";
        
        bytes memory tosign3 = new bytes(1+65);
        tosign3[0] = 0xFE;
        copyBytes(proof, 3, 65, tosign3, 1);
        
        bytes memory sig3 = new bytes(uint(proof[3+65+1])+2);
        copyBytes(proof, 3+65, sig3.length, sig3, 0);
        
        sigok = verifySig(sha256(tosign3), sig3, LEDGERKEY);
        
        return sigok;
    }
    
    modifier oraclize_randomDS_proofVerify(bytes32 _queryId, string _result, bytes _proof) {
        // Step 1: the prefix has to match 'LP\x01' (Ledger Proof version 1)
        if ((_proof[0] != "L")||(_proof[1] != "P")||(_proof[2] != 1)) throw;
        
        bool proofVerified = oraclize_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), oraclize_getNetworkName());
        if (proofVerified == false) throw;
        
        _;
    }
    
    function matchBytes32Prefix(bytes32 content, bytes prefix) internal returns (bool){
        bool match_ = true;
        
        for (var i=0; i<prefix.length; i++){
            if (content[i] != prefix[i]) match_ = false;
        }
        
        return match_;
    }

    function oraclize_randomDS_proofVerify__main(bytes proof, bytes32 queryId, bytes result, string context_name) internal returns (bool){
        bool checkok;
        
        
        // Step 2: the unique keyhash has to match with the sha256 of (context name + queryId)
        uint ledgerProofLength = 3+65+(uint(proof[3+65+1])+2)+32;
        bytes memory keyhash = new bytes(32);
        copyBytes(proof, ledgerProofLength, 32, keyhash, 0);
        checkok = (sha3(keyhash) == sha3(sha256(context_name, queryId)));
        if (checkok == false) return false;
        
        bytes memory sig1 = new bytes(uint(proof[ledgerProofLength+(32+8+1+32)+1])+2);
        copyBytes(proof, ledgerProofLength+(32+8+1+32), sig1.length, sig1, 0);
        
        
        // Step 3: we assume sig1 is valid (it will be verified during step 5) and we verify if 'result' is the prefix of sha256(sig1)
        checkok = matchBytes32Prefix(sha256(sig1), result);
        if (checkok == false) return false;
        
        
        // Step 4: commitment match verification, sha3(delay, nbytes, unonce, sessionKeyHash) == commitment in storage.
        // This is to verify that the computed args match with the ones specified in the query.
        bytes memory commitmentSlice1 = new bytes(8+1+32);
        copyBytes(proof, ledgerProofLength+32, 8+1+32, commitmentSlice1, 0);
        
        bytes memory sessionPubkey = new bytes(64);
        uint sig2offset = ledgerProofLength+32+(8+1+32)+sig1.length+65;
        copyBytes(proof, sig2offset-64, 64, sessionPubkey, 0);
        
        bytes32 sessionPubkeyHash = sha256(sessionPubkey);
        if (oraclize_randomDS_args[queryId] == sha3(commitmentSlice1, sessionPubkeyHash)){ //unonce, nbytes and sessionKeyHash match
            delete oraclize_randomDS_args[queryId];
        } else return false;
        
        
        // Step 5: validity verification for sig1 (keyhash and args signed with the sessionKey)
        bytes memory tosign1 = new bytes(32+8+1+32);
        copyBytes(proof, ledgerProofLength, 32+8+1+32, tosign1, 0);
        checkok = verifySig(sha256(tosign1), sig1, sessionPubkey);
        if (checkok == false) return false;
        
        // verify if sessionPubkeyHash was verified already, if not.. let's do it!
        if (oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] == false){
            oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] = oraclize_randomDS_proofVerify__sessionKeyValidity(proof, sig2offset);
        }
        
        return oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash];
    }

    
    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function copyBytes(bytes from, uint fromOffset, uint length, bytes to, uint toOffset) internal returns (bytes) {
        uint minLength = length + toOffset;

        if (to.length < minLength) {
            // Buffer too small
            throw; // Should be a better way?
        }

        // NOTE: the offset 32 is added to skip the `size` field of both bytes variables
        uint i = 32 + fromOffset;
        uint j = 32 + toOffset;

        while (i < (32 + fromOffset + length)) {
            assembly {
                let tmp := mload(add(from, i))
                mstore(add(to, j), tmp)
            }
            i += 32;
            j += 32;
        }

        return to;
    }
    
    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    // Duplicate Solidity's ecrecover, but catching the CALL return value
    function safer_ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal returns (bool, address) {
        // We do our own memory management here. Solidity uses memory offset
        // 0x40 to store the current end of memory. We write past it (as
        // writes are memory extensions), but don't update the offset so
        // Solidity will reuse it. The memory used here is only needed for
        // this context.

        // FIXME: inline assembly can't access return values
        bool ret;
        address addr;

        assembly {
            let size := mload(0x40)
            mstore(size, hash)
            mstore(add(size, 32), v)
            mstore(add(size, 64), r)
            mstore(add(size, 96), s)

            // NOTE: we can reuse the request memory because we deal with
            //       the return code
            ret := call(3000, 1, 0, size, 128, size, 32)
            addr := mload(size)
        }
  
        return (ret, addr);
    }

    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function ecrecovery(bytes32 hash, bytes sig) internal returns (bool, address) {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (sig.length != 65)
          return (false, 0);

        // The signature format is a compact form of:
        //   {bytes32 r}{bytes32 s}{uint8 v}
        // Compact means, uint8 is not padded to 32 bytes.
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))

            // Here we are loading the last 32 bytes. We exploit the fact that
            // 'mload' will pad with zeroes if we overread.
            // There is no 'mload8' to do this, but that would be nicer.
            v := byte(0, mload(add(sig, 96)))

            // Alternative solution:
            // 'byte' is not working due to the Solidity parser, so lets
            // use the second best option, 'and'
            // v := and(mload(add(sig, 65)), 255)
        }

        // albeit non-transactional signatures are not specified by the YP, one would expect it
        // to match the YP range of [27, 28]
        //
        // geth uses [0, 1] and some clients have followed. This might change, see:
        //  https://github.com/ethereum/go-ethereum/issues/2053
        if (v < 27)
          v += 27;

        if (v != 27 && v != 28)
            return (false, 0);

        return safer_ecrecover(hash, v, r, s);
    }
        
}
// </ORACLIZE_API>


/**
 * @title The EVNToken Token contract.
 *
 * Credit: Taking ideas from BAT token and NET token
 */
 /*is StandardToken */
contract EVNToken is StandardToken, usingOraclize {

    // Token metadata
    string public constant name = "Envion";
    string public constant symbol = "EVN";
    uint256 public constant decimals = 18;
    string public constant version = "0.9";

    // Fundraising goals: minimums and maximums
    uint256 public constant TOKEN_CREATION_CAP = 130 * (10**6) * 10**decimals; // 130 million EVNs
    uint256 public constant TOKEN_CREATED_MIN = 1 * (10**6) * 10**decimals;    // 1 million EVNs
    uint256 public constant ETH_RECEIVED_CAP = 5333 * (10**2) * 10**decimals;  // 533 300 ETH
    uint256 public constant ETH_RECEIVED_MIN = 1 * (10**3) * 10**decimals;     // 1 000 ETH
    uint256 public constant TOKEN_MIN = 1 * 10**decimals;                      // 1 EVN

    // Discount multipliers
    uint256 public constant TOKEN_FIRST_DISCOUNT_MULTIPLIER  = 142857; // later divided by 10^5 to give users 1,42857 times more tokens per ETH == 30% discount
    uint256 public constant TOKEN_SECOND_DISCOUNT_MULTIPLIER = 125000; // later divided by 10^5 to give users 1,25 more tokens per ETH == 20% discount
    uint256 public constant TOKEN_THIRD_DISCOUNT_MULTIPLIER  = 111111; // later divided by 10^5 to give users 1,11111 more tokens per ETH == 10% discount

    // Fundraising parameters provided when creating the contract
    uint256 public fundingStartBlock; // These two blocks need to be chosen to comply with the
    uint256 public fundingEndBlock;   // start date and 31 day duration requirements
    uint256 public roundTwoBlock;     // block number that triggers the second exchange rate change
    uint256 public roundThreeBlock;   // block number that triggers the third exchange rate change
    uint256 public roundFourBlock;    // block number that triggers the fourth exchange rate change
    uint256 public ccReleaseBlock;    // block number that triggers purchases made by CC be transferable

    address public admin1;      // First administrator for multi-sig mechanism
    address public admin2;      // Second administrator for multi-sig mechanism
    address public tokenVendor; // Account delivering Tokens purchased with credit card

    // Contracts current state (Fundraising, Finalized, Paused) and the saved state (if currently paused)
    ContractState public state;       // Current state of the contract
    ContractState private savedState; // State of the contract before pause

    //@dev Usecase related: Purchasing Tokens with Credit card  
    //@dev Usecase related: Canceling purchases done with credit card
    mapping (string => Purchase) purchases;                 // in case CC payments get charged back, admins shall only be allowed to kill the exact amount of tokens associated with this payment
    mapping (address => uint256) public ccLockedUpBalances; // tracking the total amount of tokens users have bought via CC - locked up until ccReleaseBlock
    string[] public purchaseArray;                          // holding the IDs of all CC purchases

    // Keep track of holders and icoBuyers
    mapping (address => bool) public isHolder; // track if a user is a known token holder to the smart contract - important for payouts later
    address[] public holders;                  // array of all known holders - important for payouts later
    mapping (address => bool) isIcoBuyer;      // for tracking if user has to be kyc verified before being able to transfer tokens

    // ETH balance per user
    // Since we have different exchange rates at different stages, we need to keep track
    // of how much ether each contributed in case that we need to issue a refund
    mapping (address => uint256) private ethBalances;
    mapping (address => uint256) private noKycEthBalances;

    // Total received ETH balances
    // We need to keep track of how much ether have been contributed, since we have a cap for ETH too
    uint256 public allReceivedEth;
    uint256 public allUnKycedEth; // total amount of ETH we have no KYC for yet

    // store the hashes of admins' msg.data
    mapping (address => bytes32) private multiSigHashes;

    // KYC
    mapping (address => bool) public isKycTeam;   // to determine, if a user belongs to the KYC team or not
    mapping (address => bool) public kycVerified; // to check if user has already undergone KYC or not, to lock up his tokens until then

    // to track if team members already got their tokens
    bool public teamTokensDelivered;

    // Current ETH/USD exchange rate
    uint256 public ETH_USD_EXCHANGE_RATE_IN_CENTS; // set by oraclize

    // Everything oraclize related
    event updatedPrice(string price);
    event newOraclizeQuery(string description);
    uint public oraclizeQueryCost;

    // Events used for logging
    event LogRefund(address indexed _to, uint256 _value);
    event LogCreateEVN(address indexed _to, uint256 _value);
    event LogDeliverEVN(address indexed _to, uint256 _value);
    event LogCancelDelivery(address indexed _to, string _id);
    event LogKycRefused(address indexed _user, uint256 _value);
    event LogTeamTokensDelivered(address indexed distributor, uint256 _value);

    // Additional helper structs
    enum ContractState { Fundraising, Finalized, Paused }

    // Credit Card Purchase Parameters
    //@dev Usecase related: Purchase Tokens with Credit card
    //@dev Usecase related: Cancel purchase done with credit card
    struct Purchase {
        address buyer;
        uint256 tokenAmount;
        bool active;
    }

    // Modifiers
    modifier isFinalized() {
        require(state == ContractState.Finalized);
        _;
    }

    modifier isFundraising() {
        require(state == ContractState.Fundraising);
        _;
    }

    modifier isPaused() {
        require(state == ContractState.Paused);
        _;
    }

    modifier notPaused() {
        require(state != ContractState.Paused);
        _;
    }

    modifier isFundraisingIgnorePaused() {
        require(state == ContractState.Fundraising || (state == ContractState.Paused && savedState == ContractState.Fundraising));
        _;
    }

    modifier onlyKycTeam(){
        require(isKycTeam[msg.sender] == true);
        _;
    }

    modifier onlyOwner() {
        // check if transaction sender is admin.
        require (msg.sender == admin1 || msg.sender == admin2);
        // if yes, store his msg.data. 
        multiSigHashes[msg.sender] = keccak256(msg.data);
        // check if his stored msg.data hash equals to the one of the other admin
        if ((multiSigHashes[admin1]) == (multiSigHashes[admin2])) {
            // if yes, both admins agreed - continue.
            _;

            // Reset hashes after successful execution
            multiSigHashes[admin1] = 0x0;
            multiSigHashes[admin2] = 0x0;
        } else {
            // if not (yet), return.
            return;
        }
    }

    modifier onlyVendor() {
        require(msg.sender == tokenVendor);
        _;
    }

    modifier minimumReached() {
        require(allReceivedEth >= ETH_RECEIVED_MIN);
        require(totalSupply >= TOKEN_CREATED_MIN);
        _;
    }

    modifier isKycVerified(address _user) {
        // if token transferring user acquired the tokens through the ICO...
        if (isIcoBuyer[_user] == true) {
            // ...check if user is already unlocked
            require (kycVerified[_user] == true);
        }
        _;
    }

    modifier hasEnoughUnlockedTokens(address _user, uint256 _value) {
        // check if the user was a CC buyer and if the lockup period is not over,
        if (ccLockedUpBalances[_user] > 0 && block.number < ccReleaseBlock) {
            // allow to only transfer the not-locked up tokens
            require ((SafeMath.sub(balances[_user], _value)) >= ccLockedUpBalances[_user]);
        }
        _;
    }

    /**
     * @dev Create a new EVNToken contract.
     *
     *  _fundingStartBlock The starting block of the fundraiser (has to be in the future).
     *  _fundingEndBlock The end block of the fundraiser (has to be after _fundingStartBlock).
     *  _roundTwoBlock The block that changes the discount rate to 20% (has to be between _fundingStartBlock and _roundThreeBlock).
     *  _roundThreeBlock The block that changes the discount rate to 10% (has to be between _roundTwoBlock and _roundFourBlock).
     *  _roundFourBlock The block that changes the discount rate to 0% (has to be between _roundThreeBlock and _fundingEndBlock).
     *  _admin1 The first admin account that owns this contract.
     *  _admin2 The second admin account that owns this contract.
     *  _tokenVendor The account that creates tokens for credit card / fiat contributers.
     */
    function EVNToken(
        uint256 _fundingStartBlock,
        uint256 _fundingEndBlock,
        uint256 _roundTwoBlock, // block number that triggers the first exchange rate change
        uint256 _roundThreeBlock, // block number that triggers the second exchange rate change
        uint256 _roundFourBlock,
        address _admin1,
        address _admin2,
        address _tokenVendor,
        uint256 _ccReleaseBlock)
    payable
    {
        // Check that the parameters make sense

        // The start of the fundraising should happen in the future
        require (block.number <= _fundingStartBlock);

        // The discount rate changes and ending should follow in their subsequent order
        require (_fundingStartBlock < _roundTwoBlock);
        require (_roundTwoBlock < _roundThreeBlock);
        require (_roundThreeBlock < _roundFourBlock);
        require (_roundFourBlock < _fundingEndBlock);

        // block when tokens bought with CC will be released must be in the future
        require (_fundingEndBlock < _ccReleaseBlock);

        // admin1 and admin2 address must be set and must be different
        require (_admin1 != 0x0);
        require (_admin2 != 0x0);
        require (_admin1 != _admin2);

        // tokenVendor must be set and be different from admin1 and admin2
        require (_tokenVendor != 0x0);
        require (_tokenVendor != _admin1);
        require (_tokenVendor != _admin2);

        // provide some ETH for oraclize price feed
        require (msg.value > 0);

        // Init contract state
        state = ContractState.Fundraising;
        savedState = ContractState.Fundraising;
        fundingStartBlock = _fundingStartBlock;
        fundingEndBlock = _fundingEndBlock;
        roundTwoBlock = _roundTwoBlock;
        roundThreeBlock = _roundThreeBlock;
        roundFourBlock = _roundFourBlock;
        ccReleaseBlock = _ccReleaseBlock;

        totalSupply = 0;

        admin1 = _admin1;
        admin2 = _admin2;
        tokenVendor = _tokenVendor;

        //oraclize 
        oraclize_setCustomGasPrice(100000000000 wei); // set the gas price a little bit higher, so the pricefeed definitely works
        updatePrice();
        oraclizeQueryCost = oraclize_getPrice("URL");
    }

    //// oraclize START

    // @dev oraclize is called recursively here - once a callback fetches the newest ETH price, the next callback is scheduled for the next hour again
    function __callback(bytes32 myid, string result) {
        require(msg.sender == oraclize_cbAddress());

        // setting the token price here
        ETH_USD_EXCHANGE_RATE_IN_CENTS = SafeMath.parse(result);
        updatedPrice(result);

        // fetch the next price
        updatePrice();
    }

    function updatePrice() payable {    // can be left public as a way for replenishing contract's ETH balance, just in case
        if (msg.sender != oraclize_cbAddress()) {
            require(msg.value >= 200 finney);
        }
        if (oraclize_getPrice("URL") > this.balance) {
            newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee");
        } else {
            newOraclizeQuery("Oraclize sent, wait..");
            // Schedule query in 1 hour. Set the gas amount to 220000, as parsing in __callback takes around 70000 - we play it safe.
            oraclize_query(3600, "URL", "json(https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD).USD", 220000);
        }
    }
    //// oraclize END

    // Overridden method to check for end of fundraising before allowing transfer of tokens
    function transfer(address _to, uint256 _value)
    public
    isFinalized // Only allow token transfer after the fundraising has ended
    isKycVerified(msg.sender)
    hasEnoughUnlockedTokens(msg.sender, _value)
    onlyPayloadSize(2)
    returns (bool success)
    {
        bool result = super.transfer(_to, _value);
        if (result) {
            trackHolder(_to); // track the owner for later payouts
        }
        return result;
    }

    // Overridden method to check for end of fundraising before allowing transfer of tokens
    function transferFrom(address _from, address _to, uint256 _value)
    public
    isFinalized // Only allow token transfer after the fundraising has ended
    isKycVerified(msg.sender)
    hasEnoughUnlockedTokens(msg.sender, _value)
    onlyPayloadSize(3)
    returns (bool success)
    {
        bool result = super.transferFrom(_from, _to, _value);
        if (result) {
            trackHolder(_to); // track the owner for later payouts
        }
        return result;
    }

    // Allow for easier balance checking
    function getBalanceOf(address _owner)
    constant
    returns (uint256 _balance)
    {
        return balances[_owner];
    }

     // getting purchase details by ID - workaround, mappings with dynamically sized keys can't be made public yet.
    function getPurchaseById(string _id)
    constant
    returns (address _buyer, uint256 _tokenAmount, bool _active){
        _buyer = purchases[_id].buyer;
        _tokenAmount = purchases[_id].tokenAmount;
        _active = purchases[_id].active;
    }

    // Allows to figure out the amount of known token holders
    function getHolderCount()
    public
    constant
    returns (uint256 _holderCount)
    {
        return holders.length;
    }

    // Allows to figure out the amount of purchases
    function getPurchaseCount()
    public
    constant
    returns (uint256 _purchaseCount)
    {
        return purchaseArray.length;
    }

    // Allows for easier retrieval of holder by array index
    function getHolder(uint256 _index)
    public
    constant
    returns (address _holder)
    {
        return holders[_index];
    }

    function trackHolder(address _to)
    private
    returns (bool success)
    {
        // Check if the recipient is a known token holder
        if (isHolder[_to] == false) {
            // if not, add him to the holders array and mark him as a known holder
            holders.push(_to);
            isHolder[_to] = true;
        }
        return true;
    }


    /// @dev Accepts ether and creates new EVN tokens
    function createTokens()
    payable
    external
    isFundraising
    {
        require(block.number >= fundingStartBlock);
        require(block.number <= fundingEndBlock);
        require(msg.value > 0);

        // First we check the ETH cap: would adding this amount to the total unKYCed eth and the already KYCed eth exceed the eth cap?
        // return the contribution if the cap has been reached already
        uint256 totalKycedAndUnKycEdEth = SafeMath.add(allUnKycedEth, allReceivedEth);
        uint256 checkedReceivedEth = SafeMath.add(totalKycedAndUnKycEdEth, msg.value);
        require(checkedReceivedEth <= ETH_RECEIVED_CAP);

        // If all is fine with the ETH cap, we continue to check the
        // minimum amount of tokens and the cap for how many tokens
        // have been generated so far

        // calculate the token amount
        uint256 tokens = SafeMath.mul(msg.value, ETH_USD_EXCHANGE_RATE_IN_CENTS);

        // divide by 100 to turn ETH_USD_EXCHANGE_RATE_IN_CENTS into full USD
        tokens = tokens / 100;

        // apply discount multiplier
        tokens = safeMulPercentage(tokens, getCurrentDiscountRate());

        require(tokens >= TOKEN_MIN);
        uint256 checkedSupply = SafeMath.add(totalSupply, tokens);
        require(checkedSupply <= TOKEN_CREATION_CAP);

        // Only when all the checks have passed, then we check if the address is already KYCEd and then 
        // update the state (noKycEthBalances, allReceivedEth, totalSupply, and balances) of the contract

        if (kycVerified[msg.sender] == false) {
            // @dev The unKYCed eth balances are moved to ethBalances in unlockKyc()

            noKycEthBalances[msg.sender] = SafeMath.add(noKycEthBalances[msg.sender], msg.value);

            // add the contributed eth to the total unKYCed eth amount
            allUnKycedEth = SafeMath.add(allUnKycedEth, msg.value);
        } else {
            // if buyer is already KYC unlocked...
            ethBalances[msg.sender] = SafeMath.add(ethBalances[msg.sender], msg.value);
            allReceivedEth = SafeMath.add(allReceivedEth, msg.value);
        }

        totalSupply = checkedSupply;
        balances[msg.sender] += tokens;  // safeAdd not needed; bad semantics to use here

        trackHolder(msg.sender);

        // to force the check for KYC Status upon the user when he tries transferring tokens
        // and exclude every later token owner
        isIcoBuyer[msg.sender] = true;

        // Log the creation of these tokens
        LogCreateEVN(msg.sender, tokens);
    }

    //add a user to the KYC team
    function addToKycTeam(address _teamMember)
    onlyOwner
    onlyPayloadSize(1){
        isKycTeam[_teamMember] = true;
    }

    //remove a user from the KYC team
    function removeFromKycTeam(address _teamMember)
    onlyOwner
    onlyPayloadSize(1){
        isKycTeam[_teamMember] = false;
    }

    //called by KYC team 
    function unlockKyc(address _owner)
    external
    onlyKycTeam {
        require(kycVerified[_owner] == false);

        //unlock the owner to allow transfer of tokens
        kycVerified[_owner] = true;

        // we leave the ccLockedUpBalances[_owner] as is, because also KYCed users could cancel their CC payments

        if (noKycEthBalances[_owner] > 0) { // check if the user was an ETH buyer

            // now move the unKYCed eth balance to the regular ethBalance. 
            ethBalances[_owner] = noKycEthBalances[_owner];

            // add the now KYCed eth to the total received eth
            allReceivedEth = SafeMath.add(allReceivedEth, noKycEthBalances[_owner]);

            // subtract the now KYCed eth from total amount of unKYCed eth
            allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[_owner]);

            // and set the user's unKYCed eth balance to 0
            noKycEthBalances[_owner] = 0; // preventing replay attacks
        }
    }

    // Refusing KYC of a user, who only contributed in ETH.
    // We must pay close attention here for the case that a user contributes in ETH AND(!) CC !
    // in this case, he must only kill the tokens he received through ETH, the ones bought in fiat will be
    // killed by canceling his payments and subsequently calling cancelDelivery() with the according payment id.
    function refuseKyc(address _user)
    external
    onlyKycTeam
    {
        // once a user is verified, you can't kick him out.
        require (kycVerified[_user] == false);

        // immediately stop, if a user has none or only CC contributions.
        // we're managing kyc refusing of CC contributors off-chain
        require(noKycEthBalances[_user]>0);

        uint256 EVNVal = balances[_user];
        require(EVNVal > 0);

        uint256 ethVal = noKycEthBalances[_user]; // refund un-KYCd eth
        require(ethVal > 0);

        // Update the state only after all the checks have passed
        allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[_user]); // or if there was any unKYCed Eth, subtract it from the total unKYCed eth balance.
        balances[_user] = ccLockedUpBalances[_user]; // assign user only the token amount he has bought through CC, if there are any.
        noKycEthBalances[_user] = 0;
        totalSupply = SafeMath.sub(totalSupply, EVNVal); // Extra safe

        // Log this refund
        LogKycRefused(_user, ethVal);

        // Send the contributions only after we have updated all the balances
        // If you're using a contract, make sure it works with .transfer() gas limits
        _user.transfer(ethVal);
    }

    // Called in case a buyer cancels his CC payment.
    // @param The payment ID from payment provider
    function cancelDelivery(string _purchaseID)
    external
    onlyKycTeam{
        
        // CC payments are only cancelable until ccReleaseBlock
        require (block.number < ccReleaseBlock);

        // check if the purchase to cancel is still active
        require (purchases[_purchaseID].active == true);

        // now withdraw the canceled purchase's token amount from the user's balance
        balances[purchases[_purchaseID].buyer] = SafeMath.sub(balances[purchases[_purchaseID].buyer], purchases[_purchaseID].tokenAmount);

        // and withdraw the canceled purchase's token amount from the lockedUp token balance
        ccLockedUpBalances[purchases[_purchaseID].buyer] = SafeMath.sub(ccLockedUpBalances[purchases[_purchaseID].buyer], purchases[_purchaseID].tokenAmount);

        // set the purchase's status to inactive
        purchases[_purchaseID].active = false;

        //correct th amount of tokens generated
        totalSupply = SafeMath.sub(totalSupply, purchases[_purchaseID].tokenAmount);

        LogCancelDelivery(purchases[_purchaseID].buyer, _purchaseID);
    }

    // @dev Deliver tokens sold for CC/fiat and BTC
    // @dev param _tokens in Cents, e.g. 1 Token == 1$, passed as 100 cents
    // @dev param _btcBuyer Boolean to determine if the delivered tokens need to be locked (not the case for BTC buyers, their payment is final)
    // @dev discount multipliers are applied off-contract in this case
    function deliverTokens(address _to, uint256 _tokens, string _purchaseId, bool _btcBuyer)
    external
    isFundraising
    onlyVendor
    {
        require(_to != 0x0);
        require(_tokens > 0);
        require(bytes(_purchaseId).length>0);
        require(block.number >= fundingStartBlock);
        require(block.number <= fundingEndBlock + 168000); // allow delivery of tokens sold for fiat for 28 days after end of ICO for safety reasons

        // calculate the total amount of tokens and cut out the extra two decimal units,
        // because _tokens was in cents.
        uint256 tokens = SafeMath.mul(_tokens, (10**(decimals) / 10**2));

        // continue to check for how many tokens
        // have been generated so far
        uint256 checkedSupply = SafeMath.add(totalSupply, tokens);
        require(checkedSupply <= TOKEN_CREATION_CAP);

        // Only when all the checks have passed, then we update the state (totalSupply, and balances) of the contract
        totalSupply = checkedSupply;

        // prevent from adding a delivery multiple times
        require(purchases[_purchaseId].buyer==0x0);

        // Log this information in order to be able to cancel token deliveries (on CC refund) by the payment ID
        purchases[_purchaseId] = Purchase({
            buyer: _to,
            tokenAmount: tokens,
            active: true
        });
        purchaseArray.push(_purchaseId);

        // if tokens were not paid with BTC (but credit card), they need to be locked up 
        if (_btcBuyer == false) {
        ccLockedUpBalances[_to] = SafeMath.add(ccLockedUpBalances[_to], tokens); // update user's locked up token balance
        }

        balances[_to] = SafeMath.add(balances[_to], tokens);                     // safeAdd not needed; bad semantics to use here
        trackHolder(_to);                                                        // log holder's address

        // to force the check for KYC Status upon the user when he tries transferring tokens
        // and exclude every later token owner
        isIcoBuyer[_to] = true;

        // Log the creation of these tokens
        LogDeliverEVN(_to, tokens);
   }

    /// @dev Returns the current token price
    function getCurrentDiscountRate()
    private
    constant
    returns (uint256 currentDiscountRate)
    {
        // determine which discount to apply
        if (block.number < roundTwoBlock) {
            // first round
            return TOKEN_FIRST_DISCOUNT_MULTIPLIER;
        } else if (block.number < roundThreeBlock){
            // second round
            return TOKEN_SECOND_DISCOUNT_MULTIPLIER;
        } else if (block.number < roundFourBlock) {
            // third round
            return TOKEN_THIRD_DISCOUNT_MULTIPLIER;
        } else {
            // fourth round, no discount
            return 100000;
        }
    }

    /// @dev Allows to transfer ether from the contract as soon as the minimum is reached
    function retrieveEth(uint256 _value, address _safe)
    external
    minimumReached
    onlyOwner
    {
        require(SafeMath.sub(this.balance, _value) >= allUnKycedEth); // make sure unKYCed eth cannot be withdrawn
        // make sure a recipient was defined !
        require (_safe != 0x0);

        // send the eth to where admins agree upon
        _safe.transfer(_value);
    }


    /// @dev Ends the fundraising period and sends the ETH to wherever the admins agree upon
    function finalize(address _safe)
    external
    isFundraising
    minimumReached
    onlyOwner  // Only the admins calling this method exactly the same way can finalize the sale.
    {
        // Only allow to finalize the contract before the ending block if we already reached any of the two caps
        require(block.number > fundingEndBlock || totalSupply >= TOKEN_CREATED_MIN || allReceivedEth >= ETH_RECEIVED_MIN);
        // make sure a recipient was defined !
        require (_safe != 0x0);

        // Move the contract to Finalized state
        state = ContractState.Finalized;
        savedState = ContractState.Finalized;

        // Send the KYCed ETH to where admins agree upon.
        _safe.transfer(allReceivedEth);
    }


    /// @dev Pauses the contract
    function pause()
    external
    notPaused   // Prevent the contract getting stuck in the Paused state
    onlyOwner   // Only both admins calling this method can pause the contract
    {
        // Move the contract to Paused state
        savedState = state;
        state = ContractState.Paused;
    }


    /// @dev Proceeds with the contract
    function proceed()
    external
    isPaused
    onlyOwner   // Only both admins calling this method can proceed with the contract
    {
        // Move the contract to the previous state
        state = savedState;
    }

    /// @dev Allows contributors to recover their ether in case the minimum funding goal is not reached
    function refund()
    external
    {
        // Allow refunds only a week after end of funding to give KYC-team time to verify contributors
        // and thereby move un-KYC-ed ETH over into allReceivedEth as well as deliver the tokens paid with CC
        require(block.number > (fundingEndBlock + 42000));

        // No refunds if the minimum has been reached or minimum of 1 Million Tokens have been generated
        require(allReceivedEth < ETH_RECEIVED_MIN || totalSupply < TOKEN_CREATED_MIN);

        // to prevent CC buyers from accidentally calling refund and burning their tokens
        require (ethBalances[msg.sender] > 0 || noKycEthBalances[msg.sender] > 0);

        // Only refund if there are EVN tokens
        uint256 EVNVal = balances[msg.sender];
        require(EVNVal > 0);

        // refunds either KYCed eth or un-KYCd eth
        uint256 ethVal = SafeMath.add(ethBalances[msg.sender], noKycEthBalances[msg.sender]);
        require(ethVal > 0);

        allReceivedEth = SafeMath.sub(allReceivedEth, ethBalances[msg.sender]);    // subtract only the KYCed ETH from allReceivedEth, because the latter is what admins will only be able to withdraw
        allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[msg.sender]); // or if there was any unKYCed Eth, subtract it from the total unKYCed eth balance.

        // Update the state only after all the checks have passed.
        // reset everything to zero, no replay attacks.
        balances[msg.sender] = 0;
        ethBalances[msg.sender] = 0;
        noKycEthBalances[msg.sender] = 0;
        totalSupply = SafeMath.sub(totalSupply, EVNVal); // Extra safe

        // Log this refund
        LogRefund(msg.sender, ethVal);

        // Send the contributions only after we have updated all the balances
        // If you're using a contract, make sure it works with .transfer() gas limits
        msg.sender.transfer(ethVal);
    }

    // @dev Deliver tokens to be distributed to team members
    function deliverTeamTokens(address _to)
    external
    isFinalized
    onlyOwner
    {
        require(teamTokensDelivered == false);
        require(_to != 0x0);

        // allow delivery of tokens for the company and supporters without vesting, team tokens will be supplied like a CC purchase.
        
        // company and supporters gets 7% of a whole final pie, meaning we have to add ~7,5% to the
        // current totalSupply now, basically stretching it and taking 7% from the result, so the 93% that remain equals the amount of tokens created right now.
        // e.g. (93 * x = 100, where x amounts to roughly about 1.07526 and 7 would be the team's part)
        uint256 newTotalSupply = safeMulPercentage(totalSupply, 107526);

        // give company and supporters their 7% 
        uint256 tokens = SafeMath.sub(newTotalSupply, totalSupply);
        balances[_to] = tokens;

        //update state
        teamTokensDelivered = true;
        totalSupply = newTotalSupply;
        trackHolder(_to);

        // Log the creation of these tokens
        LogTeamTokensDelivered(_to, tokens);
    }

    function safeMulPercentage(uint256 value, uint256 percentage)
    internal
    constant
    returns (uint256 resultValue)
    {
        require(percentage >= 100000);
        require(percentage < 200000);

        // Multiply with percentage
        uint256 newValue = SafeMath.mul(value, percentage);
        // Remove the 5 extra decimals
        newValue = newValue / 10**5;
        return newValue;
    }

    // customizing the gas price for oraclize calls during "ICO Rush hours"
    function setOraclizeGas(uint256 _option)
    external
    onlyOwner
    {
        if (_option <= 30) {
            oraclize_setCustomGasPrice(30000000000 wei);
        } else if (_option <= 50) {
            oraclize_setCustomGasPrice(50000000000 wei);
        } else if (_option <= 70) {
            oraclize_setCustomGasPrice(70000000000 wei);
        } else if (_option <= 100) {
            oraclize_setCustomGasPrice(100000000000 wei);
        }
    }
}

    Contract ABI  
[{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_safe","type":"address"}],"name":"retrieveEth","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"admin2","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_teamMember","type":"address"}],"name":"addToKycTeam","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isKycTeam","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"admin1","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_RECEIVED_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_teamMember","type":"address"}],"name":"removeFromKycTeam","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"holders","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"proceed","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"ccLockedUpBalances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"},{"name":"proof","type":"bytes"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"oraclizeQueryCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokens","type":"uint256"},{"name":"_purchaseId","type":"string"},{"name":"_btcBuyer","type":"bool"}],"name":"deliverTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_safe","type":"address"}],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_purchaseID","type":"string"}],"name":"cancelDelivery","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"updatePrice","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getHolderCount","outputs":[{"name":"_holderCount","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allReceivedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ccReleaseBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingEndBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getBalanceOf","outputs":[{"name":"_balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenVendor","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"kycVerified","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allUnKycedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"string"}],"name":"getPurchaseById","outputs":[{"name":"_buyer","type":"address"},{"name":"_tokenAmount","type":"uint256"},{"name":"_active","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"createTokens","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"purchaseArray","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getPurchaseCount","outputs":[{"name":"_purchaseCount","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"deliverTeamTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_THIRD_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_USD_EXCHANGE_RATE_IN_CENTS","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"}],"name":"refuseKyc","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"teamTokensDelivered","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundTwoBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingStartBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_RECEIVED_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_FIRST_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundFourBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getHolder","outputs":[{"name":"_holder","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundThreeBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SECOND_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_CREATED_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"unlockKyc","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_CREATION_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_option","type":"uint256"}],"name":"setOraclizeGas","outputs":[],"payable":false,"type":"function"},{"inputs":[{"name":"_fundingStartBlock","type":"uint256"},{"name":"_fundingEndBlock","type":"uint256"},{"name":"_roundTwoBlock","type":"uint256"},{"name":"_roundThreeBlock","type":"uint256"},{"name":"_roundFourBlock","type":"uint256"},{"name":"_admin1","type":"address"},{"name":"_admin2","type":"address"},{"name":"_tokenVendor","type":"address"},{"name":"_ccReleaseBlock","type":"uint256"}],"payable":true,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"price","type":"string"}],"name":"updatedPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"description","type":"string"}],"name":"newOraclizeQuery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogRefund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogCreateEVN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogDeliverEVN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_id","type":"string"}],"name":"LogCancelDelivery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_user","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogKycRefused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"distributor","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogTeamTokensDelivered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]

  Contract Creation Code Switch To Opcodes View
606060405260405161012080620054f48339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b43899011156200006457600080fd5b8689106200007157600080fd5b8587106200007e57600080fd5b8486106200008b57600080fd5b8785106200009857600080fd5b808810620000a557600080fd5b600160a060020a0384161515620000bb57600080fd5b600160a060020a0383161515620000d157600080fd5b600160a060020a038481169084161415620000eb57600080fd5b600160a060020a03821615156200010157600080fd5b600160a060020a0382811690851614156200011b57600080fd5b600160a060020a0382811690841614156200013557600080fd5b600034116200014357600080fd5b601080546000919060a060020a60ff02191674010000000000000000000000000000000000000000835b0217905550601080546000919060a860020a60ff0219167501000000000000000000000000000000000000000000835b021790555060088990556009889055600a879055600b869055600c859055600d81905560008055600e8054600160a060020a03808716600160a060020a031992831617909255600f805486841690831617905560108054928516929091169190911790556200021f64174876e80064010000000062003c086200029682021704565b620002376401000000006200205f6200040082021704565b6200028360408051908101604052600381527f55524c00000000000000000000000000000000000000000000000000000000006020820152640100000000620035d56200067e82021704565b6020555b50505050505050505062001228565b600354600160a060020a03161580620002d15750600354620002cf90600160a060020a031664010000000062003d1a6200086682021704565b155b15620002f357620002f1600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200035557600080fd5b6102c65a03f115156200036757600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063ca6ad1e4826040517c010000000000000000000000000000000000000000000000000000000063ffffffff84160281526004810191909152602401600060405180830381600087803b1515620003e657600080fd5b6102c65a03f11515620003f857600080fd5b5050505b5b50565b620004186401000000006200333062000c6b82021704565b600160a060020a031633600160a060020a031614151562000449576702c68af0bb1400003410156200044957600080fd5b5b30600160a060020a031631620004a160408051908101604052600381527f55524c00000000000000000000000000000000000000000000000000000000006020820152640100000000620035d56200067e82021704565b11156200054e57600080516020620054d48339815191526040516020808252604b908201527f4f7261636c697a6520717565727920776173204e4f542073656e742c20706c656040808301919091527f6173652061646420736f6d652045544820746f20636f76657220666f7220746860608301527f6520717565727920666565000000000000000000000000000000000000000000608083015260a0909101905180910390a16200067b565b600080516020620054d483398151915260405160208082526015908201527f4f7261636c697a652073656e742c20776169742e2e00000000000000000000006040808301919091526060909101905180910390a1620003fc610e106040805190810160405280600381526020017f55524c000000000000000000000000000000000000000000000000000000000081525060806040519081016040908152604982527f6a736f6e2868747470733a2f2f6d696e2d6170692e63727970746f636f6d706160208301527f72652e636f6d2f646174612f70726963653f6673796d3d455448267473796d73908201527f3d555344292e5553440000000000000000000000000000000000000000000000606082015262035b606401000000006200376262000de082021704565b505b5b565b600354600090600160a060020a03161580620006bc5750600354620006ba90600160a060020a031664010000000062003d1a6200086682021704565b155b15620006de57620006dc600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200074057600080fd5b6102c65a03f115156200075257600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063524f3889836000604051602001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007f55780820151818401525b602001620007da565b50505050905090810190601f168015620008235780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15156200084257600080fd5b6102c65a03f115156200085457600080fd5b50505060405180519150505b5b919050565b803b5b919050565b6000806200089e731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed64010000000062003d1a6200086682021704565b1115620009205760038054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed1790556200091760408051908101604052600b81527f6574685f6d61696e6e65740000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b60006200094f73c03a2615d5efaf5f49f60b7bb6583eaec212fdf164010000000062003d1a6200086682021704565b1115620009d15760038054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf11790556200091760408051908101604052600c81527f6574685f726f707374656e3300000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000a0073b7a07bcf2ba2f2703b24c0691b5278999c59ac7e64010000000062003d1a6200086682021704565b111562000a825760038054600160a060020a03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e1790556200091760408051908101604052600981527f6574685f6b6f76616e00000000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000ab173146500cfd35b22e4a392fe0adc06de1a1368ed4864010000000062003d1a6200086682021704565b111562000b335760038054600160a060020a03191673146500cfd35b22e4a392fe0adc06de1a1368ed481790556200091760408051908101604052600b81527f6574685f72696e6b6562790000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000b62736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47564010000000062003d1a6200086682021704565b111562000b98575060038054600160a060020a031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475179055600162000860565b600062000bc77320e12a1f859b3feae5fb2a0a32c18f5a65555bbf64010000000062003d1a6200086682021704565b111562000bfd575060038054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf179055600162000860565b600062000c2c7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa64010000000062003d1a6200086682021704565b111562000c62575060038054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa179055600162000860565b5060005b919050565b600354600090600160a060020a0316158062000ca9575060035462000ca790600160a060020a031664010000000062003d1a6200086682021704565b155b1562000ccb5762000cc9600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000d2d57600080fd5b6102c65a03f1151562000d3f57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063c281d19e6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000dbe57600080fd5b6102c65a03f1151562000dd057600080fd5b50505060405180519150505b5b90565b6003546000908190600160a060020a0316158062000e20575060035462000e1e90600160a060020a031664010000000062003d1a6200086682021704565b155b1562000e425762000e40600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000ea457600080fd5b6102c65a03f1151562000eb657600080fd5b505050604051805160048054600160a060020a031916600160a060020a039283161790819055169050632ef3accc86856000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101562000f605780820151818401525b60200162000f45565b50505050905090810190601f16801562000f8e5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b151562000fae57600080fd5b6102c65a03f1151562000fc057600080fd5b5050506040518051915050670de0b6b3a76400003a84020181111562000fea57600091506200115a565b600454600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015620010845780820151818401525b60200162001069565b50505050905090810190601f168015620010b25780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b83811015620010eb5780820151818401525b602001620010d0565b50505050905090810190601f168015620011195780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b15156200113b57600080fd5b6125ee5a03f115156200114d57600080fd5b5050505060405180519250505b5b50949350505050565b6005818051620011799291602001906200117e565b505b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620011c157805160ff1916838001178555620011f1565b82800160010185558215620011f1579182015b82811115620011f1578251825591602001919060010190620011d4565b5b506200120092915062001204565b5090565b62000ddc91905b808211156200120057600081556001016200120b565b5090565b90565b61429c80620012386000396000f300606060405236156102b95763ffffffff60e060020a60003504166304deaeb581146102be57806306a8f8a2146102e257806306fdde0314610311578063095ea7b31461039c5780630fb7cb1d146103d2578063108e4bdb146103f3578063115976c414610426578063168213491461045557806318160ddd1461047a5780631f305ec71461049f57806323b872dd146104c057806327dc297e146104fc5780632a11ced0146105545780632a33fec6146105865780632ed196bd1461059b578063313ce567146105cc57806338bbfa50146105f15780633ba864651461068b5780633eeda7d3146106b05780634ef39b75146106e657806354fd4d5014610707578063590e1ae314610792578063611ef452146107a7578063673a7e28146107c757806370a08231146107d15780637136982b1461080257806373a1e7f5146108275780638456cb591461084c5780638a957f151461086157806391b43d131461088657806395d89b41146108ab5780639b96eece146107d1578063a3766f8814610967578063a5410a6614610996578063a9059cbb146109c9578063acc99bb7146109ff578063af580d2c14610a24578063b442726314610aa5578063b8b8587314610aaf578063becd283f14610b3d578063bf5f016914610b62578063c19d93fb14610b83578063c5fc98c914610bba578063cf9a60d414610bdf578063d134295814610c04578063d16be71b14610c25578063d25a13b414610c4c578063d4d7b19a14610c71578063d648a64714610ca4578063d8e3074014610cc9578063da9b90c414610cee578063dd62ed3e14610d13578063e5a284f814610d4a578063e74799b414610d6f578063e8a96b4614610d94578063eec7006f14610dc6578063f4ee82ee14610deb578063f5689a8014610e10578063f8db5d0714610e35578063f9fae4f714610e56578063fbf44a1b14610e7b575b600080fd5b34156102c957600080fd5b6102e0600435600160a060020a0360243516610e93565b005b34156102ed57600080fd5b6102f5610ff4565b604051600160a060020a03909116815260200160405180910390f35b341561031c57600080fd5b610324611003565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103a757600080fd5b6103be600160a060020a036004351660243561103a565b604051901515815260200160405180910390f35b34156103dd57600080fd5b6102e0600160a060020a03600435166110b5565b005b34156103fe57600080fd5b6103be600160a060020a03600435166111aa565b604051901515815260200160405180910390f35b341561043157600080fd5b6102f56111bf565b604051600160a060020a03909116815260200160405180910390f35b341561046057600080fd5b6104686111ce565b60405190815260200160405180910390f35b341561048557600080fd5b6104686111db565b60405190815260200160405180910390f35b34156104aa57600080fd5b6102e0600160a060020a03600435166111e1565b005b34156104cb57600080fd5b6103be600160a060020a03600435811690602435166044356112db565b604051901515815260200160405180910390f35b341561050757600080fd5b6102e0600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506113ff95505050505050565b005b341561055f57600080fd5b6102f56004356114d8565b604051600160a060020a03909116815260200160405180910390f35b341561059157600080fd5b6102e061150a565b005b34156105a657600080fd5b610468600160a060020a0360043516611643565b60405190815260200160405180910390f35b34156105d757600080fd5b610468611655565b60405190815260200160405180910390f35b34156105fc57600080fd5b6102e0600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061165a95505050505050565b005b341561069657600080fd5b610468611660565b60405190815260200160405180910390f35b34156106bb57600080fd5b6102e060048035600160a060020a03169060248035916044359182019101356064351515611666565b005b34156106f157600080fd5b6102e0600160a060020a0360043516611923565b005b341561071257600080fd5b610324611b3d565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6102e0611b74565b005b34156107b257600080fd5b6102e06004803560248101910135611d6b565b005b6102e061205f565b005b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561080d57600080fd5b6104686122eb565b60405190815260200160405180910390f35b341561083257600080fd5b6104686122f2565b60405190815260200160405180910390f35b341561085757600080fd5b6102e06122f8565b005b341561086c57600080fd5b61046861246b565b60405190815260200160405180910390f35b341561089157600080fd5b610468612471565b60405190815260200160405180910390f35b34156108b657600080fd5b610324612477565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561097257600080fd5b6102f56124cd565b604051600160a060020a03909116815260200160405180910390f35b34156109a157600080fd5b6103be600160a060020a03600435166124dc565b604051901515815260200160405180910390f35b34156109d457600080fd5b6103be600160a060020a03600435166024356124f1565b604051901515815260200160405180910390f35b3415610a0a57600080fd5b610468612613565b60405190815260200160405180910390f35b3415610a2f57600080fd5b610a7560046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061261995505050505050565b604051600160a060020a039093168352602083019190915215156040808301919091526060909101905180910390f35b6102e0612775565b005b3415610aba57600080fd5b6103246004356129ab565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610b4857600080fd5b610468612a67565b60405190815260200160405180910390f35b3415610b6d57600080fd5b6102e0600160a060020a0360043516612a6e565b005b3415610b8e57600080fd5b610b96612c1d565b60405180826002811115610ba657fe5b60ff16815260200191505060405180910390f35b3415610bc557600080fd5b610468612c2d565b60405190815260200160405180910390f35b3415610bea57600080fd5b610468612c34565b60405190815260200160405180910390f35b3415610c0f57600080fd5b6102e0600160a060020a0360043516612c3a565b005b3415610c3057600080fd5b6103be612dd5565b604051901515815260200160405180910390f35b3415610c5757600080fd5b610468612dde565b60405190815260200160405180910390f35b3415610c7c57600080fd5b6103be600160a060020a0360043516612de4565b604051901515815260200160405180910390f35b3415610caf57600080fd5b610468612df9565b60405190815260200160405180910390f35b3415610cd457600080fd5b610468612dff565b60405190815260200160405180910390f35b3415610cf957600080fd5b610468612e0d565b60405190815260200160405180910390f35b3415610d1e57600080fd5b610468600160a060020a0360043581169060243516612e14565b60405190815260200160405180910390f35b3415610d5557600080fd5b610468612e53565b60405190815260200160405180910390f35b3415610d7a57600080fd5b610468612e59565b60405190815260200160405180910390f35b3415610d9f57600080fd5b6102f5600435612e65565b604051600160a060020a03909116815260200160405180910390f35b3415610dd157600080fd5b610468612e9e565b60405190815260200160405180910390f35b3415610df657600080fd5b610468612ea4565b60405190815260200160405180910390f35b3415610e1b57600080fd5b610468612eab565b60405190815260200160405180910390f35b3415610e4057600080fd5b6102e0600160a060020a0360043516612eb9565b005b3415610e6157600080fd5b610468612fbc565b60405190815260200160405180910390f35b3415610e8657600080fd5b6102e0600435612fcb565b005b601954683635c9adc5dea00000901015610eac57600080fd5b60005469d3c21bcecceda1000000901015610ec657600080fd5b600e5433600160a060020a0390811691161480610ef15750600f5433600160a060020a039081169116145b1515610efc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415610fed57601a54610f6e30600160a060020a03163184613102565b1015610f7957600080fd5b600160a060020a0381161515610f8e57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515610fbf57600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b5050565b600f54600160a060020a031681565b60408051908101604052600681527f456e76696f6e0000000000000000000000000000000000000000000000000000602082015281565b600060023660441461104857fe5b600160a060020a03338116600081815260026020908152604080832094891680845294909152908190208690557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259086905190815260200160405180910390a3600191505b5b5092915050565b600e5433600160a060020a03908116911614806110e05750600f5433600160a060020a039081169116145b15156110eb57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461115257fe5b600160a060020a0382166000908152601c60205260409020805460ff191660011790555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b50565b601c6020526000908152604090205460ff1681565b600e54600160a060020a031681565b683635c9adc5dea0000081565b60005481565b600e5433600160a060020a039081169116148061120c5750600f5433600160a060020a039081169116145b151561121757600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461127e57fe5b600160a060020a0382166000908152601c60205260409020805460ff191690555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b60008060015b60105460a060020a900460ff1660028111156112f957fe5b1461130357600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561135557600160a060020a0381166000908152601d602052604090205460ff16151560011461135557600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156113815750600d5443105b156113c057600160a060020a0382166000908152601260209081526040808320546001909252909120546113b59083613102565b10156113c057600080fd5b5b6003366064146113cd57fe5b6113d889898961311d565b945084156113eb576113e9886132a9565b505b8495505b5b505b50505b505b509392505050565b611407613330565b600160a060020a031633600160a060020a031614151561142657600080fd5b61142f8161344d565b601f557f891acff763972fa7f25226caa78556f59bcb130f6f13fd6ab9b9fef99cff9c698160405160208082528190810183818151815260200191508051906020019080838360005b838110156114915780820151818401525b602001611478565b50505050905090810190601f1680156114be5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1610fed61205f565b5b5050565b60158054829081106114e657fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b60025b60105460a060020a900460ff16600281111561152557fe5b1461152f57600080fd5b600e5433600160a060020a039081169116148061155a5750600f5433600160a060020a039081169116145b151561156557600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff7501000000000000000000000000000000000000000000820416919074ff0000000000000000000000000000000000000000191660a060020a83600281111561160b57fe5b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b565b60126020526000908152604090205481565b601281565b5b505050565b60205481565b600080805b60105460a060020a900460ff16600281111561168357fe5b1461168d57600080fd5b60105433600160a060020a039081169116146116a857600080fd5b600160a060020a03871615156116bd57600080fd5b600086116116ca57600080fd5b600084116116d757600080fd5b6008544310156116e657600080fd5b60095462029040014311156116fa57600080fd5b611710866064670de0b6b3a76400005b0461357e565b915061171e600054836135ad565b90506a6b88921f0410abc200000081111561173857600080fd5b6000819055601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03161561177757600080fd5b60606040519081016040528088600160a060020a0316815260200183815260200160011515815250601186866040518083838082843782019150509250505090815260200160405190819003902081518154600160a060020a031916600160a060020a0391909116178155602082015181600101556040820151600291909101805460ff19169115159190911790555060138054600181016118198382614079565b916000526020600020900160005b506118339087876140a3565b505082151561187957600160a060020a03871660009081526012602052604090205461185f90836135ad565b600160a060020a0388166000908152601260205260409020555b600160a060020a03871660009081526001602052604090205461189c90836135ad565b600160a060020a0388166000908152600160205260409020556118be876132a9565b50600160a060020a03871660008181526016602052604090819020805460ff191660011790557f1a0e722b7da39e72a59b39f661ef0ce1167fc012eeacb7481feb8b110d7c481e9084905190815260200160405180910390a25b5b5b50505050505050565b60005b60105460a060020a900460ff16600281111561193e57fe5b1461194857600080fd5b601954683635c9adc5dea0000090101561196157600080fd5b60005469d3c21bcecceda100000090101561197b57600080fd5b600e5433600160a060020a03908116911614806119a65750600f5433600160a060020a039081169116145b15156119b157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557600954431180611a29575060005469d3c21bcecceda10000009010155b80611a405750601954683635c9adc5dea000009010155b1515611a4b57600080fd5b600160a060020a0381161515611a6057600080fd5b601080546001919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550601080546001919075ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000835b021790555080600160a060020a03166108fc6019549081150290604051600060405180830381858888f193505050501515611b0057600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b5b5b50565b60408051908101604052600381527f302e390000000000000000000000000000000000000000000000000000000000602082015281565b60008060095461a4100143111515611b8b57600080fd5b601954683635c9adc5dea00000901080611bb1575060005469d3c21bcecceda100000090105b1515611bbc57600080fd5b600160a060020a0333166000908152601760205260408120541180611bf75750600160a060020a033316600090815260186020526040812054115b1515611c0257600080fd5b600160a060020a03331660009081526001602052604081205492508211611c2857600080fd5b600160a060020a033316600090815260176020908152604080832054601890925290912054611c5791906135ad565b905060008111611c6657600080fd5b601954600160a060020a033316600090815260176020526040902054611c8c9190613102565b601955601a54600160a060020a033316600090815260186020526040902054611cb59190613102565b601a55600160a060020a0333166000908152600160209081526040808320839055601782528083208390556018909152812081905554611cf59083613102565b600055600160a060020a0333167fb6c0eca8138e097d71e2dd31e19a1266487f0553f170b7260ffe68bcbe9ff8a78260405190815260200160405180910390a2600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610fed57600080fd5b5b5050565b600160a060020a0333166000908152601c602052604090205460ff161515600114611d9557600080fd5b600d544310611da357600080fd5b60118282604051808383808284378201915050925050509081526020016040519081900390206002015460ff161515600114611dde57600080fd5b611e5860016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255611f1f9160129160119086908690518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60126000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255601190849084905180838380828437820191505092505050908152602001604051908190039020600201805460ff1916911515919091179055600054611fd9906011848460405180838380828437820191505092505050908152602001604051809103902060010154613102565b600055601182826040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03167f6e9b134e7c6a5f38a62b3b3344b833bb9bda58d3c5556223978ec5273ff4735383836040516020808252810182905280604081018484808284378201915050935050505060405180910390a25b5b5050565b612067613330565b600160a060020a031633600160a060020a0316141515612096576702c68af0bb14000034101561209657600080fd5b5b30600160a060020a0316316120de60408051908101604052600381527f55524c000000000000000000000000000000000000000000000000000000000060208201526135d5565b111561219a577f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a6040516020808252604b908201527f4f7261636c697a6520717565727920776173204e4f542073656e742c20706c656040808301919091527f6173652061646420736f6d652045544820746f20636f76657220666f7220746860608301527f6520717565727920666565000000000000000000000000000000000000000000608083015260a0909101905180910390a161163e565b7f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a60405160208082526015908201527f4f7261636c697a652073656e742c20776169742e2e00000000000000000000006040808301919091526060909101905180910390a16111a5610e106040805190810160405280600381526020017f55524c0000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604981526020017f6a736f6e2868747470733a2f2f6d696e2d6170692e63727970746f636f6d706181526020017f72652e636f6d2f646174612f70726963653f6673796d3d455448267473796d7381526020017f3d555344292e555344000000000000000000000000000000000000000000000081525062035b60613762565b505b5b565b600160a060020a0381166000908152600160205260409020545b919050565b6015545b90565b60195481565b60025b60105460a060020a900460ff16600281111561231357fe5b141561231e57600080fd5b600e5433600160a060020a03908116911614806123495750600f5433600160a060020a039081169116145b151561235457600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff60a060020a820416919075ff000000000000000000000000000000000000000000191675010000000000000000000000000000000000000000008360028111156123fb57fe5b0217905550601080546002919074ff0000000000000000000000000000000000000000191660a060020a8361160b565b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561163e565b61163e565b5b5b565b600d5481565b60095481565b60408051908101604052600381527f45564e0000000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a0381166000908152600160205260409020545b919050565b601054600160a060020a031681565b601d6020526000908152604090205460ff1681565b60008060015b60105460a060020a900460ff16600281111561250f57fe5b1461251957600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561256b57600160a060020a0381166000908152601d602052604090205460ff16151560011461256b57600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156125975750600d5443105b156125d657600160a060020a0382166000908152601260209081526040808320546001909252909120546125cb9083613102565b10156125d657600080fd5b5b6002366044146125e357fe5b6125ed8888613a68565b94508415612600576125fe886132a9565b505b8495505b5b505b50505b505b5092915050565b601a5481565b60008060006011846040518082805190602001908083835b6020831061265157805182525b601f199092019160209182019101612631565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405190819003902054600160a060020a031692506011846040518082805190602001908083835b602083106126c457805182525b601f1990920191602091820191016126a4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001015491506011846040518082805190602001908083835b6020831061273057805182525b601f199092019160209182019101612710565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040519081900390206002015460ff1690505b9193909250565b6000808080805b60105460a060020a900460ff16600281111561279457fe5b1461279e57600080fd5b6008544310156127ad57600080fd5b6009544311156127bc57600080fd5b600034116127c957600080fd5b6127d7601a546019546135ad565b93506127e384346135ad565b92506970ee403ce780ac5000008311156127fc57600080fd5b61280834601f5461357e565b91506064825b0491506128228261281d613b78565b613bc6565b9150670de0b6b3a764000082101561283957600080fd5b612845600054836135ad565b90506a6b88921f0410abc200000081111561285f57600080fd5b600160a060020a0333166000908152601d602052604090205460ff1615156128d257600160a060020a0333166000908152601860205260409020546128a490346135ad565b600160a060020a033316600090815260186020526040902055601a546128ca90346135ad565b601a5561291f565b600160a060020a0333166000908152601760205260409020546128f590346135ad565b600160a060020a03331660009081526017602052604090205560195461291b90346135ad565b6019555b600081815533600160a060020a03811682526001602052604090912080548401905561294a906132a9565b50600160a060020a03331660008181526016602052604090819020805460ff191660011790557ff531cc636ac07444c260ab8fbec2dfcfb2e69f62697aa04f6429a3b052c413989084905190815260200160405180910390a25b5b50505050565b60138054829081106129b957fe5b906000526020600020900160005b915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a5f5780601f10612a3457610100808354040283529160200191612a5f565b820191906000526020600020905b815481529060010190602001808311612a4257829003601f168201915b505050505081565b6013545b90565b60008060015b60105460a060020a900460ff166002811115612a8c57fe5b14612a9657600080fd5b600e5433600160a060020a0390811691161480612ac15750600f5433600160a060020a039081169116145b1515612acc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415612c1157601e5460ff1615612b3757600080fd5b600160a060020a0383161515612b4c57600080fd5b612b5b6000546201a406613bc6565b9150612b6982600054613102565b600160a060020a03841660009081526001602081905260408220839055601e805460ff191690911790558390559050612ba1836132a9565b5082600160a060020a03167f74c57fa15425b244ab3400bd258037da3499566fe21038ab6e6db4971d1565fa8260405190815260200160405180910390a25b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561165a565b61165a565b5b5b505050565b60105460a060020a900460ff1681565b6201b20781565b601f5481565b600160a060020a0333166000908152601c6020526040812054819060ff161515600114612c6657600080fd5b600160a060020a0383166000908152601d602052604090205460ff1615612c8c57600080fd5b600160a060020a03831660009081526018602052604081205411612caf57600080fd5b600160a060020a03831660009081526001602052604081205492508211612cd557600080fd5b50600160a060020a038216600090815260186020526040812054908111612cfb57600080fd5b601a54600160a060020a038416600090815260186020526040902054612d219190613102565b601a55600160a060020a03831660009081526012602090815260408083205460018352818420556018909152812081905554612d5d9083613102565b600055600160a060020a0383167fa840617fb151e47d5e92a7fd2b59e2aedb6252c5dd8e5656a789e116f5668f038260405190815260200160405180910390a2600160a060020a03831681156108fc0282604051600060405180830381858888f19350505050151561165a57600080fd5b5b5b505050565b601e5460ff1681565b600a5481565b60146020526000908152604090205460ff1681565b60085481565b6970ee403ce780ac50000081565b62022e0981565b6000600236604414612e2257fe5b600160a060020a0380851660009081526002602090815260408083209387168352929052205491505b5b5092915050565b600c5481565b670de0b6b3a764000081565b6000601582815481101515612e7657fe5b906000526020600020900160005b9054906101000a9004600160a060020a031690505b919050565b600b5481565b6201e84881565b69d3c21bcecceda100000081565b600160a060020a0333166000908152601c602052604090205460ff161515600114612ee357600080fd5b600160a060020a0381166000908152601d602052604090205460ff1615612f0957600080fd5b600160a060020a0381166000908152601d60209081526040808320805460ff19166001179055601890915281205411156111a557600160a060020a038116600090815260186020818152604080842054601783529320839055601954919052612f71916135ad565b601955601a54600160a060020a038216600090815260186020526040902054612f9a9190613102565b601a55600160a060020a0381166000908152601860205260408120555b5b5b50565b6a6b88921f0410abc200000081565b600e5433600160a060020a0390811691161480612ff65750600f5433600160a060020a039081169116145b151561300157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557601e8111613077576130726406fc23ac00613c08565b611b00565b6032811161309257613072640ba43b7400613c08565b611b00565b604681116130ad5761307264104c533c00613c08565b611b00565b60648111611b0057611b0064174876e800613c08565b5b5b5b5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b6000808284101561310f57fe5b5050808203805b5092915050565b600160a060020a03831660009081526001602052604081205482901080159061316d5750600160a060020a0380851660009081526002602090815260408083203390941683529290522054829010155b80156131795750600082115b801561319e5750600160a060020a038316600090815260016020526040902054828101115b1561329d57600160a060020a0383166000908152600160205260409020546131c690836135ad565b600160a060020a0380851660009081526001602052604080822093909355908616815220546131f59083613102565b600160a060020a03808616600090815260016020908152604080832094909455600281528382203390931682529190915220546132329083613102565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060016132a1565b5060005b5b9392505050565b600160a060020a03811660009081526014602052604081205460ff1615156133275760158054600181016132dd8382614122565b916000526020600020900160005b8154600160a060020a038087166101009390930a838102910219909116179091556000908152601460205260409020805460ff19166001179055505b5060015b919050565b600354600090600160a060020a0316158061335d575060035461335b90600160a060020a0316613d1a565b155b1561336e5761336c6000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156133b657600080fd5b6102c65a03f115156133c757600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063c281d19e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561342c57600080fd5b6102c65a03f1151561343d57600080fd5b50505060405180519150505b5b90565b600061345761414c565b50816000805b8251811015613572577f300000000000000000000000000000000000000000000000000000000000000083828151811061349357fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561353457507f39000000000000000000000000000000000000000000000000000000000000008382815181106134fd57fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1561356957603083828151811061354757fe5b016020015160f860020a900460f860020a0260f860020a90040382600a020191505b5b60010161345d565b8193505b505050919050565b600082820283158061359a575082848281151561359757fe5b04145b15156135a257fe5b8091505b5092915050565b600082820183811080159061359a5750828110155b15156135a257fe5b8091505b5092915050565b600354600090600160a060020a03161580613602575060035461360090600160a060020a0316613d1a565b155b15613613576136116000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561365b57600080fd5b6102c65a03f1151561366c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063524f3889836000604051602001526040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136f45780820151818401525b6020016136db565b50505050905090810190601f1680156137215780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b151561373f57600080fd5b6102c65a03f1151561375057600080fd5b50505060405180519150505b5b919050565b6003546000908190600160a060020a03161580613791575060035461378f90600160a060020a0316613d1a565b155b156137a2576137a06000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156137ea57600080fd5b6102c65a03f115156137fb57600080fd5b505050604051805160048054600160a060020a031916600160a060020a039283161790819055169050632ef3accc86856000604051602001526040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561388a5780820151818401525b602001613871565b50505050905090810190601f1680156138b75780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15156138d657600080fd5b6102c65a03f115156138e757600080fd5b5050506040518051915050670de0b6b3a76400003a84020181111561390f5760009150613a5e565b600454600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff1660e060020a028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561398e5780820151818401525b602001613975565b50505050905090810190601f1680156139bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156139f25780820151818401525b6020016139d9565b50505050905090810190601f168015613a1f5780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b1515613a4057600080fd5b6125ee5a03f11515613a5157600080fd5b5050505060405180519250505b5b50949350505050565b600160a060020a033316600090815260016020526040812054829010801590613a915750600082115b8015613ab65750600160a060020a038316600090815260016020526040902054828101115b15613b6d57600160a060020a033316600090815260016020526040902054613ade9083613102565b600160a060020a033381166000908152600160205260408082209390935590851681522054613b0d90836135ad565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001613b71565b5060005b5b92915050565b6000600a54431015613b8e575062022e096122ef565b600b54431015613ba257506201e8486122ef565b600c54431015613bb657506201b2076122ef565b50620186a06122ef565b5b5b5b90565b600080620186a0831015613bd957600080fd5b62030d408310613be857600080fd5b613bf2848461357e565b9050620186a0815b0490508091505b5092915050565b600354600160a060020a03161580613c325750600354613c3090600160a060020a0316613d1a565b155b15613c4357613c416000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613c8b57600080fd5b6102c65a03f11515613c9c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063ca6ad1e48260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515613d0157600080fd5b6102c65a03f115156129a457600080fd5b5050505b5b50565b803b5b919050565b600080613d42731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed613d1a565b1115613db25760038054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed179055613daa60408051908101604052600b81527f6574685f6d61696e6e65740000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613dd173c03a2615d5efaf5f49f60b7bb6583eaec212fdf1613d1a565b1115613e415760038054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf1179055613daa60408051908101604052600c81527f6574685f726f707374656e3300000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613e6073b7a07bcf2ba2f2703b24c0691b5278999c59ac7e613d1a565b1115613ed05760038054600160a060020a03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e179055613daa60408051908101604052600981527f6574685f6b6f76616e00000000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613eef73146500cfd35b22e4a392fe0adc06de1a1368ed48613d1a565b1115613f5f5760038054600160a060020a03191673146500cfd35b22e4a392fe0adc06de1a1368ed48179055613daa60408051908101604052600b81527f6574685f72696e6b6562790000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613f7e736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475613d1a565b1115613fb2575060038054600160a060020a031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47517905560016122e6565b6000613fd17320e12a1f859b3feae5fb2a0a32c18f5a65555bbf613d1a565b1115614005575060038054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf17905560016122e6565b60006140247351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa613d1a565b1115614058575060038054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa17905560016122e6565b5060005b919050565b6005818051610fed92916020019061415e565b505b50565b81548183558181151161165a5760008381526020902061165a9181019083016141dd565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106140e45782800160ff19823516178555614111565b82800160010185558215614111579182015b828111156141115782358255916020019190600101906140f6565b5b5061411e929150614207565b5090565b81548183558181151161165a5760008381526020902061165a918101908301614207565b5b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061419f57805160ff1916838001178555614111565b82800160010185558215614111579182015b828111156141115782518255916020019190600101906141b1565b5b5061411e929150614207565b5090565b6122ef91905b8082111561411e5760006141f78282614228565b506001016141e3565b5090565b90565b6122ef91905b8082111561411e576000815560010161420d565b5090565b90565b50805460018160011615610100020316600290046000825580601f1061424e57506111a5565b601f0160209004906000526020600020908101906111a59190614207565b5b505600a165627a7a72305820988c73333ac173572010ad58d9556df1d1832dc3572d43e4c9c9322dbcb322ed002946cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a00000000000000000000000000000000000000000000000000000000004847d600000000000000000000000000000000000000000000000000000000004b0764000000000000000000000000000000000000000000000000000000000048753a000000000000000000000000000000000000000000000000000000000048b950000000000000000000000000000000000000000000000000000000000049582e0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f4000000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa190000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a1100000000000000000000000000000000000000000000000000000000000598613

    Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000004847d600000000000000000000000000000000000000000000000000000000004b0764000000000000000000000000000000000000000000000000000000000048753a000000000000000000000000000000000000000000000000000000000048b950000000000000000000000000000000000000000000000000000000000049582e0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f4000000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa190000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a1100000000000000000000000000000000000000000000000000000000000598613

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000004847d6
Arg [1] : 00000000000000000000000000000000000000000000000000000000004b0764
Arg [2] : 000000000000000000000000000000000000000000000000000000000048753a
Arg [3] : 000000000000000000000000000000000000000000000000000000000048b950
Arg [4] : 000000000000000000000000000000000000000000000000000000000049582e
Arg [5] : 0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f40
Arg [6] : 00000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa19
Arg [7] : 0000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a110
Arg [8] : 0000000000000000000000000000000000000000000000000000000000598613


   Swarm Source:
bzzr://988c73333ac173572010ad58d9556df1d1832dc3572d43e4c9c9322dbcb322ed

 

View All
Block Age transaction Difficulty Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.