ETH Price: $3,885.78 (-0.54%)

Token

CALL (CALL)
 

Overview

Max Total Supply

777,000,000 CALL

Holders

846 (0.00%)

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Global Crypto Alliance is a team of industry experts and business developers that created the platform GCNews.io, with the intent of disrupting the current news industry with a unique reward system fueled by CALL that inverts the traditional business model and challenges the status quo.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CALL

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 16: CALL.sol
pragma solidity 0.5.8;

import "./ERC777ERC20Compat.sol";
import "./SafeGuard.sol";
import { CStore } from "./CStore.sol"; //TODO: Convert all imports like this

contract CALL is ERC777ERC20Compat, SafeGuard {
    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _granularity,
        uint256 _totalSupply,
        address _initialOwner,
        address[] memory _defaultOperators
    )
    public ERC777ERC20Compat(_name, _symbol, _granularity, _totalSupply, _initialOwner, _defaultOperators)
    {
        requireMultiple(_totalSupply);
        require(balancesDB.setModule(address(this), true), "Cannot enable access to the database.");
        balancesDB.transferOwnership(_initialOwner);

        callRecipient(msg.sender, address(0), _initialOwner, _totalSupply, "", "", true);

        emit Minted(msg.sender, _initialOwner, _totalSupply, "", "");
        if (mErc20compatible) { emit Transfer(address(0), _initialOwner, _totalSupply); }
    }

    /**
     * @notice change the balances database to `_newDB`
     * @param _newDB The new balances database address
     */
    function changeBalancesDB(address _newDB) public onlyOwner {
        balancesDB = CStore(_newDB);
    }

    /**
     * @notice Disables the ERC20 interface. This function can only be called
     * by the owner.
     */
    function disableERC20() public onlyOwner {
        mErc20compatible = false;
        setInterfaceImplementation("ERC20Token", address(0));
    }

    /**
     * @notice Re enables the ERC20 interface. This function can only be called
     *  by the owner.
     */
    function enableERC20() public onlyOwner {
        mErc20compatible = true;
        setInterfaceImplementation("ERC20Token", address(this));
    }

    /**
     * @dev Transfer the specified amounts of tokens to the specified addresses.
     * @dev Be aware that there is no check for duplicate recipients.
     * @param _toAddresses Receiver addresses.
     * @param _amounts Amounts of tokens that will be transferred.
     */
    function multiPartyTransfer(address[] calldata _toAddresses, uint256[] calldata _amounts) external erc20 {
        /* Ensures _toAddresses array is less than or equal to 255 */
        require(_toAddresses.length <= 255, "Unsupported number of addresses.");
        /* Ensures _toAddress and _amounts have the same number of entries. */
        require(_toAddresses.length == _amounts.length, "Provided addresses does not equal to provided sums.");

        for (uint8 i = 0; i < _toAddresses.length; i++) {
            transfer(_toAddresses[i], _amounts[i]);
        }
    }

    /**
    * @dev Transfer the specified amounts of tokens to the specified addresses from authorized balance of sender.
    * @dev Be aware that there is no check for duplicate recipients.
    * @param _from The address of the sender
    * @param _toAddresses The addresses of the recipients (MAX 255)
    * @param _amounts The amounts of tokens to be transferred
    */
    function multiPartyTransferFrom(address _from, address[] calldata _toAddresses, uint256[] calldata _amounts) external erc20 {
        /* Ensures _toAddresses array is less than or equal to 255 */
        require(_toAddresses.length <= 255, "Unsupported number of addresses.");
        /* Ensures _toAddress and _amounts have the same number of entries. */
        require(_toAddresses.length == _amounts.length, "Provided addresses does not equal to provided sums.");

        for (uint8 i = 0; i < _toAddresses.length; i++) {
            transferFrom(_from, _toAddresses[i], _amounts[i]);
        }
    }

    /**
     * @dev Transfer the specified amounts of tokens to the specified addresses.
     * @dev Be aware that there is no check for duplicate recipients.
     * @param _toAddresses Receiver addresses.
     * @param _amounts Amounts of tokens that will be transferred.
     * @param _userData User supplied data
     */
    function multiPartySend(address[] memory _toAddresses, uint256[] memory _amounts, bytes memory _userData) public {
        /* Ensures _toAddresses array is less than or equal to 255 */
        require(_toAddresses.length <= 255, "Unsupported number of addresses.");
        /* Ensures _toAddress and _amounts have the same number of entries. */
        require(_toAddresses.length == _amounts.length, "Provided addresses does not equal to provided sums.");

        for (uint8 i = 0; i < _toAddresses.length; i++) {
            doSend(msg.sender,  msg.sender, _toAddresses[i], _amounts[i], _userData, "", true);
        }
    }

    /**
    * @dev Transfer the specified amounts of tokens to the specified addresses as `_from`.
    * @dev Be aware that there is no check for duplicate recipients.
    * @param _from Address to use as sender
    * @param _to Receiver addresses.
    * @param _amounts Amounts of tokens that will be transferred.
    * @param _userData User supplied data
    * @param _operatorData Operator supplied data
    */
    function multiOperatorSend(address _from, address[] calldata _to, uint256[] calldata _amounts, bytes calldata _userData, bytes calldata _operatorData)
    external {
        /* Ensures _toAddresses array is less than or equal to 255 */
        require(_to.length <= 255, "Unsupported number of addresses.");
        /* Ensures _toAddress and _amounts have the same number of entries. */
        require(_to.length == _amounts.length, "Provided addresses does not equal to provided sums.");

        for (uint8 i = 0; i < _to.length; i++) {
            require(isOperatorFor(msg.sender, _from), "Not an operator"); //TODO check for denial of service
            doSend(msg.sender, _from, _to[i], _amounts[i], _userData, _operatorData, true);
        }
    }
}


File 2 of 16: Context.sol
pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 16: CStore.sol
pragma solidity 0.5.8;

import "./ERC644Balances.sol";
import { ERC1820Client } from "./ERC1820Client.sol";


/**
 * @title ERC644 Database Contract
 * @author Panos
 */
contract CStore is ERC644Balances, ERC1820Client {

    address[] internal mDefaultOperators;
    mapping(address => bool) internal mIsDefaultOperator;
    mapping(address => mapping(address => bool)) internal mRevokedDefaultOperator;
    mapping(address => mapping(address => bool)) internal mAuthorizedOperators;

    /**
     * @notice Database construction
     * @param _totalSupply The total supply of the token
     */
    constructor(uint256 _totalSupply, address _initialOwner, address[] memory _defaultOperators) public
    {
        balances[_initialOwner] = _totalSupply;
        totalSupply = _totalSupply;
        mDefaultOperators = _defaultOperators;
        for (uint256 i = 0; i < mDefaultOperators.length; i++) { mIsDefaultOperator[mDefaultOperators[i]] = true; }

        setInterfaceImplementation("ERC644Balances", address(this));
    }

    /**
     * @notice Increase total supply by `_val`
     * @param _val Value to increase
     * @return Operation status
     */
    // solhint-disable-next-line no-unused-vars
    function incTotalSupply(uint _val) external onlyModule returns (bool) {
        return false;
    }

    /**
     * @notice Decrease total supply by `_val`
     * @param _val Value to decrease
     * @return Operation status
     */
     // solhint-disable-next-line no-unused-vars
     function decTotalSupply(uint _val) external onlyModule returns (bool) {
         return false;
     }

    /**
     * @notice moving `_amount` from `_from` to `_to`
     * @param _from The sender address
     * @param _to The receiving address
     * @param _amount The moving amount
     * @return bool The move result
     */
    function move(address _from, address _to, uint256 _amount) external
    onlyModule
    returns (bool) {
        balances[_from] = balances[_from].sub(_amount);
        emit BalanceAdj(msg.sender, _from, _amount, "-");
        balances[_to] = balances[_to].add(_amount);
        emit BalanceAdj(msg.sender, _to, _amount, "+");
        return true;
    }

    /**
     * @notice Setting operator `_operator` for `_tokenHolder`
     * @param _operator The operator to set status
     * @param _tokenHolder The token holder to set operator
     * @param _status The operator status
     * @return bool Status of operation
     */
    function setAuthorizedOperator(address _operator, address _tokenHolder, bool _status) external
    onlyModule
    returns (bool) {
        mAuthorizedOperators[_operator][_tokenHolder] = _status;
        return true;
    }

    /**
     * @notice Set revoke status for default operator `_operator` for `_tokenHolder`
     * @param _operator The default operator to set status
     * @param _tokenHolder The token holder to set operator
     * @param _status The operator status
     * @return bool Status of operation
     */
    function setRevokedDefaultOperator(address _operator, address _tokenHolder, bool _status) external
    onlyModule
    returns (bool) {
    mRevokedDefaultOperator[_operator][_tokenHolder] = _status;
        return true;
    }

    /**
     * @notice Getting operator `_operator` for `_tokenHolder`
     * @param _operator The operator address to get status
     * @param _tokenHolder The token holder address
     * @return bool Operator status
     */
    function getAuthorizedOperator(address _operator, address _tokenHolder) external
    view
    returns (bool) {
        return mAuthorizedOperators[_operator][_tokenHolder];
    }

    /**
     * @notice Getting default operator `_operator`
     * @param _operator The default operator address to get status
     * @return bool Default operator status
     */
    function getDefaultOperator(address _operator) external view returns (bool) {
        return mIsDefaultOperator[_operator];
    }

    /**
     * @notice Getting default operators
     * @return address[] Default operator addresses
     */
    function getDefaultOperators() external view returns (address[] memory) {
        return mDefaultOperators;
    }

    function getRevokedDefaultOperator(address _operator, address _tokenHolder) external view returns (bool) {
        return mRevokedDefaultOperator[_operator][_tokenHolder];
    }

    /**
     * @notice Increment `_acct` balance by `_val`
     * @param _acct Target account to increment balance.
     * @param _val Value to increment
     * @return Operation status
     */
    // solhint-disable-next-line no-unused-vars
    function incBalance(address _acct, uint _val) public onlyModule returns (bool) {
        return false;
    }

    /**
     * @notice Decrement `_acct` balance by `_val`
     * @param _acct Target account to decrement balance.
     * @param _val Value to decrement
     * @return Operation status
     */
     // solhint-disable-next-line no-unused-vars
     function decBalance(address _acct, uint _val) public onlyModule returns (bool) {
         return false;
     }
}


File 4 of 16: ERC1820Client.sol
pragma solidity ^0.5.3;


contract ERC1820Registry {
    function setInterfaceImplementer(address _addr, bytes32 _interfaceHash, address _implementer) external;
    function getInterfaceImplementer(address _addr, bytes32 _interfaceHash) external view returns (address);
    function setManager(address _addr, address _newManager) external;
    function getManager(address _addr) public view returns (address);
}


/// Base client to interact with the registry.
contract ERC1820Client {
    ERC1820Registry constant ERC1820REGISTRY = ERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);

    function setInterfaceImplementation(string memory _interfaceLabel, address _implementation) internal {
        bytes32 interfaceHash = keccak256(abi.encodePacked(_interfaceLabel));
        ERC1820REGISTRY.setInterfaceImplementer(address(this), interfaceHash, _implementation);
    }

    function interfaceAddr(address addr, string memory _interfaceLabel) internal view returns(address) {
        bytes32 interfaceHash = keccak256(abi.encodePacked(_interfaceLabel));
        return ERC1820REGISTRY.getInterfaceImplementer(addr, interfaceHash);
    }

    function delegateManagement(address _newManager) internal {
        ERC1820REGISTRY.setManager(address(this), _newManager);
    }
}

File 5 of 16: ERC644Balances.sol
pragma solidity 0.5.8;

import "./SafeMath.sol";
import "./SafeGuard.sol";
import "./IERC644.sol";


/**
 * @title ERC644 Standard Balances Contract
 * @author chrisfranko
 */
contract ERC644Balances is IERC644, SafeGuard {
    using SafeMath for uint256;

    uint256 public totalSupply;

    event BalanceAdj(address indexed module, address indexed account, uint amount, string polarity);
    event ModuleSet(address indexed module, bool indexed set);

    mapping(address => bool) public modules;
    mapping(address => uint256) public balances;
    mapping(address => mapping(address => uint256)) public allowed;

    modifier onlyModule() {
        require(modules[msg.sender], "ERC644Balances: caller is not a module");
        _;
    }

    /**
     * @notice Set allowance of `_spender` in behalf of `_sender` at `_value`
     * @param _sender Owner account
     * @param _spender Spender account
     * @param _value Value to approve
     * @return Operation status
     */
    function setApprove(address _sender, address _spender, uint256 _value) external onlyModule returns (bool) {
        allowed[_sender][_spender] = _value;
        return true;
    }

    /**
     * @notice Decrease allowance of `_spender` in behalf of `_from` at `_value`
     * @param _from Owner account
     * @param _spender Spender account
     * @param _value Value to decrease
     * @return Operation status
     */
    function decApprove(address _from, address _spender, uint _value) external onlyModule returns (bool) {
        allowed[_from][_spender] = allowed[_from][_spender].sub(_value);
        return true;
    }

    /**
    * @notice Increase total supply by `_val`
    * @param _val Value to increase
    * @return Operation status
    */
    function incTotalSupply(uint _val) external onlyModule returns (bool) {
        totalSupply = totalSupply.add(_val);
        return true;
    }

    /**
     * @notice Decrease total supply by `_val`
     * @param _val Value to decrease
     * @return Operation status
     */
    function decTotalSupply(uint _val) external onlyModule returns (bool) {
        totalSupply = totalSupply.sub(_val);
        return true;
    }

    /**
     * @notice Set/Unset `_acct` as an authorized module
     * @param _acct Module address
     * @param _set Module set status
     * @return Operation status
     */
    function setModule(address _acct, bool _set) external onlyOwner returns (bool) {
        modules[_acct] = _set;
        emit ModuleSet(_acct, _set);
        return true;
    }

    /**
     * @notice Get `_acct` balance
     * @param _acct Target account to get balance.
     * @return The account balance
     */
    function getBalance(address _acct) external view returns (uint256) {
        return balances[_acct];
    }

    /**
     * @notice Get allowance of `_spender` in behalf of `_owner`
     * @param _owner Owner account
     * @param _spender Spender account
     * @return Allowance
     */
    function getAllowance(address _owner, address _spender) external view returns (uint256) {
        return allowed[_owner][_spender];
    }

    /**
     * @notice Get if `_acct` is an authorized module
     * @param _acct Module address
     * @return Operation status
     */
    function getModule(address _acct) external view returns (bool) {
        return modules[_acct];
    }

    /**
     * @notice Get total supply
     * @return Total supply
     */
    function getTotalSupply() external view returns (uint256) {
        return totalSupply;
    }

    /**
     * @notice Increment `_acct` balance by `_val`
     * @param _acct Target account to increment balance.
     * @param _val Value to increment
     * @return Operation status
     */
    function incBalance(address _acct, uint _val) public onlyModule returns (bool) {
        balances[_acct] = balances[_acct].add(_val);
        emit BalanceAdj(msg.sender, _acct, _val, "+");
        return true;
    }

    /**
     * @notice Decrement `_acct` balance by `_val`
     * @param _acct Target account to decrement balance.
     * @param _val Value to decrement
     * @return Operation status
     */
    function decBalance(address _acct, uint _val) public onlyModule returns (bool) {
        balances[_acct] = balances[_acct].sub(_val);
        emit BalanceAdj(msg.sender, _acct, _val, "-");
        return true;
    }

    function transferRoot(address _new) external returns (bool) {
        return false;
    }
}


File 6 of 16: ERC777.sol
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
pragma solidity 0.5.8;

import { ERC1820Client } from "./ERC1820Client.sol";
import { SafeMath } from "./SafeMath.sol";
import { IERC777 } from "./IERC777.sol";
import { IERC777TokensSender } from "./IERC777TokensSender.sol";
import { IERC777TokensRecipient } from "./IERC777TokensRecipient.sol";


contract ERC777 is IERC777, ERC1820Client {
    using SafeMath for uint256;

    string internal mName;
    string internal mSymbol;
    uint256 internal mGranularity;
    uint256 internal mTotalSupply;


    mapping(address => uint) internal mBalances;

    address[] internal mDefaultOperators;
    mapping(address => bool) internal mIsDefaultOperator;
    mapping(address => mapping(address => bool)) internal mRevokedDefaultOperator;
    mapping(address => mapping(address => bool)) internal mAuthorizedOperators;

    /* -- Constructor -- */
    //
    /// @notice Constructor to create a ReferenceToken
    /// @param _name Name of the new token
    /// @param _symbol Symbol of the new token.
    /// @param _granularity Minimum transferable chunk.
    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _granularity,
        address[] memory _defaultOperators
    ) internal {
        mName = _name;
        mSymbol = _symbol;
        mTotalSupply = 0;
        require(_granularity >= 1, "Granularity must be > 1");
        mGranularity = _granularity;

        mDefaultOperators = _defaultOperators;
        for (uint256 i = 0; i < mDefaultOperators.length; i++) { mIsDefaultOperator[mDefaultOperators[i]] = true; }

        setInterfaceImplementation("ERC777Token", address(this));
    }

    /* -- ERC777 Interface Implementation -- */
    //
    /// @return the name of the token
    function name() public view returns (string memory) { return mName; }

    /// @return the symbol of the token
    function symbol() public view returns (string memory) { return mSymbol; }

    /// @return the granularity of the token
    function granularity() public view returns (uint256) { return mGranularity; }

    /// @return the total supply of the token
    function totalSupply() public view returns (uint256) { return mTotalSupply; }

    /// @notice Return the account balance of some account
    /// @param _tokenHolder Address for which the balance is returned
    /// @return the balance of `_tokenAddress`.
    function balanceOf(address _tokenHolder) public view returns (uint256) { return mBalances[_tokenHolder]; }

    /// @notice Return the list of default operators
    /// @return the list of all the default operators
    function defaultOperators() public view returns (address[] memory) { return mDefaultOperators; }

    /// @notice Send `_amount` of tokens to address `_to` passing `_data` to the recipient
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be sent
    function send(address _to, uint256 _amount, bytes calldata _data) external {
        doSend(msg.sender, msg.sender, _to, _amount, _data, "", true);
    }

    /// @notice Authorize a third party `_operator` to manage (send) `msg.sender`'s tokens.
    /// @param _operator The operator that wants to be Authorized
    function authorizeOperator(address _operator) external {
        require(_operator != msg.sender, "Cannot authorize yourself as an operator");
        if (mIsDefaultOperator[_operator]) {
            mRevokedDefaultOperator[_operator][msg.sender] = false;
        } else {
            mAuthorizedOperators[_operator][msg.sender] = true;
        }
        emit AuthorizedOperator(_operator, msg.sender);
    }

    /// @notice Revoke a third party `_operator`'s rights to manage (send) `msg.sender`'s tokens.
    /// @param _operator The operator that wants to be Revoked
    function revokeOperator(address _operator) external {
        require(_operator != msg.sender, "Cannot revoke yourself as an operator");
        if (mIsDefaultOperator[_operator]) {
            mRevokedDefaultOperator[_operator][msg.sender] = true;
        } else {
            mAuthorizedOperators[_operator][msg.sender] = false;
        }
        emit RevokedOperator(_operator, msg.sender);
    }

    /// @notice Check whether the `_operator` address is allowed to manage the tokens held by `_tokenHolder` address.
    /// @param _operator address to check if it has the right to manage the tokens
    /// @param _tokenHolder address which holds the tokens to be managed
    /// @return `true` if `_operator` is authorized for `_tokenHolder`
    function isOperatorFor(address _operator, address _tokenHolder) public view returns (bool) {
        return (_operator == _tokenHolder // solium-disable-line operator-whitespace
        || mAuthorizedOperators[_operator][_tokenHolder]
        || (mIsDefaultOperator[_operator] && !mRevokedDefaultOperator[_operator][_tokenHolder]));
    }

    /// @notice Send `_amount` of tokens on behalf of the address `from` to the address `to`.
    /// @param _from The address holding the tokens being sent
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be sent
    /// @param _data Data generated by the user to be sent to the recipient
    /// @param _operatorData Data generated by the operator to be sent to the recipient
    function operatorSend(
        address _from,
        address _to,
        uint256 _amount,
        bytes calldata _data,
        bytes calldata _operatorData
    )
    external
    {
        require(isOperatorFor(msg.sender, _from), "Not an operator.");
        doSend(msg.sender, _from, _to, _amount, _data, _operatorData, true);
    }

    function burn(uint256 _amount, bytes calldata _data) external {
        doBurn(msg.sender, msg.sender, _amount, _data, "");
    }

    function operatorBurn(
        address _tokenHolder,
        uint256 _amount,
        bytes calldata _data,
        bytes calldata _operatorData
    )
    external
    {
        require(isOperatorFor(msg.sender, _tokenHolder), "Not an operator");
        doBurn(msg.sender, _tokenHolder, _amount, _data, _operatorData);
    }

    /* -- Helper Functions -- */
    //
    /// @notice Internal function that ensures `_amount` is multiple of the granularity
    /// @param _amount The quantity that want's to be checked
    function requireMultiple(uint256 _amount) internal view {
        require(_amount % mGranularity == 0, "Amount is not a multiple of granularity");
    }

    /// @notice Check whether an address is a regular address or not.
    /// @param _addr Address of the contract that has to be checked
    /// @return `true` if `_addr` is a regular address (not a contract)
    function isRegularAddress(address _addr) internal view returns(bool) {
        if (_addr == address(0)) { return false; }
        uint size;
        assembly { size := extcodesize(_addr) } // solium-disable-line security/no-inline-assembly
        return size == 0;
    }

    /// @notice Helper function actually performing the sending of tokens.
    /// @param _operator The address performing the send
    /// @param _from The address holding the tokens being sent
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be sent
    /// @param _data Data generated by the user to be passed to the recipient
    /// @param _operatorData Data generated by the operator to be passed to the recipient
    /// @param _preventLocking `true` if you want this function to throw when tokens are sent to a contract not
    ///  implementing `ERC777tokensRecipient`.
    ///  ERC777 native Send functions MUST set this parameter to `true`, and backwards compatible ERC20 transfer
    ///  functions SHOULD set this parameter to `false`.
    function doSend(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes memory _data,
        bytes memory _operatorData,
        bool _preventLocking
    )
    internal
    {
        requireMultiple(_amount);

        callSender(_operator, _from, _to, _amount, _data, _operatorData);

        require(_to != address(0), "Cannot send to 0x0");
        require(mBalances[_from] >= _amount, "Not enough funds");

        mBalances[_from] = mBalances[_from].sub(_amount);
        mBalances[_to] = mBalances[_to].add(_amount);

        callRecipient(_operator, _from, _to, _amount, _data, _operatorData, _preventLocking);

        emit Sent(_operator, _from, _to, _amount, _data, _operatorData);
    }

    /// @notice Helper function actually performing the burning of tokens.
    /// @param _operator The address performing the burn
    /// @param _tokenHolder The address holding the tokens being burn
    /// @param _amount The number of tokens to be burnt
    /// @param _data Data generated by the token holder
    /// @param _operatorData Data generated by the operator
    function doBurn(
        address _operator,
        address _tokenHolder,
        uint256 _amount,
        bytes memory _data,
        bytes memory _operatorData
    )
    internal
    {
        callSender(_operator, _tokenHolder, address(0), _amount, _data, _operatorData);

        requireMultiple(_amount);
        require(balanceOf(_tokenHolder) >= _amount, "Not enough funds");

        mBalances[_tokenHolder] = mBalances[_tokenHolder].sub(_amount);
        mTotalSupply = mTotalSupply.sub(_amount);

        emit Burned(_operator, _tokenHolder, _amount, _data, _operatorData);
    }

    /// @notice Helper function that checks for ERC777TokensRecipient on the recipient and calls it.
    ///  May throw according to `_preventLocking`
    /// @param _operator The address performing the send or mint
    /// @param _from The address holding the tokens being sent
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be sent
    /// @param _data Data generated by the user to be passed to the recipient
    /// @param _operatorData Data generated by the operator to be passed to the recipient
    /// @param _preventLocking `true` if you want this function to throw when tokens are sent to a contract not
    ///  implementing `ERC777TokensRecipient`.
    ///  ERC777 native Send functions MUST set this parameter to `true`, and backwards compatible ERC20 transfer
    ///  functions SHOULD set this parameter to `false`.
    function callRecipient(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes memory _data,
        bytes memory _operatorData,
        bool _preventLocking
    )
    internal
    {
        address recipientImplementation = interfaceAddr(_to, "ERC777TokensRecipient");
        if (recipientImplementation != address(0)) {
            IERC777TokensRecipient(recipientImplementation).tokensReceived(
                _operator, _from, _to, _amount, _data, _operatorData);
        } else if (_preventLocking) {
            require(isRegularAddress(_to), "Cannot send to contract without ERC777TokensRecipient");
        }
    }

    /// @notice Helper function that checks for ERC777TokensSender on the sender and calls it.
    ///  May throw according to `_preventLocking`
    /// @param _from The address holding the tokens being sent
    /// @param _to The address of the recipient
    /// @param _amount The amount of tokens to be sent
    /// @param _data Data generated by the user to be passed to the recipient
    /// @param _operatorData Data generated by the operator to be passed to the recipient
    ///  implementing `ERC777TokensSender`.
    ///  ERC777 native Send functions MUST set this parameter to `true`, and backwards compatible ERC20 transfer
    ///  functions SHOULD set this parameter to `false`.
    function callSender(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes memory _data,
        bytes memory _operatorData
    )
    internal
    {
        address senderImplementation = interfaceAddr(_from, "ERC777TokensSender");
        if (senderImplementation == address(0)) { return; }
        IERC777TokensSender(senderImplementation).tokensToSend(
            _operator, _from, _to, _amount, _data, _operatorData);
    }
}


File 7 of 16: ERC777ERC20Compat.sol
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
pragma solidity 0.5.8;


import { IERC20 } from "./IERC20.sol";
import { ERC777RemoteBridge } from "./ERC777RemoteBridge.sol";


contract ERC777ERC20Compat is IERC20, ERC777RemoteBridge {
    bool internal mErc20compatible;

    mapping(address => mapping(address => uint256)) internal mAllowed;

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _granularity,
        uint256 _totalSupply,
        address _initialOwner,
        address[] memory _defaultOperators
    )
    internal ERC777RemoteBridge(_name, _symbol, _granularity, _totalSupply, _initialOwner, _defaultOperators)
    {
        mErc20compatible = true;
        setInterfaceImplementation("ERC20Token", address(this));
    }

    /// @notice This modifier is applied to erc20 obsolete methods that are
    ///  implemented only to maintain backwards compatibility. When the erc20
    ///  compatibility is disabled, this methods will fail.
    modifier erc20 () {
        require(mErc20compatible, "ERC20 is disabled");
        _;
    }

    /// @notice For Backwards compatibility
    /// @return The decimals of the token. Forced to 18 in ERC777.
    function decimals() public erc20 view returns (uint8) { return uint8(18); }

    /// @notice ERC20 backwards compatible transfer.
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be transferred
    /// @return `true`, if the transfer can't be done, it should fail.
    function transfer(address _to, uint256 _amount) public erc20 returns (bool success) {
        doSend(msg.sender, msg.sender, _to, _amount, "", "", false);
        return true;
    }

    /// @notice ERC20 backwards compatible transferFrom.
    /// @param _from The address holding the tokens being transferred
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be transferred
    /// @return `true`, if the transfer can't be done, it should fail.
    function transferFrom(address _from, address _to, uint256 _amount) public erc20 returns (bool success) {
        uint256 allowance = balancesDB.getAllowance(_from, msg.sender);
        require(_amount <= allowance, "Not enough allowance.");

        // Cannot be after doSend because of tokensReceived re-entry
        require(balancesDB.decApprove(_from, msg.sender, _amount));
        doSend(msg.sender, _from, _to, _amount, "", "", false);
        return true;
    }

    /// @notice ERC20 backwards compatible approve.
    ///  `msg.sender` approves `_spender` to spend `_amount` tokens on its behalf.
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _amount The number of tokens to be approved for transfer
    /// @return `true`, if the approve can't be done, it should fail.
    function approve(address _spender, uint256 _amount) public erc20 returns (bool success) {
        require(balancesDB.setApprove(msg.sender, _spender, _amount));
        emit Approval(msg.sender, _spender, _amount);
        return true;
    }

    /// @notice ERC20 backwards compatible allowance.
    ///  This function makes it easy to read the `allowed[]` map
    /// @param _owner The address of the account that owns the token
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens of _owner that _spender is allowed
    ///  to spend
    function allowance(address _owner, address _spender) public erc20 view returns (uint256 remaining) {
        return balancesDB.getAllowance(_owner, _spender);
    }

    function doSend(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes memory _data,
        bytes memory _operatorData,
        bool _preventLocking
    )
    internal
    {
        super.doSend(_operator, _from, _to, _amount, _data, _operatorData, _preventLocking);
        if (mErc20compatible) { emit Transfer(_from, _to, _amount); }
    }

    function doBurn(
        address _operator,
        address _tokenHolder,
        uint256 _amount,
        bytes memory _data,
        bytes memory _operatorData
    )
    internal
    {
        super.doBurn(_operator, _tokenHolder, _amount, _data, _operatorData);
        if (mErc20compatible) { emit Transfer(_tokenHolder, address(0), _amount); }
    }
}


File 8 of 16: ERC777RemoteBridge.sol
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
pragma solidity 0.5.8;


import { ERC777 } from "./ERC777.sol";
import { CStore } from "./CStore.sol";


contract ERC777RemoteBridge is ERC777 {

    CStore public balancesDB;

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _granularity,
        uint256 _totalSupply,
        address _initialOwner,
        address[] memory _defaultOperators
    )
    public ERC777(_name, _symbol, _granularity, new address[](0))
    {
        balancesDB = new CStore(_totalSupply, _initialOwner, _defaultOperators);
    }

    /**
     * @return the total supply of the token
     */
    function totalSupply() public view returns (uint256) {
        return balancesDB.getTotalSupply();
    }

    /**
     * @notice Return the account balance of some account
     * @param _tokenHolder Address for which the balance is returned
     * @return the balance of `_tokenAddress`.
     */
    function balanceOf(address _tokenHolder) public view returns (uint256) {
        return balancesDB.getBalance(_tokenHolder);
    }

    /**
     * @notice Return the list of default operators
     * @return the list of all the default operators
     */
    function defaultOperators() public view returns (address[] memory) {
        return balancesDB.getDefaultOperators();
    }

    /**
     * @notice Authorize a third party `_operator` to manage (send) `msg.sender`'s tokens at remote database.
     * @param _operator The operator that wants to be Authorized
     */
    function authorizeOperator(address _operator) external {
        require(_operator != msg.sender, "Cannot authorize yourself as an operator");
        if (balancesDB.getDefaultOperator(_operator)) {
            require(balancesDB.setRevokedDefaultOperator(_operator, msg.sender, false));
        } else {
            require(balancesDB.setAuthorizedOperator(_operator, msg.sender, true));
        }
        emit AuthorizedOperator(_operator, msg.sender);
    }

    /**
     * @notice Revoke a third party `_operator`'s rights to manage (send) `msg.sender`'s tokens at remote database.
     * @param _operator The operator that wants to be Revoked
     */
    function revokeOperator(address _operator) external {
        require(_operator != msg.sender, "Cannot revoke yourself as an operator");
        if (balancesDB.getDefaultOperator(_operator)) {
            require(balancesDB.setRevokedDefaultOperator(_operator, msg.sender, true));
        } else {
            require(balancesDB.setAuthorizedOperator(_operator, msg.sender, false));
        }
        emit RevokedOperator(_operator, msg.sender);
    }

    /**
    * @notice Check whether the `_operator` address is allowed to manage the tokens held by `_tokenHolder`
    *  address at remote database.
    * @param _operator address to check if it has the right to manage the tokens
    * @param _tokenHolder address which holds the tokens to be managed
    * @return `true` if `_operator` is authorized for `_tokenHolder`
    */
    function isOperatorFor(address _operator, address _tokenHolder) public view returns (bool) {
        return _operator == _tokenHolder || balancesDB.getAuthorizedOperator(_operator, _tokenHolder);
        return (_operator == _tokenHolder // solium-disable-line operator-whitespace
        || balancesDB.getAuthorizedOperator(_operator, _tokenHolder)
        || (balancesDB.getDefaultOperator(_operator) && !balancesDB.getRevokedDefaultOperator(_operator, _tokenHolder)));
    }

    /**
     * @notice Helper function actually performing the sending of tokens using a backend database.
     * @param _from The address holding the tokens being sent
     * @param _to The address of the recipient
     * @param _amount The number of tokens to be sent
     * @param _data Data generated by the user to be passed to the recipient
     * @param _operatorData Data generated by the operator to be passed to the recipient
     * @param _preventLocking `true` if you want this function to throw when tokens are sent to a contract not
     *  implementing `erc777_tokenHolder`.
     *  ERC777 native Send functions MUST set this parameter to `true`, and backwards compatible ERC20 transfer
     *  functions SHOULD set this parameter to `false`.
     */
    function doSend(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes memory _data,
        bytes memory _operatorData,
        bool _preventLocking
    )
    internal
    {
        requireMultiple(_amount);

        callSender(_operator, _from, _to, _amount, _data, _operatorData);

        require(_to != address(0), "Cannot send to 0x0");          // forbid sending to 0x0 (=burning)
        // require(mBalances[_from] >= _amount); // ensure enough funds
        // (Not Required due to SafeMath throw if underflow in database and false check)

        require(balancesDB.move(_from, _to, _amount));

        callRecipient(_operator, _from, _to, _amount, _data, _operatorData, _preventLocking);

        emit Sent(_operator, _from, _to, _amount, _data, _operatorData);
        //if (mErc20compatible) { emit Transfer(_from, _to, _amount); }
    }

    /**
     * @notice Helper function actually performing the burning of tokens.
     * @param _operator The address performing the burn
     * @param _tokenHolder The address holding the tokens being burn
     * @param _amount The number of tokens to be burnt
     * @param _data Data generated by the token holder
     * @param _operatorData Data generated by the operator
     */
    function doBurn(
        address _operator,
        address _tokenHolder,
        uint256 _amount,
        bytes memory _data,
        bytes memory _operatorData
    )
    internal
    {
        revert("Burning functionality is disabled.");
    }
}


File 9 of 16: IERC20.sol
pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 10 of 16: IERC644.sol
pragma solidity 0.5.8;


interface IERC644 {
    function getBalance(address _acct) external view returns(uint);
    function incBalance(address _acct, uint _val) external returns(bool);
    function decBalance(address _acct, uint _val) external returns(bool);
    function getAllowance(address _owner, address _spender) external view returns(uint);
    function setApprove(address _sender, address _spender, uint256 _value) external returns(bool);
    function decApprove(address _from, address _spender, uint _value) external returns(bool);
    function getModule(address _acct) external view returns (bool);
    function setModule(address _acct, bool _set) external returns(bool);
    function getTotalSupply() external view returns(uint);
    function incTotalSupply(uint _val) external returns(bool);
    function decTotalSupply(uint _val) external returns(bool);
    function transferRoot(address _new) external returns(bool);

    event BalanceAdj(address indexed Module, address indexed Account, uint Amount, string Polarity);
    event ModuleSet(address indexed Module, bool indexed Set);
}


File 11 of 16: IERC777.sol
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This code has not been reviewed.
 * Do not use or deploy this code before reviewing it personally first.
 */
// solhint-disable-next-line compiler-fixed
pragma solidity 0.5.8;


interface IERC777 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function totalSupply() external view returns (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function granularity() external view returns (uint256);

    function defaultOperators() external view returns (address[] memory);
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);
    function authorizeOperator(address operator) external;
    function revokeOperator(address operator) external;

    function send(address to, uint256 amount, bytes calldata data) external;
    function operatorSend(
        address from,
        address to,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    function burn(uint256 amount, bytes calldata data) external;
    function operatorBurn(address from, uint256 amount, bytes calldata data, bytes calldata operatorData) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );
    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);
    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);
    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);
    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}


File 12 of 16: IERC777TokensRecipient.sol
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This code has not been reviewed.
 * Do not use or deploy this code before reviewing it personally first.
 */
// solhint-disable-next-line compiler-fixed
pragma solidity 0.5.8;


interface IERC777TokensRecipient {
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;
}


File 13 of 16: IERC777TokensSender.sol
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This code has not been reviewed.
 * Do not use or deploy this code before reviewing it personally first.
 */
// solhint-disable-next-line compiler-fixed
pragma solidity 0.5.8;


interface IERC777TokensSender {
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;
}


File 14 of 16: Ownable.sol
pragma solidity ^0.5.0;

import "./Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 15 of 16: SafeGuard.sol
pragma solidity 0.5.8;

import "./Ownable.sol";


/**
 * @title Safe Guard Contract
 * @author Panos
 */
contract SafeGuard is Ownable {

    event Transaction(address indexed destination, uint value, bytes data);

    /**
     * @dev Allows owner to execute a transaction.
     */
    function executeTransaction(address destination, uint value, bytes memory data)
    public
    onlyOwner
    {
        require(externalCall(destination, value, data.length, data));
        emit Transaction(destination, value, data);
    }

    /**
     * @dev call has been separated into its own function in order to take advantage
     *  of the Solidity's code generator to produce a loop that copies tx.data into memory.
     */
    function externalCall(address destination, uint value, uint dataLength, bytes memory data)
    private
    returns (bool) {
        bool result;
        assembly { // solhint-disable-line no-inline-assembly
        let x := mload(0x40)   // "Allocate" memory for output
            // (0x40 is where "free memory" pointer is stored by convention)
            let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that
            result := call(
            sub(gas, 34710), // 34710 is the value that solidity is currently emitting
            // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) +
            // callNewAccountGas (25000, in case the destination address does not exist and needs creating)
            destination,
            value,
            d,
            dataLength, // Size of the input (in bytes) - this is what fixes the padding problem
            x,
            0                  // Output is ignored, therefore the output size is zero
            )
        }
        return result;
    }
}


File 16 of 16: SafeMath.sol
pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
     * @dev Get it via `npm install @openzeppelin/contracts@next`.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.

     * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
     * @dev Get it via `npm install @openzeppelin/contracts@next`.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
     * @dev Get it via `npm install @openzeppelin/contracts@next`.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"defaultOperators","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"enableERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"balancesDB","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDB","type":"address"}],"name":"changeBalancesDB","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"destination","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"executeTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"granularity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"},{"name":"_operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address[]"},{"name":"_amounts","type":"uint256[]"},{"name":"_userData","type":"bytes"},{"name":"_operatorData","type":"bytes"}],"name":"multiOperatorSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_toAddresses","type":"address[]"},{"name":"_amounts","type":"uint256[]"}],"name":"multiPartyTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"authorizeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"send","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_toAddresses","type":"address[]"},{"name":"_amounts","type":"uint256[]"}],"name":"multiPartyTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"},{"name":"_tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_toAddresses","type":"address[]"},{"name":"_amounts","type":"uint256[]"},{"name":"_userData","type":"bytes"}],"name":"multiPartySend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"disableERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"revokeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenHolder","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"},{"name":"_operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_granularity","type":"uint256"},{"name":"_totalSupply","type":"uint256"},{"name":"_initialOwner","type":"address"},{"name":"_defaultOperators","type":"address[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"destination","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Transaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

60806040523480156200001157600080fd5b50604051620054e0380380620054e0833981018060405260c08110156200003757600080fd5b8101908080516401000000008111156200005057600080fd5b820160208101848111156200006457600080fd5b81516401000000008111828201871017156200007f57600080fd5b505092919060200180516401000000008111156200009c57600080fd5b82016020810184811115620000b057600080fd5b8151640100000000811182820187101715620000cb57600080fd5b50506020820151604083015160608401516080909401805193969295919493640100000000811115620000fd57600080fd5b820160208101848111156200011157600080fd5b81518560208202830111640100000000821117156200012f57600080fd5b5050929190505050858585858585858585858585858585600060405190808252806020026020018201604052801562000172578160200160208202803883390190505b5083516200018890600090602087019062000c19565b5082516200019e90600190602086019062000c19565b50600060035560018210156200021557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4772616e756c6172697479206d757374206265203e2031000000000000000000604482015290519081900360640190fd5b600282905580516200022f90600590602084019062000c9e565b5060005b6005548110156200028f57600160066000600584815481106200025257fe5b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905560010162000233565b50620002d76040518060400160405280600b81526020017f455243373737546f6b656e00000000000000000000000000000000000000000081525030620006f960201b60201c565b50505050828282604051620002ec9062000d04565b80848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015620003495781810151838201526020016200032f565b50505050905001945050505050604051809103906000f08015801562000373573d6000803e3d6000fd5b5060098054600160a01b60ff02196001600160a01b03939093166001600160a01b0319909116179190911674010000000000000000000000000000000000000000179055505060408051808201909152600a81527f4552433230546f6b656e00000000000000000000000000000000000000000000602080830191909152620004099550909350309250620006f9811b901c9050565b5050505050506000620004216200080960201b60201c565b600b80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000480836200080e60201b60201c565b600954604080517fb1662d580000000000000000000000000000000000000000000000000000000081523060048201526001602482015290516001600160a01b039092169163b1662d58916044808201926020929091908290030181600087803b158015620004ee57600080fd5b505af115801562000503573d6000803e3d6000fd5b505050506040513d60208110156200051a57600080fd5b505162000573576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806200545f6025913960400191505060405180910390fd5b600954604080517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b158015620005db57600080fd5b505af1158015620005f0573d6000803e3d6000fd5b505050506200062b3360008486604051806020016040528060008152506040518060200160405280600081525060016200087660201b60201c565b60408051848152606060208201819052600090820181905260a082840181905282015290516001600160a01b0384169133917f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d9181900360e00190a360095474010000000000000000000000000000000000000000900460ff1615620006ed576040805184815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b50505050505062000d56565b6000826040516020018082805190602001908083835b60208310620007305780518252601f1990920191602091820191016200070f565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f19018352808552825192909101919091207f29965a1d000000000000000000000000000000000000000000000000000000008252306004830152602482018190526001600160a01b03881660448301529251929550731820a4b7618bde71dce8cdc73aab6c95905fad2494506329965a1d9350606480820193600093509182900301818387803b158015620007eb57600080fd5b505af115801562000800573d6000803e3d6000fd5b50505050505050565b335b90565b60025481816200081a57fe5b061562000873576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180620054846027913960400191505060405180910390fd5b50565b6000620008bf866040518060400160405280601581526020017f455243373737546f6b656e73526563697069656e74000000000000000000000081525062000ad460201b60201c565b90506001600160a01b0381161562000a5b57806001600160a01b03166223de298989898989896040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015620009855781810151838201526020016200096b565b50505050905090810190601f168015620009b35780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015620009e8578181015183820152602001620009ce565b50505050905090810190601f16801562000a165780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801562000a3c57600080fd5b505af115801562000a51573d6000803e3d6000fd5b5050505062000aca565b811562000aca5762000a738662000bf560201b60201c565b62000aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180620054ab6035913960400191505060405180910390fd5b5050505050505050565b600080826040516020018082805190602001908083835b6020831062000b0c5780518252601f19909201916020918201910162000aeb565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f190183528085528251928201929092207faabbb8ca0000000000000000000000000000000000000000000000000000000083526001600160a01b038b166004840152602483018190529351939650731820a4b7618bde71dce8cdc73aab6c95905fad24955063aabbb8ca94506044808301949193509091829003018186803b15801562000bbf57600080fd5b505afa15801562000bd4573d6000803e3d6000fd5b505050506040513d602081101562000beb57600080fd5b5051949350505050565b60006001600160a01b03821662000c0f5750600062000c14565b50803b155b919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000c5c57805160ff191683800117855562000c8c565b8280016001018555821562000c8c579182015b8281111562000c8c57825182559160200191906001019062000c6f565b5062000c9a92915062000d12565b5090565b82805482825590600052602060002090810192821562000cf6579160200282015b8281111562000cf657825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000cbf565b5062000c9a92915062000d2f565b6115bd8062003ea283390190565b6200080b91905b8082111562000c9a576000815560010162000d19565b6200080b91905b8082111562000c9a5780546001600160a01b031916815560010162000d36565b61313c8062000d666000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063715018a61161010f578063d95b6371116100a2578063f922f21611610071578063f922f21614610b9f578063fad8b32a14610ba7578063fc673c4f14610bcd578063fe9d930314610ca0576101e5565b8063d95b637114610975578063dd62ed3e146109a3578063ddb863be146109d1578063f2fde38b14610b79576101e5565b806395d89b41116100de57806395d89b41146108005780639bd9bbc614610808578063a9059cbb1461088b578063b22c14c7146108b7576101e5565b8063715018a6146107c25780638da5cb5b146107ca5780638f32d59b146107d2578063959b8c3f146107da576101e5565b8063313ce5671161018757806362ad1b831161015657806362ad1b83146104825780636379a852146105605780636e96433f146106ce57806370a082311461079c576101e5565b8063313ce5671461037d5780633e3cba8f1461039b5780633f579f42146103c1578063556f0dc71461047a576101e5565b8063095ea7b3116101c3578063095ea7b3146102c95780630f5c8c0a1461030957806318160ddd1461032d57806323b872dd14610347576101e5565b806306e48538146101ea57806306fdde0314610242578063070c87f9146102bf575b600080fd5b6101f2610d15565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561022e578181015183820152602001610216565b505050509050019250505060405180910390f35b61024a610deb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028457818101518382015260200161026c565b50505050905090810190601f1680156102b15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c7610e81565b005b6102f5600480360360408110156102df57600080fd5b506001600160a01b038135169060200135610f11565b604080519115158252519081900360200190f35b610311611041565b604080516001600160a01b039092168252519081900360200190f35b610335611050565b60408051918252519081900360200190f35b6102f56004803603606081101561035d57600080fd5b506001600160a01b038135811691602081013590911690604001356110c9565b6103856112c8565b6040805160ff9092168252519081900360200190f35b6102c7600480360360208110156103b157600080fd5b50356001600160a01b0316611320565b6102c7600480360360608110156103d757600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561040657600080fd5b82018360208201111561041857600080fd5b803590602001918460018302840111600160201b8311171561043957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061138c945050505050565b61033561149c565b6102c7600480360360a081101561049857600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156104d257600080fd5b8201836020820111156104e457600080fd5b803590602001918460018302840111600160201b8311171561050557600080fd5b919390929091602081019035600160201b81111561052257600080fd5b82018360208201111561053457600080fd5b803590602001918460018302840111600160201b8311171561055557600080fd5b5090925090506114a2565b6102c7600480360360a081101561057657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105a057600080fd5b8201836020820111156105b257600080fd5b803590602001918460208302840111600160201b831117156105d357600080fd5b919390929091602081019035600160201b8111156105f057600080fd5b82018360208201111561060257600080fd5b803590602001918460208302840111600160201b8311171561062357600080fd5b919390929091602081019035600160201b81111561064057600080fd5b82018360208201111561065257600080fd5b803590602001918460018302840111600160201b8311171561067357600080fd5b919390929091602081019035600160201b81111561069057600080fd5b8201836020820111156106a257600080fd5b803590602001918460018302840111600160201b831117156106c357600080fd5b509092509050611583565b6102c7600480360360608110156106e457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561070e57600080fd5b82018360208201111561072057600080fd5b803590602001918460208302840111600160201b8311171561074157600080fd5b919390929091602081019035600160201b81111561075e57600080fd5b82018360208201111561077057600080fd5b803590602001918460208302840111600160201b8311171561079157600080fd5b50909250905061172d565b610335600480360360208110156107b257600080fd5b50356001600160a01b0316611861565b6102c76118e9565b61031161197d565b6102f561198c565b6102c7600480360360208110156107f057600080fd5b50356001600160a01b03166119b2565b61024a611be6565b6102c76004803603606081101561081e57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561084d57600080fd5b82018360208201111561085f57600080fd5b803590602001918460018302840111600160201b8311171561088057600080fd5b509092509050611c46565b6102f5600480360360408110156108a157600080fd5b506001600160a01b038135169060200135611ca0565b6102c7600480360360408110156108cd57600080fd5b810190602081018135600160201b8111156108e757600080fd5b8201836020820111156108f957600080fd5b803590602001918460208302840111600160201b8311171561091a57600080fd5b919390929091602081019035600160201b81111561093757600080fd5b82018360208201111561094957600080fd5b803590602001918460208302840111600160201b8311171561096a57600080fd5b509092509050611d29565b6102f56004803603604081101561098b57600080fd5b506001600160a01b0381358116916020013516611e5b565b610335600480360360408110156109b957600080fd5b506001600160a01b0381358116916020013516611f04565b6102c7600480360360608110156109e757600080fd5b810190602081018135600160201b811115610a0157600080fd5b820183602082011115610a1357600080fd5b803590602001918460208302840111600160201b83111715610a3457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8357600080fd5b820183602082011115610a9557600080fd5b803590602001918460208302840111600160201b83111715610ab657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b0557600080fd5b820183602082011115610b1757600080fd5b803590602001918460018302840111600160201b83111715610b3857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611fe1945050505050565b6102c760048036036020811015610b8f57600080fd5b50356001600160a01b03166120ce565b6102c7612124565b6102c760048036036020811015610bbd57600080fd5b50356001600160a01b03166121ad565b6102c760048036036080811015610be357600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610c1257600080fd5b820183602082011115610c2457600080fd5b803590602001918460018302840111600160201b83111715610c4557600080fd5b919390929091602081019035600160201b811115610c6257600080fd5b820183602082011115610c7457600080fd5b803590602001918460018302840111600160201b83111715610c9557600080fd5b5090925090506123e1565b6102c760048036036040811015610cb657600080fd5b81359190810190604081016020820135600160201b811115610cd757600080fd5b820183602082011115610ce957600080fd5b803590602001918460018302840111600160201b83111715610d0a57600080fd5b5090925090506124aa565b60095460408051600160e01b63a02e157102815290516060926001600160a01b03169163a02e1571916004808301926000929190829003018186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d9a57600080fd5b810190808051600160201b811115610db157600080fd5b82016020810184811115610dc457600080fd5b81518560208202830111600160201b82111715610de057600080fd5b509094505050505090565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e775780601f10610e4c57610100808354040283529160200191610e77565b820191906000526020600020905b815481529060010190602001808311610e5a57829003601f168201915b5050505050905090565b610e8961198c565b610ecb5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b60098054600160a01b60ff021916600160a01b17905560408051808201909152600a8152600160b11b6922a92199182a37b5b2b7026020820152610f0f90306124ff565b565b600954600090600160a01b900460ff16610f635760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60095460408051600160e21b63247bc52d0281523360048201526001600160a01b03868116602483015260448201869052915191909216916391ef14b49160648083019260209291908290030181600087803b158015610fc257600080fd5b505af1158015610fd6573d6000803e3d6000fd5b505050506040513d6020811015610fec57600080fd5b5051610ff757600080fd5b6040805183815290516001600160a01b0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a35060015b92915050565b6009546001600160a01b031681565b60095460408051600160e11b6362720d9102815290516000926001600160a01b03169163c4e41b22916004808301926020929190829003018186803b15801561109857600080fd5b505afa1580156110ac573d6000803e3d6000fd5b505050506040513d60208110156110c257600080fd5b5051905090565b600954600090600160a01b900460ff1661111b5760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60095460408051600160e01b630af4187d0281526001600160a01b03878116600483015233602483015291516000939290921691630af4187d91604480820192602092909190829003018186803b15801561117557600080fd5b505afa158015611189573d6000803e3d6000fd5b505050506040513d602081101561119f57600080fd5b50519050808311156111fb5760408051600160e51b62461bcd02815260206004820152601560248201527f4e6f7420656e6f75676820616c6c6f77616e63652e0000000000000000000000604482015290519081900360640190fd5b60095460408051600160e01b63fcfdf7c50281526001600160a01b038881166004830152336024830152604482018790529151919092169163fcfdf7c59160648083019260209291908290030181600087803b15801561125a57600080fd5b505af115801561126e573d6000803e3d6000fd5b505050506040513d602081101561128457600080fd5b505161128f57600080fd5b6112bd33868686604051806020016040528060008152506040518060200160405280600081525060006125ec565b506001949350505050565b600954600090600160a01b900460ff1661131a5760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b50601290565b61132861198c565b61136a5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b61139461198c565b6113d65760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b6113e38383835184612661565b6113ec57600080fd5b826001600160a01b03167f67b25f942bae0532e9fd9cf32dc107fb42e6c268885aa3b9fc65c5158e77e96a83836040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561145c578181015183820152602001611444565b50505050905090810190601f1680156114895780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2505050565b60025490565b6114ac3388611e5b565b6115005760408051600160e51b62461bcd02815260206004820152601060248201527f4e6f7420616e206f70657261746f722e00000000000000000000000000000000604482015290519081900360640190fd5b61157a3388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a9150899081908401838280828437600092019190915250600192506125ec915050565b50505050505050565b60ff8711156115ca5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020612fdb833981519152604482015290519081900360640190fd5b86851461160b57604051600160e51b62461bcd028152600401808060200182810382526033815260200180612ffb6033913960400191505060405180910390fd5b60005b60ff811688111561172157611623338b611e5b565b61166c5760408051600160e51b62461bcd02815260206004820152600f6024820152600160891b6e2737ba1030b71037b832b930ba37b902604482015290519081900360640190fd5b611719338b8b8b8560ff1681811061168057fe5b905060200201356001600160a01b03168a8a8660ff1681811061169f57fe5b9050602002013589898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a9081908401838280828437600092019190915250600192506125ec915050565b60010161160e565b50505050505050505050565b600954600160a01b900460ff1661177c5760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60ff8311156117c35760408051600160e51b62461bcd0281526020600482018190526024820152600080516020612fdb833981519152604482015290519081900360640190fd5b82811461180457604051600160e51b62461bcd028152600401808060200182810382526033815260200180612ffb6033913960400191505060405180910390fd5b60005b60ff8116841115611859576118508686868460ff1681811061182557fe5b905060200201356001600160a01b031685858560ff1681811061184457fe5b905060200201356110c9565b50600101611807565b505050505050565b60095460408051600160e01b63f8b2cb4f0281526001600160a01b0384811660048301529151600093929092169163f8b2cb4f91602480820192602092909190829003018186803b1580156118b557600080fd5b505afa1580156118c9573d6000803e3d6000fd5b505050506040513d60208110156118df57600080fd5b505190505b919050565b6118f161198c565b6119335760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b600b546001600160a01b031690565b600b546000906001600160a01b03166119a3612684565b6001600160a01b031614905090565b6001600160a01b0381163314156119fd57604051600160e51b62461bcd028152600401808060200182810382526028815260200180612fb36028913960400191505060405180910390fd5b60095460408051600160e21b6311238b270281526001600160a01b0384811660048301529151919092169163448e2c9c916024808301926020929190829003018186803b158015611a4d57600080fd5b505afa158015611a61573d6000803e3d6000fd5b505050506040513d6020811015611a7757600080fd5b505115611b195760095460408051600160e01b63e1d531570281526001600160a01b038481166004830152336024830152600060448301819052925193169263e1d5315792606480840193602093929083900390910190829087803b158015611adf57600080fd5b505af1158015611af3573d6000803e3d6000fd5b505050506040513d6020811015611b0957600080fd5b5051611b1457600080fd5b611bad565b60095460408051600160e11b6378ff958d0281526001600160a01b038481166004830152336024830152600160448301529151919092169163f1ff2b1a9160648083019260209291908290030181600087803b158015611b7857600080fd5b505af1158015611b8c573d6000803e3d6000fd5b505050506040513d6020811015611ba257600080fd5b5051611bad57600080fd5b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e775780601f10610e4c57610100808354040283529160200191610e77565b611c9a3333868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525060408051602081019091529081529250600191506125ec9050565b50505050565b600954600090600160a01b900460ff16611cf25760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b611d2033338585604051806020016040528060008152506040518060200160405280600081525060006125ec565b50600192915050565b600954600160a01b900460ff16611d785760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60ff831115611dbf5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020612fdb833981519152604482015290519081900360640190fd5b828114611e0057604051600160e51b62461bcd028152600401808060200182810382526033815260200180612ffb6033913960400191505060405180910390fd5b60005b60ff8116841115611e5457611e4b85858360ff16818110611e2057fe5b905060200201356001600160a01b031684848460ff16818110611e3f57fe5b90506020020135611ca0565b50600101611e03565b5050505050565b6000816001600160a01b0316836001600160a01b03161480611efd575060095460408051600160e01b638e73eee30281526001600160a01b038681166004830152858116602483015291519190921691638e73eee3916044808301926020929190829003018186803b158015611ed057600080fd5b505afa158015611ee4573d6000803e3d6000fd5b505050506040513d6020811015611efa57600080fd5b50515b905061103b565b600954600090600160a01b900460ff16611f565760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60095460408051600160e01b630af4187d0281526001600160a01b038681166004830152858116602483015291519190921691630af4187d916044808301926020929190829003018186803b158015611fae57600080fd5b505afa158015611fc2573d6000803e3d6000fd5b505050506040513d6020811015611fd857600080fd5b50519392505050565b60ff835111156120295760408051600160e51b62461bcd0281526020600482018190526024820152600080516020612fdb833981519152604482015290519081900360640190fd5b815183511461206c57604051600160e51b62461bcd028152600401808060200182810382526033815260200180612ffb6033913960400191505060405180910390fd5b60005b83518160ff161015611c9a576120c63333868460ff168151811061208f57fe5b6020026020010151868560ff16815181106120a657fe5b6020026020010151866040518060200160405280600081525060016125ec565b60010161206f565b6120d661198c565b6121185760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b61212181612688565b50565b61212c61198c565b61216e5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b60098054600160a01b60ff021916905560408051808201909152600a8152600160b11b6922a92199182a37b5b2b7026020820152610f0f9060006124ff565b6001600160a01b0381163314156121f857604051600160e51b62461bcd02815260040180806020018281038252602581526020018061302e6025913960400191505060405180910390fd5b60095460408051600160e21b6311238b270281526001600160a01b0384811660048301529151919092169163448e2c9c916024808301926020929190829003018186803b15801561224857600080fd5b505afa15801561225c573d6000803e3d6000fd5b505050506040513d602081101561227257600080fd5b5051156123125760095460408051600160e01b63e1d531570281526001600160a01b038481166004830152336024830152600160448301529151919092169163e1d531579160648083019260209291908290030181600087803b1580156122d857600080fd5b505af11580156122ec573d6000803e3d6000fd5b505050506040513d602081101561230257600080fd5b505161230d57600080fd5b6123a8565b60095460408051600160e11b6378ff958d0281526001600160a01b038481166004830152336024830152600060448301819052925193169263f1ff2b1a92606480840193602093929083900390910190829087803b15801561237357600080fd5b505af1158015612387573d6000803e3d6000fd5b505050506040513d602081101561239d57600080fd5b50516123a857600080fd5b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b6123eb3387611e5b565b6124345760408051600160e51b62461bcd02815260206004820152600f6024820152600160891b6e2737ba1030b71037b832b930ba37b902604482015290519081900360640190fd5b61185933878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b01819004810282018101909252898152925089915088908190840183828082843760009201919091525061272c92505050565b6124fa33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506040805160208101909152908152925061272c915050565b505050565b6000826040516020018082805190602001908083835b602083106125345780518252601f199092019160209182019101612515565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f1901835280855282519290910191909120600160e01b6329965a1d028252306004830152602482018190526001600160a01b03881660448301529251929550731820a4b7618bde71dce8cdc73aab6c95905fad2494506329965a1d9350606480820193600093509182900301818387803b1580156125d857600080fd5b505af115801561157a573d6000803e3d6000fd5b6125fb87878787878787612793565b600954600160a01b900460ff161561157a57846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a350505050505050565b6000806040516020840160008287838a8c6187965a03f198975050505050505050565b3390565b6001600160a01b0381166126d057604051600160e51b62461bcd028152600401808060200182810382526026815260200180612f8d6026913960400191505060405180910390fd5b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b61273985858585856129dc565b600954600160a01b900460ff1615611e54576040805184815290516000916001600160a01b038716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b61279c84612a16565b6127aa878787878787612a61565b6001600160a01b0385166128085760408051600160e51b62461bcd02815260206004820152601260248201527f43616e6e6f742073656e6420746f203078300000000000000000000000000000604482015290519081900360640190fd5b60095460408051600160e01b63bb35783b0281526001600160a01b0389811660048301528881166024830152604482018890529151919092169163bb35783b9160648083019260209291908290030181600087803b15801561286957600080fd5b505af115801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b505161289e57600080fd5b6128ad87878787878787612c3e565b846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561293657818101518382015260200161291e565b50505050905090810190601f1680156129635780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561299657818101518382015260200161297e565b50505050905090810190601f1680156129c35780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450505050505050565b604051600160e51b62461bcd0281526004018080602001828103825260228152602001806130936022913960400191505060405180910390fd5b6002548181612a2157fe5b061561212157604051600160e51b62461bcd0281526004018080602001828103825260278152602001806130b56027913960400191505060405180910390fd5b6000612aa2866040518060400160405280601281526020017f455243373737546f6b656e7353656e6465720000000000000000000000000000815250612e68565b90506001600160a01b038116612ab85750611859565b806001600160a01b03166375ab97828888888888886040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612b6b578181015183820152602001612b53565b50505050905090810190601f168015612b985780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612bcb578181015183820152602001612bb3565b50505050905090810190601f168015612bf85780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015612c1d57600080fd5b505af1158015612c31573d6000803e3d6000fd5b5050505050505050505050565b6000612c7f866040518060400160405280601581526020017f455243373737546f6b656e73526563697069656e740000000000000000000000815250612e68565b90506001600160a01b03811615612e1157806001600160a01b03166223de298989898989896040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612d42578181015183820152602001612d2a565b50505050905090810190601f168015612d6f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612da2578181015183820152602001612d8a565b50505050905090810190601f168015612dcf5780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015612df457600080fd5b505af1158015612e08573d6000803e3d6000fd5b50505050612e5e565b8115612e5e57612e2086612f6e565b612e5e57604051600160e51b62461bcd0281526004018080602001828103825260358152602001806130dc6035913960400191505060405180910390fd5b5050505050505050565b600080826040516020018082805190602001908083835b60208310612e9e5780518252601f199092019160209182019101612e7f565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f19018352808552825192820192909220600160e11b63555ddc650283526001600160a01b038b166004840152602483018190529351939650731820a4b7618bde71dce8cdc73aab6c95905fad24955063aabbb8ca94506044808301949193509091829003018186803b158015612f3a57600080fd5b505afa158015612f4e573d6000803e3d6000fd5b505050506040513d6020811015612f6457600080fd5b5051949350505050565b60006001600160a01b038216612f86575060006118e4565b503b159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343616e6e6f7420617574686f72697a6520796f757273656c6620617320616e206f70657261746f72556e737570706f72746564206e756d626572206f66206164647265737365732e50726f76696465642061646472657373657320646f6573206e6f7420657175616c20746f2070726f76696465642073756d732e43616e6e6f74207265766f6b6520796f757273656c6620617320616e206f70657261746f7245524332302069732064697361626c65640000000000000000000000000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724275726e696e672066756e6374696f6e616c6974792069732064697361626c65642e416d6f756e74206973206e6f742061206d756c7469706c65206f66206772616e756c617269747943616e6e6f742073656e6420746f20636f6e747261637420776974686f757420455243373737546f6b656e73526563697069656e74a165627a7a723058202b0c294c2357b4b0ce440e899dbfee51ed046f4106b134c1a8d816fb26b31f76002960806040523480156200001157600080fd5b50604051620015bd380380620015bd833981018060405260608110156200003757600080fd5b81516020830151604084018051929491938201926401000000008111156200005e57600080fd5b820160208101848111156200007257600080fd5b81518560208202830111640100000000821117156200009057600080fd5b50509291905050506000620000aa620001dc60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b0382166000908152600360209081526040909120849055600184905581516200012b9160059190840190620002f1565b5060005b6005548110156200018b57600160066000600584815481106200014e57fe5b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff19169115159190911790556001016200012f565b50620001d36040518060400160405280600e81526020017f45524336343442616c616e63657300000000000000000000000000000000000081525030620001e160201b60201c565b50505062000382565b335b90565b6000826040516020018082805190602001908083835b60208310620002185780518252601f199092019160209182019101620001f7565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f19018352808552825192909101919091207f29965a1d000000000000000000000000000000000000000000000000000000008252306004830152602482018190526001600160a01b03881660448301529251929550731820a4b7618bde71dce8cdc73aab6c95905fad2494506329965a1d9350606480820193600093509182900301818387803b158015620002d357600080fd5b505af1158015620002e8573d6000803e3d6000fd5b50505050505050565b82805482825590600052602060002090810192821562000349579160200282015b828111156200034957825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000312565b50620003579291506200035b565b5090565b620001de91905b80821115620003575780546001600160a01b031916815560010162000362565b61122b80620003926000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063a02e1571116100f9578063c4e41b2211610097578063f1ff2b1a11610071578063f1ff2b1a146105d9578063f2fde38b14610611578063f8b2cb4f14610637578063fcfdf7c51461065d576101c4565b8063c4e41b2214610599578063e1d53157146105a1578063ecfc596414610279576101c4565b8063b1662d58116100d3578063b1662d58146104e9578063b5de8d4c14610517578063bb35783b1461053d578063c296302a14610573576101c4565b8063a02e15711461046b578063a8ee49fe146104c3578063aba00859146103a7576101c4565b80635c658165116101665780638da5cb5b116101405780638da5cb5b146103db5780638e73eee3146103ff5780638f32d59b1461042d57806391ef14b414610435576101c4565b80635c6581651461037957806366e7ea0f146103a7578063715018a6146103d3576101c4565b806327e235e3116101a257806327e235e31461025357806335e09095146102795780633f579f4214610296578063448e2c9c14610353576101c4565b80630af4187d146101c957806317d92cff1461020957806318160ddd1461024b575b600080fd5b6101f7600480360360408110156101df57600080fd5b506001600160a01b0381358116916020013516610693565b60408051918252519081900360200190f35b6102376004803603604081101561021f57600080fd5b506001600160a01b03813581169160200135166106be565b604080519115158252519081900360200190f35b6101f76106ec565b6101f76004803603602081101561026957600080fd5b50356001600160a01b03166106f2565b6102376004803603602081101561028f57600080fd5b5035610704565b610351600480360360608110156102ac57600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156102dc57600080fd5b8201836020820111156102ee57600080fd5b8035906020019184600183028401116401000000008311171561031057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061075d945050505050565b005b6102376004803603602081101561036957600080fd5b50356001600160a01b031661086d565b6101f76004803603604081101561038f57600080fd5b506001600160a01b038135811691602001351661088b565b610237600480360360408110156103bd57600080fd5b506001600160a01b0381351690602001356108a8565b610351610902565b6103e3610996565b604080516001600160a01b039092168252519081900360200190f35b6102376004803603604081101561041557600080fd5b506001600160a01b03813581169160200135166109a5565b6102376109d3565b6102376004803603606081101561044b57600080fd5b506001600160a01b038135811691602081013590911690604001356109f7565b610473610a78565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104af578181015183820152602001610497565b505050509050019250505060405180910390f35b610237600480360360208110156104d957600080fd5b50356001600160a01b0316610ada565b610237600480360360408110156104ff57600080fd5b506001600160a01b0381351690602001351515610aef565b6102376004803603602081101561052d57600080fd5b50356001600160a01b0316610b94565b6102376004803603606081101561055357600080fd5b506001600160a01b03813581169160208101359091169060400135610bb2565b6102376004803603602081101561058957600080fd5b50356001600160a01b0316610d39565b6101f7610d3f565b610237600480360360608110156105b757600080fd5b506001600160a01b038135811691602081013590911690604001351515610d45565b610237600480360360608110156105ef57600080fd5b506001600160a01b038135811691602081013590911690604001351515610dd3565b6103516004803603602081101561062757600080fd5b50356001600160a01b0316610e61565b6101f76004803603602081101561064d57600080fd5b50356001600160a01b0316610eb7565b6102376004803603606081101561067357600080fd5b506001600160a01b03813581169160208101359091169060400135610ed2565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60015481565b60036020526000908152604090205481565b3360009081526002602052604081205460ff1661075557604051600160e51b62461bcd0281526004018080602001828103825260268152602001806111da6026913960400191505060405180910390fd5b506000919050565b6107656109d3565b6107a75760408051600160e51b62461bcd02815260206004820181905260248201526000805160206111ba833981519152604482015290519081900360640190fd5b6107b48383835184610f89565b6107bd57600080fd5b826001600160a01b03167f67b25f942bae0532e9fd9cf32dc107fb42e6c268885aa3b9fc65c5158e77e96a83836040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561082d578181015183820152602001610815565b50505050905090810190601f16801561085a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2505050565b6001600160a01b031660009081526006602052604090205460ff1690565b600460209081526000928352604080842090915290825290205481565b3360009081526002602052604081205460ff166108f957604051600160e51b62461bcd0281526004018080602001828103825260268152602001806111da6026913960400191505060405180910390fd5b50600092915050565b61090a6109d3565b61094c5760408051600160e51b62461bcd02815260206004820181905260248201526000805160206111ba833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b600080546001600160a01b03166109e8610fac565b6001600160a01b031614905090565b3360009081526002602052604081205460ff16610a4857604051600160e51b62461bcd0281526004018080602001828103825260268152602001806111da6026913960400191505060405180910390fd5b506001600160a01b0392831660009081526004602090815260408083209490951682529290925291902055600190565b60606005805480602002602001604051908101604052809291908181526020018280548015610ad057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ab2575b5050505050905090565b60026020526000908152604090205460ff1681565b6000610af96109d3565b610b3b5760408051600160e51b62461bcd02815260206004820181905260248201526000805160206111ba833981519152604482015290519081900360640190fd5b6001600160a01b038316600081815260026020526040808220805460ff191686151590811790915590519092917f96bf850214e832f3d463d74cdf933b2aa73175e078496bd11f5e8afaeb2bbb9c91a350600192915050565b6001600160a01b031660009081526002602052604090205460ff1690565b3360009081526002602052604081205460ff16610c0357604051600160e51b62461bcd0281526004018080602001828103825260268152602001806111da6026913960400191505060405180910390fd5b6001600160a01b038416600090815260036020526040902054610c2c908363ffffffff610fb016565b6001600160a01b038516600081815260036020908152604091829020939093558051858152928301819052600183820152600160f81b602d02606084015251909133917f99affe65171b929cf897471b0e82d82c6cc3406b53fdbc068ea3b174e77131769181900360800190a36001600160a01b038316600090815260036020526040902054610cc2908363ffffffff610ff916565b6001600160a01b038416600081815260036020908152604091829020939093558051858152928301819052600183820152600160f81b602b02606084015251909133917f99affe65171b929cf897471b0e82d82c6cc3406b53fdbc068ea3b174e77131769181900360800190a35060019392505050565b50600090565b60015490565b3360009081526002602052604081205460ff16610d9657604051600160e51b62461bcd0281526004018080602001828103825260268152602001806111da6026913960400191505060405180910390fd5b506001600160a01b038084166000908152600760209081526040808320938616835292905220805482151560ff1990911617905560019392505050565b3360009081526002602052604081205460ff16610e2457604051600160e51b62461bcd0281526004018080602001828103825260268152602001806111da6026913960400191505060405180910390fd5b506001600160a01b038084166000908152600860209081526040808320938616835292905220805482151560ff1990911617905560019392505050565b610e696109d3565b610eab5760408051600160e51b62461bcd02815260206004820181905260248201526000805160206111ba833981519152604482015290519081900360640190fd5b610eb481611056565b50565b6001600160a01b031660009081526003602052604090205490565b3360009081526002602052604081205460ff16610f2357604051600160e51b62461bcd0281526004018080602001828103825260268152602001806111da6026913960400191505060405180910390fd5b6001600160a01b03808516600090815260046020908152604080832093871683529290522054610f59908363ffffffff610fb016565b6001600160a01b038086166000908152600460209081526040808320938816835292905220555060019392505050565b6000806040516020840160008287838a8c6187965a03f198975050505050505050565b3390565b6000610ff283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506110f9565b9392505050565b600082820183811015610ff25760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b03811661109e57604051600160e51b62461bcd0281526004018080602001828103825260268152602001806111946026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818484111561118b57604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611150578181015183820152602001611138565b50505050905090810190601f16801561117d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524336343442616c616e6365733a2063616c6c6572206973206e6f742061206d6f64756c65a165627a7a723058202dd35872a32d9bcd22eb8ce622b4bf0decff3fa23c8a712fa4829f82302d4fe0002943616e6e6f7420656e61626c652061636365737320746f207468652064617461626173652e416d6f756e74206973206e6f742061206d756c7469706c65206f66206772616e756c617269747943616e6e6f742073656e6420746f20636f6e747261637420776974686f757420455243373737546f6b656e73526563697069656e7400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000282b82666abfd3da9000000000000000000000000000000c225251b8738f2ff5376991fa37b44744a07b19b0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000443414c4c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443414c4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063715018a61161010f578063d95b6371116100a2578063f922f21611610071578063f922f21614610b9f578063fad8b32a14610ba7578063fc673c4f14610bcd578063fe9d930314610ca0576101e5565b8063d95b637114610975578063dd62ed3e146109a3578063ddb863be146109d1578063f2fde38b14610b79576101e5565b806395d89b41116100de57806395d89b41146108005780639bd9bbc614610808578063a9059cbb1461088b578063b22c14c7146108b7576101e5565b8063715018a6146107c25780638da5cb5b146107ca5780638f32d59b146107d2578063959b8c3f146107da576101e5565b8063313ce5671161018757806362ad1b831161015657806362ad1b83146104825780636379a852146105605780636e96433f146106ce57806370a082311461079c576101e5565b8063313ce5671461037d5780633e3cba8f1461039b5780633f579f42146103c1578063556f0dc71461047a576101e5565b8063095ea7b3116101c3578063095ea7b3146102c95780630f5c8c0a1461030957806318160ddd1461032d57806323b872dd14610347576101e5565b806306e48538146101ea57806306fdde0314610242578063070c87f9146102bf575b600080fd5b6101f2610d15565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561022e578181015183820152602001610216565b505050509050019250505060405180910390f35b61024a610deb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028457818101518382015260200161026c565b50505050905090810190601f1680156102b15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c7610e81565b005b6102f5600480360360408110156102df57600080fd5b506001600160a01b038135169060200135610f11565b604080519115158252519081900360200190f35b610311611041565b604080516001600160a01b039092168252519081900360200190f35b610335611050565b60408051918252519081900360200190f35b6102f56004803603606081101561035d57600080fd5b506001600160a01b038135811691602081013590911690604001356110c9565b6103856112c8565b6040805160ff9092168252519081900360200190f35b6102c7600480360360208110156103b157600080fd5b50356001600160a01b0316611320565b6102c7600480360360608110156103d757600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561040657600080fd5b82018360208201111561041857600080fd5b803590602001918460018302840111600160201b8311171561043957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061138c945050505050565b61033561149c565b6102c7600480360360a081101561049857600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156104d257600080fd5b8201836020820111156104e457600080fd5b803590602001918460018302840111600160201b8311171561050557600080fd5b919390929091602081019035600160201b81111561052257600080fd5b82018360208201111561053457600080fd5b803590602001918460018302840111600160201b8311171561055557600080fd5b5090925090506114a2565b6102c7600480360360a081101561057657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105a057600080fd5b8201836020820111156105b257600080fd5b803590602001918460208302840111600160201b831117156105d357600080fd5b919390929091602081019035600160201b8111156105f057600080fd5b82018360208201111561060257600080fd5b803590602001918460208302840111600160201b8311171561062357600080fd5b919390929091602081019035600160201b81111561064057600080fd5b82018360208201111561065257600080fd5b803590602001918460018302840111600160201b8311171561067357600080fd5b919390929091602081019035600160201b81111561069057600080fd5b8201836020820111156106a257600080fd5b803590602001918460018302840111600160201b831117156106c357600080fd5b509092509050611583565b6102c7600480360360608110156106e457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561070e57600080fd5b82018360208201111561072057600080fd5b803590602001918460208302840111600160201b8311171561074157600080fd5b919390929091602081019035600160201b81111561075e57600080fd5b82018360208201111561077057600080fd5b803590602001918460208302840111600160201b8311171561079157600080fd5b50909250905061172d565b610335600480360360208110156107b257600080fd5b50356001600160a01b0316611861565b6102c76118e9565b61031161197d565b6102f561198c565b6102c7600480360360208110156107f057600080fd5b50356001600160a01b03166119b2565b61024a611be6565b6102c76004803603606081101561081e57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561084d57600080fd5b82018360208201111561085f57600080fd5b803590602001918460018302840111600160201b8311171561088057600080fd5b509092509050611c46565b6102f5600480360360408110156108a157600080fd5b506001600160a01b038135169060200135611ca0565b6102c7600480360360408110156108cd57600080fd5b810190602081018135600160201b8111156108e757600080fd5b8201836020820111156108f957600080fd5b803590602001918460208302840111600160201b8311171561091a57600080fd5b919390929091602081019035600160201b81111561093757600080fd5b82018360208201111561094957600080fd5b803590602001918460208302840111600160201b8311171561096a57600080fd5b509092509050611d29565b6102f56004803603604081101561098b57600080fd5b506001600160a01b0381358116916020013516611e5b565b610335600480360360408110156109b957600080fd5b506001600160a01b0381358116916020013516611f04565b6102c7600480360360608110156109e757600080fd5b810190602081018135600160201b811115610a0157600080fd5b820183602082011115610a1357600080fd5b803590602001918460208302840111600160201b83111715610a3457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8357600080fd5b820183602082011115610a9557600080fd5b803590602001918460208302840111600160201b83111715610ab657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b0557600080fd5b820183602082011115610b1757600080fd5b803590602001918460018302840111600160201b83111715610b3857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611fe1945050505050565b6102c760048036036020811015610b8f57600080fd5b50356001600160a01b03166120ce565b6102c7612124565b6102c760048036036020811015610bbd57600080fd5b50356001600160a01b03166121ad565b6102c760048036036080811015610be357600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610c1257600080fd5b820183602082011115610c2457600080fd5b803590602001918460018302840111600160201b83111715610c4557600080fd5b919390929091602081019035600160201b811115610c6257600080fd5b820183602082011115610c7457600080fd5b803590602001918460018302840111600160201b83111715610c9557600080fd5b5090925090506123e1565b6102c760048036036040811015610cb657600080fd5b81359190810190604081016020820135600160201b811115610cd757600080fd5b820183602082011115610ce957600080fd5b803590602001918460018302840111600160201b83111715610d0a57600080fd5b5090925090506124aa565b60095460408051600160e01b63a02e157102815290516060926001600160a01b03169163a02e1571916004808301926000929190829003018186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d9a57600080fd5b810190808051600160201b811115610db157600080fd5b82016020810184811115610dc457600080fd5b81518560208202830111600160201b82111715610de057600080fd5b509094505050505090565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e775780601f10610e4c57610100808354040283529160200191610e77565b820191906000526020600020905b815481529060010190602001808311610e5a57829003601f168201915b5050505050905090565b610e8961198c565b610ecb5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b60098054600160a01b60ff021916600160a01b17905560408051808201909152600a8152600160b11b6922a92199182a37b5b2b7026020820152610f0f90306124ff565b565b600954600090600160a01b900460ff16610f635760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60095460408051600160e21b63247bc52d0281523360048201526001600160a01b03868116602483015260448201869052915191909216916391ef14b49160648083019260209291908290030181600087803b158015610fc257600080fd5b505af1158015610fd6573d6000803e3d6000fd5b505050506040513d6020811015610fec57600080fd5b5051610ff757600080fd5b6040805183815290516001600160a01b0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a35060015b92915050565b6009546001600160a01b031681565b60095460408051600160e11b6362720d9102815290516000926001600160a01b03169163c4e41b22916004808301926020929190829003018186803b15801561109857600080fd5b505afa1580156110ac573d6000803e3d6000fd5b505050506040513d60208110156110c257600080fd5b5051905090565b600954600090600160a01b900460ff1661111b5760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60095460408051600160e01b630af4187d0281526001600160a01b03878116600483015233602483015291516000939290921691630af4187d91604480820192602092909190829003018186803b15801561117557600080fd5b505afa158015611189573d6000803e3d6000fd5b505050506040513d602081101561119f57600080fd5b50519050808311156111fb5760408051600160e51b62461bcd02815260206004820152601560248201527f4e6f7420656e6f75676820616c6c6f77616e63652e0000000000000000000000604482015290519081900360640190fd5b60095460408051600160e01b63fcfdf7c50281526001600160a01b038881166004830152336024830152604482018790529151919092169163fcfdf7c59160648083019260209291908290030181600087803b15801561125a57600080fd5b505af115801561126e573d6000803e3d6000fd5b505050506040513d602081101561128457600080fd5b505161128f57600080fd5b6112bd33868686604051806020016040528060008152506040518060200160405280600081525060006125ec565b506001949350505050565b600954600090600160a01b900460ff1661131a5760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b50601290565b61132861198c565b61136a5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b61139461198c565b6113d65760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b6113e38383835184612661565b6113ec57600080fd5b826001600160a01b03167f67b25f942bae0532e9fd9cf32dc107fb42e6c268885aa3b9fc65c5158e77e96a83836040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561145c578181015183820152602001611444565b50505050905090810190601f1680156114895780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2505050565b60025490565b6114ac3388611e5b565b6115005760408051600160e51b62461bcd02815260206004820152601060248201527f4e6f7420616e206f70657261746f722e00000000000000000000000000000000604482015290519081900360640190fd5b61157a3388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a9150899081908401838280828437600092019190915250600192506125ec915050565b50505050505050565b60ff8711156115ca5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020612fdb833981519152604482015290519081900360640190fd5b86851461160b57604051600160e51b62461bcd028152600401808060200182810382526033815260200180612ffb6033913960400191505060405180910390fd5b60005b60ff811688111561172157611623338b611e5b565b61166c5760408051600160e51b62461bcd02815260206004820152600f6024820152600160891b6e2737ba1030b71037b832b930ba37b902604482015290519081900360640190fd5b611719338b8b8b8560ff1681811061168057fe5b905060200201356001600160a01b03168a8a8660ff1681811061169f57fe5b9050602002013589898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a9081908401838280828437600092019190915250600192506125ec915050565b60010161160e565b50505050505050505050565b600954600160a01b900460ff1661177c5760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60ff8311156117c35760408051600160e51b62461bcd0281526020600482018190526024820152600080516020612fdb833981519152604482015290519081900360640190fd5b82811461180457604051600160e51b62461bcd028152600401808060200182810382526033815260200180612ffb6033913960400191505060405180910390fd5b60005b60ff8116841115611859576118508686868460ff1681811061182557fe5b905060200201356001600160a01b031685858560ff1681811061184457fe5b905060200201356110c9565b50600101611807565b505050505050565b60095460408051600160e01b63f8b2cb4f0281526001600160a01b0384811660048301529151600093929092169163f8b2cb4f91602480820192602092909190829003018186803b1580156118b557600080fd5b505afa1580156118c9573d6000803e3d6000fd5b505050506040513d60208110156118df57600080fd5b505190505b919050565b6118f161198c565b6119335760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b600b546001600160a01b031690565b600b546000906001600160a01b03166119a3612684565b6001600160a01b031614905090565b6001600160a01b0381163314156119fd57604051600160e51b62461bcd028152600401808060200182810382526028815260200180612fb36028913960400191505060405180910390fd5b60095460408051600160e21b6311238b270281526001600160a01b0384811660048301529151919092169163448e2c9c916024808301926020929190829003018186803b158015611a4d57600080fd5b505afa158015611a61573d6000803e3d6000fd5b505050506040513d6020811015611a7757600080fd5b505115611b195760095460408051600160e01b63e1d531570281526001600160a01b038481166004830152336024830152600060448301819052925193169263e1d5315792606480840193602093929083900390910190829087803b158015611adf57600080fd5b505af1158015611af3573d6000803e3d6000fd5b505050506040513d6020811015611b0957600080fd5b5051611b1457600080fd5b611bad565b60095460408051600160e11b6378ff958d0281526001600160a01b038481166004830152336024830152600160448301529151919092169163f1ff2b1a9160648083019260209291908290030181600087803b158015611b7857600080fd5b505af1158015611b8c573d6000803e3d6000fd5b505050506040513d6020811015611ba257600080fd5b5051611bad57600080fd5b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e775780601f10610e4c57610100808354040283529160200191610e77565b611c9a3333868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525060408051602081019091529081529250600191506125ec9050565b50505050565b600954600090600160a01b900460ff16611cf25760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b611d2033338585604051806020016040528060008152506040518060200160405280600081525060006125ec565b50600192915050565b600954600160a01b900460ff16611d785760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60ff831115611dbf5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020612fdb833981519152604482015290519081900360640190fd5b828114611e0057604051600160e51b62461bcd028152600401808060200182810382526033815260200180612ffb6033913960400191505060405180910390fd5b60005b60ff8116841115611e5457611e4b85858360ff16818110611e2057fe5b905060200201356001600160a01b031684848460ff16818110611e3f57fe5b90506020020135611ca0565b50600101611e03565b5050505050565b6000816001600160a01b0316836001600160a01b03161480611efd575060095460408051600160e01b638e73eee30281526001600160a01b038681166004830152858116602483015291519190921691638e73eee3916044808301926020929190829003018186803b158015611ed057600080fd5b505afa158015611ee4573d6000803e3d6000fd5b505050506040513d6020811015611efa57600080fd5b50515b905061103b565b600954600090600160a01b900460ff16611f565760408051600160e51b62461bcd0281526020600482015260116024820152600080516020613053833981519152604482015290519081900360640190fd5b60095460408051600160e01b630af4187d0281526001600160a01b038681166004830152858116602483015291519190921691630af4187d916044808301926020929190829003018186803b158015611fae57600080fd5b505afa158015611fc2573d6000803e3d6000fd5b505050506040513d6020811015611fd857600080fd5b50519392505050565b60ff835111156120295760408051600160e51b62461bcd0281526020600482018190526024820152600080516020612fdb833981519152604482015290519081900360640190fd5b815183511461206c57604051600160e51b62461bcd028152600401808060200182810382526033815260200180612ffb6033913960400191505060405180910390fd5b60005b83518160ff161015611c9a576120c63333868460ff168151811061208f57fe5b6020026020010151868560ff16815181106120a657fe5b6020026020010151866040518060200160405280600081525060016125ec565b60010161206f565b6120d661198c565b6121185760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b61212181612688565b50565b61212c61198c565b61216e5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613073833981519152604482015290519081900360640190fd5b60098054600160a01b60ff021916905560408051808201909152600a8152600160b11b6922a92199182a37b5b2b7026020820152610f0f9060006124ff565b6001600160a01b0381163314156121f857604051600160e51b62461bcd02815260040180806020018281038252602581526020018061302e6025913960400191505060405180910390fd5b60095460408051600160e21b6311238b270281526001600160a01b0384811660048301529151919092169163448e2c9c916024808301926020929190829003018186803b15801561224857600080fd5b505afa15801561225c573d6000803e3d6000fd5b505050506040513d602081101561227257600080fd5b5051156123125760095460408051600160e01b63e1d531570281526001600160a01b038481166004830152336024830152600160448301529151919092169163e1d531579160648083019260209291908290030181600087803b1580156122d857600080fd5b505af11580156122ec573d6000803e3d6000fd5b505050506040513d602081101561230257600080fd5b505161230d57600080fd5b6123a8565b60095460408051600160e11b6378ff958d0281526001600160a01b038481166004830152336024830152600060448301819052925193169263f1ff2b1a92606480840193602093929083900390910190829087803b15801561237357600080fd5b505af1158015612387573d6000803e3d6000fd5b505050506040513d602081101561239d57600080fd5b50516123a857600080fd5b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b6123eb3387611e5b565b6124345760408051600160e51b62461bcd02815260206004820152600f6024820152600160891b6e2737ba1030b71037b832b930ba37b902604482015290519081900360640190fd5b61185933878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b01819004810282018101909252898152925089915088908190840183828082843760009201919091525061272c92505050565b6124fa33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506040805160208101909152908152925061272c915050565b505050565b6000826040516020018082805190602001908083835b602083106125345780518252601f199092019160209182019101612515565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f1901835280855282519290910191909120600160e01b6329965a1d028252306004830152602482018190526001600160a01b03881660448301529251929550731820a4b7618bde71dce8cdc73aab6c95905fad2494506329965a1d9350606480820193600093509182900301818387803b1580156125d857600080fd5b505af115801561157a573d6000803e3d6000fd5b6125fb87878787878787612793565b600954600160a01b900460ff161561157a57846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a350505050505050565b6000806040516020840160008287838a8c6187965a03f198975050505050505050565b3390565b6001600160a01b0381166126d057604051600160e51b62461bcd028152600401808060200182810382526026815260200180612f8d6026913960400191505060405180910390fd5b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b61273985858585856129dc565b600954600160a01b900460ff1615611e54576040805184815290516000916001600160a01b038716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b61279c84612a16565b6127aa878787878787612a61565b6001600160a01b0385166128085760408051600160e51b62461bcd02815260206004820152601260248201527f43616e6e6f742073656e6420746f203078300000000000000000000000000000604482015290519081900360640190fd5b60095460408051600160e01b63bb35783b0281526001600160a01b0389811660048301528881166024830152604482018890529151919092169163bb35783b9160648083019260209291908290030181600087803b15801561286957600080fd5b505af115801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b505161289e57600080fd5b6128ad87878787878787612c3e565b846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561293657818101518382015260200161291e565b50505050905090810190601f1680156129635780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561299657818101518382015260200161297e565b50505050905090810190601f1680156129c35780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450505050505050565b604051600160e51b62461bcd0281526004018080602001828103825260228152602001806130936022913960400191505060405180910390fd5b6002548181612a2157fe5b061561212157604051600160e51b62461bcd0281526004018080602001828103825260278152602001806130b56027913960400191505060405180910390fd5b6000612aa2866040518060400160405280601281526020017f455243373737546f6b656e7353656e6465720000000000000000000000000000815250612e68565b90506001600160a01b038116612ab85750611859565b806001600160a01b03166375ab97828888888888886040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612b6b578181015183820152602001612b53565b50505050905090810190601f168015612b985780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612bcb578181015183820152602001612bb3565b50505050905090810190601f168015612bf85780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015612c1d57600080fd5b505af1158015612c31573d6000803e3d6000fd5b5050505050505050505050565b6000612c7f866040518060400160405280601581526020017f455243373737546f6b656e73526563697069656e740000000000000000000000815250612e68565b90506001600160a01b03811615612e1157806001600160a01b03166223de298989898989896040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612d42578181015183820152602001612d2a565b50505050905090810190601f168015612d6f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612da2578181015183820152602001612d8a565b50505050905090810190601f168015612dcf5780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015612df457600080fd5b505af1158015612e08573d6000803e3d6000fd5b50505050612e5e565b8115612e5e57612e2086612f6e565b612e5e57604051600160e51b62461bcd0281526004018080602001828103825260358152602001806130dc6035913960400191505060405180910390fd5b5050505050505050565b600080826040516020018082805190602001908083835b60208310612e9e5780518252601f199092019160209182019101612e7f565b51815160209384036101000a60001901801990921691161790526040805192909401828103601f19018352808552825192820192909220600160e11b63555ddc650283526001600160a01b038b166004840152602483018190529351939650731820a4b7618bde71dce8cdc73aab6c95905fad24955063aabbb8ca94506044808301949193509091829003018186803b158015612f3a57600080fd5b505afa158015612f4e573d6000803e3d6000fd5b505050506040513d6020811015612f6457600080fd5b5051949350505050565b60006001600160a01b038216612f86575060006118e4565b503b159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343616e6e6f7420617574686f72697a6520796f757273656c6620617320616e206f70657261746f72556e737570706f72746564206e756d626572206f66206164647265737365732e50726f76696465642061646472657373657320646f6573206e6f7420657175616c20746f2070726f76696465642073756d732e43616e6e6f74207265766f6b6520796f757273656c6620617320616e206f70657261746f7245524332302069732064697361626c65640000000000000000000000000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724275726e696e672066756e6374696f6e616c6974792069732064697361626c65642e416d6f756e74206973206e6f742061206d756c7469706c65206f66206772616e756c617269747943616e6e6f742073656e6420746f20636f6e747261637420776974686f757420455243373737546f6b656e73526563697069656e74a165627a7a723058202b0c294c2357b4b0ce440e899dbfee51ed046f4106b134c1a8d816fb26b31f760029

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

00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000282b82666abfd3da9000000000000000000000000000000c225251b8738f2ff5376991fa37b44744a07b19b0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000443414c4c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443414c4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): CALL
Arg [1] : _symbol (string): CALL
Arg [2] : _granularity (uint256): 10000000000000000
Arg [3] : _totalSupply (uint256): 777000000000000000000000000
Arg [4] : _initialOwner (address): 0xC225251B8738f2FF5376991fa37B44744a07b19b

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [3] : 00000000000000000000000000000000000000000282b82666abfd3da9000000
Arg [4] : 000000000000000000000000c225251b8738f2ff5376991fa37b44744a07b19b
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 43414c4c00000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 43414c4c00000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

162:5579:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;162:5579:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1381:123:7;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1381:123:7;;;;;;;;;;;;;;;;;1936:69:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1936:69:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1615:145:0;;;:::i;:::-;;3008:241:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3008:241:6;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;355:24:7;;;:::i;:::-;;;;-1:-1:-1;;;;;355:24:7;;;;;;;;;;;;;;824:104;;;:::i;:::-;;;;;;;;;;;;;;;;2177:469:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2177:469:6;;;;;;;;;;;;;;;;;:::i;1367:75::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1123:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1123:103:0;-1:-1:-1;;;;;1123:103:0;;:::i;286:238:14:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;286:238:14;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;286:238:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;286:238:14;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;286:238:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;286:238:14;;-1:-1:-1;286:238:14;;-1:-1:-1;;;;;286:238:14:i;2175:77:5:-;;;:::i;5489:337::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;5489:337:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;5489:337:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5489:337:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5489:337:5;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;5489:337:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5489:337:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;5489:337:5;;-1:-1:-1;5489:337:5;-1:-1:-1;5489:337:5;:::i;4983:756:0:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;4983:756:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;4983:756:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4983:756:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4983:756:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;4983:756:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4983:756:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4983:756:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;4983:756:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4983:756:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;4983:756:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;4983:756:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4983:756:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;4983:756:0;;-1:-1:-1;4983:756:0;-1:-1:-1;4983:756:0;:::i;3001:605::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;3001:605:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;3001:605:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3001:605:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;3001:605:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;3001:605:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3001:605:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;3001:605:0;;-1:-1:-1;3001:605:0;-1:-1:-1;3001:605:0;:::i;1124:130:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1124:130:7;-1:-1:-1;;;;;1124:130:7;;:::i;1679:137:13:-;;;:::i;894:77::-;;;:::i;1245:92::-;;;:::i;1701:460:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1701:460:7;-1:-1:-1;;;;;1701:460:7;;:::i;2051:73:5:-;;;:::i;3079:153::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;3079:153:5;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;3079:153:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3079:153:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;3079:153:5;;-1:-1:-1;3079:153:5;-1:-1:-1;3079:153:5;:::i;1682:181:6:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1682:181:6;;;;;;;;:::i;2047:575:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2047:575:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;2047:575:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2047:575:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;2047:575:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;2047:575:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2047:575:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;2047:575:0;;-1:-1:-1;2047:575:0;-1:-1:-1;2047:575:0;:::i;3196:477:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3196:477:7;;;;;;;;;;:::i;3618:164:6:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3618:164:6;;;;;;;;;;:::i;3936:627:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3936:627:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;3936:627:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3936:627:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;3936:627:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3936:627:0;;;;;;;;-1:-1:-1;3936:627:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;3936:627:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3936:627:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;3936:627:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3936:627:0;;;;;;;;-1:-1:-1;3936:627:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;3936:627:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3936:627:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3936:627:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3936:627:0;;-1:-1:-1;3936:627:0;;-1:-1:-1;;;;;3936:627:0:i;1965:107:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1965:107:13;-1:-1:-1;;;;;1965:107:13;;:::i;1347:144:0:-;;;:::i;2361:451:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2361:451:7;-1:-1:-1;;;;;2361:451:7;;:::i;5967:325:5:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;5967:325:5;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;5967:325:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5967:325:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5967:325:5;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;5967:325:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5967:325:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;5967:325:5;;-1:-1:-1;5967:325:5;-1:-1:-1;5967:325:5;:::i;5832:129::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5832:129:5;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;5832:129:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5832:129:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;5832:129:5;;-1:-1:-1;5832:129:5;-1:-1:-1;5832:129:5;:::i;1381:123:7:-;1465:10;;:32;;;-1:-1:-1;;;;;1465:32:7;;;;1430:16;;-1:-1:-1;;;;;1465:10:7;;:30;;:32;;;;;:10;;:32;;;;;;;:10;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;1465:32:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1465:32:7;;;;;;39:16:-1;36:1;17:17;2:54;101:4;1465:32:7;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;1465:32:7;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;-1:-1;1465:32:7;;-1:-1:-1;;;;;1381:123:7;:::o;1936:69:5:-;1997:5;1990:12;;;;;;;;-1:-1:-1;;1990:12:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:13;;1990:12;;1997:5;;1990:12;;1997:5;1990:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1936:69;:::o;1615:145:0:-;1098:9:13;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;;;1090:54:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:13;;;;;;;;;;;;;;;1665:16:0;:23;;-1:-1:-1;;;;;;1665:23:0;-1:-1:-1;;;1665:23:0;;;1698:55;;;;;;;;;;;;-1:-1:-1;;;;;1698:55:0;;;;;;1747:4;1698:26;:55::i;:::-;1615:145::o;3008:241:6:-;1194:16;;3082:12;;-1:-1:-1;;;1194:16:6;;;;1186:46;;;;;-1:-1:-1;;;;;1186:46:6;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1186:46:6;;;;;;;;;;;;;;;3114:10;;:52;;;-1:-1:-1;;;;;3114:52:6;;3136:10;3114:52;;;;-1:-1:-1;;;;;3114:52:6;;;;;;;;;;;;;;;:10;;;;;:21;;:52;;;;;;;;;;;;;;:10;;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;3114:52:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3114:52:6;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3114:52:6;3106:61;;;;;;3182:39;;;;;;;;-1:-1:-1;;;;;3182:39:6;;;3191:10;;3182:39;;;;;;;;;-1:-1:-1;3238:4:6;1242:1;3008:241;;;;:::o;355:24:7:-;;;-1:-1:-1;;;;;355:24:7;;:::o;824:104::-;894:10;;:27;;;-1:-1:-1;;;;;894:27:7;;;;868:7;;-1:-1:-1;;;;;894:10:7;;:25;;:27;;;;;;;;;;;;;;:10;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;894:27:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;894:27:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;894:27:7;;-1:-1:-1;824:104:7;:::o;2177:469:6:-;1194:16;;2266:12;;-1:-1:-1;;;1194:16:6;;;;1186:46;;;;;-1:-1:-1;;;;;1186:46:6;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1186:46:6;;;;;;;;;;;;;;;2310:10;;:42;;;-1:-1:-1;;;;;2310:42:6;;-1:-1:-1;;;;;2310:42:6;;;;;;;2341:10;2310:42;;;;;;2290:17;;2310:10;;;;;:23;;:42;;;;;;;;;;;;;;;:10;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;2310:42:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2310:42:6;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2310:42:6;;-1:-1:-1;2370:20:6;;;;2362:54;;;;;-1:-1:-1;;;;;2362:54:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;2504:10;;:49;;;-1:-1:-1;;;;;2504:49:6;;-1:-1:-1;;;;;2504:49:6;;;;;;;2533:10;2504:49;;;;;;;;;;;;:10;;;;;:21;;:49;;;;;;;;;;;;;;:10;;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;2504:49:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2504:49:6;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2504:49:6;2496:58;;;;;;2564:54;2571:10;2583:5;2590:3;2595:7;2564:54;;;;;;;;;;;;;;;;;;;;;;;;2612:5;2564:6;:54::i;:::-;-1:-1:-1;2635:4:6;;2177:469;-1:-1:-1;;;;2177:469:6:o;1367:75::-;1194:16;;1414:5;;-1:-1:-1;;;1194:16:6;;;;1186:46;;;;;-1:-1:-1;;;;;1186:46:6;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1186:46:6;;;;;;;;;;;;;;;-1:-1:-1;1436:2:6;1367:75;:::o;1123:103:0:-;1098:9:13;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;;;1090:54:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:13;;;;;;;;;;;;;;;1192:10:0;:27;;-1:-1:-1;;;;;;1192:27:0;-1:-1:-1;;;;;1192:27:0;;;;;;;;;;1123:103::o;286:238:14:-;1098:9:13;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;;;1090:54:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:13;;;;;;;;;;;;;;;413:51:14;426:11;439:5;446:4;:11;459:4;413:12;:51::i;:::-;405:60;;;;;;492:11;-1:-1:-1;;;;;480:37:14;;505:5;512:4;480:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;480:37:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;286:238;;;:::o;2175:77:5:-;2237:12;;2175:77;:::o;5489:337::-;5689:32;5703:10;5715:5;5689:13;:32::i;:::-;5681:61;;;;;-1:-1:-1;;;;;5681:61:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;5752:67;5759:10;5771:5;5778:3;5783:7;5792:5;;5752:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;5752:67:5;;;;137:4:-1;5752:67:5;;;;;;;;;;;;;;;;;;-1:-1:-1;5799:13:5;;-1:-1:-1;5799:13:5;;;;5752:67;;5799:13;;;;5752:67;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;5814:4:5;;-1:-1:-1;5752:6:5;;-1:-1:-1;;5752:67:5:i;:::-;5489:337;;;;;;;:::o;4983:756:0:-;5249:3;5235:17;;;5227:62;;;;;-1:-1:-1;;;;;5227:62:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5227:62:0;;;;;;;;;;;;;;;5386:29;;;5378:93;;;;-1:-1:-1;;;;;5378:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5487:7;5482:251;5500:14;;;;-1:-1:-1;5482:251:0;;;5543:32;5557:10;5569:5;5543:13;:32::i;:::-;5535:60;;;;;-1:-1:-1;;;;;5535:60:0;;;;;;;;;;;;-1:-1:-1;;;;;5535:60:0;;;;;;;;;;;;;;;5644:78;5651:10;5663:5;5670:3;;5674:1;5670:6;;;;;;;;;;;;;;;-1:-1:-1;;;;;5670:6:0;5678:8;;5687:1;5678:11;;;;;;;;;;;;;;;5691:9;;5644:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;5644:78:0;;;;137:4:-1;5644:78:0;;;;;;;;;;;;;;;;;;-1:-1:-1;5702:13:0;;-1:-1:-1;5702:13:0;;;;5644:78;;5702:13;;;;5644:78;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;5717:4:0;;-1:-1:-1;5644:6:0;;-1:-1:-1;;5644:78:0:i;:::-;5516:3;;5482:251;;;;4983:756;;;;;;;;;:::o;3001:605::-;1194:16:6;;-1:-1:-1;;;1194:16:6;;;;1186:46;;;;;-1:-1:-1;;;;;1186:46:6;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1186:46:6;;;;;;;;;;;;;;;3236:3:0;3213:26;;;3205:71;;;;;-1:-1:-1;;;;;3205:71:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3205:71:0;;;;;;;;;;;;;;;3373:38;;;3365:102;;;;-1:-1:-1;;;;;3365:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3483:7;3478:122;3496:23;;;;-1:-1:-1;3478:122:0;;;3540:49;3553:5;3560:12;;3573:1;3560:15;;;;;;;;;;;;;;;-1:-1:-1;;;;;3560:15:0;3577:8;;3586:1;3577:11;;;;;;;;;;;;;;;3540:12;:49::i;:::-;-1:-1:-1;3521:3:0;;3478:122;;;;3001:605;;;;;:::o;1124:130:7:-;1212:10;;:35;;;-1:-1:-1;;;;;1212:35:7;;-1:-1:-1;;;;;1212:35:7;;;;;;;;;1186:7;;1212:10;;;;;:21;;:35;;;;;;;;;;;;;;;:10;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;1212:35:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1212:35:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1212:35:7;;-1:-1:-1;1124:130:7;;;;:::o;1679:137:13:-;1098:9;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;;;1090:54:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:13;;;;;;;;;;;;;;;1761:6;;1740:40;;1777:1;;-1:-1:-1;;;;;1761:6:13;;1740:40;;1777:1;;1740:40;1790:6;:19;;-1:-1:-1;;;;;;1790:19:13;;;1679:137::o;894:77::-;958:6;;-1:-1:-1;;;;;958:6:13;894:77;:::o;1245:92::-;1324:6;;1285:4;;-1:-1:-1;;;;;1324:6:13;1308:12;:10;:12::i;:::-;-1:-1:-1;;;;;1308:22:13;;1301:29;;1245:92;:::o;1701:460:7:-;-1:-1:-1;;;;;1774:23:7;;1787:10;1774:23;;1766:76;;;;-1:-1:-1;;;;;1766:76:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1856:10;;:40;;;-1:-1:-1;;;;;1856:40:7;;-1:-1:-1;;;;;1856:40:7;;;;;;;;;:10;;;;;:29;;:40;;;;;;;;;;;;;;:10;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;1856:40:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1856:40:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1856:40:7;1852:247;;;1920:10;;:66;;;-1:-1:-1;;;;;1920:66:7;;-1:-1:-1;;;;;1920:66:7;;;;;;;1968:10;1920:66;;;;:10;:66;;;;;;;;:10;;;:36;;:66;;;;;;;;;;;;;;;;;;:10;:66;;;5:2:-1;;;;30:1;27;20:12;5:2;1920:66:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1920:66:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1920:66:7;1912:75;;;;;;1852:247;;;2026:10;;:61;;;-1:-1:-1;;;;;2026:61:7;;-1:-1:-1;;;;;2026:61:7;;;;;;;2070:10;2026:61;;;;:10;:61;;;;;;:10;;;;;:32;;:61;;;;;;;;;;;;;;:10;;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;2026:61:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2026:61:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2026:61:7;2018:70;;;;;;2113:41;;2143:10;;-1:-1:-1;;;;;2113:41:7;;;;;;;;1701:460;:::o;2051:73:5:-;2114:7;2107:14;;;;;;;;-1:-1:-1;;2107:14:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2090:13;;2107:14;;2114:7;;2107:14;;2114:7;2107:14;;;;;;;;;;;;;;;;;;;;;;;;3079:153;3164:61;3171:10;3183;3195:3;3200:7;3209:5;;3164:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;-1:-1;3164:61:5;;;;;;;;;;;;;-1:-1:-1;3220:4:5;;-1:-1:-1;3164:6:5;;-1:-1:-1;3164:61:5:i;:::-;3079:153;;;;:::o;1682:181:6:-;1194:16;;1752:12;;-1:-1:-1;;;1194:16:6;;;;1186:46;;;;;-1:-1:-1;;;;;1186:46:6;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1186:46:6;;;;;;;;;;;;;;;1776:59;1783:10;1795;1807:3;1812:7;1776:59;;;;;;;;;;;;;;;;;;;;;;;;1829:5;1776:6;:59::i;:::-;-1:-1:-1;1852:4:6;1682:181;;;;:::o;2047:575:0:-;1194:16:6;;-1:-1:-1;;;1194:16:6;;;;1186:46;;;;;-1:-1:-1;;;;;1186:46:6;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1186:46:6;;;;;;;;;;;;;;;2263:3:0;2240:26;;;2232:71;;;;;-1:-1:-1;;;;;2232:71:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2232:71:0;;;;;;;;;;;;;;;2400:38;;;2392:102;;;;-1:-1:-1;;;;;2392:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:7;2505:111;2523:23;;;;-1:-1:-1;2505:111:0;;;2567:38;2576:12;;2589:1;2576:15;;;;;;;;;;;;;;;-1:-1:-1;;;;;2576:15:0;2593:8;;2602:1;2593:11;;;;;;;;;;;;;;;2567:8;:38::i;:::-;-1:-1:-1;2548:3:0;;2505:111;;;;2047:575;;;;:::o;3196:477:7:-;3281:4;3317:12;-1:-1:-1;;;;;3304:25:7;:9;-1:-1:-1;;;;;3304:25:7;;:86;;;-1:-1:-1;3333:10:7;;:57;;;-1:-1:-1;;;;;3333:57:7;;-1:-1:-1;;;;;3333:57:7;;;;;;;;;;;;;;;;:10;;;;;:32;;:57;;;;;;;;;;;;;;:10;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;3333:57:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3333:57:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3333:57:7;3304:86;3297:93;;;;3618:164:6;1194:16;;3698:17;;-1:-1:-1;;;1194:16:6;;;;1186:46;;;;;-1:-1:-1;;;;;1186:46:6;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1186:46:6;;;;;;;;;;;;;;;3734:10;;:41;;;-1:-1:-1;;;;;3734:41:6;;-1:-1:-1;;;;;3734:41:6;;;;;;;;;;;;;;;;:10;;;;;:23;;:41;;;;;;;;;;;;;;:10;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;3734:41:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3734:41:6;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3734:41:6;;3618:164;-1:-1:-1;;;3618:164:6:o;3936:627:0:-;4160:3;4137:12;:19;:26;;4129:71;;;;;-1:-1:-1;;;;;4129:71:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4129:71:0;;;;;;;;;;;;;;;4320:8;:15;4297:12;:19;:38;4289:102;;;;-1:-1:-1;;;;;4289:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4407:7;4402:155;4424:12;:19;4420:1;:23;;;4402:155;;;4464:82;4471:10;4484;4496:12;4509:1;4496:15;;;;;;;;;;;;;;;;4513:8;4522:1;4513:11;;;;;;;;;;;;;;;;4526:9;4464:82;;;;;;;;;;;;4541:4;4464:6;:82::i;:::-;4445:3;;4402:155;;1965:107:13;1098:9;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;;;1090:54:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:13;;;;;;;;;;;;;;;2037:28;2056:8;2037:18;:28::i;:::-;1965:107;:::o;1347:144:0:-;1098:9:13;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;;;1090:54:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:13;;;;;;;;;;;;;;;1398:16:0;:24;;-1:-1:-1;;;;;;1398:24:0;;;1432:52;;;;;;;;;;;;-1:-1:-1;;;;;1432:52:0;;;;;;1417:5;1432:26;:52::i;2361:451:7:-;-1:-1:-1;;;;;2431:23:7;;2444:10;2431:23;;2423:73;;;;-1:-1:-1;;;;;2423:73:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:10;;:40;;;-1:-1:-1;;;;;2510:40:7;;-1:-1:-1;;;;;2510:40:7;;;;;;;;;:10;;;;;:29;;:40;;;;;;;;;;;;;;:10;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;2510:40:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2510:40:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2510:40:7;2506:247;;;2574:10;;:65;;;-1:-1:-1;;;;;2574:65:7;;-1:-1:-1;;;;;2574:65:7;;;;;;;2622:10;2574:65;;;;:10;:65;;;;;;:10;;;;;:36;;:65;;;;;;;;;;;;;;:10;;:65;;;5:2:-1;;;;30:1;27;20:12;5:2;2574:65:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2574:65:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2574:65:7;2566:74;;;;;;2506:247;;;2679:10;;:62;;;-1:-1:-1;;;;;2679:62:7;;-1:-1:-1;;;;;2679:62:7;;;;;;;2723:10;2679:62;;;;:10;:62;;;;;;;;:10;;;:32;;:62;;;;;;;;;;;;;;;;;;:10;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;2679:62:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2679:62:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2679:62:7;2671:71;;;;;;2767:38;;2794:10;;-1:-1:-1;;;;;2767:38:7;;;;;;;;2361:451;:::o;5967:325:5:-;6153:39;6167:10;6179:12;6153:13;:39::i;:::-;6145:67;;;;;-1:-1:-1;;;;;6145:67:5;;;;;;;;;;;;-1:-1:-1;;;;;6145:67:5;;;;;;;;;;;;;;;6222:63;6229:10;6241:12;6255:7;6264:5;;6222:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;6222:63:5;;;;137:4:-1;6222:63:5;;;;;;;;;;;;;;;;;;-1:-1:-1;6271:13:5;;-1:-1:-1;6271:13:5;;;;6222:63;;6271:13;;;;6222:63;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;6222:6:5;;-1:-1:-1;;;6222:63:5:i;5832:129::-;5904:50;5911:10;5923;5935:7;5944:5;;5904:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;-1:-1;5904:50:5;;;;;;;;;;;;;-1:-1:-1;5904:6:5;;-1:-1:-1;;5904:50:5:i;:::-;5832:129;;;:::o;599:282:3:-;710:21;761:15;744:33;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;744::3;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;744:33:3;;;734:44;;;;;;;;;;-1:-1:-1;;;;;788:86:3;;836:4;788:86;;;;;;;;;;-1:-1:-1;;;;;788:86:3;;;;;;;;734:44;;-1:-1:-1;549:42:3;;-1:-1:-1;788:39:3;;-1:-1:-1;788:86:3;;;;;-1:-1:-1;;;788:86:3;;;;;;-1:-1:-1;549:42:3;788:86;;;5:2:-1;;;;30:1;27;20:12;5:2;788:86:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;3788:399:6;4027:83;4040:9;4051:5;4058:3;4063:7;4072:5;4079:13;4094:15;4027:12;:83::i;:::-;4124:16;;-1:-1:-1;;;4124:16:6;;;;4120:61;;;4165:3;-1:-1:-1;;;;;4149:29:6;4158:5;-1:-1:-1;;;;;4149:29:6;;4170:7;4149:29;;;;;;;;;;;;;;;;;;3788:399;;;;;;;:::o;723:1087:14:-;839:4;855:11;953:4;947:11;1101:2;1095:4;1091:13;1683:1;1668;1571:10;1556:1;1537:5;1512:11;1219:5;1214:3;1210:15;1192:579;1182:589;723:1087;-1:-1:-1;;;;;;;;723:1087:14:o;788:96:2:-;867:10;788:96;:::o;2173:225:13:-;-1:-1:-1;;;;;2246:22:13;;2238:73;;;;-1:-1:-1;;;;;2238:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2347:6;;2326:38;;-1:-1:-1;;;;;2326:38:13;;;;2347:6;;2326:38;;2347:6;;2326:38;2374:6;:17;;-1:-1:-1;;;;;;2374:17:13;-1:-1:-1;;;;;2374:17:13;;;;;;;;;;2173:225::o;4193:354:6:-;4388:68;4401:9;4412:12;4426:7;4435:5;4442:13;4388:12;:68::i;:::-;4470:16;;-1:-1:-1;;;4470:16:6;;;;4466:75;;;4495:43;;;;;;;;4526:1;;-1:-1:-1;;;;;4495:43:6;;;;;;;;;;;;4193:354;;;;;:::o;4445:907:7:-;4684:24;4700:7;4684:15;:24::i;:::-;4719:64;4730:9;4741:5;4748:3;4753:7;4762:5;4769:13;4719:10;:64::i;:::-;-1:-1:-1;;;;;4802:17:7;;4794:48;;;;;-1:-1:-1;;;;;4794:48:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;5067:10;;:36;;;-1:-1:-1;;;;;5067:36:7;;-1:-1:-1;;;;;5067:36:7;;;;;;;;;;;;;;;;;;;;;;:10;;;;;:15;;:36;;;;;;;;;;;;;;:10;;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;5067:36:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5067:36:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5067:36:7;5059:45;;;;;;5115:84;5129:9;5140:5;5147:3;5152:7;5161:5;5168:13;5183:15;5115:13;:84::i;:::-;5238:3;-1:-1:-1;;;;;5215:58:7;5231:5;-1:-1:-1;;;;;5215:58:7;5220:9;-1:-1:-1;;;;;5215:58:7;;5243:7;5252:5;5259:13;5215:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5215:58:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5215:58:7;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5215:58:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4445:907;;;;;;;:::o;5742:246::-;5937:44;;-1:-1:-1;;;;;5937:44:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6488:152:5;6572:12;;6562:7;:22;;;;;;:27;6554:79;;;;-1:-1:-1;;;;;6554:79:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11912:484;12125:28;12156:42;12170:5;12156:42;;;;;;;;;;;;;;;;;:13;:42::i;:::-;12125:73;-1:-1:-1;;;;;;12212:34:5;;12208:51;;12250:7;;;12208:51;12288:20;-1:-1:-1;;;;;12268:54:5;;12336:9;12347:5;12354:3;12359:7;12368:5;12375:13;12268:121;;;;;;;;;;;;;-1:-1:-1;;;;;12268:121:5;-1:-1:-1;;;;;12268:121:5;;;;;;-1:-1:-1;;;;;12268:121:5;-1:-1:-1;;;;;12268:121:5;;;;;;-1:-1:-1;;;;;12268:121:5;-1:-1:-1;;;;;12268:121:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12268:121:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12268:121:5;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12268:121:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12268:121:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12268:121:5;;;;11912:484;;;;;;;:::o;10534:679::-;10780:31;10814:43;10828:3;10814:43;;;;;;;;;;;;;;;;;:13;:43::i;:::-;10780:77;-1:-1:-1;;;;;;10871:37:5;;;10867:340;;10947:23;-1:-1:-1;;;;;10924:62:5;;11004:9;11015:5;11022:3;11027:7;11036:5;11043:13;10924:133;;;;;;;;;;;;;-1:-1:-1;;;;;10924:133:5;-1:-1:-1;;;;;10924:133:5;;;;;;-1:-1:-1;;;;;10924:133:5;-1:-1:-1;;;;;10924:133:5;;;;;;-1:-1:-1;;;;;10924:133:5;-1:-1:-1;;;;;10924:133:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10924:133:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10924:133:5;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10924:133:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10924:133:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10924:133:5;;;;10867:340;;;11078:15;11074:133;;;11117:21;11134:3;11117:16;:21::i;:::-;11109:87;;;;-1:-1:-1;;;;;11109:87:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10534:679;;;;;;;;:::o;887:261:3:-;977:7;996:21;1047:15;1030:33;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1030::3;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;1030:33:3;;;1020:44;;;;;;;;;-1:-1:-1;;;;;1081:60:3;;-1:-1:-1;;;;;1081:60:3;;;;;;;;;;;;;;1020:44;;-1:-1:-1;549:42:3;;-1:-1:-1;1081:39:3;;-1:-1:-1;1081:60:3;;;;;263:2:-1;;-1:-1;1081:60:3;;;;;;;549:42;1081:60;;;5:2:-1;;;;30:1;27;20:12;5:2;1081:60:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1081:60:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1081:60:3;;887:261;-1:-1:-1;;;;887:261:3:o;6856:271:5:-;6919:4;-1:-1:-1;;;;;6939:19:5;;6935:42;;-1:-1:-1;6969:5:5;6962:12;;6935:42;-1:-1:-1;7024:18:5;7111:9;;6856:271::o

Swarm Source

bzzr://2dd35872a32d9bcd22eb8ce622b4bf0decff3fa23c8a712fa4829f82302d4fe0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.