ETH Price: $1,586.11 (-0.25%)
Gas: 21 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
0x60806040113925492020-12-05 12:10:171024 days 8 hrs ago1607170217IN
 Create: TwoKeyEventSource
0 ETH0.0874533725

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TwoKeyEventSource

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-02
*/

pragma solidity ^0.4.13;

contract IStructuredStorage {

    function setProxyLogicContractAndDeployer(address _proxyLogicContract, address _deployer) external;
    function setProxyLogicContract(address _proxyLogicContract) external;

    // *** Getter Methods ***
    function getUint(bytes32 _key) external view returns(uint);
    function getString(bytes32 _key) external view returns(string);
    function getAddress(bytes32 _key) external view returns(address);
    function getBytes(bytes32 _key) external view returns(bytes);
    function getBool(bytes32 _key) external view returns(bool);
    function getInt(bytes32 _key) external view returns(int);
    function getBytes32(bytes32 _key) external view returns(bytes32);

    // *** Getter Methods For Arrays ***
    function getBytes32Array(bytes32 _key) external view returns (bytes32[]);
    function getAddressArray(bytes32 _key) external view returns (address[]);
    function getUintArray(bytes32 _key) external view returns (uint[]);
    function getIntArray(bytes32 _key) external view returns (int[]);
    function getBoolArray(bytes32 _key) external view returns (bool[]);

    // *** Setter Methods ***
    function setUint(bytes32 _key, uint _value) external;
    function setString(bytes32 _key, string _value) external;
    function setAddress(bytes32 _key, address _value) external;
    function setBytes(bytes32 _key, bytes _value) external;
    function setBool(bytes32 _key, bool _value) external;
    function setInt(bytes32 _key, int _value) external;
    function setBytes32(bytes32 _key, bytes32 _value) external;

    // *** Setter Methods For Arrays ***
    function setBytes32Array(bytes32 _key, bytes32[] _value) external;
    function setAddressArray(bytes32 _key, address[] _value) external;
    function setUintArray(bytes32 _key, uint[] _value) external;
    function setIntArray(bytes32 _key, int[] _value) external;
    function setBoolArray(bytes32 _key, bool[] _value) external;

    // *** Delete Methods ***
    function deleteUint(bytes32 _key) external;
    function deleteString(bytes32 _key) external;
    function deleteAddress(bytes32 _key) external;
    function deleteBytes(bytes32 _key) external;
    function deleteBool(bytes32 _key) external;
    function deleteInt(bytes32 _key) external;
    function deleteBytes32(bytes32 _key) external;
}

contract ITwoKeyAdmin {
    function getDefaultIntegratorFeePercent() public view returns (uint);
    function getDefaultNetworkTaxPercent() public view returns (uint);
    function getTwoKeyRewardsReleaseDate() external view returns(uint);
    function updateReceivedTokensAsModerator(uint amountOfTokens) public;
    function updateReceivedTokensAsModeratorPPC(uint amountOfTokens, address campaignPlasma) public;
    function addFeesCollectedInCurrency(string currency, uint amount) public payable;

    function updateTokensReceivedFromDistributionFees(uint amountOfTokens) public;
}

contract ITwoKeyCampaignValidator {
    function isCampaignValidated(address campaign) public view returns (bool);
    function validateAcquisitionCampaign(address campaign, string nonSingletonHash) public;
    function validateDonationCampaign(address campaign, address donationConversionHandler, address donationLogicHandler, string nonSingletonHash) public;
    function validateCPCCampaign(address campaign, string nonSingletonHash) public;
}

contract ITwoKeyFeeManager {
    function payDebtWhenConvertingOrWithdrawingProceeds(address _plasmaAddress, uint _debtPaying) public payable;
    function getDebtForUser(address _userPlasma) public view returns (uint);
    function payDebtWithDAI(address _plasmaAddress, uint _totalDebt, uint _debtPaid) public;
    function payDebtWith2Key(address _beneficiaryPublic, address _plasmaAddress, uint _amountOf2keyForRewards) public;
    function payDebtWith2KeyV2(
        address _beneficiaryPublic,
        address _plasmaAddress,
        uint _amountOf2keyForRewards,
        address _twoKeyEconomy,
        address _twoKeyAdmin
    ) public;
    function setRegistrationFeeForUser(address _plasmaAddress, uint _registrationFee) public;
    function addDebtForUser(address _plasmaAddress, uint _debtAmount, string _debtType) public;
    function withdrawEtherCollected() public returns (uint);
    function withdraw2KEYCollected() public returns (uint);
    function withdrawDAICollected(address _dai) public returns (uint);
}

contract ITwoKeyMaintainersRegistry {
    function checkIsAddressMaintainer(address _sender) public view returns (bool);
    function checkIsAddressCoreDev(address _sender) public view returns (bool);

    function addMaintainers(address [] _maintainers) public;
    function addCoreDevs(address [] _coreDevs) public;
    function removeMaintainers(address [] _maintainers) public;
    function removeCoreDevs(address [] _coreDevs) public;
}

contract ITwoKeyReg {
    function addTwoKeyEventSource(address _twoKeyEventSource) public;
    function changeTwoKeyEventSource(address _twoKeyEventSource) public;
    function addWhereContractor(address _userAddress, address _contractAddress) public;
    function addWhereModerator(address _userAddress, address _contractAddress) public;
    function addWhereReferrer(address _userAddress, address _contractAddress) public;
    function addWhereConverter(address _userAddress, address _contractAddress) public;
    function getContractsWhereUserIsContractor(address _userAddress) public view returns (address[]);
    function getContractsWhereUserIsModerator(address _userAddress) public view returns (address[]);
    function getContractsWhereUserIsRefferer(address _userAddress) public view returns (address[]);
    function getContractsWhereUserIsConverter(address _userAddress) public view returns (address[]);
    function getTwoKeyEventSourceAddress() public view returns (address);
    function addName(string _name, address _sender, string _fullName, string _email, bytes signature) public;
    function addNameByUser(string _name) public;
    function getName2Owner(string _name) public view returns (address);
    function getOwner2Name(address _sender) public view returns (string);
    function getPlasmaToEthereum(address plasma) public view returns (address);
    function getEthereumToPlasma(address ethereum) public view returns (address);
    function checkIfTwoKeyMaintainerExists(address _maintainer) public view returns (bool);
    function getUserData(address _user) external view returns (bytes);
}

contract ITwoKeySingletoneRegistryFetchAddress {
    function getContractProxyAddress(string _contractName) public view returns (address);
    function getNonUpgradableContractAddress(string contractName) public view returns (address);
    function getLatestCampaignApprovedVersion(string campaignType) public view returns (string);
}

interface ITwoKeySingletonesRegistry {

    /**
    * @dev This event will be emitted every time a new proxy is created
    * @param proxy representing the address of the proxy created
    */
    event ProxyCreated(address proxy);


    /**
    * @dev This event will be emitted every time a new implementation is registered
    * @param version representing the version name of the registered implementation
    * @param implementation representing the address of the registered implementation
    * @param contractName is the name of the contract we added new version
    */
    event VersionAdded(string version, address implementation, string contractName);

    /**
    * @dev Registers a new version with its implementation address
    * @param version representing the version name of the new implementation to be registered
    * @param implementation representing the address of the new implementation to be registered
    */
    function addVersion(string _contractName, string version, address implementation) public;

    /**
    * @dev Tells the address of the implementation for a given version
    * @param _contractName is the name of the contract we're querying
    * @param version to query the implementation of
    * @return address of the implementation registered for the given version
    */
    function getVersion(string _contractName, string version) public view returns (address);
}

contract ITwoKeyEventSourceStorage is IStructuredStorage {

}

contract ITwoKeySingletonUtils {

    address public TWO_KEY_SINGLETON_REGISTRY;

    // Modifier to restrict method calls only to maintainers
    modifier onlyMaintainer {
        address twoKeyMaintainersRegistry = getAddressFromTwoKeySingletonRegistry("TwoKeyMaintainersRegistry");
        require(ITwoKeyMaintainersRegistry(twoKeyMaintainersRegistry).checkIsAddressMaintainer(msg.sender));
        _;
    }

    /**
     * @notice Function to get any singleton contract proxy address from TwoKeySingletonRegistry contract
     * @param contractName is the name of the contract we're looking for
     */
    function getAddressFromTwoKeySingletonRegistry(
        string contractName
    )
    internal
    view
    returns (address)
    {
        return ITwoKeySingletoneRegistryFetchAddress(TWO_KEY_SINGLETON_REGISTRY)
            .getContractProxyAddress(contractName);
    }

    function getNonUpgradableContractAddressFromTwoKeySingletonRegistry(
        string contractName
    )
    internal
    view
    returns (address)
    {
        return ITwoKeySingletoneRegistryFetchAddress(TWO_KEY_SINGLETON_REGISTRY)
            .getNonUpgradableContractAddress(contractName);
    }
}

contract UpgradeabilityStorage {
    // Versions registry
    ITwoKeySingletonesRegistry internal registry;

    // Address of the current implementation
    address internal _implementation;

    /**
    * @dev Tells the address of the current implementation
    * @return address of the current implementation
    */
    function implementation() public view returns (address) {
        return _implementation;
    }
}

contract Upgradeable is UpgradeabilityStorage {
    /**
     * @dev Validates the caller is the versions registry.
     * @param sender representing the address deploying the initial behavior of the contract
     */
    function initialize(address sender) public payable {
        require(msg.sender == address(registry));
    }
}

contract TwoKeyEventSource is Upgradeable, ITwoKeySingletonUtils {

    bool initialized;

    ITwoKeyEventSourceStorage public PROXY_STORAGE_CONTRACT;


    string constant _twoKeyCampaignValidator = "TwoKeyCampaignValidator";
    string constant _twoKeyFactory = "TwoKeyFactory";
    string constant _twoKeyRegistry = "TwoKeyRegistry";
    string constant _twoKeyAdmin = "TwoKeyAdmin";
    string constant _twoKeyExchangeRateContract = "TwoKeyExchangeRateContract";
    string constant _twoKeyMaintainersRegistry = "TwoKeyMaintainersRegistry";
    string constant _deepFreezeTokenPool = "TwoKeyDeepFreezeTokenPool";

    /**
     * Modifier which will allow only completely verified and validated contracts to call some functions
     */
    modifier onlyAllowedContracts {
        address twoKeyCampaignValidator = getAddressFromTwoKeySingletonRegistry(_twoKeyCampaignValidator);
        require(ITwoKeyCampaignValidator(twoKeyCampaignValidator).isCampaignValidated(msg.sender) == true);
        _;
    }

    /**
     * Modifier which will allow only TwoKeyCampaignValidator to make some calls
     */
    modifier onlyTwoKeyCampaignValidator {
        address twoKeyCampaignValidator = getAddressFromTwoKeySingletonRegistry(_twoKeyCampaignValidator);
        require(msg.sender == twoKeyCampaignValidator);
        _;
    }

    /**
     * @notice Function to set initial params in the contract
     * @param _twoKeySingletonesRegistry is the address of TWO_KEY_SINGLETON_REGISTRY contract
     * @param _proxyStorage is the address of proxy of storage contract
     */
    function setInitialParams(
        address _twoKeySingletonesRegistry,
        address _proxyStorage
    )
    external
    {
        require(initialized == false);

        TWO_KEY_SINGLETON_REGISTRY = _twoKeySingletonesRegistry;
        PROXY_STORAGE_CONTRACT = ITwoKeyEventSourceStorage(_proxyStorage);

        initialized = true;
    }

    /**
     * Events which will be emitted during use of system
     * All events are emitted from this contract
     * Every event is monitored in GraphQL
     */

    event Created(
        address _campaign,
        address _owner,
        address _moderator
    );

    event Joined(
        address _campaign,
        address _from,
        address _to
    );

    event Converted(
        address _campaign,
        address _converter,
        uint256 _amount
    );

    event ConvertedAcquisition(
        address _campaign,
        address _converterPlasma,
        uint256 _baseTokens,
        uint256 _bonusTokens,
        uint256 _conversionAmount,
        bool _isFiatConversion,
        uint _conversionId
    );

    event ConvertedDonation(
        address _campaign,
        address _converterPlasma,
        uint _conversionAmount,
        uint _conversionId
    );

    event Rewarded(
        address _campaign,
        address _to,
        uint256 _amount
    );

    event Cancelled(
        address _campaign,
        address _converter,
        uint256 _indexOrAmount
    );

    event Rejected(
        address _campaign,
        address _converter
    );

    event UpdatedPublicMetaHash(
        uint timestamp,
        string value
    );

    event UpdatedData(
        uint timestamp,
        uint value,
        string action
    );

    event ReceivedEther(
        address _sender,
        uint value
    );

    event AcquisitionCampaignCreated(
        address proxyLogicHandler,
        address proxyConversionHandler,
        address proxyAcquisitionCampaign,
        address proxyPurchasesHandler,
        address contractor
    );

    event DonationCampaignCreated(
        address proxyDonationCampaign,
        address proxyDonationConversionHandler,
        address proxyDonationLogicHandler,
        address contractor
    );

    event CPCCampaignCreated(
        address proxyCPCCampaign,
        address contractor //Contractor public address
    );

    event PriceUpdated(
        bytes32 _currency,
        uint newRate,
        uint _timestamp,
        address _updater
    );

    event UserRegistered(
        string _handle,
        address _address
    );

    event Executed(
        address campaignAddress,
        address converterPlasmaAddress,
        uint conversionId,
        uint tokens
    );

    event TokenWithdrawnFromPurchasesHandler(
        address campaignAddress,
        uint conversionID,
        uint tokensAmountWithdrawn
    );

    event Debt (
        address plasmaAddress,
        uint weiAmount,
        bool addition, //If true means debt increasing otherwise it means that event emitted when user paid part of the debt
        string currency
    );

    event ReceivedTokensAsModerator(
        address campaignAddress,
        uint amountOfTokens
    );

    event ReceivedTokensDeepFreezeTokenPool(
        address campaignAddress,
        uint amountOfTokens
    );

    event HandleChanged(
        address userPlasmaAddress,
        string newHandle
    );

    event DaiReleased(
        address contractSenderAddress,
        uint amountOfDAI
    );

    event RebalancedRatesEvent (
        uint priceAtBeginning,
        uint priceAtRebalancingTime,
        uint ratio,
        uint amountOfTokensTransferedInAction,
        string actionPerformedWithUpgradableExchange
    );

    event EndedBudgetCampaign (
        address campaignPlasmaAddress,
        uint contractorLeftover,
        uint moderatorEarningsDistributed
    );

    event RebalancedRewards(
        uint cycleId,
        uint amountOfTokens,
        string action
    );

    event UserWithdrawnNetworkEarnings(
        address user,
        uint amountOfTokens
    );

    /**
     * @notice Function to emit created event every time campaign is created
     * @param _campaign is the address of the deployed campaign
     * @param _owner is the contractor address of the campaign
     * @param _moderator is the address of the moderator in campaign
     * @dev this function updates values in TwoKeyRegistry contract
     */
    function created(
        address _campaign,
        address _owner,
        address _moderator
    )
    external
    onlyTwoKeyCampaignValidator
    {
        emit Created(_campaign, _owner, _moderator);
    }

    /**
     * @notice Function to emit created event every time someone has joined to campaign
     * @param _campaign is the address of the deployed campaign
     * @param _from is the address of the referrer
     * @param _to is the address of person who has joined
     * @dev this function updates values in TwoKeyRegistry contract
     */
    function joined(
        address _campaign,
        address _from,
        address _to
    )
    external
    onlyAllowedContracts
    {
        emit Joined(_campaign, _from, _to);
    }

    /**
     * @notice Function to emit converted event
     * @param _campaign is the address of main campaign contract
     * @param _converter is the address of converter during the conversion
     * @param _conversionAmount is conversion amount
     */
    function converted(
        address _campaign,
        address _converter,
        uint256 _conversionAmount
    )
    external
    onlyAllowedContracts
    {
        emit Converted(_campaign, _converter, _conversionAmount);
    }

    function rejected(
        address _campaign,
        address _converter
    )
    external
    onlyAllowedContracts
    {
        emit Rejected(_campaign, _converter);
    }


    /**
     * @notice Function to emit event every time conversion gets executed
     * @param _campaignAddress is the main campaign contract address
     * @param _converterPlasmaAddress is the address of converter plasma
     * @param _conversionId is the ID of conversion, unique per campaign
     */
    function executed(
        address _campaignAddress,
        address _converterPlasmaAddress,
        uint _conversionId,
        uint tokens
    )
    external
    onlyAllowedContracts
    {
        emit Executed(_campaignAddress, _converterPlasmaAddress, _conversionId, tokens);
    }


    /**
     * @notice Function to emit created event every time conversion happened under AcquisitionCampaign
     * @param _campaign is the address of the deployed campaign
     * @param _converterPlasma is the converter address
     * @param _baseTokens is the amount of tokens bought
     * @param _bonusTokens is the amount of bonus tokens received
     * @param _conversionAmount is the amount of conversion
     * @param _isFiatConversion is flag representing if conversion is either FIAT or ETHER
     * @param _conversionId is the id of conversion
     * @dev this function updates values in TwoKeyRegistry contract
     */
    function convertedAcquisition(
        address _campaign,
        address _converterPlasma,
        uint256 _baseTokens,
        uint256 _bonusTokens,
        uint256 _conversionAmount,
        bool _isFiatConversion,
        uint _conversionId
    )
    external
    onlyAllowedContracts
    {
        emit ConvertedAcquisition(
            _campaign,
            _converterPlasma,
            _baseTokens,
            _bonusTokens,
            _conversionAmount,
            _isFiatConversion,
            _conversionId
        );
    }



    /**
     * @notice Function to emit created event every time conversion happened under DonationCampaign
     * @param _campaign is the address of main campaign contract
     * @param _converterPlasma is the address of the converter
     * @param _conversionAmount is the amount of conversion
     * @param _conversionId is the id of conversion
     */
    function convertedDonation(
        address _campaign,
        address _converterPlasma,
        uint256 _conversionAmount,
        uint256 _conversionId
    )
    external
    onlyAllowedContracts
    {
        emit ConvertedDonation(
            _campaign,
            _converterPlasma,
            _conversionAmount,
            _conversionId
        );
    }

    /**
     * @notice Function to emit created event every time bounty is distributed between influencers
     * @param _campaign is the address of the deployed campaign
     * @param _to is the reward receiver
     * @param _amount is the reward amount
     */
    function rewarded(
        address _campaign,
        address _to,
        uint256 _amount
    )
    external
    onlyAllowedContracts
    {
        emit Rewarded(_campaign, _to, _amount);
    }

    /**
     * @notice Function to emit created event every time campaign is cancelled
     * @param _campaign is the address of the cancelled campaign
     * @param _converter is the address of the converter
     * @param _indexOrAmount is the amount of campaign
     */
    function cancelled(
        address  _campaign,
        address _converter,
        uint256 _indexOrAmount
    )
    external
    onlyAllowedContracts
    {
        emit Cancelled(_campaign, _converter, _indexOrAmount);
    }

    /**
     * @notice Function to emit event every time someone starts new Acquisition campaign
     * @param proxyLogicHandler is the address of TwoKeyAcquisitionLogicHandler proxy deployed by TwoKeyFactory
     * @param proxyConversionHandler is the address of TwoKeyConversionHandler proxy deployed by TwoKeyFactory
     * @param proxyAcquisitionCampaign is the address of TwoKeyAcquisitionCampaign proxy deployed by TwoKeyFactory
     * @param proxyPurchasesHandler is the address of TwoKeyPurchasesHandler proxy deployed by TwoKeyFactory
     */
    function acquisitionCampaignCreated(
        address proxyLogicHandler,
        address proxyConversionHandler,
        address proxyAcquisitionCampaign,
        address proxyPurchasesHandler,
        address contractor
    )
    external
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry(_twoKeyFactory));
        emit AcquisitionCampaignCreated(
            proxyLogicHandler,
            proxyConversionHandler,
            proxyAcquisitionCampaign,
            proxyPurchasesHandler,
            contractor
        );
    }

    /**
     * @notice Function to emit event every time someone starts new Donation campaign
     * @param proxyDonationCampaign is the address of TwoKeyDonationCampaign proxy deployed by TwoKeyFactory
     * @param proxyDonationConversionHandler is the address of TwoKeyDonationConversionHandler proxy deployed by TwoKeyFactory
     * @param proxyDonationLogicHandler is the address of TwoKeyDonationLogicHandler proxy deployed by TwoKeyFactory
     */
    function donationCampaignCreated(
        address proxyDonationCampaign,
        address proxyDonationConversionHandler,
        address proxyDonationLogicHandler,
        address contractor
    )
    external
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry(_twoKeyFactory));
        emit DonationCampaignCreated(
            proxyDonationCampaign,
            proxyDonationConversionHandler,
            proxyDonationLogicHandler,
            contractor
        );
    }


    /**
     * @notice Function to emit event every time someone starts new CPC campaign
     * @param proxyCPC is the proxy address of CPC campaign
     * @param contractor is the PUBLIC address of campaign contractor
     */
    function cpcCampaignCreated(
        address proxyCPC,
        address contractor
    )
    external
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry(_twoKeyFactory));
        emit CPCCampaignCreated(
            proxyCPC,
            contractor
        );
    }

    /**
     * @notice Function which will emit event PriceUpdated every time that happens under TwoKeyExchangeRateContract
     * @param _currency is the hexed string of currency name
     * @param _newRate is the new rate
     * @param _timestamp is the time of updating
     * @param _updater is the maintainer address which performed this call
     */
    function priceUpdated(
        bytes32 _currency,
        uint _newRate,
        uint _timestamp,
        address _updater
    )
    external
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry(_twoKeyExchangeRateContract));
        emit PriceUpdated(_currency, _newRate, _timestamp, _updater);
    }

    /**
     * @notice Function to emit event every time user is registered
     * @param _handle is the handle of the user
     * @param _address is the address of the user
     */
    function userRegistered(
        string _handle,
        address _address,
        uint _registrationFee
    )
    external
    {
        require(isAddressMaintainer(msg.sender) == true);
        ITwoKeyFeeManager(getAddressFromTwoKeySingletonRegistry("TwoKeyFeeManager")).setRegistrationFeeForUser(_address, _registrationFee);
        emit UserRegistered(_handle, _address);
        emit Debt(_address, _registrationFee, true, "ETH");
    }

    function addAdditionalDebtForUser(
        address _plasmaAddress,
        uint _debtAmount,
        string _debtType
    )
    public
    {
        require(isAddressMaintainer(msg.sender) == true);
        ITwoKeyFeeManager(getAddressFromTwoKeySingletonRegistry("TwoKeyFeeManager")).addDebtForUser(_plasmaAddress, _debtAmount, _debtType);
        emit Debt(_plasmaAddress, _debtAmount, true, "ETH");
    }

    /**
     * @notice Function which will emit every time some debt is increased or paid
     * @param _plasmaAddress is the address of the user we are increasing/decreasing debt for
     * @param _amount is the amount of ETH he paid/increased
     * @param _isAddition is stating either debt increased or paid
     */
    function emitDebtEvent(
        address _plasmaAddress,
        uint _amount,
        bool _isAddition,
        string _currency
    )
    external
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry("TwoKeyFeeManager"));
        emit Debt(
            _plasmaAddress,
            _amount,
            _isAddition,
            _currency
        );
    }

    /**
     * @notice Function which will be called by TwoKeyAdmin every time it receives 2KEY tokens
     * as a moderator on TwoKeyCampaigns
     * @param _campaignAddress is the address of the campaign sending tokens
     * @param _amountOfTokens is the amount of tokens sent
     */
    function emitReceivedTokensAsModerator(
        address _campaignAddress,
        uint _amountOfTokens
    )
    public
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry(_twoKeyAdmin));
        emit ReceivedTokensAsModerator(
            _campaignAddress,
            _amountOfTokens
        );
    }

    /**
     * @notice Function which will be called by TwoKeyDeepFreezeTokenPool every time it receives 2KEY tokens
     * from moderator rewards on the conversion event
     * @param _campaignAddress is the address of the campaign sending tokens
     * @param _amountOfTokens is the amount of tokens sent
     */
    function emitReceivedTokensToDeepFreezeTokenPool(
        address _campaignAddress,
        uint _amountOfTokens
    )
    public
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry(_deepFreezeTokenPool));
        emit ReceivedTokensDeepFreezeTokenPool(
            _campaignAddress,
            _amountOfTokens
        );
    }


    /**
     * @notice Function which will emit an event every time somebody performs
     * withdraw of bought tokens in AcquisitionCampaign contracts
     * @param _campaignAddress is the address of main campaign contract
     * @param _conversionID is the unique ID of conversion inside one campaign
     * @param _tokensAmountWithdrawn is the amount of tokens user withdrawn
     */
    function tokensWithdrawnFromPurchasesHandler(
        address _campaignAddress,
        uint _conversionID,
        uint _tokensAmountWithdrawn
    )
    external
    onlyAllowedContracts
    {
        emit TokenWithdrawnFromPurchasesHandler(_campaignAddress, _conversionID, _tokensAmountWithdrawn);
    }


    function emitRebalancedRatesEvent(
        uint priceAtBeginning,
        uint priceAtRebalancingTime,
        uint ratio,
        uint amountOfTokensTransferedInAction,
        string actionPerformedWithUpgradableExchange
    )
    external
    onlyAllowedContracts
    {
        emit RebalancedRatesEvent(
            priceAtBeginning,
            priceAtRebalancingTime,
            ratio,
            amountOfTokensTransferedInAction,
            actionPerformedWithUpgradableExchange
        );
    }

    function emitHandleChangedEvent(
        address _userPlasmaAddress,
        string _newHandle
    )
    public
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry("TwoKeyRegistry"));

        emit HandleChanged(
            _userPlasmaAddress,
            _newHandle
        );
    }


    /**
     * @notice          Function to emit an event whenever DAI is released as an income
     *
     * @param           _campaignContractAddress is campaign contract address
     * @param           _amountOfDAI is the amount of DAI being released
     */
    function emitDAIReleasedAsIncome(
        address _campaignContractAddress,
        uint _amountOfDAI
    )
    public
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry("TwoKeyUpgradableExchange"));

        emit DaiReleased(
            _campaignContractAddress,
            _amountOfDAI
        );
    }

    function emitEndedBudgetCampaign(
        address campaignPlasmaAddress,
        uint contractorLeftover,
        uint moderatorEarningsDistributed
    )
    public
    {
        require (msg.sender == getAddressFromTwoKeySingletonRegistry("TwoKeyBudgetCampaignsPaymentsHandler"));

        emit EndedBudgetCampaign(
            campaignPlasmaAddress,
            contractorLeftover,
            moderatorEarningsDistributed
        );
    }


    function emitRebalancedRewards(
        uint cycleId,
        uint difference,
        string action
    )
    public
    {
        require (msg.sender == getAddressFromTwoKeySingletonRegistry("TwoKeyBudgetCampaignsPaymentsHandler"));

        emit RebalancedRewards(
            cycleId,
            difference,
            action
        );
    }


    /**
     * @notice          Function which will emit event that user have withdrawn network earnings
     * @param           user is the address of the user
     * @param           amountOfTokens is the amount of tokens user withdrawn as network earnings
     */
    function emitUserWithdrawnNetworkEarnings(
        address user,
        uint amountOfTokens
    )
    public
    {
        require(msg.sender == getAddressFromTwoKeySingletonRegistry("TwoKeyParticipationMiningPool"));

        emit UserWithdrawnNetworkEarnings(
            user,
            amountOfTokens
        );
    }


    /**
     * @notice Function to check adequate plasma address for submitted eth address
     * @param me is the ethereum address we request corresponding plasma address for
     */
    function plasmaOf(
        address me
    )
    public
    view
    returns (address)
    {
        address twoKeyRegistry = getAddressFromTwoKeySingletonRegistry(_twoKeyRegistry);
        address plasma = ITwoKeyReg(twoKeyRegistry).getEthereumToPlasma(me);
        if (plasma != address(0)) {
            return plasma;
        }
        return me;
    }

    /**
     * @notice Function to determine ethereum address of plasma address
     * @param me is the plasma address of the user
     * @return ethereum address
     */
    function ethereumOf(
        address me
    )
    public
    view
    returns (address)
    {
        address twoKeyRegistry = getAddressFromTwoKeySingletonRegistry(_twoKeyRegistry);
        address ethereum = ITwoKeyReg(twoKeyRegistry).getPlasmaToEthereum(me);
        if (ethereum != address(0)) {
            return ethereum;
        }
        return me;
    }

    /**
     * @notice Address to check if an address is maintainer in TwoKeyMaintainersRegistry
     * @param _maintainer is the address we're checking this for
     */
    function isAddressMaintainer(
        address _maintainer
    )
    public
    view
    returns (bool)
    {
        address twoKeyMaintainersRegistry = getAddressFromTwoKeySingletonRegistry(_twoKeyMaintainersRegistry);
        bool _isMaintainer = ITwoKeyMaintainersRegistry(twoKeyMaintainersRegistry).checkIsAddressMaintainer(_maintainer);
        return _isMaintainer;
    }

    /**
     * @notice In default TwoKeyAdmin will be moderator and his fee percentage per conversion is predefined
     */
    function getTwoKeyDefaultIntegratorFeeFromAdmin()
    public
    view
    returns (uint)
    {
        address twoKeyAdmin = getAddressFromTwoKeySingletonRegistry(_twoKeyAdmin);
        uint integratorFeePercentage = ITwoKeyAdmin(twoKeyAdmin).getDefaultIntegratorFeePercent();
        return integratorFeePercentage;
    }

    /**
     * @notice Function to get default network tax percentage
     */
    function getTwoKeyDefaultNetworkTaxPercent()
    public
    view
    returns (uint)
    {
        address twoKeyAdmin = getAddressFromTwoKeySingletonRegistry(_twoKeyAdmin);
        uint networkTaxPercent = ITwoKeyAdmin(twoKeyAdmin).getDefaultNetworkTaxPercent();
        return networkTaxPercent;
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_twoKeySingletonesRegistry","type":"address"},{"name":"_proxyStorage","type":"address"}],"name":"setInitialParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaignAddress","type":"address"},{"name":"_amountOfTokens","type":"uint256"}],"name":"emitReceivedTokensAsModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"},{"name":"amountOfTokens","type":"uint256"}],"name":"emitUserWithdrawnNetworkEarnings","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"me","type":"address"}],"name":"ethereumOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PROXY_STORAGE_CONTRACT","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_campaign","type":"address"},{"name":"_converter","type":"address"},{"name":"_conversionAmount","type":"uint256"}],"name":"converted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"me","type":"address"}],"name":"plasmaOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_campaign","type":"address"},{"name":"_owner","type":"address"},{"name":"_moderator","type":"address"}],"name":"created","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"proxyDonationCampaign","type":"address"},{"name":"proxyDonationConversionHandler","type":"address"},{"name":"proxyDonationLogicHandler","type":"address"},{"name":"contractor","type":"address"}],"name":"donationCampaignCreated","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"proxyLogicHandler","type":"address"},{"name":"proxyConversionHandler","type":"address"},{"name":"proxyAcquisitionCampaign","type":"address"},{"name":"proxyPurchasesHandler","type":"address"},{"name":"contractor","type":"address"}],"name":"acquisitionCampaignCreated","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaignContractAddress","type":"address"},{"name":"_amountOfDAI","type":"uint256"}],"name":"emitDAIReleasedAsIncome","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_maintainer","type":"address"}],"name":"isAddressMaintainer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTwoKeyDefaultIntegratorFeeFromAdmin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_plasmaAddress","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_isAddition","type":"bool"},{"name":"_currency","type":"string"}],"name":"emitDebtEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaign","type":"address"},{"name":"_converterPlasma","type":"address"},{"name":"_conversionAmount","type":"uint256"},{"name":"_conversionId","type":"uint256"}],"name":"convertedDonation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTwoKeyDefaultNetworkTaxPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proxyCPC","type":"address"},{"name":"contractor","type":"address"}],"name":"cpcCampaignCreated","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"campaignPlasmaAddress","type":"address"},{"name":"contractorLeftover","type":"uint256"},{"name":"moderatorEarningsDistributed","type":"uint256"}],"name":"emitEndedBudgetCampaign","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaignAddress","type":"address"},{"name":"_amountOfTokens","type":"uint256"}],"name":"emitReceivedTokensToDeepFreezeTokenPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TWO_KEY_SINGLETON_REGISTRY","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_campaign","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"joined","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_plasmaAddress","type":"address"},{"name":"_debtAmount","type":"uint256"},{"name":"_debtType","type":"string"}],"name":"addAdditionalDebtForUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaignAddress","type":"address"},{"name":"_conversionID","type":"uint256"},{"name":"_tokensAmountWithdrawn","type":"uint256"}],"name":"tokensWithdrawnFromPurchasesHandler","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_userPlasmaAddress","type":"address"},{"name":"_newHandle","type":"string"}],"name":"emitHandleChangedEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaignAddress","type":"address"},{"name":"_converterPlasmaAddress","type":"address"},{"name":"_conversionId","type":"uint256"},{"name":"tokens","type":"uint256"}],"name":"executed","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaign","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"rewarded","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"}],"name":"initialize","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"priceAtBeginning","type":"uint256"},{"name":"priceAtRebalancingTime","type":"uint256"},{"name":"ratio","type":"uint256"},{"name":"amountOfTokensTransferedInAction","type":"uint256"},{"name":"actionPerformedWithUpgradableExchange","type":"string"}],"name":"emitRebalancedRatesEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaign","type":"address"},{"name":"_converter","type":"address"},{"name":"_indexOrAmount","type":"uint256"}],"name":"cancelled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaign","type":"address"},{"name":"_converter","type":"address"}],"name":"rejected","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"cycleId","type":"uint256"},{"name":"difference","type":"uint256"},{"name":"action","type":"string"}],"name":"emitRebalancedRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaign","type":"address"},{"name":"_converterPlasma","type":"address"},{"name":"_baseTokens","type":"uint256"},{"name":"_bonusTokens","type":"uint256"},{"name":"_conversionAmount","type":"uint256"},{"name":"_isFiatConversion","type":"bool"},{"name":"_conversionId","type":"uint256"}],"name":"convertedAcquisition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_handle","type":"string"},{"name":"_address","type":"address"},{"name":"_registrationFee","type":"uint256"}],"name":"userRegistered","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_currency","type":"bytes32"},{"name":"_newRate","type":"uint256"},{"name":"_timestamp","type":"uint256"},{"name":"_updater","type":"address"}],"name":"priceUpdated","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_campaign","type":"address"},{"indexed":false,"name":"_owner","type":"address"},{"indexed":false,"name":"_moderator","type":"address"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_campaign","type":"address"},{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"_to","type":"address"}],"name":"Joined","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_campaign","type":"address"},{"indexed":false,"name":"_converter","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Converted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_campaign","type":"address"},{"indexed":false,"name":"_converterPlasma","type":"address"},{"indexed":false,"name":"_baseTokens","type":"uint256"},{"indexed":false,"name":"_bonusTokens","type":"uint256"},{"indexed":false,"name":"_conversionAmount","type":"uint256"},{"indexed":false,"name":"_isFiatConversion","type":"bool"},{"indexed":false,"name":"_conversionId","type":"uint256"}],"name":"ConvertedAcquisition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_campaign","type":"address"},{"indexed":false,"name":"_converterPlasma","type":"address"},{"indexed":false,"name":"_conversionAmount","type":"uint256"},{"indexed":false,"name":"_conversionId","type":"uint256"}],"name":"ConvertedDonation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_campaign","type":"address"},{"indexed":false,"name":"_to","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Rewarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_campaign","type":"address"},{"indexed":false,"name":"_converter","type":"address"},{"indexed":false,"name":"_indexOrAmount","type":"uint256"}],"name":"Cancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_campaign","type":"address"},{"indexed":false,"name":"_converter","type":"address"}],"name":"Rejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"value","type":"string"}],"name":"UpdatedPublicMetaHash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"action","type":"string"}],"name":"UpdatedData","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_sender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"ReceivedEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proxyLogicHandler","type":"address"},{"indexed":false,"name":"proxyConversionHandler","type":"address"},{"indexed":false,"name":"proxyAcquisitionCampaign","type":"address"},{"indexed":false,"name":"proxyPurchasesHandler","type":"address"},{"indexed":false,"name":"contractor","type":"address"}],"name":"AcquisitionCampaignCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proxyDonationCampaign","type":"address"},{"indexed":false,"name":"proxyDonationConversionHandler","type":"address"},{"indexed":false,"name":"proxyDonationLogicHandler","type":"address"},{"indexed":false,"name":"contractor","type":"address"}],"name":"DonationCampaignCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proxyCPCCampaign","type":"address"},{"indexed":false,"name":"contractor","type":"address"}],"name":"CPCCampaignCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_currency","type":"bytes32"},{"indexed":false,"name":"newRate","type":"uint256"},{"indexed":false,"name":"_timestamp","type":"uint256"},{"indexed":false,"name":"_updater","type":"address"}],"name":"PriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_handle","type":"string"},{"indexed":false,"name":"_address","type":"address"}],"name":"UserRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"campaignAddress","type":"address"},{"indexed":false,"name":"converterPlasmaAddress","type":"address"},{"indexed":false,"name":"conversionId","type":"uint256"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"campaignAddress","type":"address"},{"indexed":false,"name":"conversionID","type":"uint256"},{"indexed":false,"name":"tokensAmountWithdrawn","type":"uint256"}],"name":"TokenWithdrawnFromPurchasesHandler","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"plasmaAddress","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"addition","type":"bool"},{"indexed":false,"name":"currency","type":"string"}],"name":"Debt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"campaignAddress","type":"address"},{"indexed":false,"name":"amountOfTokens","type":"uint256"}],"name":"ReceivedTokensAsModerator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"campaignAddress","type":"address"},{"indexed":false,"name":"amountOfTokens","type":"uint256"}],"name":"ReceivedTokensDeepFreezeTokenPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"userPlasmaAddress","type":"address"},{"indexed":false,"name":"newHandle","type":"string"}],"name":"HandleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"contractSenderAddress","type":"address"},{"indexed":false,"name":"amountOfDAI","type":"uint256"}],"name":"DaiReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"priceAtBeginning","type":"uint256"},{"indexed":false,"name":"priceAtRebalancingTime","type":"uint256"},{"indexed":false,"name":"ratio","type":"uint256"},{"indexed":false,"name":"amountOfTokensTransferedInAction","type":"uint256"},{"indexed":false,"name":"actionPerformedWithUpgradableExchange","type":"string"}],"name":"RebalancedRatesEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"campaignPlasmaAddress","type":"address"},{"indexed":false,"name":"contractorLeftover","type":"uint256"},{"indexed":false,"name":"moderatorEarningsDistributed","type":"uint256"}],"name":"EndedBudgetCampaign","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"cycleId","type":"uint256"},{"indexed":false,"name":"amountOfTokens","type":"uint256"},{"indexed":false,"name":"action","type":"string"}],"name":"RebalancedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amountOfTokens","type":"uint256"}],"name":"UserWithdrawnNetworkEarnings","type":"event"}]

608060405234801561001057600080fd5b50613e80806100206000396000f3006080604052600436106101b7576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305dbe412146101bc5780630ab6839a1461021f5780630d80ceb71461026c578063102a8e70146102b9578063105005a11461033c57806315ff0b97146103935780631a025f25146104005780632254a1b71461048357806328bb4730146105065780633092eb2f146105a9578063405b30531461066c57806340f59c21146106b95780635211fb0014610714578063567b7af71461073f578063585efc1c146107b05780635c60da1b146108275780635d680c9c1461087e5780636a14341f146108a95780636bfa36f41461090c5780636de83b71146109635780638830afa0146109b05780638af1cbb914610a075780638fd2385214610a8a5780639aff2a7e14610b1d5780639eda107414610b74578063a4cae2eb14610bfd578063bd6cd0d114610c74578063c4d66de814610ce1578063c553cdde14610d17578063c9404dd914610d7a578063d209703714610de7578063e202e57214610e4a578063ec19989c14610ec7578063f78a3a2d14610f5e578063f8809a9514610fc3575b600080fd5b3480156101c857600080fd5b5061021d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611028565b005b34801561022b57600080fd5b5061026a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110eb565b005b34801561027857600080fd5b506102b7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111d1565b005b3480156102c557600080fd5b506102fa600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112b7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561034857600080fd5b5061035161141d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039f57600080fd5b506103fe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611443565b005b34801561040c57600080fd5b50610441600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611612565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561048f57600080fd5b50610504600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611778565b005b34801561051257600080fd5b506105a7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118c5565b005b3480156105b557600080fd5b5061066a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a41565b005b34801561067857600080fd5b506106b7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611bf2565b005b3480156106c557600080fd5b506106fa600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cd8565b604051808215151515815260200191505060405180910390f35b34801561072057600080fd5b50610729611dff565b6040518082815260200191505060405180910390f35b34801561074b57600080fd5b506107ae600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803590602001908201803590602001919091929391929390505050611eed565b005b3480156107bc57600080fd5b50610825600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612004565b005b34801561083357600080fd5b5061083c6121dc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561088a57600080fd5b50610893612206565b6040518082815260200191505060405180910390f35b3480156108b557600080fd5b5061090a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122f4565b005b34801561091857600080fd5b50610961600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612406565b005b34801561096f57600080fd5b506109ae600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061251c565b005b3480156109bc57600080fd5b506109c5612602565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a1357600080fd5b50610a88600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612628565b005b348015610a9657600080fd5b50610b1b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612823565b005b348015610b2957600080fd5b50610b72600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612a59565b005b348015610b8057600080fd5b50610bfb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612bfc565b005b348015610c0957600080fd5b50610c72600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612d47565b005b348015610c8057600080fd5b50610cdf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612f1f565b005b610d15600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130ee565b005b348015610d2357600080fd5b50610d786004803603810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190820180359060200191909192939192939050505061314c565b005b348015610d8657600080fd5b50610de5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132f0565b005b348015610df357600080fd5b50610e48600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134bf565b005b348015610e5657600080fd5b50610ec56004803603810190808035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613685565b005b348015610ed357600080fd5b50610f5c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803515159060200190929190803590602001909291905050506137d4565b005b348015610f6a57600080fd5b50610fc1600480360381019080803590602001908201803590602001919091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506139cb565b005b348015610fcf57600080fd5b5061102660048036038101908080356000191690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b60001515600260149054906101000a900460ff16151514151561104a57600080fd5b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600260146101000a81548160ff0219169083151502179055505050565b6111296040805190810160405280600b81526020017f54776f4b657941646d696e000000000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116257600080fd5b7f5c8e2b629af968089714cc9b0ed80107f8cc224e5036d7e12f22b33a998942e28282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b61120f6040805190810160405280601d81526020017f54776f4b657950617274696369706174696f6e4d696e696e67506f6f6c000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561124857600080fd5b7f9e008d1fe92d92989ec7c946474e1b443b7b18fad2f3ce450e24dc7d26c242a98282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b60008060006112fa6040805190810160405280600e81526020017f54776f4b65795265676973747279000000000000000000000000000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff1663b8397065856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561139757600080fd5b505af11580156113ab573d6000803e3d6000fd5b505050506040513d60208110156113c157600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561141257809250611416565b8392505b5050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006114836040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561152457600080fd5b505af1158015611538573d6000803e3d6000fd5b505050506040513d602081101561154e57600080fd5b8101908080519060200190929190505050151514151561156d57600080fd5b7f906a93b9c694feed29962dd45c9b10da5a1f52440a51de2f55ef70d0710c2642848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050565b60008060006116556040805190810160405280600e81526020017f54776f4b65795265676973747279000000000000000000000000000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff1663edab0437856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050506040513d602081101561171c57600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561176d57809250611771565b8392505b5050919050565b60006117b86040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117f457600080fd5b7f454b0172f64812df0cd504c2bd7df7aab8ff328a54d946b4bd0fa7c527adf9cc848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150505050565b6119036040805190810160405280600d81526020017f54776f4b6579466163746f727900000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561193c57600080fd5b7fb03e09dad78d8c951d9f02adfb36839cebbb3e4ca980b738e0eff605768bfa4c84848484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150505050565b611a7f6040805190810160405280600d81526020017f54776f4b6579466163746f727900000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab857600080fd5b7f7a29fc557a80b2254dad2cd7b0558bebb0a2a1d2ad4a319f97ea76a5891d32638585858585604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a15050505050565b611c306040805190810160405280601881526020017f54776f4b657955706772616461626c6545786368616e67650000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c6957600080fd5b7f02556fed6731dfe07962ca7a7e155af1de3f26ba243f37a66034c0df3461d15b8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000806000611d1b6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff16635cc7815c856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015611db857600080fd5b505af1158015611dcc573d6000803e3d6000fd5b505050506040513d6020811015611de257600080fd5b810190808051906020019092919050505090508092505050919050565b6000806000611e426040805190810160405280600b81526020017f54776f4b657941646d696e000000000000000000000000000000000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff166327fe76416040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611ea857600080fd5b505af1158015611ebc573d6000803e3d6000fd5b505050506040513d6020811015611ed257600080fd5b81019080805190602001909291905050509050809250505090565b611f2b6040805190810160405280601081526020017f54776f4b65794665654d616e6167657200000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f6457600080fd5b7f8621bf05dee425dbf45355adf1d7281893f5411aa67ad2e9cd3107d8f0014f478585858585604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001841515151581526020018060200182810382528484828181526020019250808284378201915050965050505050505060405180910390a15050505050565b60006120446040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156120e557600080fd5b505af11580156120f9573d6000803e3d6000fd5b505050506040513d602081101561210f57600080fd5b8101908080519060200190929190505050151514151561212e57600080fd5b7fd99a5f85ec9ee4a7f08d1ec5f4c47230c87b223726c9321988f6841709d0c58585858585604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a15050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060006122496040805190810160405280600b81526020017f54776f4b657941646d696e000000000000000000000000000000000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff16635795aa566040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156122af57600080fd5b505af11580156122c3573d6000803e3d6000fd5b505050506040513d60208110156122d957600080fd5b81019080805190602001909291905050509050809250505090565b6123326040805190810160405280600d81526020017f54776f4b6579466163746f727900000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561236b57600080fd5b7f9e05b95a1dc731d824d1d8fbbaf9848c03cdc446957f9b1eb18e78c60e8350788282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b61246b606060405190810160405280602481526020017f54776f4b657942756467657443616d706169676e735061796d656e747348616e81526020017f646c657200000000000000000000000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124a457600080fd5b7f8ef920ebf58a23e45470d57373be1bcec1bd99e895d03fa4865d59348883fa2d838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1505050565b61255a6040805190810160405280601981526020017f54776f4b657944656570467265657a65546f6b656e506f6f6c00000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561259357600080fd5b7fb4fac382e9efeab437e61dda562a293b56dd331cdbddd323402a025aae2914ce8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006126686040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561270957600080fd5b505af115801561271d573d6000803e3d6000fd5b505050506040513d602081101561273357600080fd5b8101908080519060200190929190505050151514151561275257600080fd5b7f2bd729a8054724da0df9fdf02b37398fb43652780a2590cef6fa6e8abcf43678848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150505050565b6001151561283033611cd8565b151514151561283e57600080fd5b61287c6040805190810160405280601081526020017f54776f4b65794665654d616e6167657200000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff1663b97c39058484846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561293d578082015181840152602081019050612922565b50505050905090810190601f16801561296a5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561298b57600080fd5b505af115801561299f573d6000803e3d6000fd5b505050507f8621bf05dee425dbf45355adf1d7281893f5411aa67ad2e9cd3107d8f0014f4783836001604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018215151515815260200180602001828103825260038152602001807f455448000000000000000000000000000000000000000000000000000000000081525060200194505050505060405180910390a1505050565b6000612a996040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015612b3a57600080fd5b505af1158015612b4e573d6000803e3d6000fd5b505050506040513d6020811015612b6457600080fd5b81019080805190602001909291905050501515141515612b8357600080fd5b7f595b8fc8e8b1acbfb8694b03a08fac4cfb668b916edf8a214b9430531e4203f9848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a150505050565b612c3a6040805190810160405280600e81526020017f54776f4b65795265676973747279000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c7357600080fd5b7f3150321c20bb22ea506f41320e9cfbdddedba4e89aed138cfc32ada4b60b83268282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612d08578082015181840152602081019050612ced565b50505050905090810190601f168015612d355780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000612d876040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015612e2857600080fd5b505af1158015612e3c573d6000803e3d6000fd5b505050506040513d6020811015612e5257600080fd5b81019080805190602001909291905050501515141515612e7157600080fd5b7fe953ae62f4f69be1c6d943cb68d93d288f23ffae7332b84196d46e9e778b23b285858585604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a15050505050565b6000612f5f6040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561300057600080fd5b505af1158015613014573d6000803e3d6000fd5b505050506040513d602081101561302a57600080fd5b8101908080519060200190929190505050151514151561304957600080fd5b7f6876a213a761d9b4f8d7ba3609528ef85da671684271f75fdacb41be8db29f45848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314957600080fd5b50565b600061318c6040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561322d57600080fd5b505af1158015613241573d6000803e3d6000fd5b505050506040513d602081101561325757600080fd5b8101908080519060200190929190505050151514151561327657600080fd5b7fb6a38159f315194e98abd249dec5f61e27f1d00d03debc4d3ac8e640e6094fbc87878787878760405180878152602001868152602001858152602001848152602001806020018281038252848482818152602001925080828437820191505097505050505050505060405180910390a150505050505050565b60006133306040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156133d157600080fd5b505af11580156133e5573d6000803e3d6000fd5b505050506040513d60208110156133fb57600080fd5b8101908080519060200190929190505050151514151561341a57600080fd5b7f915fb8c652d6245752cc491b71bd8e87ab6761417f8d2ca353c8055103294c03848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050565b60006134ff6040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a057600080fd5b505af11580156135b4573d6000803e3d6000fd5b505050506040513d60208110156135ca57600080fd5b810190808051906020019092919050505015151415156135e957600080fd5b7f1fd08c43ff018b384f5037a68179f90e0808a91887eeb0c991bc72dbc96a53fd8383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050565b6136ea606060405190810160405280602481526020017f54776f4b657942756467657443616d706169676e735061796d656e747348616e81526020017f646c657200000000000000000000000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561372357600080fd5b7f6a94b887f5d928d43664c98ed441c63f14a7e7e01435ff18102af74adb199c9a8383836040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613793578082015181840152602081019050613778565b50505050905090810190601f1680156137c05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1505050565b60006138146040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156138b557600080fd5b505af11580156138c9573d6000803e3d6000fd5b505050506040513d60208110156138df57600080fd5b810190808051906020019092919050505015151415156138fe57600080fd5b7fbc2cef928730c5d2f4c5be6e4b866d71726e12b53127bff102e98bd373816c7388888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018315151515815260200182815260200197505050505050505060405180910390a15050505050505050565b600115156139d833611cd8565b15151415156139e657600080fd5b613a246040805190810160405280601081526020017f54776f4b65794665654d616e6167657200000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff1663c5d2c43e83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613ac657600080fd5b505af1158015613ada573d6000803e3d6000fd5b505050507f7f605d0ff47d2a070e456b69ce2a36041788910b64443c7f4c6d307993cade2c84848460405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a17f8621bf05dee425dbf45355adf1d7281893f5411aa67ad2e9cd3107d8f0014f4782826001604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018215151515815260200180602001828103825260038152602001807f455448000000000000000000000000000000000000000000000000000000000081525060200194505050505060405180910390a150505050565b613c586040805190810160405280601a81526020017f54776f4b657945786368616e676552617465436f6e7472616374000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613c9157600080fd5b7fb9f26901b015ee01cabc2af9042d52bc821b1aaedcb7b0e97199a99ac3277fdd848484846040518085600019166000191681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db7a6d90836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613dc6578082015181840152602081019050613dab565b50505050905090810190601f168015613df35780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015613e1257600080fd5b505af1158015613e26573d6000803e3d6000fd5b505050506040513d6020811015613e3c57600080fd5b810190808051906020019092919050505090509190505600a165627a7a723058205fc682d063098bbff0a706e9d0b8daa7563f0e502a5c968dfa1bc8fb8fbfe2a00029

Deployed Bytecode

0x6080604052600436106101b7576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305dbe412146101bc5780630ab6839a1461021f5780630d80ceb71461026c578063102a8e70146102b9578063105005a11461033c57806315ff0b97146103935780631a025f25146104005780632254a1b71461048357806328bb4730146105065780633092eb2f146105a9578063405b30531461066c57806340f59c21146106b95780635211fb0014610714578063567b7af71461073f578063585efc1c146107b05780635c60da1b146108275780635d680c9c1461087e5780636a14341f146108a95780636bfa36f41461090c5780636de83b71146109635780638830afa0146109b05780638af1cbb914610a075780638fd2385214610a8a5780639aff2a7e14610b1d5780639eda107414610b74578063a4cae2eb14610bfd578063bd6cd0d114610c74578063c4d66de814610ce1578063c553cdde14610d17578063c9404dd914610d7a578063d209703714610de7578063e202e57214610e4a578063ec19989c14610ec7578063f78a3a2d14610f5e578063f8809a9514610fc3575b600080fd5b3480156101c857600080fd5b5061021d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611028565b005b34801561022b57600080fd5b5061026a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110eb565b005b34801561027857600080fd5b506102b7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111d1565b005b3480156102c557600080fd5b506102fa600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112b7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561034857600080fd5b5061035161141d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039f57600080fd5b506103fe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611443565b005b34801561040c57600080fd5b50610441600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611612565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561048f57600080fd5b50610504600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611778565b005b34801561051257600080fd5b506105a7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118c5565b005b3480156105b557600080fd5b5061066a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a41565b005b34801561067857600080fd5b506106b7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611bf2565b005b3480156106c557600080fd5b506106fa600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cd8565b604051808215151515815260200191505060405180910390f35b34801561072057600080fd5b50610729611dff565b6040518082815260200191505060405180910390f35b34801561074b57600080fd5b506107ae600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190803590602001908201803590602001919091929391929390505050611eed565b005b3480156107bc57600080fd5b50610825600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612004565b005b34801561083357600080fd5b5061083c6121dc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561088a57600080fd5b50610893612206565b6040518082815260200191505060405180910390f35b3480156108b557600080fd5b5061090a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122f4565b005b34801561091857600080fd5b50610961600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612406565b005b34801561096f57600080fd5b506109ae600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061251c565b005b3480156109bc57600080fd5b506109c5612602565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a1357600080fd5b50610a88600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612628565b005b348015610a9657600080fd5b50610b1b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612823565b005b348015610b2957600080fd5b50610b72600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612a59565b005b348015610b8057600080fd5b50610bfb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612bfc565b005b348015610c0957600080fd5b50610c72600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612d47565b005b348015610c8057600080fd5b50610cdf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612f1f565b005b610d15600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130ee565b005b348015610d2357600080fd5b50610d786004803603810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190820180359060200191909192939192939050505061314c565b005b348015610d8657600080fd5b50610de5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132f0565b005b348015610df357600080fd5b50610e48600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134bf565b005b348015610e5657600080fd5b50610ec56004803603810190808035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613685565b005b348015610ed357600080fd5b50610f5c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803515159060200190929190803590602001909291905050506137d4565b005b348015610f6a57600080fd5b50610fc1600480360381019080803590602001908201803590602001919091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506139cb565b005b348015610fcf57600080fd5b5061102660048036038101908080356000191690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b60001515600260149054906101000a900460ff16151514151561104a57600080fd5b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600260146101000a81548160ff0219169083151502179055505050565b6111296040805190810160405280600b81526020017f54776f4b657941646d696e000000000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116257600080fd5b7f5c8e2b629af968089714cc9b0ed80107f8cc224e5036d7e12f22b33a998942e28282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b61120f6040805190810160405280601d81526020017f54776f4b657950617274696369706174696f6e4d696e696e67506f6f6c000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561124857600080fd5b7f9e008d1fe92d92989ec7c946474e1b443b7b18fad2f3ce450e24dc7d26c242a98282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b60008060006112fa6040805190810160405280600e81526020017f54776f4b65795265676973747279000000000000000000000000000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff1663b8397065856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561139757600080fd5b505af11580156113ab573d6000803e3d6000fd5b505050506040513d60208110156113c157600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561141257809250611416565b8392505b5050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006114836040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561152457600080fd5b505af1158015611538573d6000803e3d6000fd5b505050506040513d602081101561154e57600080fd5b8101908080519060200190929190505050151514151561156d57600080fd5b7f906a93b9c694feed29962dd45c9b10da5a1f52440a51de2f55ef70d0710c2642848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050565b60008060006116556040805190810160405280600e81526020017f54776f4b65795265676973747279000000000000000000000000000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff1663edab0437856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050506040513d602081101561171c57600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561176d57809250611771565b8392505b5050919050565b60006117b86040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117f457600080fd5b7f454b0172f64812df0cd504c2bd7df7aab8ff328a54d946b4bd0fa7c527adf9cc848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150505050565b6119036040805190810160405280600d81526020017f54776f4b6579466163746f727900000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561193c57600080fd5b7fb03e09dad78d8c951d9f02adfb36839cebbb3e4ca980b738e0eff605768bfa4c84848484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150505050565b611a7f6040805190810160405280600d81526020017f54776f4b6579466163746f727900000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab857600080fd5b7f7a29fc557a80b2254dad2cd7b0558bebb0a2a1d2ad4a319f97ea76a5891d32638585858585604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a15050505050565b611c306040805190810160405280601881526020017f54776f4b657955706772616461626c6545786368616e67650000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c6957600080fd5b7f02556fed6731dfe07962ca7a7e155af1de3f26ba243f37a66034c0df3461d15b8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000806000611d1b6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff16635cc7815c856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015611db857600080fd5b505af1158015611dcc573d6000803e3d6000fd5b505050506040513d6020811015611de257600080fd5b810190808051906020019092919050505090508092505050919050565b6000806000611e426040805190810160405280600b81526020017f54776f4b657941646d696e000000000000000000000000000000000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff166327fe76416040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611ea857600080fd5b505af1158015611ebc573d6000803e3d6000fd5b505050506040513d6020811015611ed257600080fd5b81019080805190602001909291905050509050809250505090565b611f2b6040805190810160405280601081526020017f54776f4b65794665654d616e6167657200000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f6457600080fd5b7f8621bf05dee425dbf45355adf1d7281893f5411aa67ad2e9cd3107d8f0014f478585858585604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001841515151581526020018060200182810382528484828181526020019250808284378201915050965050505050505060405180910390a15050505050565b60006120446040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156120e557600080fd5b505af11580156120f9573d6000803e3d6000fd5b505050506040513d602081101561210f57600080fd5b8101908080519060200190929190505050151514151561212e57600080fd5b7fd99a5f85ec9ee4a7f08d1ec5f4c47230c87b223726c9321988f6841709d0c58585858585604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a15050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060006122496040805190810160405280600b81526020017f54776f4b657941646d696e000000000000000000000000000000000000000000815250613d1a565b91508173ffffffffffffffffffffffffffffffffffffffff16635795aa566040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156122af57600080fd5b505af11580156122c3573d6000803e3d6000fd5b505050506040513d60208110156122d957600080fd5b81019080805190602001909291905050509050809250505090565b6123326040805190810160405280600d81526020017f54776f4b6579466163746f727900000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561236b57600080fd5b7f9e05b95a1dc731d824d1d8fbbaf9848c03cdc446957f9b1eb18e78c60e8350788282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b61246b606060405190810160405280602481526020017f54776f4b657942756467657443616d706169676e735061796d656e747348616e81526020017f646c657200000000000000000000000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124a457600080fd5b7f8ef920ebf58a23e45470d57373be1bcec1bd99e895d03fa4865d59348883fa2d838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1505050565b61255a6040805190810160405280601981526020017f54776f4b657944656570467265657a65546f6b656e506f6f6c00000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561259357600080fd5b7fb4fac382e9efeab437e61dda562a293b56dd331cdbddd323402a025aae2914ce8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006126686040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561270957600080fd5b505af115801561271d573d6000803e3d6000fd5b505050506040513d602081101561273357600080fd5b8101908080519060200190929190505050151514151561275257600080fd5b7f2bd729a8054724da0df9fdf02b37398fb43652780a2590cef6fa6e8abcf43678848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150505050565b6001151561283033611cd8565b151514151561283e57600080fd5b61287c6040805190810160405280601081526020017f54776f4b65794665654d616e6167657200000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff1663b97c39058484846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561293d578082015181840152602081019050612922565b50505050905090810190601f16801561296a5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561298b57600080fd5b505af115801561299f573d6000803e3d6000fd5b505050507f8621bf05dee425dbf45355adf1d7281893f5411aa67ad2e9cd3107d8f0014f4783836001604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018215151515815260200180602001828103825260038152602001807f455448000000000000000000000000000000000000000000000000000000000081525060200194505050505060405180910390a1505050565b6000612a996040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015612b3a57600080fd5b505af1158015612b4e573d6000803e3d6000fd5b505050506040513d6020811015612b6457600080fd5b81019080805190602001909291905050501515141515612b8357600080fd5b7f595b8fc8e8b1acbfb8694b03a08fac4cfb668b916edf8a214b9430531e4203f9848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a150505050565b612c3a6040805190810160405280600e81526020017f54776f4b65795265676973747279000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c7357600080fd5b7f3150321c20bb22ea506f41320e9cfbdddedba4e89aed138cfc32ada4b60b83268282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612d08578082015181840152602081019050612ced565b50505050905090810190601f168015612d355780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b6000612d876040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015612e2857600080fd5b505af1158015612e3c573d6000803e3d6000fd5b505050506040513d6020811015612e5257600080fd5b81019080805190602001909291905050501515141515612e7157600080fd5b7fe953ae62f4f69be1c6d943cb68d93d288f23ffae7332b84196d46e9e778b23b285858585604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a15050505050565b6000612f5f6040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561300057600080fd5b505af1158015613014573d6000803e3d6000fd5b505050506040513d602081101561302a57600080fd5b8101908080519060200190929190505050151514151561304957600080fd5b7f6876a213a761d9b4f8d7ba3609528ef85da671684271f75fdacb41be8db29f45848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314957600080fd5b50565b600061318c6040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561322d57600080fd5b505af1158015613241573d6000803e3d6000fd5b505050506040513d602081101561325757600080fd5b8101908080519060200190929190505050151514151561327657600080fd5b7fb6a38159f315194e98abd249dec5f61e27f1d00d03debc4d3ac8e640e6094fbc87878787878760405180878152602001868152602001858152602001848152602001806020018281038252848482818152602001925080828437820191505097505050505050505060405180910390a150505050505050565b60006133306040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156133d157600080fd5b505af11580156133e5573d6000803e3d6000fd5b505050506040513d60208110156133fb57600080fd5b8101908080519060200190929190505050151514151561341a57600080fd5b7f915fb8c652d6245752cc491b71bd8e87ab6761417f8d2ca353c8055103294c03848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a150505050565b60006134ff6040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a057600080fd5b505af11580156135b4573d6000803e3d6000fd5b505050506040513d60208110156135ca57600080fd5b810190808051906020019092919050505015151415156135e957600080fd5b7f1fd08c43ff018b384f5037a68179f90e0808a91887eeb0c991bc72dbc96a53fd8383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050565b6136ea606060405190810160405280602481526020017f54776f4b657942756467657443616d706169676e735061796d656e747348616e81526020017f646c657200000000000000000000000000000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561372357600080fd5b7f6a94b887f5d928d43664c98ed441c63f14a7e7e01435ff18102af74adb199c9a8383836040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613793578082015181840152602081019050613778565b50505050905090810190601f1680156137c05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1505050565b60006138146040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613d1a565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156138b557600080fd5b505af11580156138c9573d6000803e3d6000fd5b505050506040513d60208110156138df57600080fd5b810190808051906020019092919050505015151415156138fe57600080fd5b7fbc2cef928730c5d2f4c5be6e4b866d71726e12b53127bff102e98bd373816c7388888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018315151515815260200182815260200197505050505050505060405180910390a15050505050505050565b600115156139d833611cd8565b15151415156139e657600080fd5b613a246040805190810160405280601081526020017f54776f4b65794665654d616e6167657200000000000000000000000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff1663c5d2c43e83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613ac657600080fd5b505af1158015613ada573d6000803e3d6000fd5b505050507f7f605d0ff47d2a070e456b69ce2a36041788910b64443c7f4c6d307993cade2c84848460405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a17f8621bf05dee425dbf45355adf1d7281893f5411aa67ad2e9cd3107d8f0014f4782826001604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018215151515815260200180602001828103825260038152602001807f455448000000000000000000000000000000000000000000000000000000000081525060200194505050505060405180910390a150505050565b613c586040805190810160405280601a81526020017f54776f4b657945786368616e676552617465436f6e7472616374000000000000815250613d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613c9157600080fd5b7fb9f26901b015ee01cabc2af9042d52bc821b1aaedcb7b0e97199a99ac3277fdd848484846040518085600019166000191681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db7a6d90836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613dc6578082015181840152602081019050613dab565b50505050905090810190601f168015613df35780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015613e1257600080fd5b505af1158015613e26573d6000803e3d6000fd5b505050506040513d6020811015613e3c57600080fd5b810190808051906020019092919050505090509190505600a165627a7a723058205fc682d063098bbff0a706e9d0b8daa7563f0e502a5c968dfa1bc8fb8fbfe2a00029

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.