Sponsored Link:   SHARPAY.io • Share button with blockchain profit • ICOBench TOP Project • 30% Bonus • Buy Now!
Contract Overview
Balance: 0 Ether
Ether Value: $0
Transactions: 6317 txns
Token Contract: Fysical (FYS)
 Latest 25 txns from a total Of 6317 transactions
View All

TxHash Age From To Value [TxFee]
0x5b8d854062b55840ce4caae9ec67aa47e5fd4906abc570474286457ba213f8f04 hrs 35 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00152044
0xd05a666e88aed7ab47b7b25c53c82bd7a423a1a32799120808d1dda9df45ea174 hrs 36 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00064751
0xc8882fb7c2a160d465b5f21b2217ddbf8937b0a6e170d1e955df1035ef0357384 hrs 36 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00068233
0x87e977e4ec765b238101bbfb8cdf4c9e36645f300afaa19fbcaf7524f77084d74 hrs 38 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00096844
0xa78344363f2de217de0edbfb8efc21d7fdb4162904abf93af0ea6323876729fc4 hrs 40 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00096844
0xfb263d044e369b4b275bb65c608df40a5dcc0f9241eb62d78ff30d0e85dd6fd64 hrs 42 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00089024
0x7b329a81b19d92d198e169f2606db85694dfc02dab2d035e21b196fb8b6478b34 hrs 45 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00069577
0xe8bb7057c2daf0aff3df883af670b50399ace3eb203e6719234f792b10b2747c4 hrs 51 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00159796
0x4110b735a48442e0f1b5dc6aae89f3f91f60e2c5bde8a5cdd09cd70d94499bb75 hrs 8 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00162896
0x7c55f804fec51d50afd49235ca86df0f46766d7b65942126de939c2b6c044e7f5 hrs 19 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00064751
0xcc97c72eed41773aae42c8985a45f54d39225f4da75918f4fe32c310eebdc20c5 hrs 24 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.0007396
0x1bf2f96eebf7cae38f08449c18b4ab431717a4343bb63cc1cf1abf275766bdc05 hrs 25 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00157438
0xeb0b3f028a8ef36524f2dd92165d715c832b46eda3ec8fd5bde84ce63e66f70d5 hrs 26 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00064751
0xc85aaba55784dffbde96ea1e6789dfebf5ba94007c0f1ae9c5b1b462d7e8b42b5 hrs 27 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.0007396
0xb7770594f7cb668752388943a043b92fcd334cab049c445b6ffbad51cf30a26d5 hrs 28 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00136916
0xadf34d9d5dd91c74f058d11676d3f87458d27bde678a03910970a37788088bb85 hrs 33 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00064751
0xffce6eb06c238d3f32aac28c21ebb20481c2a70001dc1df279a241fa9e2d660b5 hrs 33 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00068233
0xf853e70b980543b7b8bdcba378770470c4f44db3cbdb1967a41294774fa72f115 hrs 35 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00096524
0x20e53be1dcc64b04d42999ee4324d0cf3553c50ccc9a09c273d68d75aaedef205 hrs 45 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.0007396
0x19f42b52ed829e4a609b639a60b066b7dfae66348e5b836b031a033df59535da5 hrs 53 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00069577
0x25582b7ae2c320a4f61dd2b0e333d3721b5526aa7f9a923b82d41bc5d3568d0b6 hrs 1 min ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00159796
0x4c603350d83e4d5cc4ea2785aa6db519ee1e8651995f74cdfa0be7d7d1ca16046 hrs 4 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00157438
0xbf51a00fe91cda1a09f903a7ae07ad9d6cc6cff00495d8abafcb2b87a40d13816 hrs 5 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00049687
0xee8f9c455984b97fbd99c1801e76606f18efa41e3e8817ba67a870a1bec102fe6 hrs 9 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.0007396
0x293200f9844057b07886210e28c4fad08bc2eded901d05bee59c1225177191ee6 hrs 10 mins ago0x26fdedd41012aef4a86a405c52bf88e934956899  IN   0x587e276dc7f2c97d986e8adf9b82d3f14d6cd8d20 Ether0.00136852
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Contract Source Code Verified (Exact match)
Contract Name: Fysical
Compiler Version: v0.4.19+commit.c4cbbb05
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.13;

contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  /**
  * @dev total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
  }

}

contract StandardToken is ERC20, BasicToken {

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


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(address _owner, address _spender) public view returns (uint256) {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract Fysical is StandardToken {
    using SafeMath for uint256;

    // To increase consistency and reduce the opportunity for human error, the '*sById' mappings, '*Count' values,
    // 'get*ById' function declarations/implementations, and 'create*' function declarations/implementations have been
    // programmatically-generated based on the each struct's name, member types/names, and the comments sharing a line
    // with a member.
    //
    // This programmatic generation builds 'require' function calls based on the following rules:
    //      - 'string' values must have length > 0
    //      - 'bytes' and uint256[] values may have any length
    //      - 'uint256' values representing a quantity must be > 0 (identifiers and Ethereum block numbers do not represent a quantity)
    //
    // The implementation of 'createProposal' contains one operation not found in the other programmatically-generated
    // 'create*' functions, a call to 'transferTokensToEscrow'.
    //
    // None of the other members or functions have been programmatically generated.

    // See https://en.wikipedia.org/wiki/Uniform_Resource_Identifier.
    // The risk of preventing support for a future addition to the URI syntax outweighs the benefit of validating URI
    // values within this immutable smart contract, so readers of Uri values should expect values that do not conform
    // to the formal syntax of a URI.
    struct Uri {
        string value;
    }

    // A set of URIs may describe multiple methods to access a particular resource.
    struct UriSet {
        uint256[] uniqueUriIdsSortedAscending;    // each value must be key in 'urisById'
    }

    // See https://en.wikipedia.org/wiki/Checksum#Algorithms. The description of the algorithm referred to by each URI
    // in the set should give a reader enough information to interpret the 'value' member of a 'Checksum' object
    // referring to this algorithm object.
    struct ChecksumAlgorithm {
        uint256 descriptionUriSetId;    // must be key in 'uriSetsById'
    }

    // See https://en.wikipedia.org/wiki/Checksum. The 'resourceByteCount' indicates the number of bytes contained in
    // the resource. Though this is not strictly part of most common Checksum algorithms, its validation may also be
    // useful. The 'value' field should contain the expected output of passing the resource content to the checksum
    // algorithm.
    struct Checksum {
        uint256 algorithmId; // must be key in 'checksumAlgorithmsById'
        uint256 resourceByteCount;
        bytes value;
    }

    // See https://en.wikipedia.org/wiki/Encryption. The description of the algorithm referred to by each URI
    // in the set should give a reader enough information to access the content of an encrypted resource. The algorithm
    // may be a symmetric encryption algorithm or an asymmetric encryption algorithm
    struct EncryptionAlgorithm {
        uint256 descriptionUriSetId;    // must be key in 'uriSetsById'
    }

    // For each resource, an Ethereum account may describe a checksum for the encrypted content of a resource and a
    // checksum for the decrypted content of a resource. When the resource is encrypted with a null encryption
    // algorithm, the resource is effectively unencrypted, so these two checksums should be identical
    // (See https://en.wikipedia.org/wiki/Null_encryption).
    struct ChecksumPair {
        uint256 encryptedChecksumId; // must be key in 'checksumsById'
        uint256 decryptedChecksumId; // must be key in 'checksumsById'
    }

    // A 'Resource' is content accessible with each URI referenced in the 'uriSetId'. This content should be
    // encrypted with the algorithm described by the 'EncryptionAlgorithm' referenced in 'encryptionAlgorithmId'. Each
    // resource referenced in 'metaResourceSetId' should describe the decrypted content in some way.
    //
    // For example, if the decrypted content conforms to a Protocol Buffers schema, the corresponding proto definition
    // file should be included in the meta-resources. Likewise, that proto definition resource should refer to a
    // resource like https://en.wikipedia.org/wiki/Protocol_Buffers among its meta-resources.
    struct Resource {
        uint256 uriSetId;                // must be key in 'uriSetsById'
        uint256 encryptionAlgorithmId;   // must be key in 'encryptionAlgorithmsById'
        uint256 metaResourceSetId;       // must be key in 'resourceSetsById'
    }

    // See https://en.wikipedia.org/wiki/Public-key_cryptography. This value should be the public key used in an
    // asymmetric encryption operation. It should be useful for encrypting an resource destined for the holder of the
    // corresponding private key or for decrypting a resource encrypted with the corresponding private key.
    struct PublicKey {
        bytes value;
    }

    // A 'ResourceSet' groups together resources that may be part of a trade proposal involving Fysical tokens. The
    // creator of a 'ResourceSet' must include a public key for use in the encryption operations of creating and
    // accepting a trade proposal. The creator must also specify the encryption algorithm a proposal creator should
    // use along with this resource set creator's public key. Just as a single resource may have meta-resources
    // describing the content of a resource, a 'ResourceSet' may have resources describing the whole resource set.
    //
    // Creators should be careful to not include so many resources that an Ethereum transaction to accept a proposal
    // might run out of gas while storing the corresponding encrypted decryption keys.
    //
    // While developing reasonable filters for un-useful data in this collection, developers should choose a practical
    // maximum depth of traversal through the meta-resources, since an infinite loop is possible.
    struct ResourceSet {
        address creator;
        uint256 creatorPublicKeyId;                     // must be key in 'publicKeysById'
        uint256 proposalEncryptionAlgorithmId;          // must be key in 'encryptionAlgorithmsById'
        uint256[] uniqueResourceIdsSortedAscending;     // each value must be key in 'resourcesById'
        uint256 metaResourceSetId;                      // must be key in 'resourceSetsById'
    }

    // The creator of a trade proposal may include arbitrary content to be considered part of the agreement the
    // resource set is accepting. This may be useful for license agreements to be enforced within a jurisdiction
    // governing the trade partners. The content available through each URI in the set should be encrypted first with
    // the public key of a resource set's creator and then with the private key of a proposal's creator.
    struct Agreement {
        uint256 uriSetId;           // must be key in 'uriSetsById'
        uint256 checksumPairId;     // must be key in 'checksumPairsById'
    }

    // Many agreements may be grouped together in an 'AgreementSet'
    struct AgreementSet {
        uint256[] uniqueAgreementIdsSortedAscending; // each value must be key in 'agreementsById'
    }

    // A 'TokenTransfer' describes a transfer of tokens to occur between two Ethereum accounts.
    struct TokenTransfer {
        address source;
        address destination;
        uint256 tokenCount;
    }

    // Many token transfers may be grouped together in a "TokenTransferSet'
    struct TokenTransferSet {
        uint256[] uniqueTokenTransferIdsSortedAscending; // each value must be key in 'tokenTransfersById'
    }

    // A 'Proposal' describes the conditions for the atomic exchange of Fysical tokens and a keys to decrypt resources
    // in a resource set. The creator must specify the asymmetric encryption algorithm for use when accepting the
    // proposal, along with this creator's public key. The creator may specify arbitrary agreements that should be
    // considered a condition of the trade.
    //
    // During the execution of 'createProposal', the count of tokens specified in each token transfer will be transfered
    // from the specified source account to the account with the Ethereum address of 0. When the proposal state changes
    // to a final state, these tokens will be returned to the source accounts or tranfserred to the destination account.
    //
    // By including a 'minimumBlockNumberForWithdrawal' value later than the current Ethereum block, the proposal
    // creator can give the resource set creator a rough sense of how long the proposal will remain certainly
    // acceptable. This is particularly useful because the execution of an Ethereum transaction to accept a proposal
    // exposes the encrypted decryption keys to the Ethereum network regardless of whether the transaction succeeds.
    // Within the time frame that a proposal acceptance transaction will certainly succeed, the resource creator need
    // not be concerned with the possibility that an acceptance transaction might execute after a proposal withdrawal
    // submitted to the Ethereum network at approximately the same time.
    struct Proposal {
        uint256 minimumBlockNumberForWithdrawal;
        address creator;
        uint256 creatorPublicKeyId;                 // must be key in 'publicKeysById'
        uint256 acceptanceEncryptionAlgorithmId;    // must be key in 'encryptionAlgorithmsById'
        uint256 resourceSetId;                      // must be key in 'resourceSetsById'
        uint256 agreementSetId;                     // must be key in 'agreementSetsById'
        uint256 tokenTransferSetId;                 // must be key in 'tokenTransferSetsById'
    }

    // When created, the proposal is in the 'Pending' state. All other states are final states, so a proposal may change
    // state exactly one time based on a call to 'withdrawProposal', 'acceptProposal', or 'rejectProposal'.
    enum ProposalState {
        Pending,
        WithdrawnByCreator,
        RejectedByResourceSetCreator,
        AcceptedByResourceSetCreator
    }

    // solium would warn "Constant name 'name' doesn't follow the UPPER_CASE notation", but this public constant is
    // recommended by https://theethereum.wiki/w/index.php/ERC20_Token_Standard, so we'll disable warnings for the line.
    //
    /* solium-disable-next-line */
    string public constant name = "Fysical";

    // solium would warn "Constant name 'symbol' doesn't follow the UPPER_CASE notation", but this public constant is
    // recommended by https://theethereum.wiki/w/index.php/ERC20_Token_Standard, so we'll disable warnings for the line.
    //
    /* solium-disable-next-line */
    string public constant symbol = "FYS";

    // solium would warn "Constant name 'decimals' doesn't follow the UPPER_CASE notation", but this public constant is
    // recommended by https://theethereum.wiki/w/index.php/ERC20_Token_Standard, so we'll disable warnings for the line.
    //
    /* solium-disable-next-line */
    uint8 public constant decimals = 9;

    uint256 public constant ONE_BILLION = 1000000000;
    uint256 public constant ONE_QUINTILLION = 1000000000000000000;

    // See https://en.wikipedia.org/wiki/9,223,372,036,854,775,807
    uint256 public constant MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE = 9223372036854775807;

    uint256 public constant EMPTY_PUBLIC_KEY_ID = 0;
    uint256 public constant NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID = 0;
    uint256 public constant NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID = 0;
    uint256 public constant NULL_ENCRYPTION_ALGORITHM_ID = 0;
    uint256 public constant EMPTY_RESOURCE_SET_ID = 0;

    mapping(uint256 => Uri) internal urisById;
    uint256 internal uriCount = 0;

    mapping(uint256 => UriSet) internal uriSetsById;
    uint256 internal uriSetCount = 0;

    mapping(uint256 => ChecksumAlgorithm) internal checksumAlgorithmsById;
    uint256 internal checksumAlgorithmCount = 0;

    mapping(uint256 => Checksum) internal checksumsById;
    uint256 internal checksumCount = 0;

    mapping(uint256 => EncryptionAlgorithm) internal encryptionAlgorithmsById;
    uint256 internal encryptionAlgorithmCount = 0;

    mapping(uint256 => ChecksumPair) internal checksumPairsById;
    uint256 internal checksumPairCount = 0;

    mapping(uint256 => Resource) internal resourcesById;
    uint256 internal resourceCount = 0;

    mapping(uint256 => PublicKey) internal publicKeysById;
    uint256 internal publicKeyCount = 0;

    mapping(uint256 => ResourceSet) internal resourceSetsById;
    uint256 internal resourceSetCount = 0;

    mapping(uint256 => Agreement) internal agreementsById;
    uint256 internal agreementCount = 0;

    mapping(uint256 => AgreementSet) internal agreementSetsById;
    uint256 internal agreementSetCount = 0;

    mapping(uint256 => TokenTransfer) internal tokenTransfersById;
    uint256 internal tokenTransferCount = 0;

    mapping(uint256 => TokenTransferSet) internal tokenTransferSetsById;
    uint256 internal tokenTransferSetCount = 0;

    mapping(uint256 => Proposal) internal proposalsById;
    uint256 internal proposalCount = 0;

    mapping(uint256 => ProposalState) internal statesByProposalId;

    mapping(uint256 => mapping(uint256 => bytes)) internal encryptedDecryptionKeysByProposalIdAndResourceId;

    mapping(address => mapping(uint256 => bool)) internal checksumPairAssignmentsByCreatorAndResourceId;

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

    function Fysical() public {
        assert(ProposalState(0) == ProposalState.Pending);

        // The total number of Fysical tokens is intended to be one billion, with the ability to express values with
        // nine decimals places of precision. The token values passed in ERC20 functions and operations involving
        // TokenTransfer operations must be counts of nano-Fysical tokens (one billionth of one Fysical token).
        //
        // See the initialization of the total supply in https://theethereum.wiki/w/index.php/ERC20_Token_Standard.

        assert(0 < ONE_BILLION);
        assert(0 < ONE_QUINTILLION);
        assert(MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE > ONE_BILLION);
        assert(MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE > ONE_QUINTILLION);
        assert(ONE_BILLION == uint256(10)**decimals);
        assert(ONE_QUINTILLION == ONE_BILLION.mul(ONE_BILLION));

        totalSupply_ = ONE_QUINTILLION;

        balances[msg.sender] = totalSupply_;

        // From "https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#transfer-1" on 2018-02-08 (commit cea1db05a3444870132ec3cb7dd78a244cba1805):
        //  "A token contract which creates new tokens SHOULD trigger a Transfer event with the _from address set to 0x0 when tokens are created."
        Transfer(0x0, msg.sender, balances[msg.sender]);

        // This mimics the behavior of the 'createPublicKey' external function.
        assert(EMPTY_PUBLIC_KEY_ID == publicKeyCount);
        publicKeysById[EMPTY_PUBLIC_KEY_ID] = PublicKey(new bytes(0));
        publicKeyCount = publicKeyCount.add(1);
        assert(1 == publicKeyCount);

        // This mimics the behavior of the 'createUri' external function.
        assert(NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID == uriCount);
        urisById[NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID] = Uri("https://en.wikipedia.org/wiki/Null_encryption");
        uriCount = uriCount.add(1);
        assert(1 == uriCount);

        // This mimics the behavior of the 'createUriSet' external function.
        assert(NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID == uriSetCount);
        uint256[] memory uniqueIdsSortedAscending = new uint256[](1);
        uniqueIdsSortedAscending[0] = NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID;
        validateIdSet(uniqueIdsSortedAscending, uriCount);
        uriSetsById[NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID] = UriSet(uniqueIdsSortedAscending);
        uriSetCount = uriSetCount.add(1);
        assert(1 == uriSetCount);

        // This mimics the behavior of the 'createEncryptionAlgorithm' external function.
        assert(NULL_ENCRYPTION_ALGORITHM_ID == encryptionAlgorithmCount);
        encryptionAlgorithmsById[NULL_ENCRYPTION_ALGORITHM_ID] = EncryptionAlgorithm(NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID);
        encryptionAlgorithmCount = encryptionAlgorithmCount.add(1);
        assert(1 == encryptionAlgorithmCount);

        // This mimics the behavior of the 'createResourceSet' external function, but allows for a self-reference in
        // the assignment of the 'metaResourceSetId' member, which the function would prohibit.
        assert(EMPTY_RESOURCE_SET_ID == resourceSetCount);
        resourceSetsById[EMPTY_RESOURCE_SET_ID] = ResourceSet(
            msg.sender,
            EMPTY_PUBLIC_KEY_ID,
            NULL_ENCRYPTION_ALGORITHM_ID,
            new uint256[](0),
            EMPTY_RESOURCE_SET_ID
        );
        resourceSetCount = resourceSetCount.add(1);
        assert(1 == resourceSetCount);
    }

    function getUriCount() external view returns (uint256) {
        return uriCount;
    }

    function getUriById(uint256 id) external view returns (string) {
        require(id < uriCount);

        Uri memory object = urisById[id];
        return object.value;
    }

    function getUriSetCount() external view returns (uint256) {
        return uriSetCount;
    }

    function getUriSetById(uint256 id) external view returns (uint256[]) {
        require(id < uriSetCount);

        UriSet memory object = uriSetsById[id];
        return object.uniqueUriIdsSortedAscending;
    }

    function getChecksumAlgorithmCount() external view returns (uint256) {
        return checksumAlgorithmCount;
    }

    function getChecksumAlgorithmById(uint256 id) external view returns (uint256) {
        require(id < checksumAlgorithmCount);

        ChecksumAlgorithm memory object = checksumAlgorithmsById[id];
        return object.descriptionUriSetId;
    }

    function getChecksumCount() external view returns (uint256) {
        return checksumCount;
    }

    function getChecksumById(uint256 id) external view returns (uint256, uint256, bytes) {
        require(id < checksumCount);

        Checksum memory object = checksumsById[id];
        return (object.algorithmId, object.resourceByteCount, object.value);
    }

    function getEncryptionAlgorithmCount() external view returns (uint256) {
        return encryptionAlgorithmCount;
    }

    function getEncryptionAlgorithmById(uint256 id) external view returns (uint256) {
        require(id < encryptionAlgorithmCount);

        EncryptionAlgorithm memory object = encryptionAlgorithmsById[id];
        return object.descriptionUriSetId;
    }

    function getChecksumPairCount() external view returns (uint256) {
        return checksumPairCount;
    }

    function getChecksumPairById(uint256 id) external view returns (uint256, uint256) {
        require(id < checksumPairCount);

        ChecksumPair memory object = checksumPairsById[id];
        return (object.encryptedChecksumId, object.decryptedChecksumId);
    }

    function getResourceCount() external view returns (uint256) {
        return resourceCount;
    }

    function getResourceById(uint256 id) external view returns (uint256, uint256, uint256) {
        require(id < resourceCount);

        Resource memory object = resourcesById[id];
        return (object.uriSetId, object.encryptionAlgorithmId, object.metaResourceSetId);
    }

    function getPublicKeyCount() external view returns (uint256) {
        return publicKeyCount;
    }

    function getPublicKeyById(uint256 id) external view returns (bytes) {
        require(id < publicKeyCount);

        PublicKey memory object = publicKeysById[id];
        return object.value;
    }

    function getResourceSetCount() external view returns (uint256) {
        return resourceSetCount;
    }

    function getResourceSetById(uint256 id) external view returns (address, uint256, uint256, uint256[], uint256) {
        require(id < resourceSetCount);

        ResourceSet memory object = resourceSetsById[id];
        return (object.creator, object.creatorPublicKeyId, object.proposalEncryptionAlgorithmId, object.uniqueResourceIdsSortedAscending, object.metaResourceSetId);
    }

    function getAgreementCount() external view returns (uint256) {
        return agreementCount;
    }

    function getAgreementById(uint256 id) external view returns (uint256, uint256) {
        require(id < agreementCount);

        Agreement memory object = agreementsById[id];
        return (object.uriSetId, object.checksumPairId);
    }

    function getAgreementSetCount() external view returns (uint256) {
        return agreementSetCount;
    }

    function getAgreementSetById(uint256 id) external view returns (uint256[]) {
        require(id < agreementSetCount);

        AgreementSet memory object = agreementSetsById[id];
        return object.uniqueAgreementIdsSortedAscending;
    }

    function getTokenTransferCount() external view returns (uint256) {
        return tokenTransferCount;
    }

    function getTokenTransferById(uint256 id) external view returns (address, address, uint256) {
        require(id < tokenTransferCount);

        TokenTransfer memory object = tokenTransfersById[id];
        return (object.source, object.destination, object.tokenCount);
    }

    function getTokenTransferSetCount() external view returns (uint256) {
        return tokenTransferSetCount;
    }

    function getTokenTransferSetById(uint256 id) external view returns (uint256[]) {
        require(id < tokenTransferSetCount);

        TokenTransferSet memory object = tokenTransferSetsById[id];
        return object.uniqueTokenTransferIdsSortedAscending;
    }

    function getProposalCount() external view returns (uint256) {
        return proposalCount;
    }

    function getProposalById(uint256 id) external view returns (uint256, address, uint256, uint256, uint256, uint256, uint256) {
        require(id < proposalCount);

        Proposal memory object = proposalsById[id];
        return (object.minimumBlockNumberForWithdrawal, object.creator, object.creatorPublicKeyId, object.acceptanceEncryptionAlgorithmId, object.resourceSetId, object.agreementSetId, object.tokenTransferSetId);
    }

    function getStateByProposalId(uint256 proposalId) external view returns (ProposalState) {
        require(proposalId < proposalCount);

        return statesByProposalId[proposalId];
    }

    // Check to see if an Ethereum account has assigned a checksum for a particular resource.
    function hasAddressAssignedResourceChecksumPair(address address_, uint256 resourceId) external view returns (bool) {
        require(resourceId < resourceCount);

        return checksumPairAssignmentsByCreatorAndResourceId[address_][resourceId];
    }

    // Retrieve the checksum assigned assigned to particular resource
    function getChecksumPairIdByAssignerAndResourceId(address assigner, uint256 resourceId) external view returns (uint256) {
        require(resourceId < resourceCount);
        require(checksumPairAssignmentsByCreatorAndResourceId[assigner][resourceId]);

        return checksumPairIdsByCreatorAndResourceId[assigner][resourceId];
    }

    // Retrieve the encrypted key to decrypt a resource referenced by an accepted proposal.
    function getEncryptedResourceDecryptionKey(uint256 proposalId, uint256 resourceId) external view returns (bytes) {
        require(proposalId < proposalCount);
        require(ProposalState.AcceptedByResourceSetCreator == statesByProposalId[proposalId]);
        require(resourceId < resourceCount);

        uint256[] memory validResourceIds = resourceSetsById[proposalsById[proposalId].resourceSetId].uniqueResourceIdsSortedAscending;
        require(0 < validResourceIds.length);

        if (1 == validResourceIds.length) {
            require(resourceId == validResourceIds[0]);

        } else {
            uint256 lowIndex = 0;
            uint256 highIndex = validResourceIds.length.sub(1);
            uint256 middleIndex = lowIndex.add(highIndex).div(2);

            while (resourceId != validResourceIds[middleIndex]) {
                require(lowIndex <= highIndex);

                if (validResourceIds[middleIndex] < resourceId) {
                    lowIndex = middleIndex.add(1);
                } else {
                    highIndex = middleIndex.sub(1);
                }

                middleIndex = lowIndex.add(highIndex).div(2);
            }
        }

        return encryptedDecryptionKeysByProposalIdAndResourceId[proposalId][resourceId];
    }

    function createUri(
        string value
    ) external returns (uint256)
    {
        require(0 < bytes(value).length);

        uint256 id = uriCount;
        uriCount = id.add(1);
        urisById[id] = Uri(
            value
        );

        return id;
    }

    function createUriSet(
        uint256[] uniqueUriIdsSortedAscending
    ) external returns (uint256)
    {
        validateIdSet(uniqueUriIdsSortedAscending, uriCount);

        uint256 id = uriSetCount;
        uriSetCount = id.add(1);
        uriSetsById[id] = UriSet(
            uniqueUriIdsSortedAscending
        );

        return id;
    }

    function createChecksumAlgorithm(
        uint256 descriptionUriSetId
    ) external returns (uint256)
    {
        require(descriptionUriSetId < uriSetCount);

        uint256 id = checksumAlgorithmCount;
        checksumAlgorithmCount = id.add(1);
        checksumAlgorithmsById[id] = ChecksumAlgorithm(
            descriptionUriSetId
        );

        return id;
    }

    function createChecksum(
        uint256 algorithmId,
        uint256 resourceByteCount,
        bytes value
    ) external returns (uint256)
    {
        require(algorithmId < checksumAlgorithmCount);
        require(0 < resourceByteCount);

        uint256 id = checksumCount;
        checksumCount = id.add(1);
        checksumsById[id] = Checksum(
            algorithmId,
            resourceByteCount,
            value
        );

        return id;
    }

    function createEncryptionAlgorithm(
        uint256 descriptionUriSetId
    ) external returns (uint256)
    {
        require(descriptionUriSetId < uriSetCount);

        uint256 id = encryptionAlgorithmCount;
        encryptionAlgorithmCount = id.add(1);
        encryptionAlgorithmsById[id] = EncryptionAlgorithm(
            descriptionUriSetId
        );

        return id;
    }

    function createChecksumPair(
        uint256 encryptedChecksumId,
        uint256 decryptedChecksumId
    ) external returns (uint256)
    {
        require(encryptedChecksumId < checksumCount);
        require(decryptedChecksumId < checksumCount);

        uint256 id = checksumPairCount;
        checksumPairCount = id.add(1);
        checksumPairsById[id] = ChecksumPair(
            encryptedChecksumId,
            decryptedChecksumId
        );

        return id;
    }

    function createResource(
        uint256 uriSetId,
        uint256 encryptionAlgorithmId,
        uint256 metaResourceSetId
    ) external returns (uint256)
    {
        require(uriSetId < uriSetCount);
        require(encryptionAlgorithmId < encryptionAlgorithmCount);
        require(metaResourceSetId < resourceSetCount);

        uint256 id = resourceCount;
        resourceCount = id.add(1);
        resourcesById[id] = Resource(
            uriSetId,
            encryptionAlgorithmId,
            metaResourceSetId
        );

        return id;
    }

    function createPublicKey(
        bytes value
    ) external returns (uint256)
    {
        uint256 id = publicKeyCount;
        publicKeyCount = id.add(1);
        publicKeysById[id] = PublicKey(
            value
        );

        return id;
    }

    function createResourceSet(
        uint256 creatorPublicKeyId,
        uint256 proposalEncryptionAlgorithmId,
        uint256[] uniqueResourceIdsSortedAscending,
        uint256 metaResourceSetId
    ) external returns (uint256)
    {
        require(creatorPublicKeyId < publicKeyCount);
        require(proposalEncryptionAlgorithmId < encryptionAlgorithmCount);
        validateIdSet(uniqueResourceIdsSortedAscending, resourceCount);
        require(metaResourceSetId < resourceSetCount);

        uint256 id = resourceSetCount;
        resourceSetCount = id.add(1);
        resourceSetsById[id] = ResourceSet(
            msg.sender,
            creatorPublicKeyId,
            proposalEncryptionAlgorithmId,
            uniqueResourceIdsSortedAscending,
            metaResourceSetId
        );

        return id;
    }

    function createAgreement(
        uint256 uriSetId,
        uint256 checksumPairId
    ) external returns (uint256)
    {
        require(uriSetId < uriSetCount);
        require(checksumPairId < checksumPairCount);

        uint256 id = agreementCount;
        agreementCount = id.add(1);
        agreementsById[id] = Agreement(
            uriSetId,
            checksumPairId
        );

        return id;
    }

    function createAgreementSet(
        uint256[] uniqueAgreementIdsSortedAscending
    ) external returns (uint256)
    {
        validateIdSet(uniqueAgreementIdsSortedAscending, agreementCount);

        uint256 id = agreementSetCount;
        agreementSetCount = id.add(1);
        agreementSetsById[id] = AgreementSet(
            uniqueAgreementIdsSortedAscending
        );

        return id;
    }

    function createTokenTransfer(
        address source,
        address destination,
        uint256 tokenCount
    ) external returns (uint256)
    {
        require(address(0) != source);
        require(address(0) != destination);
        require(0 < tokenCount);

        uint256 id = tokenTransferCount;
        tokenTransferCount = id.add(1);
        tokenTransfersById[id] = TokenTransfer(
            source,
            destination,
            tokenCount
        );

        return id;
    }

    function createTokenTransferSet(
        uint256[] uniqueTokenTransferIdsSortedAscending
    ) external returns (uint256)
    {
        validateIdSet(uniqueTokenTransferIdsSortedAscending, tokenTransferCount);

        uint256 id = tokenTransferSetCount;
        tokenTransferSetCount = id.add(1);
        tokenTransferSetsById[id] = TokenTransferSet(
            uniqueTokenTransferIdsSortedAscending
        );

        return id;
    }

    function createProposal(
        uint256 minimumBlockNumberForWithdrawal,
        uint256 creatorPublicKeyId,
        uint256 acceptanceEncryptionAlgorithmId,
        uint256 resourceSetId,
        uint256 agreementSetId,
        uint256 tokenTransferSetId
    ) external returns (uint256)
    {
        require(creatorPublicKeyId < publicKeyCount);
        require(acceptanceEncryptionAlgorithmId < encryptionAlgorithmCount);
        require(resourceSetId < resourceSetCount);
        require(agreementSetId < agreementSetCount);
        require(tokenTransferSetId < tokenTransferSetCount);

        transferTokensToEscrow(msg.sender, tokenTransferSetId);

        uint256 id = proposalCount;
        proposalCount = id.add(1);
        proposalsById[id] = Proposal(
            minimumBlockNumberForWithdrawal,
            msg.sender,
            creatorPublicKeyId,
            acceptanceEncryptionAlgorithmId,
            resourceSetId,
            agreementSetId,
            tokenTransferSetId
        );

        return id;
    }

    // Each Ethereum account may assign a 'ChecksumPair' to a resource exactly once. This ensures that each claim that a
    // checksum should match a resource is attached to a particular authority. This operation is not bound to the
    // creation of the resource because the resource's creator may not know the checksum when creating the resource.
    function assignResourceChecksumPair(
        uint256 resourceId,
        uint256 checksumPairId
    ) external
    {
        require(resourceId < resourceCount);
        require(checksumPairId < checksumPairCount);
        require(false == checksumPairAssignmentsByCreatorAndResourceId[msg.sender][resourceId]);

        checksumPairIdsByCreatorAndResourceId[msg.sender][resourceId] = checksumPairId;
        checksumPairAssignmentsByCreatorAndResourceId[msg.sender][resourceId] = true;
    }

    // This function moves a proposal to a final state of `WithdrawnByCreator' and returns tokens to the sources
    // described by the proposal's transfers.
    function withdrawProposal(
        uint256 proposalId
    ) external
    {
        require(proposalId < proposalCount);
        require(ProposalState.Pending == statesByProposalId[proposalId]);

        Proposal memory proposal = proposalsById[proposalId];
        require(msg.sender == proposal.creator);
        require(block.number >= proposal.minimumBlockNumberForWithdrawal);

        returnTokensFromEscrow(proposal.creator, proposal.tokenTransferSetId);
        statesByProposalId[proposalId] = ProposalState.WithdrawnByCreator;
    }

    // This function moves a proposal to a final state of `RejectedByResourceSetCreator' and returns tokens to the sources
    // described by the proposal's transfers.
    function rejectProposal(
        uint256 proposalId
    ) external
    {
        require(proposalId < proposalCount);
        require(ProposalState.Pending == statesByProposalId[proposalId]);

        Proposal memory proposal = proposalsById[proposalId];
        require(msg.sender == resourceSetsById[proposal.resourceSetId].creator);

        returnTokensFromEscrow(proposal.creator, proposal.tokenTransferSetId);
        statesByProposalId[proposalId] = ProposalState.RejectedByResourceSetCreator;
    }

    // This function moves a proposal to a final state of `RejectedByResourceSetCreator' and sends tokens to the
    // destinations described by the proposal's transfers.
    //
    // The caller should encrypt each decryption key corresponding
    // to each resource in the proposal's resource set first with the public key of the proposal's creator and then with
    // the private key assoicated with the public key referenced in the resource set. The caller should concatenate
    // these encrypted values and pass the resulting byte array as 'concatenatedResourceDecryptionKeys'.
    // The length of each encrypted decryption key should be provided in the 'concatenatedResourceDecryptionKeyLengths'.
    // The index of each value in 'concatenatedResourceDecryptionKeyLengths' must correspond to an index in the resource
    // set referenced by the proposal.
    function acceptProposal(
        uint256 proposalId,
        bytes concatenatedResourceDecryptionKeys,
        uint256[] concatenatedResourceDecryptionKeyLengths
    ) external
    {
        require(proposalId < proposalCount);
        require(ProposalState.Pending == statesByProposalId[proposalId]);

        Proposal memory proposal = proposalsById[proposalId];
        require(msg.sender == resourceSetsById[proposal.resourceSetId].creator);

        storeEncryptedDecryptionKeys(
            proposalId,
            concatenatedResourceDecryptionKeys,
            concatenatedResourceDecryptionKeyLengths
        );

        transferTokensFromEscrow(proposal.tokenTransferSetId);

        statesByProposalId[proposalId] = ProposalState.AcceptedByResourceSetCreator;
    }

    function validateIdSet(uint256[] uniqueIdsSortedAscending, uint256 idCount) private pure {
        if (0 < uniqueIdsSortedAscending.length) {

            uint256 id = uniqueIdsSortedAscending[0];
            require(id < idCount);

            uint256 previousId = id;
            for (uint256 index = 1; index < uniqueIdsSortedAscending.length; index = index.add(1)) {
                id = uniqueIdsSortedAscending[index];
                require(id < idCount);
                require(previousId < id);

                previousId = id;
            }
        }
    }

    function transferTokensToEscrow(address proposalCreator, uint256 tokenTransferSetId) private {
        assert(tokenTransferSetId < tokenTransferSetCount);
        assert(address(0) != proposalCreator);

        uint256[] memory tokenTransferIds = tokenTransferSetsById[tokenTransferSetId].uniqueTokenTransferIdsSortedAscending;
        for (uint256 index = 0; index < tokenTransferIds.length; index = index.add(1)) {
            uint256 tokenTransferId = tokenTransferIds[index];
            assert(tokenTransferId < tokenTransferCount);

            TokenTransfer memory tokenTransfer = tokenTransfersById[tokenTransferId];
            assert(0 < tokenTransfer.tokenCount);
            assert(address(0) != tokenTransfer.source);
            assert(address(0) != tokenTransfer.destination);

            require(tokenTransfer.tokenCount <= balances[tokenTransfer.source]);

            if (tokenTransfer.source != proposalCreator) {
                require(tokenTransfer.tokenCount <= allowed[tokenTransfer.source][proposalCreator]);

                allowed[tokenTransfer.source][proposalCreator] = allowed[tokenTransfer.source][proposalCreator].sub(tokenTransfer.tokenCount);
            }

            balances[tokenTransfer.source] = balances[tokenTransfer.source].sub(tokenTransfer.tokenCount);
            balances[address(0)] = balances[address(0)].add(tokenTransfer.tokenCount);

            Transfer(tokenTransfer.source, address(0), tokenTransfer.tokenCount);
        }
    }

    function returnTokensFromEscrow(address proposalCreator, uint256 tokenTransferSetId) private {
        assert(tokenTransferSetId < tokenTransferSetCount);
        assert(address(0) != proposalCreator);

        uint256[] memory tokenTransferIds = tokenTransferSetsById[tokenTransferSetId].uniqueTokenTransferIdsSortedAscending;
        for (uint256 index = 0; index < tokenTransferIds.length; index = index.add(1)) {
            uint256 tokenTransferId = tokenTransferIds[index];
            assert(tokenTransferId < tokenTransferCount);

            TokenTransfer memory tokenTransfer = tokenTransfersById[tokenTransferId];
            assert(0 < tokenTransfer.tokenCount);
            assert(address(0) != tokenTransfer.source);
            assert(address(0) != tokenTransfer.destination);
            assert(tokenTransfer.tokenCount <= balances[address(0)]);

            balances[tokenTransfer.source] = balances[tokenTransfer.source].add(tokenTransfer.tokenCount);
            balances[address(0)] = balances[address(0)].sub(tokenTransfer.tokenCount);

            Transfer(address(0), tokenTransfer.source, tokenTransfer.tokenCount);
        }
    }

    function transferTokensFromEscrow(uint256 tokenTransferSetId) private {
        assert(tokenTransferSetId < tokenTransferSetCount);

        uint256[] memory tokenTransferIds = tokenTransferSetsById[tokenTransferSetId].uniqueTokenTransferIdsSortedAscending;
        for (uint256 index = 0; index < tokenTransferIds.length; index = index.add(1)) {
            uint256 tokenTransferId = tokenTransferIds[index];
            assert(tokenTransferId < tokenTransferCount);

            TokenTransfer memory tokenTransfer = tokenTransfersById[tokenTransferId];
            assert(0 < tokenTransfer.tokenCount);
            assert(address(0) != tokenTransfer.source);
            assert(address(0) != tokenTransfer.destination);

            balances[address(0)] = balances[address(0)].sub(tokenTransfer.tokenCount);
            balances[tokenTransfer.destination] = balances[tokenTransfer.destination].add(tokenTransfer.tokenCount);
            Transfer(address(0), tokenTransfer.destination, tokenTransfer.tokenCount);
        }
    }

    function storeEncryptedDecryptionKeys(
        uint256 proposalId,
        bytes concatenatedEncryptedResourceDecryptionKeys,
        uint256[] encryptedResourceDecryptionKeyLengths
    ) private
    {
        assert(proposalId < proposalCount);

        uint256 resourceSetId = proposalsById[proposalId].resourceSetId;
        assert(resourceSetId < resourceSetCount);

        ResourceSet memory resourceSet = resourceSetsById[resourceSetId];
        require(resourceSet.uniqueResourceIdsSortedAscending.length == encryptedResourceDecryptionKeyLengths.length);

        uint256 concatenatedEncryptedResourceDecryptionKeysIndex = 0;
        for (uint256 resourceIndex = 0; resourceIndex < encryptedResourceDecryptionKeyLengths.length; resourceIndex = resourceIndex.add(1)) {
            bytes memory encryptedResourceDecryptionKey = new bytes(encryptedResourceDecryptionKeyLengths[resourceIndex]);
            require(0 < encryptedResourceDecryptionKey.length);

            for (uint256 encryptedResourceDecryptionKeyIndex = 0; encryptedResourceDecryptionKeyIndex < encryptedResourceDecryptionKey.length; encryptedResourceDecryptionKeyIndex = encryptedResourceDecryptionKeyIndex.add(1)) {
                require(concatenatedEncryptedResourceDecryptionKeysIndex < concatenatedEncryptedResourceDecryptionKeys.length);
                encryptedResourceDecryptionKey[encryptedResourceDecryptionKeyIndex] = concatenatedEncryptedResourceDecryptionKeys[concatenatedEncryptedResourceDecryptionKeysIndex];
                concatenatedEncryptedResourceDecryptionKeysIndex = concatenatedEncryptedResourceDecryptionKeysIndex.add(1);
            }

            uint256 resourceId = resourceSet.uniqueResourceIdsSortedAscending[resourceIndex];
            assert(resourceId < resourceCount);

            encryptedDecryptionKeysByProposalIdAndResourceId[proposalId][resourceId] = encryptedResourceDecryptionKey;
        }

        require(concatenatedEncryptedResourceDecryptionKeysIndex == concatenatedEncryptedResourceDecryptionKeys.length);
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"getAgreementCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"source","type":"address"},{"name":"destination","type":"address"},{"name":"tokenCount","type":"uint256"}],"name":"createTokenTransfer","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getUriCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uniqueAgreementIdsSortedAscending","type":"uint256[]"}],"name":"createAgreementSet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getEncryptionAlgorithmCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getAgreementSetById","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPublicKeyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uniqueTokenTransferIdsSortedAscending","type":"uint256[]"}],"name":"createTokenTransferSet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAgreementSetCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTokenTransferSetCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getResourceSetCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NULL_ENCRYPTION_ALGORITHM_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getChecksumPairById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"minimumBlockNumberForWithdrawal","type":"uint256"},{"name":"creatorPublicKeyId","type":"uint256"},{"name":"acceptanceEncryptionAlgorithmId","type":"uint256"},{"name":"resourceSetId","type":"uint256"},{"name":"agreementSetId","type":"uint256"},{"name":"tokenTransferSetId","type":"uint256"}],"name":"createProposal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getProposalById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"uint256"},{"name":"resourceId","type":"uint256"}],"name":"getEncryptedResourceDecryptionKey","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uriSetId","type":"uint256"},{"name":"checksumPairId","type":"uint256"}],"name":"createAgreement","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getChecksumAlgorithmCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getTokenTransferSetById","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"encryptedChecksumId","type":"uint256"},{"name":"decryptedChecksumId","type":"uint256"}],"name":"createChecksumPair","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getChecksumCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getAgreementById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONE_BILLION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EMPTY_RESOURCE_SET_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getChecksumAlgorithmById","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"algorithmId","type":"uint256"},{"name":"resourceByteCount","type":"uint256"},{"name":"value","type":"bytes"}],"name":"createChecksum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uriSetId","type":"uint256"},{"name":"encryptionAlgorithmId","type":"uint256"},{"name":"metaResourceSetId","type":"uint256"}],"name":"createResource","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"uint256"}],"name":"getStateByProposalId","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"descriptionUriSetId","type":"uint256"}],"name":"createEncryptionAlgorithm","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getUriById","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getUriSetById","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getTokenTransferById","outputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getResourceSetById","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256[]"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uniqueUriIdsSortedAscending","type":"uint256[]"}],"name":"createUriSet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"descriptionUriSetId","type":"uint256"}],"name":"createChecksumAlgorithm","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getEncryptionAlgorithmById","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getResourceCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bytes"}],"name":"createPublicKey","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getUriSetCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONE_QUINTILLION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"uint256"}],"name":"rejectProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getChecksumById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getProposalCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"address_","type":"address"},{"name":"resourceId","type":"uint256"}],"name":"hasAddressAssignedResourceChecksumPair","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getResourceById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"createUri","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"assigner","type":"address"},{"name":"resourceId","type":"uint256"}],"name":"getChecksumPairIdByAssignerAndResourceId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getChecksumPairCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getPublicKeyById","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"uint256"}],"name":"withdrawProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"EMPTY_PUBLIC_KEY_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"creatorPublicKeyId","type":"uint256"},{"name":"proposalEncryptionAlgorithmId","type":"uint256"},{"name":"uniqueResourceIdsSortedAscending","type":"uint256[]"},{"name":"metaResourceSetId","type":"uint256"}],"name":"createResourceSet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"resourceId","type":"uint256"},{"name":"checksumPairId","type":"uint256"}],"name":"assignResourceChecksumPair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"uint256"},{"name":"concatenatedResourceDecryptionKeys","type":"bytes"},{"name":"concatenatedResourceDecryptionKeyLengths","type":"uint256[]"}],"name":"acceptProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTokenTransferCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

  Contract Creation Code Switch To Opcodes View
60606040526000600455600060065560006008556000600a556000600c556000600e55600060105560006012556000601455600060165560006018556000601a556000601c556000601e5534156200005657600080fd5b62000060620005e6565b6200007e633b9aca00806401000000006200390d620004f482021704565b670de0b6b3a7640000146200008f57fe5b670de0b6b3a76400006001819055600160a060020a033316600081815260208190526040808220849055919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91905190815260200160405180910390a360125415620000fa57fe5b6020604051908101604052806000604051805910620001165750595b818152601f19601f8301168101602001604052905090526000805260116020527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b78151819080516200016d929160200190620005f8565b50506012546200018e9150600164010000000062002ba56200052e82021704565b60128190556001146200019d57fe5b60045415620001a857fe5b60206040519081016040528060606040519081016040908152602d82527f68747470733a2f2f656e2e77696b6970656469612e6f72672f77696b692f4e756020808401919091527f6c6c5f656e6372797074696f6e0000000000000000000000000000000000000091830191909152915260008052600390527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff81518190805162000258929160200190620005f8565b5050600454620002799150600164010000000062002ba56200052e82021704565b60048190556001146200028857fe5b600654156200029357fe5b6001604051805910620002a35750595b90808252806020026020018201604052509050600081600081518110620002c657fe5b60209081029091010152600454620002ee90829064010000000062002bbb6200053e82021704565b60206040519081016040528181526000805260056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc8151819080516200033c9291602001906200067d565b50506006546200035d9150600164010000000062002ba56200052e82021704565b60068190556001146200036c57fe5b600c54156200037757fe5b602060405190810160405260008082528052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f768151905550600c54620003d290600164010000000062002ba56200052e82021704565b600c819055600114620003e157fe5b60145415620003ec57fe5b60a06040519081016040528033600160a060020a0316815260200160008152602001600081526020016000604051805910620004255750595b81815260209182028101820160405282526000918101829052908052601390527f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6c81518154600160a060020a031916600160a060020a03919091161781556020820151816001015560408201518160020155606082015181600301908051620004b39291602001906200067d565b50608082015160049091015550601454620004de90600164010000000062002ba56200052e82021704565b6014819055600114620004ed57fe5b50620006da565b60008083151562000509576000915062000527565b508282028284828115156200051a57fe5b04146200052357fe5b8091505b5092915050565b6000828201838110156200052357fe5b6000806000845160001015620005df57846000815181106200055c57fe5b9060200190602002015192508383106200057557600080fd5b5081905060015b8451811015620005df578481815181106200059357fe5b906020019060200201519250838310620005ac57600080fd5b828210620005b957600080fd5b829150620005d781600164010000000062002ba56200052e82021704565b90506200057c565b5050505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200063b57805160ff19168380011785556200066b565b828001600101855582156200066b579182015b828111156200066b5782518255916020019190600101906200064e565b5062000679929150620006ba565b5090565b8280548282559060005260206000209081019282156200066b57916020028201828111156200066b5782518255916020019190600101906200064e565b620006d791905b80821115620006795760008155600101620006c1565b90565b6139a480620006ea6000396000f30060606040526004361061032b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416628bed3e811461033057806301c0954b1461035557806302d055311461037d57806306fdde03146103905780630828baa21461041a578063095ea7b3146104385780630f732bdc1461046e578063143c28301461048157806318160ddd146104ea5780631880692f146104fd57806320e190a41461051057806322b6fe9e1461052e57806323b872dd1461054157806327d51979146105695780632a61d47b1461057c5780632be6ec1f1461058f578063313ce567146105a257806334116fd8146105cb57806334f99b59146105f95780633656de211461061e5780633befcd631461067a57806344ce97c914610693578063466c3a2b146106ac5780634dfe165c146106bf5780634e006d83146106d55780635044b112146106ee578063573fb624146107015780635d12fc0c14610717578063650619571461058f578063661884631461072a5780636928e1421461074c5780636d8062ee1461076257806370a08231146107885780637773c36e146107a75780637ad669e9146107c35780637b7179fc146107fd5780637e2d0ebc14610813578063820a5b191461082957806387181b101461083f57806389f90872146108825780638e5653d41461091a57806395d89b4114610938578063970afd9b1461094b578063980619a71461095e5780639bad7720146109745780639f96de0f1461098a578063a75c127b1461099d578063a9059cbb146109bb578063b086d5aa146109dd578063b154dea61461058f578063b663dc0a146109f0578063bc28d87814610a03578063bc824a7714610a1b578063c08cc02d14610ab7578063c18d958214610aca578063c798192214610aec578063cbb9d38514610b26578063d206703514610b44578063d6f22e6914610b66578063d73dd62314610b79578063dd62ed3e14610b9b578063e0db1b9114610bc0578063e1f02ffa14610bd6578063ea32c95e1461058f578063f26be2a814610bec578063f3fbad2514610c15578063fab3ebb11461058f578063feadaa1b14610c2e578063feaf087214610c5c575b600080fd5b341561033b57600080fd5b610343610c6f565b60405190815260200160405180910390f35b341561036057600080fd5b610343600160a060020a0360043581169060243516604435610c76565b341561038857600080fd5b610343610d72565b341561039b57600080fd5b6103a3610d78565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103df5780820151838201526020016103c7565b50505050905090810190601f16801561040c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561042557600080fd5b6103436004803560248101910135610daf565b341561044357600080fd5b61045a600160a060020a0360043516602435610e72565b604051901515815260200160405180910390f35b341561047957600080fd5b610343610ede565b341561048c57600080fd5b610497600435610ee4565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156104d65780820151838201526020016104be565b505050509050019250505060405180910390f35b34156104f557600080fd5b610343610f83565b341561050857600080fd5b610343610f89565b341561051b57600080fd5b6103436004803560248101910135610f8f565b341561053957600080fd5b610343611043565b341561054c57600080fd5b61045a600160a060020a0360043581169060243516604435611049565b341561057457600080fd5b6103436111b7565b341561058757600080fd5b6103436111bd565b341561059a57600080fd5b6103436111c3565b34156105ad57600080fd5b6105b56111c8565b60405160ff909116815260200160405180910390f35b34156105d657600080fd5b6105e16004356111cd565b60405191825260208201526040908101905180910390f35b341561060457600080fd5b61034360043560243560443560643560843560a435611221565b341561062957600080fd5b610634600435611359565b604051968752600160a060020a0390951660208701526040808701949094526060860192909252608085015260a084015260c083019190915260e0909101905180910390f35b341561068557600080fd5b6103a360043560243561141a565b341561069e57600080fd5b6103436004356024356116bc565b34156106b757600080fd5b61034361172f565b34156106ca57600080fd5b610497600435611735565b34156106e057600080fd5b6103436004356024356117d2565b34156106f957600080fd5b610343611845565b341561070c57600080fd5b6105e160043561184b565b341561072257600080fd5b61034361189f565b341561073557600080fd5b61045a600160a060020a03600435166024356118a7565b341561075757600080fd5b6103436004356119a1565b341561076d57600080fd5b610343600480359060248035916044359182019101356119e2565b341561079357600080fd5b610343600160a060020a0360043516611aa9565b34156107b257600080fd5b610343600435602435604435611ac4565b34156107ce57600080fd5b6107d9600435611b57565b604051808260038111156107e957fe5b60ff16815260200191505060405180910390f35b341561080857600080fd5b610343600435611b7e565b341561081e57600080fd5b6103a3600435611bcf565b341561083457600080fd5b610497600435611cae565b341561084a57600080fd5b610855600435611d4b565b604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390f35b341561088d57600080fd5b610898600435611dc6565b6040518086600160a060020a0316600160a060020a0316815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156109025780820151838201526020016108ea565b50505050905001965050505050505060405180910390f35b341561092557600080fd5b6103436004803560248101910135611eda565b341561094357600080fd5b6103a3611f8e565b341561095657600080fd5b610343611fc5565b341561096957600080fd5b610343600435611fd1565b341561097f57600080fd5b610343600435612022565b341561099557600080fd5b610343612063565b34156109a857600080fd5b6103436004803560248101910135612069565b34156109c657600080fd5b61045a600160a060020a03600435166024356120e4565b34156109e857600080fd5b6103436121e4565b34156109fb57600080fd5b6103436121ea565b3415610a0e57600080fd5b610a196004356121f6565b005b3415610a2657600080fd5b610a31600435612304565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610a7a578082015183820152602001610a62565b50505050905090810190601f168015610aa75780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3415610ac257600080fd5b610343612416565b3415610ad557600080fd5b61045a600160a060020a036004351660243561241c565b3415610af757600080fd5b610b02600435612459565b60405180848152602001838152602001828152602001935050505060405180910390f35b3415610b3157600080fd5b61034360048035602481019101356124c8565b3415610b4f57600080fd5b610343600160a060020a0360043516602435612550565b3415610b7157600080fd5b6103436125bc565b3415610b8457600080fd5b61045a600160a060020a03600435166024356125c2565b3415610ba657600080fd5b610343600160a060020a0360043581169060243516612666565b3415610bcb57600080fd5b6103a3600435612691565b3415610be157600080fd5b610a19600435612738565b3415610bf757600080fd5b61034360048035906024803591604435918201910135606435612841565b3415610c2057600080fd5b610a1960043560243561299f565b3415610c3957600080fd5b610a19600480359060248035808201929081013591604435908101910135612a32565b3415610c6757600080fd5b610343612b9f565b6016545b90565b600080600160a060020a0385161515610c8e57600080fd5b600160a060020a0384161515610ca357600080fd5b6000839010610cb157600080fd5b50601a54610cc681600163ffffffff612ba516565b601a5560606040519081016040908152600160a060020a038088168352861660208084019190915281830186905260008481526019909152208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015160018201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560408201516002909101555090509392505050565b60045490565b60408051908101604052600781527f4679736963616c00000000000000000000000000000000000000000000000000602082015281565b600080610dec84848080602002602001604051908101604052809392919081815260200183836020028082843750506016549350612bbb92505050565b50601854610e0181600163ffffffff612ba516565b601855602060405190810160405280858580806020026020016040519081016040528093929190818152602001838360200280828437505050929093525050506000828152601760205260409020815181908051610e6392916020019061370f565b509050508091505b5092915050565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b600c5490565b610eec61375a565b610ef461376c565b6018548310610f0257600080fd5b6000838152601760209081526040918290209151908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015610f6c57602002820191906000526020600020905b815481526020019060010190808311610f58575b505050505081525050905080600001519392505050565b60015490565b60125490565b600080610fcc8484808060200260200160405190810160405280939291908181526020018383602002808284375050601a549350612bbb92505050565b50601c54610fe181600163ffffffff612ba516565b601c55602060405190810160405280858580806020026020016040519081016040528093929190818152602001838360200280828437505050929093525050506000828152601b60205260409020815181908051610e6392916020019061370f565b60185490565b6000600160a060020a038316151561106057600080fd5b600160a060020a03841660009081526020819052604090205482111561108557600080fd5b600160a060020a03808516600090815260026020908152604080832033909416835292905220548211156110b857600080fd5b600160a060020a0384166000908152602081905260409020546110e1908363ffffffff612c5116565b600160a060020a038086166000908152602081905260408082209390935590851681522054611116908363ffffffff612ba516565b600160a060020a038085166000908152602081815260408083209490945587831682526002815283822033909316825291909152205461115c908363ffffffff612c5116565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516916000805160206139398339815191529085905190815260200160405180910390a35060019392505050565b601c5490565b60145490565b600081565b600981565b6000806111d8613785565b600e5484106111e657600080fd5b6000848152600d6020526040908190209080519081016040528154815260019091015460208201529050805181602001519250925050915091565b6000806012548710151561123457600080fd5b600c54861061124257600080fd5b601454851061125057600080fd5b601854841061125e57600080fd5b601c54831061126c57600080fd5b6112763384612c63565b50601e5461128b81600163ffffffff612ba516565b601e5560e06040519081016040528089815260200133600160a060020a0316815260200188815260200187815260200186815260200185815260200184815250601d600083815260200190815260200160002060008201518155602082015160018201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201516006909101555090509695505050505050565b600080600080600080600061136c61379c565b601e54891061137a57600080fd5b6000898152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a031660208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460c08201529050805181602001518260400151836060015184608001518560a001518660c00151959f949e50929c50909a509850965090945092505050565b61142261375a565b61142a61375a565b6000806000601e548710151561143f57600080fd5b6000878152601f602052604090205460ff16600381111561145c57fe5b60031461146857600080fd5b601054861061147657600080fd5b6000878152601d6020908152604080832060040154835260138252918290206003018054909290918281020190519081016040528092919081815260200182805480156114e257602002820191906000526020600020905b8154815260200190600101908083116114ce575b5050505050935083516000106114f757600080fd5b835160011415611528578360008151811061150e57fe5b90602001906020020151861461152357600080fd5b6115f3565b6000925061153f600185519063ffffffff612c5116565b91506115626002611556858563ffffffff612ba516565b9063ffffffff612fb816565b90505b83818151811061157157fe5b9060200190602002015186146115f3578183111561158e57600080fd5b8584828151811061159b57fe5b9060200190602002015110156115c3576115bc81600163ffffffff612ba516565b92506115d7565b6115d481600163ffffffff612c5116565b91505b6115ec6002611556858563ffffffff612ba516565b9050611565565b6020600088815260200190815260200160002060008781526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ab5780601f10611680576101008083540402835291602001916116ab565b820191906000526020600020905b81548152906001019060200180831161168e57829003601f168201915b505050505094505050505092915050565b600080600654841015156116cf57600080fd5b600e5483106116dd57600080fd5b506016546116f281600163ffffffff612ba516565b6016556040805190810160409081528582526020808301869052600084815260159091522081518155602082015160019091015550905092915050565b60085490565b61173d61375a565b61174561376c565b601c54831061175357600080fd5b6000838152601b60209081526040918290209151908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015610f6c5760200282019190600052602060002090815481526020019060010190808311610f5857505050505081525050905080600001519392505050565b600080600a54841015156117e557600080fd5b600a5483106117f357600080fd5b50600e5461180881600163ffffffff612ba516565b600e5560408051908101604090815285825260208083018690526000848152600d9091522081518155602082015160019091015550905092915050565b600a5490565b600080611856613785565b601654841061186457600080fd5b600084815260156020526040908190209080519081016040528154815260019091015460208201529050805181602001519250925050915091565b633b9aca0081565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561190457600160a060020a03338116600090815260026020908152604080832093881683529290529081205561193b565b611914818463ffffffff612c5116565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b60006119ab61375a565b60085483106119b957600080fd5b600083815260076020908152604091829020915190810160405290548152905080519392505050565b600080600854861015156119f557600080fd5b6000859010611a0357600080fd5b50600a54611a1881600163ffffffff612ba516565b600a5560606040519081016040528087815260200186815260200185858080601f01602080910402602001604051908101604052818152929190602084018383808284375050509290935250505060008281526009602052604090208151815560208201518160010155604082015181600201908051611a9c9291602001906137e3565b5091979650505050505050565b600160a060020a031660009081526020819052604090205490565b60008060065485101515611ad757600080fd5b600c548410611ae557600080fd5b6014548310611af357600080fd5b50601054611b0881600163ffffffff612ba516565b6010556060604051908101604090815286825260208083018790528183018690526000848152600f90915220815181556020820151816001015560408201516002909101555090509392505050565b601e546000908210611b6857600080fd5b506000908152601f602052604090205460ff1690565b60008060065483101515611b9157600080fd5b50600c54611ba681600163ffffffff612ba516565b600c55602060405190810160409081528482526000838152600b60205220815190555092915050565b611bd761375a565b611bdf61376c565b6004548310611bed57600080fd5b60008381526003602090815260409182902091519081016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6c5780601f10611c7657610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311611c8457505050919092525091925082915050519392505050565b611cb661375a565b611cbe61376c565b6006548310611ccc57600080fd5b6000838152600560209081526040918290209151908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015610f6c5760200282019190600052602060002090815481526020019060010190808311610f5857505050505081525050905080600001519392505050565b6000806000611d58613850565b601a548510611d6657600080fd5b60008581526019602052604090819020906060905190810160409081528254600160a060020a0390811683526001840154166020830152600290920154918101919091529050805181602001518260400151935093509350509193909250565b6000806000611dd361375a565b6000611ddd613870565b6014548710611deb57600080fd5b600087815260136020526040908190209060a0905190810160405290816000820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a03168152602001600182015481526020016002820154815260200160038201805480602002602001604051908101604052809291908181526020018280548015611e9957602002820191906000526020600020905b815481526020019060010190808311611e85575b50505050508152602001600482015481525050905080600001518160200151826040015183606001518460800151939b929a50909850965090945092505050565b600080611f1784848080602002602001604051908101604052809392919081815260200183836020028082843750506004549350612bbb92505050565b50600654611f2c81600163ffffffff612ba516565b600655602060405190810160405280858580806020026020016040519081016040528093929190818152602001838360200280828437505050929093525050506000828152600560205260409020815181908051610e6392916020019061370f565b60408051908101604052600381527f4659530000000000000000000000000000000000000000000000000000000000602082015281565b677fffffffffffffff81565b60008060065483101515611fe457600080fd5b50600854611ff981600163ffffffff612ba516565b600855602060405190810160409081528482526000838152600760205220815190555092915050565b600061202c61375a565b600c54831061203a57600080fd5b6000838152600b6020908152604091829020915190810160405290548152905080519392505050565b60105490565b60125460009061208081600163ffffffff612ba516565b60125560206040519081016040528085858080601f0160208091040260200160405190810160405281815292919060208401838380828437505050929093525050506000828152601160205260409020815181908051610e639291602001906137e3565b6000600160a060020a03831615156120fb57600080fd5b600160a060020a03331660009081526020819052604090205482111561212057600080fd5b600160a060020a033316600090815260208190526040902054612149908363ffffffff612c5116565b600160a060020a03338116600090815260208190526040808220939093559085168152205461217e908363ffffffff612ba516565b60008085600160a060020a0316600160a060020a031681526020019081526020016000208190555082600160a060020a031633600160a060020a03166000805160206139398339815191528460405190815260200160405180910390a350600192915050565b60065490565b670de0b6b3a764000081565b6121fe61379c565b601e54821061220c57600080fd5b6000828152601f602052604090205460ff16600381111561222957fe5b1561223357600080fd5b6000828152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a0316602083015260028301549082015260038201546060820152600482015460808201908152600583015460a083015260069092015460c0820152915060139060009051815260208101919091526040016000205433600160a060020a039081169116146122cd57600080fd5b6122df81602001518260c00151612fcf565b6000828152601f6020526040902080546002919060ff19166001835b02179055505050565b60008061230f61375a565b6123176138af565b600a54851061232557600080fd5b60008581526009602052604090819020906060905190810160405290816000820154815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123ee5780601f106123c3576101008083540402835291602001916123ee565b820191906000526020600020905b8154815290600101906020018083116123d157829003601f168201915b5050505050815250509050806000015181602001518260400151919790965090945092505050565b601e5490565b601054600090821061242d57600080fd5b50600160a060020a03919091166000908152602160209081526040808320938352929052205460ff1690565b60008060006124666138d1565b601054851061247457600080fd5b6000858152600f602052604090819020906060905190810160409081528254825260018301546020830152600290920154918101919091529050805181602001518260400151935093509350509193909250565b6000808281106124d757600080fd5b506004546124ec81600163ffffffff612ba516565b60045560206040519081016040528085858080601f0160208091040260200160405190810160405281815292919060208401838380828437505050929093525050506000828152600360205260409020815181908051610e639291602001906137e3565b601054600090821061256157600080fd5b600160a060020a038316600090815260216020908152604080832085845290915290205460ff16151561259357600080fd5b50600160a060020a03919091166000908152602260209081526040808320938352929052205490565b600e5490565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120546125fa908363ffffffff612ba516565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b61269961375a565b6126a161376c565b60125483106126af57600080fd5b60008381526011602090815260409182902091519081016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6c5780601f10611c7657610100808354040283529160200191610f6c565b61274061379c565b601e54821061274e57600080fd5b6000828152601f602052604090205460ff16600381111561276b57fe5b1561277557600080fd5b6000828152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a0316602083019081526002840154918301919091526003830154606083015260048301546080830152600583015460a083015260069092015460c0820152915051600160a060020a031633600160a060020a031614151561280257600080fd5b805143101561281057600080fd5b61282281602001518260c00151612fcf565b6000828152601f6020526040902080546001919060ff191682806122fb565b6000806012548710151561285457600080fd5b600c54861061286257600080fd5b61289c85858080602002602001604051908101604052809392919081815260200183836020028082843750506010549350612bbb92505050565b60145483106128aa57600080fd5b506014546128bf81600163ffffffff612ba516565b60145560a06040519081016040528033600160a060020a03168152602001888152602001878152602001868680806020026020016040519081016040528093929190818152602001838360200280828437505050928452505050602090810185905260008381526013909152604090208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015181600101556040820151816002015560608201518160030190805161298792916020019061370f565b50608082015160049091015550905095945050505050565b60105482106129ad57600080fd5b600e5481106129bb57600080fd5b600160a060020a033316600090815260216020908152604080832085845290915290205460ff16156129ec57600080fd5b600160a060020a0333166000818152602260209081526040808320868452825280832094909455918152602182528281209381529290529020805460ff19166001179055565b612a3a61379c565b601e548610612a4857600080fd5b6000868152601f602052604090205460ff166003811115612a6557fe5b15612a6f57600080fd5b6000868152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a0316602083015260028301549082015260038201546060820152600482015460808201908152600583015460a083015260069092015460c0820152915060139060009051815260208101919091526040016000205433600160a060020a03908116911614612b0957600080fd5b612b728686868080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050508585808060200260200160405190810160405280939291908181526020018383602002808284375061321f945050505050565b612b7f8160c001516134ed565b50505060009283525050601f60205260409020805460ff19166003179055565b601a5490565b600082820183811015612bb457fe5b9392505050565b6000806000845160001015612c4a5784600081518110612bd757fe5b906020019060200201519250838310612bef57600080fd5b5081905060015b8451811015612c4a57848181518110612c0b57fe5b906020019060200201519250838310612c2357600080fd5b828210612c2f57600080fd5b829150612c4381600163ffffffff612ba516565b9050612bf6565b5050505050565b600082821115612c5d57fe5b50900390565b612c6b61375a565b600080612c76613850565b601c548510612c8157fe5b600160a060020a0386161515612c9357fe5b601b6000868152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015612cf357602002820191906000526020600020905b815481526020019060010190808311612cdf575b50505050509350600092505b8351831015612fb057838381518110612d1457fe5b90602001906020020151601a549092508210612d2c57fe5b60008281526019602052604090819020906060905190810160409081528254600160a060020a0390811683526001840154166020830152600290920154918101918252915051600010612d7b57fe5b8051600160a060020a03161515612d8e57fe5b8060200151600160a060020a03161515612da457fe5b6000808251600160a060020a0316600160a060020a031681526020019081526020016000205481604001511115612dda57600080fd5b600160a060020a0386168151600160a060020a031614612ec357600260008251600160a060020a0316600160a060020a03168152602001908152602001600020600087600160a060020a0316600160a060020a031681526020019081526020016000205481604001511115612e4e57600080fd5b612e928160400151600260008451600160a060020a03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff612c5116565b600260008351600160a060020a03908116825260208083019390935260409182016000908120918b16815292529020555b612ef681604001516000808451600160a060020a031681526020810191909152604001600020549063ffffffff612c5116565b6000808351600160a060020a0316600160a060020a0316815260200190815260200160002081905550612f4b81604001516000808052602052600080516020613959833981519152549063ffffffff612ba516565b60008080526020819052600080516020613959833981519152919091558151600160a060020a0316600080516020613939833981519152836040015160405190815260200160405180910390a3612fa983600163ffffffff612ba516565b9250612cff565b505050505050565b6000808284811515612fc657fe5b04949350505050565b612fd761375a565b600080612fe2613850565b601c548510612fed57fe5b600160a060020a0386161515612fff57fe5b601b600086815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561305f57602002820191906000526020600020905b81548152602001906001019080831161304b575b50505050509350600092505b8351831015612fb05783838151811061308057fe5b90602001906020020151601a54909250821061309857fe5b60008281526019602052604090819020906060905190810160409081528254600160a060020a03908116835260018401541660208301526002909201549181019182529150516000106130e757fe5b8051600160a060020a031615156130fa57fe5b8060200151600160a060020a0316151561311057fe5b6000808052602052600080516020613959833981519152546040820151111561313557fe5b61316881604001516000808451600160a060020a031681526020810191909152604001600020549063ffffffff612ba516565b6000808351600160a060020a0316600160a060020a03168152602001908152602001600020819055506131bd81604001516000808052602052600080516020613959833981519152549063ffffffff612c5116565b6000808052602052600080516020613959833981519152558051600160a060020a03166000600080516020613939833981519152604084015160405190815260200160405180910390a361321883600163ffffffff612ba516565b925061306b565b6000613229613870565b60008061323461375a565b600080601e548a10151561324457fe5b60008a8152601d6020526040902060040154601454909750871061326457fe5b600087815260136020526040908190209060a0905190810160405290816000820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160018201548152602001600282015481526020016003820180548060200260200160405190810160405280929190818152602001828054801561331257602002820191906000526020600020905b8154815260200190600101908083116132fe575b50505050508152602001600482015481525050955087518660600151511461333957600080fd5b60009450600093505b87518410156134d45787848151811061335757fe5b9060200190602002015160405180591061336e5750595b818152601f19601f830116810160200160405290509250825160001061339357600080fd5b600091505b825182101561346b57885185106133ae57600080fd5b8885815181106133ba57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838151811061341057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061345185600163ffffffff612ba516565b945061346482600163ffffffff612ba516565b9150613398565b8560600151848151811061347b57fe5b90602001906020020151601054909150811061349357fe5b60008a81526020808052604080832084845290915290208380516134bb9291602001906137e3565b506134cd84600163ffffffff612ba516565b9350613342565b885185146134e157600080fd5b50505050505050505050565b6134f561375a565b600080613500613850565b601c54851061350b57fe5b601b600086815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561356b57602002820191906000526020600020905b815481526020019060010190808311613557575b50505050509350600092505b8351831015612c4a5783838151811061358c57fe5b90602001906020020151601a5490925082106135a457fe5b60008281526019602052604090819020906060905190810160409081528254600160a060020a03908116835260018401541660208301526002909201549181019182529150516000106135f357fe5b8051600160a060020a0316151561360657fe5b8060200151600160a060020a0316151561361c57fe5b61364881604001516000808052602052600080516020613959833981519152549063ffffffff612c5116565b60008080526020526000805160206139598339815191525561369660408201516000808460200151600160a060020a031681526020810191909152604001600020549063ffffffff612ba516565b6000808360200151600160a060020a0316600160a060020a03168152602001908152602001600020819055508060200151600160a060020a03166000600080516020613939833981519152604084015160405190815260200160405180910390a361370883600163ffffffff612ba516565b9250613577565b82805482825590600052602060002090810192821561374a579160200282015b8281111561374a57825182559160200191906001019061372f565b506137569291506138f3565b5090565b60206040519081016040526000815290565b60206040519081016040528061378061375a565b905290565b604080519081016040526000808252602082015290565b60e060405190810160405280600081526020016000600160a060020a0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061382457805160ff191683800117855561374a565b8280016001018555821561374a579182018281111561374a57825182559160200191906001019061372f565b606060405190810160409081526000808352602083018190529082015290565b60a0604051908101604052806000600160a060020a0316815260200160008152602001600081526020016138a261375a565b8152602001600081525090565b606060405190810160405280600081526020016000815260200161378061375a565b6060604051908101604052806000815260200160008152602001600081525090565b610c7391905b8082111561375657600081556001016138f9565b6000808315156139205760009150610e6b565b5082820282848281151561393057fe5b0414612bb457fe00ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5a165627a7a723058200fb0c3cbc8d416f4de6c6e803e18100f4a7e09d3da8bf366c4c066a943f890510029

   Swarm Source:
bzzr://0fb0c3cbc8d416f4de6c6e803e18100f4a7e09d3da8bf366c4c066a943f89051

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.