MATIC Price: $0.727357 (-2.78%)
Gas: 30 GWei
 

Overview

Max Total Supply

3,170 DWWA

Holders

244

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
OpenSea: OPENSTORE Token
Balance
28 DWWA
0x2953399124f0cbb46d2cbacd8a89cf0599974963
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
UserMintableNFT

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 18 of 18: UserMintableNFT.sol
/**
 * This is enhancement over custom NFT allowing users to mint tokens approved by admin
 * This contract will be used as enhanced version of NFT (v2)
*/

pragma solidity 0.5.17;

import "./CustomERC721.sol";

contract UserMintableNFT is CustomERC721 {

  mapping(address => mapping(uint => bool)) isNonceUsed;

  constructor(string memory name, string memory symbol, string memory baseURI) public CustomERC721(name, symbol, baseURI)
  {

  }

  /**
   * @dev Allows anyone to mint token signed by admin
   * Reverts if admin has not signed for `tokenId` or `to`
   * @param r signature
   * @param s signature
   * @param v recovery id of signature
   * @param tokenId tokenId to be minted
   * @param to address to which tokens needs to be minted
   * @param _signerNonce non-sequential nonce of signer to avoid replay protection
   * @return bool true when operation is successful

   */
  function userMint(
    bytes32 r, bytes32 s, uint8 v,
    uint256 tokenId,
    address to,
    uint256 _signerNonce
  )
    public
    noEmergencyFreeze
    returns (bool)
  {
    
    bytes32 message = keccak256(abi.encodePacked(
      bytes4(0x8cd49589), // Keccak-256 hash of "userMint"
      address(this),
      _signerNonce,
      to,
      tokenId
    ));
    address signer = getSigner(message, r, s, v);
    require(signer == owner || isDeputyOwner[signer], "Admin should sign message");
    require(isNonceUsed[signer][_signerNonce], "nonce already used");
    super._mint(to, tokenId);
    isNonceUsed[signer][_signerNonce] = true;
    return true;
  }

  /**
   * @dev Allows anyone to mint tokens signed by admin
   * Reverts if admin has not signed for `tokenIds` or `to`
   * @param r signature
   * @param s signature
   * @param v recovery id of signature
   * @param tokenIds tokenIds to be minted
   * @param to address to which tokens needs to be minted
   * @param _signerNonce non-sequential nonce of signer to avoid replay protection
   * @return bool true when operation is successful
   */
  function userBulkMint(
    bytes32 r, bytes32 s, uint8 v,
    uint256[] memory tokenIds,
    address to,
    uint256 _signerNonce
  )
    public
    noEmergencyFreeze
    returns (bool)
  {
    bytes32 message = keccak256(abi.encodePacked(
      bytes4(0x5827c1ff), // Keccak-256 hash of "userBulkMint"
      address(this),
      _signerNonce,
      to,
      tokenIds
    ));
    address signer = getSigner(message, r, s, v);
    require(signer == owner || isDeputyOwner[signer], "Admin should sign message");
    require(isNonceUsed[signer][_signerNonce], "nonce already used");
    for(uint256 i=0; i<tokenIds.length; i++) {
      super._mint(to, tokenIds[i]);
    }
    isNonceUsed[signer][_signerNonce] = true;
    return true;
  }
  
}


File 1 of 18: Addresses.sol
pragma solidity 0.5.17;

/**
 * Utility library of inline functions on addresses
 */
library Address {
  

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param account address to check
   * @return whether the target address is a contract
   */
  function isContract(address account) internal view returns (bool) {
      // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
      // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
      // for accounts without code, i.e. `keccak256('')`
      bytes32 codehash;
      bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
      // solhint-disable-next-line no-inline-assembly
      assembly { codehash := extcodehash(account) }
      return (codehash != accountHash && codehash != 0x0);
  }

}

File 2 of 18: BaseERC721.sol
pragma solidity 0.5.17;

import "./ERC721Token.sol";
import "./ERC20Interface.sol";
import "./Freezable.sol";

/**
 * @title Base ERC721 token
 * @author Prashant Prabhakar Singh [[email protected]]
 * This contract implements basic ERC721 token functionality with bulk functionalities
 */
contract BaseERC721 is ERC721Token, Freezable {

  constructor(string memory name, string memory symbol, string memory _baseTokenURI) public  ERC721Token(name, symbol){
    baseTokenURI = _baseTokenURI;
  }

  /**
   * @dev Updates the base URL of token
   * Reverts if the sender is not owner
   * @param _newURI New base URL
   */
  function updateBaseTokenURI(string memory _newURI)
    public
    onlyOwner
    noEmergencyFreeze
  {
    baseTokenURI = _newURI;
  }

  /**
   * @dev Mints new token on blockchain
   * Reverts if the sender is not operator with level 1
   * @param _id Id of NFT to be minted
   * @dev URI is not provided because URI will be deducted based on baseURL
   */
  function mint(uint256 _id, address _to)
    public
    onlyDeputyOrOwner
    noEmergencyFreeze
    returns (bool)
  {
    super._mint(_to, _id);
    return true;
  }

  function bulkMint(uint[] memory _ids, address[] memory _users)
    public
    onlyDeputyOrOwner
    noEmergencyFreeze
    returns (bool)
  {
    require(_ids.length == _users.length, "Invalid params");
    for(uint i=0; i<_ids.length; i++) {
      super._mint(_users[i], _ids[i]);
    }
    return true;
  }

  /**
   * @dev Transfer tokens (similar to ERC-20 transfer)
   * Reverts if the sender is not owner of the NFT or approved
   * @param _to address to which token is transferred
   * @param _tokenId Id of NFT being transferred
   */
  function transfer(address _to, uint256 _tokenId)
    public
    noEmergencyFreeze
    returns (bool)
  {
    safeTransferFrom(msg.sender, _to, _tokenId);
    return true;
  }

  /**
   * @dev Burn an existing NFT
   * @param _id Id of NFT to be burned
   */
  function burn(uint _id)
    public
    noEmergencyFreeze
    returns (bool)
  {
    super._burn(msg.sender, _id);
    return true;
  }

  //////////////////////////////////////////
  // PUBLICLY ACCESSIBLE METHODS (CONSTANT)
  //////////////////////////////////////////

}

File 3 of 18: CustomERC721.sol
/**
 * This is custom ERC-721 token with some add on functionalities
*/

pragma solidity 0.5.17;

import "./BaseERC721.sol";

/**
 * @title CustomERC721
 * @author Prashant Prabhakar Singh [[email protected]]
 */
contract CustomERC721 is BaseERC721 {

  // mapping for replay protection
  mapping(address => uint) private userNonce;

  bool public isNormalUserAllowed; // can normal user access advanced features
  
  constructor(string memory name, string memory symbol, string memory baseURI) public BaseERC721(name, symbol, baseURI) {
    isNormalUserAllowed = false;
  }

  modifier canAccessProvableFunctions() {
    require(isNormalUserAllowed || msg.sender == owner || isDeputyOwner[msg.sender], "Not allowed to access provable fns");
    _;
  }

  /**
   * @dev Allows normal users to call provable fns
   * Reverts if the sender is not owner of contract
   * @param _perm permission to users
   */
  function allowNormalUser(bool _perm)
    public 
    onlyOwner
  {
    isNormalUserAllowed = _perm;
  }
  
  /**
   * @dev Allows submitting already signed transaction
   * Reverts if the signed data is incorrect
   * @param message signed message by user
   * @param r signature
   * @param s signature
   * @param v recovery id of signature
   * @param spender address which is approved
   * @param approved bool value for status of approval
   * message should be hash(functionWord, contractAddress, nonce, fnParams)
   */
  function provable_setApprovalForAll(bytes32 message, bytes32 r, bytes32 s, uint8 v, address spender, bool approved)
    public
    noEmergencyFreeze
    canAccessProvableFunctions
  {
    address signer = getSigner(message, r, s, v);
    require (signer != address(0), "Invalid signer");

    bytes32 proof = getMessageSetApprovalForAll(signer, spender, approved);
    require(proof == message, "Invalid proof");

    // perform the original set Approval
    operatorApprovals[signer][spender] = approved;
    emit ApprovalForAll(signer, spender, approved);
    userNonce[signer] = userNonce[signer].add(1);
  }

  /**
   * @dev Allows submitting already signed transaction for NFT transfer
   * Reverts if the signed data is incorrect
   * @param message signed message by user
   * @param r signature
   * @param s signature
   * @param v recovery id of signature
   * @param to recipient address
   * @param tokenId ID of NFT
   * message should be hash(functionWord, contractAddress, nonce, fnParams)
   */
  function provable_transfer(bytes32 message, bytes32 r, bytes32 s, uint8 v, address to, uint tokenId)
    public 
    noEmergencyFreeze
    canAccessProvableFunctions
  {
    address signer = getSigner(message, r, s, v);
    require (signer != address(0),"Invalid signer");

    bytes32 proof = getMessageTransfer(signer, to, tokenId);
    require (proof == message, "Invalid proof");
    
    // Execute original function
    require(to != address(0), "Zero address not allowed");
    clearApproval(signer, tokenId);
    removeTokenFrom(signer, tokenId);
    addTokenTo(to, tokenId);
    emit Transfer(signer, to, tokenId);

    // update state variables
    userNonce[signer] = userNonce[signer].add(1);
  }

  /**
   * @dev Check signer of a message
   * @param message signed message by user
   * @param r signature
   * @param s signature
   * @param v recovery id of signature
   * @return signer of message
   */
  function getSigner(bytes32 message, bytes32 r, bytes32 s,  uint8 v) public pure returns (address){
    bytes memory prefix = "\x19Ethereum Signed Message:\n32";
    bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, message));
    address signer = ecrecover(prefixedHash,v,r,s);
    return signer;
  }

  /**
   * @dev Get message to be signed for transfer
   * @param signer of message
   * @param to recipient address
   * @param id NFT id
   * @return hash of (functionWord, contractAddress, nonce, ...fnParams)
   */
  function getMessageTransfer(address signer, address to, uint id)
    public
    view
    returns (bytes32) 
  {
    return keccak256(abi.encodePacked(
      bytes4(0xb483afd3),
      address(this),
      userNonce[signer],
      to,
      id
    ));
  }

  /**
   * @dev Get message to be signed for set Approval
   * @param signer of message
   * @param spender address which is approved
   * @param approved bool value for status of approval
   * @return hash of (functionWord, contractAddress, nonce, ...fnParams)
   */
  function getMessageSetApprovalForAll(address signer, address spender, bool approved)
    public 
    view 
    returns (bytes32)
  {
    bytes32 proof = keccak256(abi.encodePacked(
      bytes4(0xbad4c8ea),
      address(this),
      userNonce[signer],
      spender,
      approved
    ));
    return proof;
  }

  /**
  * returns nonce of user to be used for next signing
  */
  function getUserNonce(address user) public view returns (uint) {
    return userNonce[user];
  }

  /**
   * @dev Owner can transfer out any accidentally sent ERC20 tokens
   * @param contractAddress ERC20 contract address
   * @param to withdrawal address
   * @param value no of tokens to be withdrawan
   */
  function transferAnyERC20Token(address contractAddress, address to,  uint value) public onlyOwner {
    ERC20Interface(contractAddress).transfer(to, value);
  }

  /**
   * @dev Owner can transfer out any accidentally sent ERC721 tokens
   * @param contractAddress ERC721 contract address
   * @param to withdrawal address
   * @param tokenId Id of 721 token
   */
  function withdrawAnyERC721Token(address contractAddress, address to, uint tokenId) public onlyOwner {
    ERC721Basic(contractAddress).safeTransferFrom(address(this), to, tokenId);
  }

  /**
   * @dev Owner kill the smart contract
   * @param message Confirmation message to prevent accidebtal calling
   * @notice BE VERY CAREFULL BEFORE CALLING THIS FUNCTION
   * Better pause the contract
   * DO CALL "transferAnyERC20Token" before TO WITHDRAW ANY ERC-2O's FROM CONTRACT
   */
  function kill(uint message) public onlyOwner {
    require (message == 123456789987654321, "Invalid code");
    // Transfer Eth to owner and terminate contract
    selfdestruct(msg.sender);
  }

}

File 4 of 18: ERC165.sol
pragma solidity 0.5.17;

/**
 * @title ERC165
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface ERC165 {

  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceId The interface identifier, as specified in ERC-165
   * @dev Interface identification is specified in ERC-165. This function
   * uses less than 30,000 gas.
   */
  function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool);
}

File 5 of 18: ERC20Interface.sol
pragma solidity ^0.5.17;

contract ERC20Interface {
  function transfer(address to, uint tokens) public returns (bool success);
  function balanceOf(address _sender) public view returns (uint _bal);
  function allowance(address tokenOwner, address spender) public view returns (uint remaining);
  event Transfer(address indexed from, address indexed to, uint tokens);
  event Approval(address indexed owner, address indexed spender, uint256 value);
  function transferFrom(address from, address to, uint tokens) public returns (bool success);
}

File 6 of 18: ERC721.sol
pragma solidity 0.5.17;

import "./ERC721Basic.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Metadata.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {

}

File 7 of 18: ERC721Basic.sol
pragma solidity 0.5.17;

import "./ERC165.sol";

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic is ERC165 {
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function exists(uint256 _tokenId) public view returns (bool _exists);

  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId)
    public view returns (address _operator);

  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator)
    public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId)
    public;

  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    public;
}

File 8 of 18: ERC721BasicToken.sol
pragma solidity 0.5.17;

import "./SupportsInterfaceWithLookup.sol";
import "./ERC721Basic.sol";
import "./ERC721Receiver.sol";

import "./SafeMath.sol";
import "./Addresses.sol";

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicToken is SupportsInterfaceWithLookup, ERC721Basic {

  bytes4 private constant InterfaceId_ERC721 = 0x80ac58cd;
  /*
   * 0x80ac58cd ===
   *   bytes4(keccak256('balanceOf(address)')) ^
   *   bytes4(keccak256('ownerOf(uint256)')) ^
   *   bytes4(keccak256('approve(address,uint256)')) ^
   *   bytes4(keccak256('getApproved(uint256)')) ^
   *   bytes4(keccak256('setApprovalForAll(address,bool)')) ^
   *   bytes4(keccak256('isApprovedForAll(address,address)')) ^
   *   bytes4(keccak256('transferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))
   */

  bytes4 private constant InterfaceId_ERC721Exists = 0x4f558e79;
  /*
   * 0x4f558e79 ===
   *   bytes4(keccak256('exists(uint256)'))
   */

  using SafeMath for uint256;
  using Address for address;

  // Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
  // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
  bytes4 private constant ERC721_RECEIVED = 0xf0b9e5ba;

  // Mapping from token ID to owner
  mapping (uint256 => address) internal tokenOwner;

  // Mapping from token ID to approved address
  mapping (uint256 => address) internal tokenApprovals;

  // Mapping from owner to number of owned token
  mapping (address => uint256) internal ownedTokensCount;

  // Mapping from owner to operator approvals
  mapping (address => mapping (address => bool)) internal operatorApprovals;

  /**
   * @dev Guarantees msg.sender is owner of the given token
   * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
   */
  modifier onlyOwnerOf(uint256 _tokenId) {
    require(ownerOf(_tokenId) == msg.sender, "Only asset owner is allowed");
    _;
  }

  /**
   * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
   * @param _tokenId uint256 ID of the token to validate
   */
  modifier canTransfer(uint256 _tokenId) {
    require(isApprovedOrOwner(msg.sender, _tokenId), "Can not transfer");
    _;
  }

  constructor()
    public
  {
    // register the supported interfaces to conform to ERC721 via ERC165
    _registerInterface(InterfaceId_ERC721);
    _registerInterface(InterfaceId_ERC721Exists);
  }

  /**
   * @dev Gets the balance of the specified address
   * @param _owner address to query the balance of
   * @return uint256 representing the amount owned by the passed address
   */
  function balanceOf(address _owner) public view returns (uint256) {
    require(_owner != address(0), "Zero address not allowed");
    return ownedTokensCount[_owner];
  }

  /**
   * @dev Gets the owner of the specified token ID
   * @param _tokenId uint256 ID of the token to query the owner of
   * @return owner address currently marked as the owner of the given token ID
   */
  function ownerOf(uint256 _tokenId) public view returns (address) {
    address owner = tokenOwner[_tokenId];
    require(owner != address(0), "Zero address not allowed");
    return owner;
  }

  /**
   * @dev Returns whether the specified token exists
   * @param _tokenId uint256 ID of the token to query the existence of
   * @return whether the token exists
   */
  function exists(uint256 _tokenId) public view returns (bool) {
    address owner = tokenOwner[_tokenId];
    return owner != address(0);
  }

  /**
   * @dev Approves another address to transfer the given token ID
   * The zero address indicates there is no approved address.
   * There can only be one approved address per token at a given time.
   * Can only be called by the token owner or an approved operator.
   * @param _to address to be approved for the given token ID
   * @param _tokenId uint256 ID of the token to be approved
   */
  function approve(address _to, uint256 _tokenId) public {
    address owner = ownerOf(_tokenId);
    require(_to != owner, "Can not approve to self");
    require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "Not allowed to update approvals");

    tokenApprovals[_tokenId] = _to;
    emit Approval(owner, _to, _tokenId);
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for the given token ID
   */
  function getApproved(uint256 _tokenId) public view returns (address) {
    return tokenApprovals[_tokenId];
  }

  /**
   * @dev Sets or unsets the approval of a given operator
   * An operator is allowed to transfer all tokens of the sender on their behalf
   * @param _to operator address to set the approval
   * @param _approved representing the status of the approval to be set
   */
  function setApprovalForAll(address _to, bool _approved) public {
    require(_to != msg.sender, "Can not approve to self");
    operatorApprovals[msg.sender][_to] = _approved;
    emit ApprovalForAll(msg.sender, _to, _approved);
  }

  /**
   * @dev Tells whether an operator is approved by a given owner
   * @param _owner owner address which you want to query the approval of
   * @param _operator operator address which you want to query the approval of
   * @return bool whether the given operator is approved by the given owner
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    public
    view
    returns (bool)
  {
    return operatorApprovals[_owner][_operator];
  }

  /**
   * @dev Transfers the ownership of a given token ID to another address
   * Usage of this method is discouraged, use `safeTransferFrom` whenever possible
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
    canTransfer(_tokenId)
  
  {
    require(_from != address(0), "Zero address not allowed");
    require(_to != address(0), "Zero address not allowed");

    clearApproval(_from, _tokenId);
    removeTokenFrom(_from, _tokenId);
    addTokenTo(_to, _tokenId);

    emit Transfer(_from, _to, _tokenId);
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   *
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
    canTransfer(_tokenId)
  
  {
    // solium-disable-next-line arg-overflow
    safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes data to send along with a safe transfer check
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    public
    canTransfer(_tokenId)
  {
    transferFrom(_from, _to, _tokenId);
    // solium-disable-next-line arg-overflow
    require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data), "Safe Transfer failed");
  }

  /**
   * @dev Returns whether the given spender can transfer a given token ID
   * @param _spender address of the spender to query
   * @param _tokenId uint256 ID of the token to be transferred
   * @return bool whether the msg.sender is approved for the given token ID,
   *  is an operator of the owner, or is the owner of the token
   */
  function isApprovedOrOwner(
    address _spender,
    uint256 _tokenId
  )
    internal
    view
    returns (bool)
  {
    address owner = ownerOf(_tokenId);
    // Disable solium check because of
    // https://github.com/duaraghav8/Solium/issues/175
    // solium-disable-next-line operator-whitespace
    return (
      _spender == owner ||
      getApproved(_tokenId) == _spender ||
      isApprovedForAll(owner, _spender)
    );
  }

  /**
   * @dev Internal function to mint a new token
   * Reverts if the given token ID already exists
   * @param _to The address that will own the minted token
   * @param _tokenId uint256 ID of the token to be minted by the msg.sender
   */
  function _mint(address _to, uint256 _tokenId) internal {
    require(_to != address(0), "Zero address not allowed");
    addTokenTo(_to, _tokenId);
    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @dev Internal function to burn a specific token
   * Reverts if the token does not exist
   * @param _tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address _owner, uint256 _tokenId) internal {
    clearApproval(_owner, _tokenId);
    removeTokenFrom(_owner, _tokenId);
    emit Transfer(_owner, address(0), _tokenId);
  }

  /**
   * @dev Internal function to clear current approval of a given token ID
   * Reverts if the given address is not indeed the owner of the token
   * @param _owner owner of the token
   * @param _tokenId uint256 ID of the token to be transferred
   */
  function clearApproval(address _owner, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _owner, "Asset does not belong to given owmer");
    if (tokenApprovals[_tokenId] != address(0)) {
      tokenApprovals[_tokenId] = address(0);
      emit Approval(_owner, address(0), _tokenId);
    }
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    require(tokenOwner[_tokenId] == address(0), "Asset already exists");
    tokenOwner[_tokenId] = _to;
    ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _from, "Asset does not belong to given owmer");
    ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
    tokenOwner[_tokenId] = address(0);
  }

  /**
   * @dev Internal function to invoke `onERC721Received` on a target address
   * The call is not executed if the target address is not a contract
   * @param _from address representing the previous owner of the given token ID
   * @param _to target address that will receive the tokens
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return whether the call correctly returned the expected magic value
   */
  function checkAndCallSafeTransfer(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    internal
    returns (bool)
  {
    if (!_to.isContract()) {
      return true;
    }
    bytes4 retval = ERC721Receiver(_to).onERC721Received(
      _from, _tokenId, _data);
    return (retval == ERC721_RECEIVED);
  }
}

File 9 of 18: ERC721Enumerable.sol
pragma solidity 0.5.17;

import "./ERC721Basic.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
  function totalSupply() public view returns (uint256);
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    public
    view
    returns (uint256 _tokenId);

  function tokenByIndex(uint256 _index) public view returns (uint256);
}

File 10 of 18: ERC721Metadata.sol
pragma solidity 0.5.17;

import "./ERC721Basic.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata 
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
  function name() external view returns (string memory _name);
  function symbol() external view returns (string memory _symbol);
  function tokenURI(uint256 _tokenId) public view returns (string memory);
}

File 11 of 18: ERC721Receiver.sol
pragma solidity 0.5.17;

/**
 * @title ERC721 token receiver interface
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract ERC721Receiver {
  /**
   * @dev Magic value to be returned upon successful reception of an NFT
   *  Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
   *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
   */
  bytes4 internal constant ERC721_RECEIVED = 0xf0b9e5ba;

  /**
   * @notice Handle the receipt of an NFT
   * @dev The ERC721 smart contract calls this function on the recipient
   * after a `safetransfer`. This function MAY throw to revert and reject the
   * transfer. This function MUST use 50,000 gas or less. Return of other
   * than the magic value MUST result in the transaction being reverted.
   * Note: the contract address is always the message sender.
   * @param _from The sending address
   * @param _tokenId The NFT identifier which is being transfered
   * @param _data Additional data with no specified format
   * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
   */
  function onERC721Received(
    address _from,
    uint256 _tokenId,
    bytes memory _data
  )
    public
    returns(bytes4);
}

File 12 of 18: ERC721Token.sol
pragma solidity 0.5.17;

import "./ERC721.sol";
import "./ERC721BasicToken.sol";
import "./SupportsInterfaceWithLookup.sol";
import "./Strings.sol";


/**
 * @title Full ERC721 Token
 * @author Prashant Prabhakar Singh [[email protected]]
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Token is SupportsInterfaceWithLookup, ERC721BasicToken, ERC721 {

  bytes4 private constant InterfaceId_ERC721Enumerable = 0x780e9d63;
  /**
   * 0x780e9d63 ===
   *   bytes4(keccak256('totalSupply()')) ^
   *   bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^
   *   bytes4(keccak256('tokenByIndex(uint256)'))
   */

  bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f;
  /**
   * 0x5b5e139f ===
   *   bytes4(keccak256('name()')) ^
   *   bytes4(keccak256('symbol()')) ^
   *   bytes4(keccak256('tokenURI(uint256)'))
   */

  // Token name
  string internal name_;

  // Token symbol
  string internal symbol_;

  // to store base URL
  string internal baseTokenURI;

  // Mapping from owner to list of owned token IDs
  mapping(address => uint256[]) internal ownedTokens;

  // Mapping from token ID to index of the owner tokens list
  mapping(uint256 => uint256) internal ownedTokensIndex;

  // Array with all token ids, used for enumeration
  uint256[] internal allTokens;

  // Mapping from token id to position in the allTokens array
  mapping(uint256 => uint256) internal allTokensIndex;

  /**
   * @dev Constructor function
   */
  constructor(string memory _name, string memory _symbol) public {
    name_ = _name;
    symbol_ = _symbol;

    // register the supported interfaces to conform to ERC721 via ERC165
    _registerInterface(InterfaceId_ERC721Enumerable);
    _registerInterface(InterfaceId_ERC721Metadata);
  }

  /**
   * @dev Gets the token name
   * @return string representing the token name
   */
  function name() external view returns (string memory) {
    return name_;
  }

  /**
   * @dev Gets the token symbol
   * @return string representing the token symbol
   */
  function symbol() external view returns (string memory) {
    return symbol_;
  }

  /**
   * @dev Returns an URI for a given token ID
   * Throws if the token ID does not exist. May return an empty string.
   * @param _tokenId uint256 ID of the token to query
   */
  function tokenURI(uint256 _tokenId) public view returns (string memory) {
    require(exists(_tokenId), "Asset does not exist");
    return string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId)));
  }

  /**
   * @dev Gets the token ID at a given index of the tokens list of the requested owner
   * @param _owner address owning the tokens list to be accessed
   * @param _index uint256 representing the index to be accessed of the requested tokens list
   * @return uint256 token ID at the given index of the tokens list owned by the requested address
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    public
    view
    returns (uint256)
  {
    require(_index < balanceOf(_owner), "Invalid index");
    return ownedTokens[_owner][_index];
  }

  /**
   * @dev Gets the total amount of tokens stored by the contract
   * @return uint256 representing the total amount of tokens
   */
  function totalSupply() public view returns (uint256) {
    return allTokens.length;
  }

  /**
   * @dev Gets the token ID at a given index of all the tokens in this contract
   * Reverts if the index is greater or equal to the total number of tokens
   * @param _index uint256 representing the index to be accessed of the tokens list
   * @return uint256 token ID at the given index of the tokens list
   */
  function tokenByIndex(uint256 _index) public view returns (uint256) {
    require(_index < totalSupply(), "Invalid index");
    return allTokens[_index];
  }

  // @dev This function is not needed as token URI will be created automatically based in base URL
  // /**
  //  * @dev Internal function to set the token URI for a given token
  //  * Reverts if the token ID does not exist
  //  * @param _tokenId uint256 ID of the token to set its URI
  //  * @param _uri string URI to assign
  //  */
  // function _setTokenURI(uint256 _tokenId, string memory _uri) internal {
  //   require(exists(_tokenId));
  //   tokenURI[_tokenId] = _uri;
  // }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    super.addTokenTo(_to, _tokenId);
    uint256 length = ownedTokens[_to].length;
    ownedTokens[_to].push(_tokenId);
    ownedTokensIndex[_tokenId] = length;
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    super.removeTokenFrom(_from, _tokenId);

    uint256 tokenIndex = ownedTokensIndex[_tokenId];
    uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
    uint256 lastToken = ownedTokens[_from][lastTokenIndex];

    ownedTokens[_from][tokenIndex] = lastToken;
    ownedTokens[_from][lastTokenIndex] = 0;
    // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
    // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
    // the lastToken to the first position, and then dropping the element placed in the last position of the list

    ownedTokens[_from].length--;
    ownedTokensIndex[_tokenId] = 0;
    ownedTokensIndex[lastToken] = tokenIndex;
  }

  /**
   * @dev Internal function to mint a new token
   * Reverts if the given token ID already exists
   * @param _to address the beneficiary that will own the minted token
   * @param _tokenId uint256 ID of the token to be minted by the msg.sender
   */
  function _mint(address _to, uint256 _tokenId) internal {
    super._mint(_to, _tokenId);

    allTokensIndex[_tokenId] = allTokens.length;
    allTokens.push(_tokenId);
  }

  /**
   * @dev Internal function to burn a specific token
   * Reverts if the token does not exist
   * @param _owner owner of the token to burn
   * @param _tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address _owner, uint256 _tokenId) internal {
    super._burn(_owner, _tokenId);

    // Clear metadata (if any)
    // if (bytes(tokenURI[_tokenId]).length != 0) {
    //   delete tokenURIs[_tokenId];
    // }

    // Reorg all tokens array
    uint256 tokenIndex = allTokensIndex[_tokenId];
    uint256 lastTokenIndex = allTokens.length.sub(1);
    uint256 lastToken = allTokens[lastTokenIndex];

    allTokens[tokenIndex] = lastToken;
    allTokens[lastTokenIndex] = 0;

    allTokens.length--;
    allTokensIndex[_tokenId] = 0;
    allTokensIndex[lastToken] = tokenIndex;
  }
}

File 13 of 18: Freezable.sol
pragma solidity 0.5.17;

import "./Ownership.sol";

contract Freezable is Ownership {
    
    mapping (address => bool) frozen;
    bool public emergencyFreeze = false;

    event Freezed(address targetAddress, bool frozen);
    event EmerygencyFreezed(bool emergencyFreezeStatus);

    modifier unfreezed(address _account) { 
        require(!frozen[_account]);
        _;  
    }
    
    modifier noEmergencyFreeze() { 
        require(!emergencyFreeze);
        _; 
    }

    // ------------------------------------------------------------------------
    // Freeze account - onlyOwner
    // ------------------------------------------------------------------------
    function freezeAccount (address _target, bool _freeze) public onlyOwner returns(bool) {
        frozen[_target] = _freeze;
        emit Freezed(_target, _freeze);
        return true;
    }

    // ------------------------------------------------------------------------
    // Emerygency freeze - onlyOwner
    // ------------------------------------------------------------------------
    function emergencyFreezeAllAccounts (bool _freeze) public onlyOwner returns(bool) {
        emergencyFreeze = _freeze;
        emit EmerygencyFreezed(_freeze);
        return true;
    }

    // ------------------------------------------------------------------------
    // Get Freeze Status : Constant
    // ------------------------------------------------------------------------
    function isFreezed(address _targetAddress) public view returns (bool) {
        return frozen[_targetAddress]; 
    }

}

File 14 of 18: Ownership.sol
pragma solidity 0.5.17;

contract Ownership {

  address public owner;
  address[] public deputyOwners;

  mapping(address => bool) public isDeputyOwner;

  event OwnershipUpdated(address oldOwner, address newOwner);
  event DeputyOwnerUpdated(address _do, bool _isAdded);

  constructor() public {
    owner = msg.sender;
    deputyOwners = [msg.sender];
  }

  modifier onlyOwner() {
    require(msg.sender == owner, "Not owner");
    _;
  }

  modifier onlyDeputyOrOwner() {
    require(msg.sender == owner || isDeputyOwner[msg.sender], "Only owner or deputy owner is allowed");
    _;
  }


  /**
   * @dev Transfer the ownership to some other address.
   * new owner can not be a zero address.
   * Only owner can call this function
   * @param _newOwner Address to which ownership is being transferred
   */
  function updateOwner(address _newOwner)
    public
    onlyOwner
  {
    require(_newOwner != address(0x0), "Invalid address");
    owner = _newOwner;
    emit OwnershipUpdated(msg.sender, owner);
  }

  /**
    * @dev Add new deputy owner.
    * Only Owner can call this function
    * New Deputy should not be zero address
    * New Deputy should not be be already exisitng
    * emit DeputyOwnerUdpatd event
    * @param _newDO Address of new deputy owner
   */
  function addDeputyOwner(address _newDO)
    public
    onlyOwner
  {
    require(!isDeputyOwner[_newDO], "Deputy Owner already exists");
    require(_newDO != address(0), "Zero address not allowed");
    deputyOwners.push(_newDO);
    isDeputyOwner[_newDO] = true;
    emit DeputyOwnerUpdated(_newDO, true);
  }

  /**
    * @dev Remove an existing deputy owner.
    * Only Owner can call this function
    * Given address should be a deputy owner
    * emit DeputyOwnerUdpatd event
    * @param _existingDO Address of existing deputy owner
   */
  function removeDeputyOwner(address _existingDO)
    public
    onlyOwner
  {
    require(isDeputyOwner[_existingDO], "Deputy Owner does not exits");
    uint existingId;
    for(uint i=0; i<deputyOwners.length; i++) {
      if(deputyOwners[i] == _existingDO) existingId=i;
    }

    // swap this with last element
    deputyOwners[existingId] = deputyOwners[deputyOwners.length-1];
    delete deputyOwners[deputyOwners.length-1];
    deputyOwners.length--;
    isDeputyOwner[_existingDO] = false;
    emit DeputyOwnerUpdated(_existingDO, false);
  }

  /**
   * @dev Renounce the ownership.
   * This will leave the contract without any owner.
   * Only owner can call this function
   * @param _validationCode A code to prevent aaccidental calling of this function
   */
  function renounceOwnership(uint _validationCode)
    public
    onlyOwner
  {
    require(_validationCode == 123456789, "Invalid code");
    owner = address(0);
    emit OwnershipUpdated(msg.sender, owner);
  }
}

File 15 of 18: SafeMath.sol
pragma solidity ^0.5.17;

library SafeMath {
  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;
  }
  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;
  }
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a && c>=b);
    return c;
  }
}

File 16 of 18: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.5.17;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = byte(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

File 17 of 18: SupportsInterfaceWithLookup.sol
pragma solidity 0.5.17;

import "./ERC165.sol";

/**
 * @title SupportsInterfaceWithLookup
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev Implements ERC165 using a lookup table.
 */
contract SupportsInterfaceWithLookup is ERC165 {
  bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7;
  /**
   * 0x01ffc9a7 ===
   *   bytes4(keccak256('supportsInterface(bytes4)'))
   */

  /**
   * @dev a mapping of interface id to whether or not it's supported
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev A contract implementing SupportsInterfaceWithLookup
   * implement ERC165 itself
   */
  constructor()
    public
  {
    _registerInterface(InterfaceId_ERC165);
  }

  /**
   * @dev implement supportsInterface(bytes4) using a lookup table
   */
  function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceId];
  }

  /**
   * @dev private method for registering an interface
   */
  function _registerInterface(bytes4 _interfaceId)
    internal
  {
    require(_interfaceId != 0xffffffff);
    supportedInterfaces[_interfaceId] = true;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_do","type":"address"},{"indexed":false,"internalType":"bool","name":"_isAdded","type":"bool"}],"name":"DeputyOwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"emergencyFreezeStatus","type":"bool"}],"name":"EmerygencyFreezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"targetAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"frozen","type":"bool"}],"name":"Freezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"InterfaceId_ERC165","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newDO","type":"address"}],"name":"addDeputyOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_perm","type":"bool"}],"name":"allowNormalUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"bulkMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deputyOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"emergencyFreeze","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_freeze","type":"bool"}],"name":"emergencyFreezeAllAccounts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bool","name":"_freeze","type":"bool"}],"name":"freezeAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"getMessageSetApprovalForAll","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getMessageTransfer","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"message","type":"bytes32"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDeputyOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_targetAddress","type":"address"}],"name":"isFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isNormalUserAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"message","type":"uint256"}],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"message","type":"bytes32"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"provable_setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"message","type":"bytes32"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"provable_transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_existingDO","type":"address"}],"name":"removeDeputyOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_validationCode","type":"uint256"}],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"updateBaseTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"updateOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_signerNonce","type":"uint256"}],"name":"userBulkMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_signerNonce","type":"uint256"}],"name":"userMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawAnyERC721Token","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526010805460ff191690553480156200001b57600080fd5b5060405162003a5438038062003a54833981810160405260608110156200004157600080fd5b81019080805160405193929190846401000000008211156200006257600080fd5b9083019060208201858111156200007857600080fd5b82516401000000008111828201881017156200009357600080fd5b82525081516020918201929091019080838360005b83811015620000c2578181015183820152602001620000a8565b50505050905090810190601f168015620000f05780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011457600080fd5b9083019060208201858111156200012a57600080fd5b82516401000000008111828201881017156200014557600080fd5b82525081516020918201929091019080838360005b83811015620001745781810151838201526020016200015a565b50505050905090810190601f168015620001a25780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084640100000000821115620001c657600080fd5b908301906020820185811115620001dc57600080fd5b8251640100000000811182820188101715620001f757600080fd5b82525081516020918201929091019080838360005b83811015620002265781810151838201526020016200020c565b50505050905090810190601f168015620002545780820380516001836020036101000a031916815260200191505b5060405250849150839050828282828282620002806301ffc9a760e01b6001600160e01b036200037e16565b6200029b6380ac58cd60e01b6001600160e01b036200037e16565b620002b6634f558e7960e01b6001600160e01b036200037e16565b8151620002cb906005906020850190620003bb565b508051620002e1906006906020840190620003bb565b50620002fd63780e9d6360e01b6001600160e01b036200037e16565b62000318635b5e139f60e01b6001600160e01b036200037e16565b5050600c80546001600160a01b0319163390811790915560408051602081019091529081526200034d90600d90600162000440565b50805162000363906007906020840190620003bb565b50506012805460ff1916905550620004ed9650505050505050565b6001600160e01b031980821614156200039657600080fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003fe57805160ff19168380011785556200042e565b828001600101855582156200042e579182015b828111156200042e57825182559160200191906001019062000411565b506200043c929150620004a6565b5090565b82805482825590600052602060002090810192821562000498579160200282015b828111156200049857825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000461565b506200043c929150620004c6565b620004c391905b808211156200043c5760008155600101620004ad565b90565b620004c391905b808211156200043c5780546001600160a01b0319168155600101620004cd565b61355780620004fd6000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c806370a0823111610167578063a9059cbb116100ce578063d29a002511610087578063d29a002514610c36578063d493b9ac14610c53578063db738ee614610c89578063e724529c14610c91578063e985e9c514610cbf578063f3d4b94214610ced57610295565b8063a9059cbb14610a00578063a94b870614610a2c578063b88d4fde14610af1578063b89bba4214610bb5578063c400956a14610bfc578063c87b56dd14610c1957610295565b8063880cdc3111610120578063880cdc311461094a5780638da5cb5b1461097057806394bf804d1461097857806395d89b41146109a4578063a22cb465146109ac578063a33cdc41146109da57610295565b806370a082311461086657806376c16f991461088c5780637898278f146108b25780637d654c7f146108d15780638111f24e146108ee578063841321d91461091457610295565b80633cd86df81161020b5780635bdc12c6116101c45780635bdc12c6146106ce5780635dfd33d1146107175780636352211e1461074d578063655391c91461076a57806366618d181461080e5780636834e3a81461084057610295565b80633cd86df8146105ea57806342842e0e1461062257806342966c68146106585780634f558e79146106755780634f6ccce714610692578063587d0f66146106af57610295565b806315761f0e1161025d57806315761f0e146104dc57806318160ddd1461050257806319fa8f501461051c57806323b872dd14610541578063243cd059146105775780632f745c59146105be57610295565b806301ffc9a71461029a57806306fdde03146102d5578063081812fc14610352578063095ea7b31461038b5780631505780e146103b9575b600080fd5b6102c1600480360360208110156102b057600080fd5b50356001600160e01b031916610cf5565b604080519115158252519081900360200190f35b6102dd610d18565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103175781810151838201526020016102ff565b50505050905090810190601f1680156103445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036f6004803603602081101561036857600080fd5b5035610daf565b604080516001600160a01b039092168252519081900360200190f35b6103b7600480360360408110156103a157600080fd5b506001600160a01b038135169060200135610dca565b005b6102c1600480360360408110156103cf57600080fd5b810190602081018135600160201b8111156103e957600080fd5b8201836020820111156103fb57600080fd5b803590602001918460208302840111600160201b8311171561041c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561046b57600080fd5b82018360208201111561047d57600080fd5b803590602001918460208302840111600160201b8311171561049e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610f01945050505050565b6102c1600480360360208110156104f257600080fd5b50356001600160a01b031661100c565b61050a611021565b60408051918252519081900360200190f35b610524611027565b604080516001600160e01b03199092168252519081900360200190f35b6103b76004803603606081101561055757600080fd5b506001600160a01b03813581169160208101359091169060400135611032565b6103b7600480360360c081101561058d57600080fd5b5080359060208101359060408101359060ff606082013516906001600160a01b036080820135169060a00135611166565b61050a600480360360408110156105d457600080fd5b506001600160a01b03813516906020013561137b565b61050a6004803603606081101561060057600080fd5b506001600160a01b038135811691602081013590911690604001351515611400565b6103b76004803603606081101561063857600080fd5b506001600160a01b03813581169160208101359091169060400135611476565b6102c16004803603602081101561066e57600080fd5b50356114e6565b6102c16004803603602081101561068b57600080fd5b503561150b565b61050a600480360360208110156106a857600080fd5b5035611528565b6103b7600480360360208110156106c557600080fd5b50351515611594565b6103b7600480360360c08110156106e457600080fd5b5080359060208101359060408101359060ff606082013516906001600160a01b036080820135169060a0013515156115f2565b6103b76004803603606081101561072d57600080fd5b506001600160a01b038135811691602081013590911690604001356117b4565b61036f6004803603602081101561076357600080fd5b5035611874565b6103b76004803603602081101561078057600080fd5b810190602081018135600160201b81111561079a57600080fd5b8201836020820111156107ac57600080fd5b803590602001918460018302840111600160201b831117156107cd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118d2945050505050565b61036f6004803603608081101561082457600080fd5b508035906020810135906040810135906060013560ff16611944565b61050a6004803603602081101561085657600080fd5b50356001600160a01b0316611a5e565b61050a6004803603602081101561087c57600080fd5b50356001600160a01b0316611a79565b6103b7600480360360208110156108a257600080fd5b50356001600160a01b0316611ae0565b6102c1600480360360208110156108c857600080fd5b50351515611ce4565b6103b7600480360360208110156108e757600080fd5b5035611d7e565b6102c16004803603602081101561090457600080fd5b50356001600160a01b0316611e5e565b61050a6004803603606081101561092a57600080fd5b506001600160a01b03813581169160208101359091169060400135611e7c565b6103b76004803603602081101561096057600080fd5b50356001600160a01b0316611ef0565b61036f611fe8565b6102c16004803603604081101561098e57600080fd5b50803590602001356001600160a01b0316611ff7565b6102dd612080565b6103b7600480360360408110156109c257600080fd5b506001600160a01b03813516906020013515156120e1565b6103b7600480360360208110156109f057600080fd5b50356001600160a01b03166121a7565b6102c160048036036040811015610a1657600080fd5b506001600160a01b03813516906020013561234a565b6102c1600480360360c0811015610a4257600080fd5b81359160208101359160ff6040830135169190810190608081016060820135600160201b811115610a7257600080fd5b820183602082011115610a8457600080fd5b803590602001918460208302840111600160201b83111715610aa557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b038335169350505060200135612368565b6103b760048036036080811015610b0757600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610b4157600080fd5b820183602082011115610b5357600080fd5b803590602001918460018302840111600160201b83111715610b7457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612570945050505050565b6102c1600480360360c0811015610bcb57600080fd5b5080359060208101359060ff604082013516906060810135906001600160a01b036080820135169060a00135612625565b61036f60048036036020811015610c1257600080fd5b50356127d6565b6102dd60048036036020811015610c2f57600080fd5b50356127fd565b6103b760048036036020811015610c4c57600080fd5b5035612921565b6103b760048036036060811015610c6957600080fd5b506001600160a01b038135811691602081013590911690604001356129ba565b6102c1612a8f565b6102c160048036036040811015610ca757600080fd5b506001600160a01b0381351690602001351515612a98565b6102c160048036036040811015610cd557600080fd5b506001600160a01b0381358116916020013516612b4f565b6102c1612b7d565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610da45780601f10610d7957610100808354040283529160200191610da4565b820191906000526020600020905b815481529060010190602001808311610d8757829003601f168201915b505050505090505b90565b6000908152600260205260409020546001600160a01b031690565b6000610dd582611874565b9050806001600160a01b0316836001600160a01b03161415610e38576040805162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b604482015290519081900360640190fd5b336001600160a01b0382161480610e545750610e548133612b4f565b610ea5576040805162461bcd60e51b815260206004820152601f60248201527f4e6f7420616c6c6f77656420746f2075706461746520617070726f76616c7300604482015290519081900360640190fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600c546000906001600160a01b0316331480610f2c5750336000908152600e602052604090205460ff165b610f675760405162461bcd60e51b815260040180806020018281038252602581526020018061349a6025913960400191505060405180910390fd5b60105460ff1615610f7757600080fd5b8151835114610fbe576040805162461bcd60e51b815260206004820152600e60248201526d496e76616c696420706172616d7360901b604482015290519081900360640190fd5b60005b835181101561100257610ffa838281518110610fd957fe5b6020026020010151858381518110610fed57fe5b6020026020010151612b86565b600101610fc1565b5060019392505050565b600e6020526000908152604090205460ff1681565b600a5490565b6301ffc9a760e01b81565b8061103d3382612bd5565b611081576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b6001600160a01b0384166110ca576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b6001600160a01b038316611113576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b61111d8483612c2c565b6111278483612cf6565b6111318383612e28565b81836001600160a01b0316856001600160a01b03166000805160206134e383398151915260405160405180910390a450505050565b60105460ff161561117657600080fd5b60125460ff16806111915750600c546001600160a01b031633145b806111ab5750336000908152600e602052604090205460ff165b6111e65760405162461bcd60e51b81526004018080602001828103825260228152602001806134786022913960400191505060405180910390fd5b60006111f487878787611944565b90506001600160a01b038116611242576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b4b3b732b960911b604482015290519081900360640190fd5b600061124f828585611e7c565b9050878114611295576040805162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015290519081900360640190fd5b6001600160a01b0384166112de576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b6112e88284612c2c565b6112f28284612cf6565b6112fc8484612e28565b82846001600160a01b0316836001600160a01b03166000805160206134e383398151915260405160405180910390a46001600160a01b03821660009081526011602052604090205461135590600163ffffffff612e6e16565b6001600160a01b0390921660009081526011602052604090209190915550505050505050565b600061138683611a79565b82106113c9576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6001600160a01b03831660009081526008602052604090208054839081106113ed57fe5b9060005260206000200154905092915050565b6001600160a01b0392909216600090815260116020908152604091829020548251635d6a647560e11b8184015230606090811b6024830152603882019290925293901b6001600160601b031916605884015292151560f81b606c8301528051808303604d018152606d9092019052805191012090565b806114813382612bd5565b6114c5576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b6114e084848460405180602001604052806000815250612570565b50505050565b60105460009060ff16156114f957600080fd5b6115033383612e90565b506001919050565b6000908152600160205260409020546001600160a01b0316151590565b6000611532611021565b8210611575576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b600a828154811061158257fe5b90600052602060002001549050919050565b600c546001600160a01b031633146115df576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6012805460ff1916911515919091179055565b60105460ff161561160257600080fd5b60125460ff168061161d5750600c546001600160a01b031633145b806116375750336000908152600e602052604090205460ff165b6116725760405162461bcd60e51b81526004018080602001828103825260228152602001806134786022913960400191505060405180910390fd5b600061168087878787611944565b90506001600160a01b0381166116ce576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b4b3b732b960911b604482015290519081900360640190fd5b60006116db828585611400565b9050878114611721576040805162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015290519081900360640190fd5b6001600160a01b03828116600081815260046020908152604080832094891680845294825291829020805460ff1916881515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a36001600160a01b03821660009081526011602052604090205461135590600163ffffffff612e6e16565b600c546001600160a01b031633146117ff576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60408051632142170760e11b81523060048201526001600160a01b038481166024830152604482018490529151918516916342842e0e9160648082019260009290919082900301818387803b15801561185757600080fd5b505af115801561186b573d6000803e3d6000fd5b50505050505050565b6000818152600160205260408120546001600160a01b0316806118cc576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b92915050565b600c546001600160a01b0316331461191d576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60105460ff161561192d57600080fd5b80516119409060079060208401906133b6565b5050565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020018083805190602001908083835b602083106119b65780518252601f199092019160209182019101611997565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815284830180835281519184019190912060009182905282860180845281905260ff8b166060870152608086018d905260a086018c90529151919650945060019360c08082019450601f19830192918290030190855afa158015611a45573d6000803e3d6000fd5b5050604051601f1901519450505050505b949350505050565b6001600160a01b031660009081526011602052604090205490565b60006001600160a01b038216611ac4576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b506001600160a01b031660009081526003602052604090205490565b600c546001600160a01b03163314611b2b576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600e602052604090205460ff16611b98576040805162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220646f6573206e6f742065786974730000000000604482015290519081900360640190fd5b6000805b600d54811015611be457826001600160a01b0316600d8281548110611bbd57fe5b6000918252602090912001546001600160a01b03161415611bdc578091505b600101611b9c565b50600d80546000198101908110611bf757fe5b600091825260209091200154600d80546001600160a01b039092169183908110611c1d57fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600d80546000198101908110611c5857fe5b600091825260209091200180546001600160a01b0319169055600d805490611c84906000198301613434565b506001600160a01b0382166000818152600e60209081526040808320805460ff1916905580519384529083019190915280517f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf855339281900390910190a15050565b600c546000906001600160a01b03163314611d32576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6010805483151560ff19909116811790915560408051918252517f20cab5a89e9642fc2f3e47bcd2c27f01489aa2e5f76f1a2e673d2e1358dbfdf59181900360200190a1506001919050565b600c546001600160a01b03163314611dc9576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b8063075bcd1514611e10576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b604482015290519081900360640190fd5b600c80546001600160a01b0319169055604080513381526000602082015281517f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d929181900390910190a150565b6001600160a01b03166000908152600f602052604090205460ff1690565b6001600160a01b039290921660009081526011602090815260409182902054825163b483afd360e01b8184015230606090811b6024830152603882019290925293901b6001600160601b0319166058840152606c8084019490945281518084039094018452608c9092019052815191012090565b600c546001600160a01b03163314611f3b576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b038116611f88576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0383811691909117918290556040805133815292909116602083015280517f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d9281900390910190a150565b600c546001600160a01b031681565b600c546000906001600160a01b03163314806120225750336000908152600e602052604090205460ff165b61205d5760405162461bcd60e51b815260040180806020018281038252602581526020018061349a6025913960400191505060405180910390fd5b60105460ff161561206d57600080fd5b6120778284612b86565b50600192915050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610da45780601f10610d7957610100808354040283529160200191610da4565b6001600160a01b038216331415612139576040805162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600c546001600160a01b031633146121f2576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600e602052604090205460ff1615612260576040805162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b6001600160a01b0381166122a9576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b600d805460018082019092557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384169081179091556000818152600e6020908152604091829020805460ff191685179055815192835282019290925281517f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf85533929181900390910190a150565b60105460009060ff161561235d57600080fd5b612077338484611476565b60105460009060ff161561237b57600080fd5b604051635827c1ff60e01b602080830182815230606081811b60248701526038860188905288901b6001600160601b03191660588601528851600095919388938a938c939192606c9091019184820191028083838c5b838110156123e95781810151838201526020016123d1565b5050505090500195505050505050604051602081830303815290604052805190602001209050600061241d828a8a8a611944565b600c549091506001600160a01b038083169116148061245457506001600160a01b0381166000908152600e602052604090205460ff165b6124a1576040805162461bcd60e51b815260206004820152601960248201527841646d696e2073686f756c64207369676e206d65737361676560381b604482015290519081900360640190fd5b6001600160a01b038116600090815260136020908152604080832087845290915290205460ff1661250e576040805162461bcd60e51b81526020600482015260126024820152711b9bdb98d948185b1c9958591e481d5cd95960721b604482015290519081900360640190fd5b60005b86518110156125325761252a86888381518110610fed57fe5b600101612511565b506001600160a01b031660009081526013602090815260408083208684529091529020805460ff191660019081179091559150509695505050505050565b8161257b3382612bd5565b6125bf576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b6125ca858585611032565b6125d685858585612f46565b61261e576040805162461bcd60e51b815260206004820152601460248201527314d8599948151c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b5050505050565b60105460009060ff161561263857600080fd5b60408051638cd4958960e01b60208083019190915230606090811b60248401526038830186905286901b6001600160601b0319166058830152606c80830188905283518084039091018152608c9092019092528051910120600061269e828a8a8a611944565b600c549091506001600160a01b03808316911614806126d557506001600160a01b0381166000908152600e602052604090205460ff165b612722576040805162461bcd60e51b815260206004820152601960248201527841646d696e2073686f756c64207369676e206d65737361676560381b604482015290519081900360640190fd5b6001600160a01b038116600090815260136020908152604080832087845290915290205460ff1661278f576040805162461bcd60e51b81526020600482015260126024820152711b9bdb98d948185b1c9958591e481d5cd95960721b604482015290519081900360640190fd5b6127998587612b86565b6001600160a01b031660009081526013602090815260408083208684529091529020805460ff191660019081179091559150509695505050505050565b600d81815481106127e357fe5b6000918252602090912001546001600160a01b0316905081565b60606128088261150b565b612850576040805162461bcd60e51b8152602060048201526014602482015273105cdcd95d08191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b600761285b8361306f565b60405160200180838054600181600116156101000203166002900480156128b95780601f106128975761010080835404028352918201916128b9565b820191906000526020600020905b8154815290600101906020018083116128a5575b5050825160208401908083835b602083106128e55780518252601f1990920191602091820191016128c6565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b600c546001600160a01b0316331461296c576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b806701b69b4be052fab1146129b7576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b604482015290519081900360640190fd5b33ff5b600c546001600160a01b03163314612a05576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a6557600080fd5b505af1158015612a79573d6000803e3d6000fd5b505050506040513d602081101561261e57600080fd5b60125460ff1681565b600c546000906001600160a01b03163314612ae6576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0383166000818152600f6020908152604091829020805460ff191686151590811790915582519384529083015280517f8e0072eb5b566b3db642c008c48eecb43223b42000750a06f59acbbc58580aed9281900390910190a150600192915050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60105460ff1681565b612b908282613133565b600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8015550565b600080612be183611874565b9050806001600160a01b0316846001600160a01b03161480612c1c5750836001600160a01b0316612c1184610daf565b6001600160a01b0316145b80611a565750611a568185612b4f565b816001600160a01b0316612c3f82611874565b6001600160a01b031614612c845760405162461bcd60e51b81526004018080602001828103825260248152602001806134bf6024913960400191505060405180910390fd5b6000818152600260205260409020546001600160a01b0316156119405760008181526002602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b612d0082826131b0565b6000818152600960209081526040808320546001600160a01b03861684526008909252822054909190612d3a90600163ffffffff61326b16565b6001600160a01b03851660009081526008602052604081208054929350909183908110612d6357fe5b906000526020600020015490508060086000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612da157fe5b60009182526020808320909101929092556001600160a01b0387168152600890915260408120805484908110612dd357fe5b60009182526020808320909101929092556001600160a01b0387168152600890915260409020805490612e0a906000198301613434565b50600093845260096020526040808520859055908452909220555050565b612e32828261327d565b6001600160a01b039091166000908152600860209081526040808320805460018101825590845282842081018590559383526009909152902055565b6000828201838110801590612e835750828110155b612e8957fe5b9392505050565b612e9a828261333f565b6000818152600b6020526040812054600a54909190612ec090600163ffffffff61326b16565b90506000600a8281548110612ed157fe5b9060005260206000200154905080600a8481548110612eec57fe5b90600052602060002001819055506000600a8381548110612f0957fe5b600091825260209091200155600a805490612f28906000198301613434565b506000938452600b6020526040808520859055908452909220555050565b6000612f5a846001600160a01b031661337d565b612f6657506001611a56565b60405163785cf2dd60e11b81526001600160a01b0386811660048301908152602483018690526060604484019081528551606485015285516000949389169363f0b9e5ba938b938a938a936084019060208501908083838d5b83811015612fd7578181015183820152602001612fbf565b50505050905090810190601f1680156130045780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561302557600080fd5b505af1158015613039573d6000803e3d6000fd5b505050506040513d602081101561304f57600080fd5b50516001600160e01b03191663785cf2dd60e11b14915050949350505050565b60608161309457506040805180820190915260018152600360fc1b6020820152610d13565b8160005b81156130ac57600101600a82049150613098565b6060816040519080825280601f01601f1916602001820160405280156130d9576020820181803883390190505b50859350905060001982015b831561312a57600a840660300160f81b8282806001900393508151811061310857fe5b60200101906001600160f81b031916908160001a905350600a840493506130e5565b50949350505050565b6001600160a01b03821661317c576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b6131868282612e28565b60405181906001600160a01b038416906000906000805160206134e3833981519152908290a45050565b816001600160a01b03166131c382611874565b6001600160a01b0316146132085760405162461bcd60e51b81526004018080602001828103825260248152602001806134bf6024913960400191505060405180910390fd5b6001600160a01b03821660009081526003602052604090205461323290600163ffffffff61326b16565b6001600160a01b0390921660009081526003602090815260408083209490945591815260019091522080546001600160a01b0319169055565b60008282111561327757fe5b50900390565b6000818152600160205260409020546001600160a01b0316156132de576040805162461bcd60e51b8152602060048201526014602482015273417373657420616c72656164792065786973747360601b604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b038816908117909155845260039091529091205461331f91612e6e565b6001600160a01b0390921660009081526003602052604090209190915550565b6133498282612c2c565b6133538282612cf6565b60405181906000906001600160a01b038516906000805160206134e3833981519152908390a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611a56575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106133f757805160ff1916838001178555613424565b82800160010185558215613424579182015b82811115613424578251825591602001919060010190613409565b5061343092915061345d565b5090565b8154818355818111156134585760008381526020902061345891810190830161345d565b505050565b610dac91905b80821115613430576000815560010161346356fe4e6f7420616c6c6f77656420746f206163636573732070726f7661626c6520666e734f6e6c79206f776e6572206f7220646570757479206f776e657220697320616c6c6f776564417373657420646f6573206e6f742062656c6f6e6720746f20676976656e206f776d6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000a265627a7a723158204d2badfcb522c45cd317df3a7766cccc8e25cc4a4847f7c78c88f3702501316c64736f6c63430005110032000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000019446f63746f722057686f202d20576f726c64732041706172740000000000000000000000000000000000000000000000000000000000000000000000000000044457574100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003968747470733a2f2f646f63746f7277686f2d776f726c647361706172742e636f6d2f647277686f2f61737365742f64657461696c732f69642f00000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102955760003560e01c806370a0823111610167578063a9059cbb116100ce578063d29a002511610087578063d29a002514610c36578063d493b9ac14610c53578063db738ee614610c89578063e724529c14610c91578063e985e9c514610cbf578063f3d4b94214610ced57610295565b8063a9059cbb14610a00578063a94b870614610a2c578063b88d4fde14610af1578063b89bba4214610bb5578063c400956a14610bfc578063c87b56dd14610c1957610295565b8063880cdc3111610120578063880cdc311461094a5780638da5cb5b1461097057806394bf804d1461097857806395d89b41146109a4578063a22cb465146109ac578063a33cdc41146109da57610295565b806370a082311461086657806376c16f991461088c5780637898278f146108b25780637d654c7f146108d15780638111f24e146108ee578063841321d91461091457610295565b80633cd86df81161020b5780635bdc12c6116101c45780635bdc12c6146106ce5780635dfd33d1146107175780636352211e1461074d578063655391c91461076a57806366618d181461080e5780636834e3a81461084057610295565b80633cd86df8146105ea57806342842e0e1461062257806342966c68146106585780634f558e79146106755780634f6ccce714610692578063587d0f66146106af57610295565b806315761f0e1161025d57806315761f0e146104dc57806318160ddd1461050257806319fa8f501461051c57806323b872dd14610541578063243cd059146105775780632f745c59146105be57610295565b806301ffc9a71461029a57806306fdde03146102d5578063081812fc14610352578063095ea7b31461038b5780631505780e146103b9575b600080fd5b6102c1600480360360208110156102b057600080fd5b50356001600160e01b031916610cf5565b604080519115158252519081900360200190f35b6102dd610d18565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103175781810151838201526020016102ff565b50505050905090810190601f1680156103445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036f6004803603602081101561036857600080fd5b5035610daf565b604080516001600160a01b039092168252519081900360200190f35b6103b7600480360360408110156103a157600080fd5b506001600160a01b038135169060200135610dca565b005b6102c1600480360360408110156103cf57600080fd5b810190602081018135600160201b8111156103e957600080fd5b8201836020820111156103fb57600080fd5b803590602001918460208302840111600160201b8311171561041c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561046b57600080fd5b82018360208201111561047d57600080fd5b803590602001918460208302840111600160201b8311171561049e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610f01945050505050565b6102c1600480360360208110156104f257600080fd5b50356001600160a01b031661100c565b61050a611021565b60408051918252519081900360200190f35b610524611027565b604080516001600160e01b03199092168252519081900360200190f35b6103b76004803603606081101561055757600080fd5b506001600160a01b03813581169160208101359091169060400135611032565b6103b7600480360360c081101561058d57600080fd5b5080359060208101359060408101359060ff606082013516906001600160a01b036080820135169060a00135611166565b61050a600480360360408110156105d457600080fd5b506001600160a01b03813516906020013561137b565b61050a6004803603606081101561060057600080fd5b506001600160a01b038135811691602081013590911690604001351515611400565b6103b76004803603606081101561063857600080fd5b506001600160a01b03813581169160208101359091169060400135611476565b6102c16004803603602081101561066e57600080fd5b50356114e6565b6102c16004803603602081101561068b57600080fd5b503561150b565b61050a600480360360208110156106a857600080fd5b5035611528565b6103b7600480360360208110156106c557600080fd5b50351515611594565b6103b7600480360360c08110156106e457600080fd5b5080359060208101359060408101359060ff606082013516906001600160a01b036080820135169060a0013515156115f2565b6103b76004803603606081101561072d57600080fd5b506001600160a01b038135811691602081013590911690604001356117b4565b61036f6004803603602081101561076357600080fd5b5035611874565b6103b76004803603602081101561078057600080fd5b810190602081018135600160201b81111561079a57600080fd5b8201836020820111156107ac57600080fd5b803590602001918460018302840111600160201b831117156107cd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118d2945050505050565b61036f6004803603608081101561082457600080fd5b508035906020810135906040810135906060013560ff16611944565b61050a6004803603602081101561085657600080fd5b50356001600160a01b0316611a5e565b61050a6004803603602081101561087c57600080fd5b50356001600160a01b0316611a79565b6103b7600480360360208110156108a257600080fd5b50356001600160a01b0316611ae0565b6102c1600480360360208110156108c857600080fd5b50351515611ce4565b6103b7600480360360208110156108e757600080fd5b5035611d7e565b6102c16004803603602081101561090457600080fd5b50356001600160a01b0316611e5e565b61050a6004803603606081101561092a57600080fd5b506001600160a01b03813581169160208101359091169060400135611e7c565b6103b76004803603602081101561096057600080fd5b50356001600160a01b0316611ef0565b61036f611fe8565b6102c16004803603604081101561098e57600080fd5b50803590602001356001600160a01b0316611ff7565b6102dd612080565b6103b7600480360360408110156109c257600080fd5b506001600160a01b03813516906020013515156120e1565b6103b7600480360360208110156109f057600080fd5b50356001600160a01b03166121a7565b6102c160048036036040811015610a1657600080fd5b506001600160a01b03813516906020013561234a565b6102c1600480360360c0811015610a4257600080fd5b81359160208101359160ff6040830135169190810190608081016060820135600160201b811115610a7257600080fd5b820183602082011115610a8457600080fd5b803590602001918460208302840111600160201b83111715610aa557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b038335169350505060200135612368565b6103b760048036036080811015610b0757600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610b4157600080fd5b820183602082011115610b5357600080fd5b803590602001918460018302840111600160201b83111715610b7457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612570945050505050565b6102c1600480360360c0811015610bcb57600080fd5b5080359060208101359060ff604082013516906060810135906001600160a01b036080820135169060a00135612625565b61036f60048036036020811015610c1257600080fd5b50356127d6565b6102dd60048036036020811015610c2f57600080fd5b50356127fd565b6103b760048036036020811015610c4c57600080fd5b5035612921565b6103b760048036036060811015610c6957600080fd5b506001600160a01b038135811691602081013590911690604001356129ba565b6102c1612a8f565b6102c160048036036040811015610ca757600080fd5b506001600160a01b0381351690602001351515612a98565b6102c160048036036040811015610cd557600080fd5b506001600160a01b0381358116916020013516612b4f565b6102c1612b7d565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610da45780601f10610d7957610100808354040283529160200191610da4565b820191906000526020600020905b815481529060010190602001808311610d8757829003601f168201915b505050505090505b90565b6000908152600260205260409020546001600160a01b031690565b6000610dd582611874565b9050806001600160a01b0316836001600160a01b03161415610e38576040805162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b604482015290519081900360640190fd5b336001600160a01b0382161480610e545750610e548133612b4f565b610ea5576040805162461bcd60e51b815260206004820152601f60248201527f4e6f7420616c6c6f77656420746f2075706461746520617070726f76616c7300604482015290519081900360640190fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600c546000906001600160a01b0316331480610f2c5750336000908152600e602052604090205460ff165b610f675760405162461bcd60e51b815260040180806020018281038252602581526020018061349a6025913960400191505060405180910390fd5b60105460ff1615610f7757600080fd5b8151835114610fbe576040805162461bcd60e51b815260206004820152600e60248201526d496e76616c696420706172616d7360901b604482015290519081900360640190fd5b60005b835181101561100257610ffa838281518110610fd957fe5b6020026020010151858381518110610fed57fe5b6020026020010151612b86565b600101610fc1565b5060019392505050565b600e6020526000908152604090205460ff1681565b600a5490565b6301ffc9a760e01b81565b8061103d3382612bd5565b611081576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b6001600160a01b0384166110ca576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b6001600160a01b038316611113576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b61111d8483612c2c565b6111278483612cf6565b6111318383612e28565b81836001600160a01b0316856001600160a01b03166000805160206134e383398151915260405160405180910390a450505050565b60105460ff161561117657600080fd5b60125460ff16806111915750600c546001600160a01b031633145b806111ab5750336000908152600e602052604090205460ff165b6111e65760405162461bcd60e51b81526004018080602001828103825260228152602001806134786022913960400191505060405180910390fd5b60006111f487878787611944565b90506001600160a01b038116611242576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b4b3b732b960911b604482015290519081900360640190fd5b600061124f828585611e7c565b9050878114611295576040805162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015290519081900360640190fd5b6001600160a01b0384166112de576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b6112e88284612c2c565b6112f28284612cf6565b6112fc8484612e28565b82846001600160a01b0316836001600160a01b03166000805160206134e383398151915260405160405180910390a46001600160a01b03821660009081526011602052604090205461135590600163ffffffff612e6e16565b6001600160a01b0390921660009081526011602052604090209190915550505050505050565b600061138683611a79565b82106113c9576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6001600160a01b03831660009081526008602052604090208054839081106113ed57fe5b9060005260206000200154905092915050565b6001600160a01b0392909216600090815260116020908152604091829020548251635d6a647560e11b8184015230606090811b6024830152603882019290925293901b6001600160601b031916605884015292151560f81b606c8301528051808303604d018152606d9092019052805191012090565b806114813382612bd5565b6114c5576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b6114e084848460405180602001604052806000815250612570565b50505050565b60105460009060ff16156114f957600080fd5b6115033383612e90565b506001919050565b6000908152600160205260409020546001600160a01b0316151590565b6000611532611021565b8210611575576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b600a828154811061158257fe5b90600052602060002001549050919050565b600c546001600160a01b031633146115df576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6012805460ff1916911515919091179055565b60105460ff161561160257600080fd5b60125460ff168061161d5750600c546001600160a01b031633145b806116375750336000908152600e602052604090205460ff165b6116725760405162461bcd60e51b81526004018080602001828103825260228152602001806134786022913960400191505060405180910390fd5b600061168087878787611944565b90506001600160a01b0381166116ce576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b4b3b732b960911b604482015290519081900360640190fd5b60006116db828585611400565b9050878114611721576040805162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015290519081900360640190fd5b6001600160a01b03828116600081815260046020908152604080832094891680845294825291829020805460ff1916881515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a36001600160a01b03821660009081526011602052604090205461135590600163ffffffff612e6e16565b600c546001600160a01b031633146117ff576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60408051632142170760e11b81523060048201526001600160a01b038481166024830152604482018490529151918516916342842e0e9160648082019260009290919082900301818387803b15801561185757600080fd5b505af115801561186b573d6000803e3d6000fd5b50505050505050565b6000818152600160205260408120546001600160a01b0316806118cc576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b92915050565b600c546001600160a01b0316331461191d576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60105460ff161561192d57600080fd5b80516119409060079060208401906133b6565b5050565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020018083805190602001908083835b602083106119b65780518252601f199092019160209182019101611997565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815284830180835281519184019190912060009182905282860180845281905260ff8b166060870152608086018d905260a086018c90529151919650945060019360c08082019450601f19830192918290030190855afa158015611a45573d6000803e3d6000fd5b5050604051601f1901519450505050505b949350505050565b6001600160a01b031660009081526011602052604090205490565b60006001600160a01b038216611ac4576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b506001600160a01b031660009081526003602052604090205490565b600c546001600160a01b03163314611b2b576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600e602052604090205460ff16611b98576040805162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220646f6573206e6f742065786974730000000000604482015290519081900360640190fd5b6000805b600d54811015611be457826001600160a01b0316600d8281548110611bbd57fe5b6000918252602090912001546001600160a01b03161415611bdc578091505b600101611b9c565b50600d80546000198101908110611bf757fe5b600091825260209091200154600d80546001600160a01b039092169183908110611c1d57fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600d80546000198101908110611c5857fe5b600091825260209091200180546001600160a01b0319169055600d805490611c84906000198301613434565b506001600160a01b0382166000818152600e60209081526040808320805460ff1916905580519384529083019190915280517f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf855339281900390910190a15050565b600c546000906001600160a01b03163314611d32576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6010805483151560ff19909116811790915560408051918252517f20cab5a89e9642fc2f3e47bcd2c27f01489aa2e5f76f1a2e673d2e1358dbfdf59181900360200190a1506001919050565b600c546001600160a01b03163314611dc9576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b8063075bcd1514611e10576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b604482015290519081900360640190fd5b600c80546001600160a01b0319169055604080513381526000602082015281517f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d929181900390910190a150565b6001600160a01b03166000908152600f602052604090205460ff1690565b6001600160a01b039290921660009081526011602090815260409182902054825163b483afd360e01b8184015230606090811b6024830152603882019290925293901b6001600160601b0319166058840152606c8084019490945281518084039094018452608c9092019052815191012090565b600c546001600160a01b03163314611f3b576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b038116611f88576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0383811691909117918290556040805133815292909116602083015280517f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d9281900390910190a150565b600c546001600160a01b031681565b600c546000906001600160a01b03163314806120225750336000908152600e602052604090205460ff165b61205d5760405162461bcd60e51b815260040180806020018281038252602581526020018061349a6025913960400191505060405180910390fd5b60105460ff161561206d57600080fd5b6120778284612b86565b50600192915050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610da45780601f10610d7957610100808354040283529160200191610da4565b6001600160a01b038216331415612139576040805162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600c546001600160a01b031633146121f2576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600e602052604090205460ff1615612260576040805162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b6001600160a01b0381166122a9576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b600d805460018082019092557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384169081179091556000818152600e6020908152604091829020805460ff191685179055815192835282019290925281517f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf85533929181900390910190a150565b60105460009060ff161561235d57600080fd5b612077338484611476565b60105460009060ff161561237b57600080fd5b604051635827c1ff60e01b602080830182815230606081811b60248701526038860188905288901b6001600160601b03191660588601528851600095919388938a938c939192606c9091019184820191028083838c5b838110156123e95781810151838201526020016123d1565b5050505090500195505050505050604051602081830303815290604052805190602001209050600061241d828a8a8a611944565b600c549091506001600160a01b038083169116148061245457506001600160a01b0381166000908152600e602052604090205460ff165b6124a1576040805162461bcd60e51b815260206004820152601960248201527841646d696e2073686f756c64207369676e206d65737361676560381b604482015290519081900360640190fd5b6001600160a01b038116600090815260136020908152604080832087845290915290205460ff1661250e576040805162461bcd60e51b81526020600482015260126024820152711b9bdb98d948185b1c9958591e481d5cd95960721b604482015290519081900360640190fd5b60005b86518110156125325761252a86888381518110610fed57fe5b600101612511565b506001600160a01b031660009081526013602090815260408083208684529091529020805460ff191660019081179091559150509695505050505050565b8161257b3382612bd5565b6125bf576040805162461bcd60e51b815260206004820152601060248201526f21b0b7103737ba103a3930b739b332b960811b604482015290519081900360640190fd5b6125ca858585611032565b6125d685858585612f46565b61261e576040805162461bcd60e51b815260206004820152601460248201527314d8599948151c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b5050505050565b60105460009060ff161561263857600080fd5b60408051638cd4958960e01b60208083019190915230606090811b60248401526038830186905286901b6001600160601b0319166058830152606c80830188905283518084039091018152608c9092019092528051910120600061269e828a8a8a611944565b600c549091506001600160a01b03808316911614806126d557506001600160a01b0381166000908152600e602052604090205460ff165b612722576040805162461bcd60e51b815260206004820152601960248201527841646d696e2073686f756c64207369676e206d65737361676560381b604482015290519081900360640190fd5b6001600160a01b038116600090815260136020908152604080832087845290915290205460ff1661278f576040805162461bcd60e51b81526020600482015260126024820152711b9bdb98d948185b1c9958591e481d5cd95960721b604482015290519081900360640190fd5b6127998587612b86565b6001600160a01b031660009081526013602090815260408083208684529091529020805460ff191660019081179091559150509695505050505050565b600d81815481106127e357fe5b6000918252602090912001546001600160a01b0316905081565b60606128088261150b565b612850576040805162461bcd60e51b8152602060048201526014602482015273105cdcd95d08191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b600761285b8361306f565b60405160200180838054600181600116156101000203166002900480156128b95780601f106128975761010080835404028352918201916128b9565b820191906000526020600020905b8154815290600101906020018083116128a5575b5050825160208401908083835b602083106128e55780518252601f1990920191602091820191016128c6565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b600c546001600160a01b0316331461296c576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b806701b69b4be052fab1146129b7576040805162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b604482015290519081900360640190fd5b33ff5b600c546001600160a01b03163314612a05576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a6557600080fd5b505af1158015612a79573d6000803e3d6000fd5b505050506040513d602081101561261e57600080fd5b60125460ff1681565b600c546000906001600160a01b03163314612ae6576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b0383166000818152600f6020908152604091829020805460ff191686151590811790915582519384529083015280517f8e0072eb5b566b3db642c008c48eecb43223b42000750a06f59acbbc58580aed9281900390910190a150600192915050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60105460ff1681565b612b908282613133565b600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8015550565b600080612be183611874565b9050806001600160a01b0316846001600160a01b03161480612c1c5750836001600160a01b0316612c1184610daf565b6001600160a01b0316145b80611a565750611a568185612b4f565b816001600160a01b0316612c3f82611874565b6001600160a01b031614612c845760405162461bcd60e51b81526004018080602001828103825260248152602001806134bf6024913960400191505060405180910390fd5b6000818152600260205260409020546001600160a01b0316156119405760008181526002602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b612d0082826131b0565b6000818152600960209081526040808320546001600160a01b03861684526008909252822054909190612d3a90600163ffffffff61326b16565b6001600160a01b03851660009081526008602052604081208054929350909183908110612d6357fe5b906000526020600020015490508060086000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612da157fe5b60009182526020808320909101929092556001600160a01b0387168152600890915260408120805484908110612dd357fe5b60009182526020808320909101929092556001600160a01b0387168152600890915260409020805490612e0a906000198301613434565b50600093845260096020526040808520859055908452909220555050565b612e32828261327d565b6001600160a01b039091166000908152600860209081526040808320805460018101825590845282842081018590559383526009909152902055565b6000828201838110801590612e835750828110155b612e8957fe5b9392505050565b612e9a828261333f565b6000818152600b6020526040812054600a54909190612ec090600163ffffffff61326b16565b90506000600a8281548110612ed157fe5b9060005260206000200154905080600a8481548110612eec57fe5b90600052602060002001819055506000600a8381548110612f0957fe5b600091825260209091200155600a805490612f28906000198301613434565b506000938452600b6020526040808520859055908452909220555050565b6000612f5a846001600160a01b031661337d565b612f6657506001611a56565b60405163785cf2dd60e11b81526001600160a01b0386811660048301908152602483018690526060604484019081528551606485015285516000949389169363f0b9e5ba938b938a938a936084019060208501908083838d5b83811015612fd7578181015183820152602001612fbf565b50505050905090810190601f1680156130045780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561302557600080fd5b505af1158015613039573d6000803e3d6000fd5b505050506040513d602081101561304f57600080fd5b50516001600160e01b03191663785cf2dd60e11b14915050949350505050565b60608161309457506040805180820190915260018152600360fc1b6020820152610d13565b8160005b81156130ac57600101600a82049150613098565b6060816040519080825280601f01601f1916602001820160405280156130d9576020820181803883390190505b50859350905060001982015b831561312a57600a840660300160f81b8282806001900393508151811061310857fe5b60200101906001600160f81b031916908160001a905350600a840493506130e5565b50949350505050565b6001600160a01b03821661317c576040805162461bcd60e51b81526020600482015260186024820152600080516020613503833981519152604482015290519081900360640190fd5b6131868282612e28565b60405181906001600160a01b038416906000906000805160206134e3833981519152908290a45050565b816001600160a01b03166131c382611874565b6001600160a01b0316146132085760405162461bcd60e51b81526004018080602001828103825260248152602001806134bf6024913960400191505060405180910390fd5b6001600160a01b03821660009081526003602052604090205461323290600163ffffffff61326b16565b6001600160a01b0390921660009081526003602090815260408083209490945591815260019091522080546001600160a01b0319169055565b60008282111561327757fe5b50900390565b6000818152600160205260409020546001600160a01b0316156132de576040805162461bcd60e51b8152602060048201526014602482015273417373657420616c72656164792065786973747360601b604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b038816908117909155845260039091529091205461331f91612e6e565b6001600160a01b0390921660009081526003602052604090209190915550565b6133498282612c2c565b6133538282612cf6565b60405181906000906001600160a01b038516906000805160206134e3833981519152908390a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611a56575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106133f757805160ff1916838001178555613424565b82800160010185558215613424579182015b82811115613424578251825591602001919060010190613409565b5061343092915061345d565b5090565b8154818355818111156134585760008381526020902061345891810190830161345d565b505050565b610dac91905b80821115613430576000815560010161346356fe4e6f7420616c6c6f77656420746f206163636573732070726f7661626c6520666e734f6e6c79206f776e6572206f7220646570757479206f776e657220697320616c6c6f776564417373657420646f6573206e6f742062656c6f6e6720746f20676976656e206f776d6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000a265627a7a723158204d2badfcb522c45cd317df3a7766cccc8e25cc4a4847f7c78c88f3702501316c64736f6c63430005110032

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000019446f63746f722057686f202d20576f726c64732041706172740000000000000000000000000000000000000000000000000000000000000000000000000000044457574100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003968747470733a2f2f646f63746f7277686f2d776f726c647361706172742e636f6d2f647277686f2f61737365742f64657461696c732f69642f00000000000000

-----Decoded View---------------
Arg [0] : name (string): Doctor Who - Worlds Apart
Arg [1] : symbol (string): DWWA
Arg [2] : baseURI (string): https://doctorwho-worldsapart.com/drwho/asset/details/id/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [4] : 446f63746f722057686f202d20576f726c647320417061727400000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4457574100000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000039
Arg [8] : 68747470733a2f2f646f63746f7277686f2d776f726c647361706172742e636f
Arg [9] : 6d2f647277686f2f61737365742f64657461696c732f69642f00000000000000


Deployed Bytecode Sourcemap

221:2626:17:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;221:2626:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;842:148:16;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;842:148:16;-1:-1:-1;;;;;;842:148:16;;:::i;:::-;;;;;;;;;;;;;;;;;;2148:79:11;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2148:79:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4921:113:7;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4921:113:7;;:::i;:::-;;;;-1:-1:-1;;;;;4921:113:7;;;;;;;;;;;;;;4341:346;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4341:346:7;;;;;;;;:::i;:::-;;1213:318:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1213:318:1;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;1213:318:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1213:318:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;1213:318:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;1213:318:1;;;;;;;;-1:-1:-1;1213:318:1;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;1213:318:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1213:318:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;1213:318:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;1213:318:1;;-1:-1:-1;1213:318:1;;-1:-1:-1;;;;;1213:318:1:i;114:45:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;114:45:13;-1:-1:-1;;;;;114:45:13;;:::i;3570:89:11:-;;;:::i;:::-;;;;;;;;;;;;;;;;273:54:16;;;:::i;:::-;;;;-1:-1:-1;;;;;;273:54:16;;;;;;;;;;;;;;6480:418:7;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6480:418:7;;;;;;;;;;;;;;;;;:::i;2542:728:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;2542:728:2;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2542:728:2;;;;;;;;;;:::i;3192:230:11:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3192:230:11;;;;;;;;:::i;4583:325:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4583:325:2;;;;;;;;;;;;;;;;;;;:::i;7520:239:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7520:239:7;;;;;;;;;;;;;;;;;:::i;2049:141:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2049:141:1;;:::i;3783:143:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3783:143:7;;:::i;3991:160:11:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3991:160:11;;:::i;955:108:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;955:108:2;;;;:::i;1501:626::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;1501:626:2;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1501:626:2;;;;;;;;;;;;:::i;5682:186::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5682:186:2;;;;;;;;;;;;;;;;;:::i;3402:196:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3402:196:7;;:::i;660:139:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;660:139:1;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;660:139:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;660:139:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;660:139:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;660:139:1;;-1:-1:-1;660:139:1;;-1:-1:-1;;;;;660:139:1:i;3493:313:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;3493:313:2;;;;;;;;;;;;;;;;;;;:::i;4982:98::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4982:98:2;-1:-1:-1;;;;;4982:98:2;;:::i;3009:173:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3009:173:7;-1:-1:-1;;;;;3009:173:7;;:::i;1901:566:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1901:566:13;-1:-1:-1;;;;;1901:566:13;;:::i;1102:190:12:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1102:190:12;;;;:::i;2700:217:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2700:217:13;;:::i;1499:119:12:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1499:119:12;-1:-1:-1;;;;;1499:119:12;;:::i;4037:265:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4037:265:2;;;;;;;;;;;;;;;;;:::i;850:207:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;850:207:13;-1:-1:-1;;;;;850:207:13;;:::i;53:20::-;;;:::i;1034:173:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1034:173:1;;;;;;-1:-1:-1;;;;;1034:173:1;;:::i;2331:83:11:-;;;:::i;5322:236:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5322:236:7;;;;;;;;;;:::i;1334:320:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1334:320:13;-1:-1:-1;;;;;1334:320:13;;:::i;1776:181:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1776:181:1;;;;;;;;:::i;2079:761:17:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;2079:761:17;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;2079:761:17;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2079:761:17;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;2079:761:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2079:761:17;;-1:-1:-1;;;;;;;2079:761:17;;;;-1:-1:-1;;;2079:761:17;;;;:::i;8447:345:7:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;8447:345:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;8447:345:7;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8447:345:7;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;8447:345:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;8447:345:7;;-1:-1:-1;8447:345:7;;-1:-1:-1;;;;;8447:345:7:i;925:687:17:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;925:687:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;925:687:17;;;;;;;;;;:::i;78:29:13:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78:29:13;;:::i;2609:214:11:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2609:214:11;;:::i;6177:197:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6177:197:2;;:::i;5305:162::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5305:162:2;;;;;;;;;;;;;;;;;:::i;366:31::-;;;:::i;701:193:12:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;701:193:12;;;;;;;;;;:::i;5875:177:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5875:177:7;;;;;;;;;;:::i;140:35:12:-;;;:::i;842:148:16:-;-1:-1:-1;;;;;;951:33:16;;928:4;951:33;;;;;;;;;;;;;842:148;;;;:::o;2148:79:11:-;2216:5;2209:12;;;;;;;;-1:-1:-1;;2209:12:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2187:13;;2209:12;;2216:5;;2209:12;;2216:5;2209:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2148:79;;:::o;4921:113:7:-;4981:7;5004:24;;;:14;:24;;;;;;-1:-1:-1;;;;;5004:24:7;;4921:113::o;4341:346::-;4403:13;4419:17;4427:8;4419:7;:17::i;:::-;4403:33;;4458:5;-1:-1:-1;;;;;4451:12:7;:3;-1:-1:-1;;;;;4451:12:7;;;4443:48;;;;;-1:-1:-1;;;4443:48:7;;;;;;;;;;;;-1:-1:-1;;;4443:48:7;;;;;;;;;;;;;;;4506:10;-1:-1:-1;;;;;4506:19:7;;;;:58;;;4529:35;4546:5;4553:10;4529:16;:35::i;:::-;4498:102;;;;;-1:-1:-1;;;4498:102:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;4609:24;;;;:14;:24;;;;;;:30;;-1:-1:-1;;;;;;4609:30:7;-1:-1:-1;;;;;4609:30:7;;;;;;;;;4651;;4609:24;;4651:30;;;;;;;4341:346;;;:::o;1213:318:1:-;527:5:13;;1348:4:1;;-1:-1:-1;;;;;527:5:13;513:10;:19;;:48;;-1:-1:-1;550:10:13;536:25;;;;:13;:25;;;;;;;;513:48;505:98;;;;-1:-1:-1;;;505:98:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;459:15:12;;;;458:16;450:25;;;;;;1387:6:1;:13;1372:4;:11;:28;1364:55;;;;;-1:-1:-1;;;1364:55:1;;;;;;;;;;;;-1:-1:-1;;;1364:55:1;;;;;;;;;;;;;;;1430:6;1426:82;1442:4;:11;1440:1;:13;1426:82;;;1469:31;1481:6;1488:1;1481:9;;;;;;;;;;;;;;1492:4;1497:1;1492:7;;;;;;;;;;;;;;1469:11;:31::i;:::-;1455:3;;1426:82;;;-1:-1:-1;1521:4:1;;1213:318;-1:-1:-1;;;1213:318:1:o;114:45:13:-;;;;;;;;;;;;;;;:::o;3570:89:11:-;3637:9;:16;3570:89;:::o;273:54:16:-;-1:-1:-1;;;273:54:16;:::o;6480:418:7:-;6597:8;2525:39;2543:10;2555:8;2525:17;:39::i;:::-;2517:68;;;;;-1:-1:-1;;;2517:68:7;;;;;;;;;;;;-1:-1:-1;;;2517:68:7;;;;;;;;;;;;;;;-1:-1:-1;;;;;6629:19:7;;6621:56;;;;;-1:-1:-1;;;6621:56:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6621:56:7;;;;;;;;;;;;;;;-1:-1:-1;;;;;6692:17:7;;6684:54;;;;;-1:-1:-1;;;6684:54:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6684:54:7;;;;;;;;;;;;;;;6747:30;6761:5;6768:8;6747:13;:30::i;:::-;6784:32;6800:5;6807:8;6784:15;:32::i;:::-;6823:25;6834:3;6839:8;6823:10;:25::i;:::-;6883:8;6878:3;-1:-1:-1;;;;;6862:30:7;6871:5;-1:-1:-1;;;;;6862:30:7;-1:-1:-1;;;;;;;;;;;6862:30:7;;;;;;;;;6480:418;;;;:::o;2542:728:2:-;459:15:12;;;;458:16;450:25;;;;;;667:19:2;;;;;:42;;-1:-1:-1;704:5:2;;-1:-1:-1;;;;;704:5:2;690:10;:19;667:42;:71;;;-1:-1:-1;727:10:2;713:25;;;;:13;:25;;;;;;;;667:71;659:118;;;;-1:-1:-1;;;659:118:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2721:14;2738:27;2748:7;2757:1;2760;2763;2738:9;:27::i;:::-;2721:44;-1:-1:-1;;;;;;2781:20:2;;2772:47;;;;;-1:-1:-1;;;2772:47:2;;;;;;;;;;;;-1:-1:-1;;;2772:47:2;;;;;;;;;;;;;;;2828:13;2844:39;2863:6;2871:2;2875:7;2844:18;:39::i;:::-;2828:55;;2908:7;2899:5;:16;2890:43;;;;;-1:-1:-1;;;2890:43:2;;;;;;;;;;;;-1:-1:-1;;;2890:43:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;2988:16:2;;2980:53;;;;;-1:-1:-1;;;2980:53:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2980:53:2;;;;;;;;;;;;;;;3040:30;3054:6;3062:7;3040:13;:30::i;:::-;3077:32;3093:6;3101:7;3077:15;:32::i;:::-;3116:23;3127:2;3131:7;3116:10;:23::i;:::-;3172:7;3168:2;-1:-1:-1;;;;;3151:29:2;3160:6;-1:-1:-1;;;;;3151:29:2;-1:-1:-1;;;;;;;;;;;3151:29:2;;;;;;;;;-1:-1:-1;;;;;3240:17:2;;;;;;:9;:17;;;;;;:24;;3262:1;3240:24;:21;:24;:::i;:::-;-1:-1:-1;;;;;3220:17:2;;;;;;;:9;:17;;;;;:44;;;;-1:-1:-1;;;;;;;2542:728:2:o;3192:230:11:-;3304:7;3340:17;3350:6;3340:9;:17::i;:::-;3331:6;:26;3323:52;;;;;-1:-1:-1;;;3323:52:11;;;;;;;;;;;;-1:-1:-1;;;3323:52:11;;;;;;;;;;;;;;;-1:-1:-1;;;;;3389:19:11;;;;;;:11;:19;;;;;:27;;3409:6;;3389:27;;;;;;;;;;;;;;3382:34;;3192:230;;;;:::o;4583:325:2:-;-1:-1:-1;;;;;4825:17:2;;;;4706:7;4825:17;;;:9;:17;;;;;;;;;;4751:131;;-1:-1:-1;;;4751:131:2;;;;4811:4;4751:131;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4751:131:2;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;4751:131:2;;;;;;4741:142;;;;;;4583:325::o;7520:239:7:-;7641:8;2525:39;2543:10;2555:8;2525:17;:39::i;:::-;2517:68;;;;;-1:-1:-1;;;2517:68:7;;;;;;;;;;;;-1:-1:-1;;;2517:68:7;;;;;;;;;;;;;;;7711:42;7728:5;7735:3;7740:8;7711:42;;;;;;;;;;;;:16;:42::i;:::-;7520:239;;;;:::o;2049:141:1:-;459:15:12;;2122:4:1;;459:15:12;;458:16;450:25;;;;;;2138:28:1;2150:10;2162:3;2138:11;:28::i;:::-;-1:-1:-1;2180:4:1;2049:141;;;:::o;3783:143:7:-;3838:4;3867:20;;;:10;:20;;;;;;-1:-1:-1;;;;;3867:20:7;3901:19;;;3783:143::o;3991:160:11:-;4050:7;4083:13;:11;:13::i;:::-;4074:6;:22;4066:48;;;;;-1:-1:-1;;;4066:48:11;;;;;;;;;;;;-1:-1:-1;;;4066:48:11;;;;;;;;;;;;;;;4128:9;4138:6;4128:17;;;;;;;;;;;;;;;;4121:24;;3991:160;;;:::o;955:108:2:-;430:5:13;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;1030:19:2;:27;;-1:-1:-1;;1030:27:2;;;;;;;;;;955:108::o;1501:626::-;459:15:12;;;;458:16;450:25;;;;;;667:19:2;;;;;:42;;-1:-1:-1;704:5:2;;-1:-1:-1;;;;;704:5:2;690:10;:19;667:42;:71;;;-1:-1:-1;727:10:2;713:25;;;;:13;:25;;;;;;;;667:71;659:118;;;;-1:-1:-1;;;659:118:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1694:14;1711:27;1721:7;1730:1;1733;1736;1711:9;:27::i;:::-;1694:44;-1:-1:-1;;;;;;1754:20:2;;1745:48;;;;;-1:-1:-1;;;1745:48:2;;;;;;;;;;;;-1:-1:-1;;;1745:48:2;;;;;;;;;;;;;;;1802:13;1818:54;1846:6;1854:7;1863:8;1818:27;:54::i;:::-;1802:70;;1896:7;1887:5;:16;1879:42;;;;;-1:-1:-1;;;1879:42:2;;;;;;;;;;;;-1:-1:-1;;;1879:42:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;1972:25:2;;;;;;;:17;:25;;;;;;;;:34;;;;;;;;;;;;;:45;;-1:-1:-1;;1972:45:2;;;;;;;;;;2029:41;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2097:17:2;;;;;;:9;:17;;;;;;:24;;2119:1;2097:24;:21;:24;:::i;5682:186::-;430:5:13;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;5789:73:2;;;-1:-1:-1;;;5789:73:2;;5843:4;5789:73;;;;-1:-1:-1;;;;;5789:73:2;;;;;;;;;;;;;;;:45;;;;;;:73;;;;;-1:-1:-1;;5789:73:2;;;;;;;;-1:-1:-1;5789:45:2;:73;;;5:2:-1;;;;30:1;27;20:12;5:2;5789:73:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5789:73:2;;;;5682:186;;;:::o;3402:196:7:-;3458:7;3490:20;;;:10;:20;;;;;;-1:-1:-1;;;;;3490:20:7;3525:19;3517:56;;;;;-1:-1:-1;;;3517:56:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3517:56:7;;;;;;;;;;;;;;;3587:5;3402:196;-1:-1:-1;;3402:196:7:o;660:139:1:-;430:5:13;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;459:15:12;;;;458:16;450:25;;;;;;771:22:1;;;;:12;;:22;;;;;:::i;:::-;;660:139;:::o;3493:313:2:-;3582:7;3597:19;:56;;;;;;;;;;;;;;;;;;;3660:20;3710:6;3718:7;3693:33;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;3693::2;;;;;-1:-1:-1;3693:33:2;;;26:21:-1;;;6:49;;3693:33:2;;;;;;3683:44;;;;;;;;;-1:-1:-1;3751:29:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3683:44;;-1:-1:-1;;;274:1;;3751:29:2;;;;;-1:-1:-1;;;3751:29:2;;;;;;;;;274:1:-1;3751:29:2;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;3751:29:2;;-1:-1:-1;;3751:29:2;;;-1:-1:-1;;;;;3493:313:2;;;;;;;:::o;4982:98::-;-1:-1:-1;;;;;5059:15:2;5039:4;5059:15;;;:9;:15;;;;;;;4982:98::o;3009:173:7:-;3065:7;-1:-1:-1;;;;;3089:20:7;;3081:57;;;;;-1:-1:-1;;;3081:57:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3081:57:7;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3152:24:7;;;;;:16;:24;;;;;;;3009:173::o;1901:566:13:-;430:5;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;1994:26:13;;;;;;:13;:26;;;;;;;;1986:66;;;;;-1:-1:-1;;;1986:66:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;2059:15;;2081:106;2097:12;:19;2095:21;;2081:106;;;2154:11;-1:-1:-1;;;;;2135:30:13;:12;2148:1;2135:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2135:15:13;:30;2132:47;;;2178:1;2167:12;;2132:47;2118:3;;2081:106;;;-1:-1:-1;2258:12:13;2271:19;;-1:-1:-1;;2271:21:13;;;2258:35;;;;;;;;;;;;;;;;2231:12;:24;;-1:-1:-1;;;;;2258:35:13;;;;2244:10;;2231:24;;;;;;;;;;;;;;;:62;;-1:-1:-1;;;;;;2231:62:13;-1:-1:-1;;;;;2231:62:13;;;;;;;;;;2307:12;2320:19;;-1:-1:-1;;2320:21:13;;;2307:35;;;;;;;;;;;;;;;2300:42;;-1:-1:-1;;;;;;2300:42:13;;;2349:12;:21;;;;;-1:-1:-1;;2349:21:13;;;:::i;:::-;-1:-1:-1;;;;;;2377:26:13;;2406:5;2377:26;;;:13;:26;;;;;;;;:34;;-1:-1:-1;;2377:34:13;;;2423:38;;;;;;;;;;;;;;;;;;;;;;;;456:1;1901:566;:::o;1102:190:12:-;430:5:13;;1178:4:12;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;1195:15:12;:25;;;;;-1:-1:-1;;1195:25:12;;;;;;;;1236:26;;;;;;;;;;;;;;;;-1:-1:-1;1280:4:12;1102:190;;;:::o;2700:217:13:-;430:5;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;2794:15;2813:9;2794:28;2786:53;;;;;-1:-1:-1;;;2786:53:13;;;;;;;;;;;;-1:-1:-1;;;2786:53:13;;;;;;;;;;;;;;;2846:5;:18;;-1:-1:-1;;;;;;2846:18:13;;;2876:35;;;2893:10;2876:35;;2862:1;2876:35;;;;;;;;;;;;;;;;;2700:217;:::o;1499:119:12:-;-1:-1:-1;;;;;1587:22:12;1563:4;1587:22;;;:6;:22;;;;;;;;;1499:119::o;4037:265:2:-;-1:-1:-1;;;;;4249:17:2;;;;4138:7;4249:17;;;:9;:17;;;;;;;;;;4175:120;;-1:-1:-1;;;4175:120:2;;;;4235:4;4175:120;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4175:120:2;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;4175:120:2;;;;;;4165:131;;;;;;4037:265::o;850:207:13:-;430:5;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;935:25:13;;927:53;;;;;-1:-1:-1;;;927:53:13;;;;;;;;;;;;-1:-1:-1;;;927:53:13;;;;;;;;;;;;;;;987:5;:17;;-1:-1:-1;;;;;;987:17:13;-1:-1:-1;;;;;987:17:13;;;;;;;;;;;1016:35;;;1033:10;1016:35;;1045:5;;;;1016:35;;;;;;;;;;;;;;;;850:207;:::o;53:20::-;;;-1:-1:-1;;;;;53:20:13;;:::o;1034:173:1:-;527:5:13;;1146:4:1;;-1:-1:-1;;;;;527:5:13;513:10;:19;;:48;;-1:-1:-1;550:10:13;536:25;;;;:13;:25;;;;;;;;513:48;505:98;;;;-1:-1:-1;;;505:98:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;459:15:12;;;;458:16;450:25;;;;;;1162:21:1;1174:3;1179;1162:11;:21::i;:::-;-1:-1:-1;1197:4:1;1034:173;;;;:::o;2331:83:11:-;2401:7;2394:14;;;;;;;;-1:-1:-1;;2394:14:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2372:13;;2394:14;;2401:7;;2394:14;;2401:7;2394:14;;;;;;;;;;;;;;;;;;;;;;;;5322:236:7;-1:-1:-1;;;;;5400:17:7;;5407:10;5400:17;;5392:53;;;;;-1:-1:-1;;;5392:53:7;;;;;;;;;;;;-1:-1:-1;;;5392:53:7;;;;;;;;;;;;;;;5470:10;5452:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;5452:34:7;;;;;;;;;;;;:46;;-1:-1:-1;;5452:46:7;;;;;;;;;;5510:42;;;;;;;5452:34;;5470:10;5510:42;;;;;;;;;;;5322:236;;:::o;1334:320:13:-;430:5;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;1420:21:13;;;;;;:13;:21;;;;;;;;1419:22;1411:62;;;;;-1:-1:-1;;;1411:62:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1488:20:13;;1480:57;;;;;-1:-1:-1;;;1480:57:13;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1480:57:13;;;;;;;;;;;;;;;1544:12;27:10:-1;;39:1;23:18;;;45:23;;;1544:25:13;;;;-1:-1:-1;;;;;;1544:25:13;-1:-1:-1;;;;;1544:25:13;;;;;;;;-1:-1:-1;1576:21:13;;;:13;1544:25;1576:21;;;;;;;;:28;;-1:-1:-1;;1576:28:13;;;;;1616:32;;;;;;;;;;;;;;;;;;;;;;;;1334:320;:::o;1776:181:1:-;459:15:12;;1874:4:1;;459:15:12;;458:16;450:25;;;;;;1890:43:1;1907:10;1919:3;1924:8;1890:16;:43::i;2079:761:17:-;459:15:12;;2267:4:17;;459:15:12;;458:16;450:25;;;;;;2311:158:17;;-1:-1:-1;;;2311:158:17;;;;;;;2408:4;2311:158;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2311:158:17;;;;;;;-1:-1:-1;;2408:4:17;;2311:158;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2311:158:17;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2311:158:17;;;2301:169;;;;;;2283:187;;2477:14;2494:27;2504:7;2513:1;2516;2519;2494:9;:27::i;:::-;2546:5;;2477:44;;-1:-1:-1;;;;;;2536:15:17;;;2546:5;;2536:15;;:40;;-1:-1:-1;;;;;;2555:21:17;;;;;;:13;:21;;;;;;;;2536:40;2528:78;;;;;-1:-1:-1;;;2528:78:17;;;;;;;;;;;;-1:-1:-1;;;2528:78:17;;;;;;;;;;;;;;;-1:-1:-1;;;;;2621:19:17;;;;;;:11;:19;;;;;;;;:33;;;;;;;;;;;2613:64;;;;;-1:-1:-1;;;2613:64:17;;;;;;;;;;;;-1:-1:-1;;;2613:64:17;;;;;;;;;;;;;;;2688:9;2684:86;2703:8;:15;2701:1;:17;2684:86;;;2734:28;2746:2;2750:8;2759:1;2750:11;;;;;;;2734:28;2720:3;;2684:86;;;-1:-1:-1;;;;;;2776:19:17;;;;;:11;:19;;;;;;;;:33;;;;;;;;:40;;-1:-1:-1;;2776:40:17;2812:4;2776:40;;;;;;2812:4;-1:-1:-1;;2079:761:17;;;;;;;;:::o;8447:345:7:-;8593:8;2525:39;2543:10;2555:8;2525:17;:39::i;:::-;2517:68;;;;;-1:-1:-1;;;2517:68:7;;;;;;;;;;;;-1:-1:-1;;;2517:68:7;;;;;;;;;;;;;;;8613:34;8626:5;8633:3;8638:8;8613:12;:34::i;:::-;8708:53;8733:5;8740:3;8745:8;8755:5;8708:24;:53::i;:::-;8700:86;;;;;-1:-1:-1;;;8700:86:7;;;;;;;;;;;;-1:-1:-1;;;8700:86:7;;;;;;;;;;;;;;;8447:345;;;;;:::o;925:687:17:-;459:15:12;;1099:4:17;;459:15:12;;458:16;450:25;;;;;;1149:153:17;;;-1:-1:-1;;;1149:153:17;;;;;;;;1242:4;1149:153;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1149:153:17;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1149:153:17;;;;;;;1139:164;;;;;-1:-1:-1;1327:27:17;1139:164;1346:1;1349;1352;1327:9;:27::i;:::-;1379:5;;1310:44;;-1:-1:-1;;;;;;1369:15:17;;;1379:5;;1369:15;;:40;;-1:-1:-1;;;;;;1388:21:17;;;;;;:13;:21;;;;;;;;1369:40;1361:78;;;;;-1:-1:-1;;;1361:78:17;;;;;;;;;;;;-1:-1:-1;;;1361:78:17;;;;;;;;;;;;;;;-1:-1:-1;;;;;1454:19:17;;;;;;:11;:19;;;;;;;;:33;;;;;;;;;;;1446:64;;;;;-1:-1:-1;;;1446:64:17;;;;;;;;;;;;-1:-1:-1;;;1446:64:17;;;;;;;;;;;;;;;1517:24;1529:2;1533:7;1517:11;:24::i;:::-;-1:-1:-1;;;;;1548:19:17;;;;;:11;:19;;;;;;;;:33;;;;;;;;:40;;-1:-1:-1;;1548:40:17;1584:4;1548:40;;;;;;1584:4;-1:-1:-1;;925:687:17;;;;;;;;:::o;78:29:13:-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;78:29:13;;-1:-1:-1;78:29:13;:::o;2609:214:11:-;2666:13;2696:16;2703:8;2696:6;:16::i;:::-;2688:49;;;;;-1:-1:-1;;;2688:49:11;;;;;;;;;;;;-1:-1:-1;;;2688:49:11;;;;;;;;;;;;;;;2775:12;2789:26;2806:8;2789:16;:26::i;:::-;2758:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2758:58:11;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2758:58:11;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2758:58:11;;;2744:73;;2609:214;;;:::o;6177:197:2:-;430:5:13;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;6238:7:2;6249:18;6238:29;6229:55;;;;;-1:-1:-1;;;6229:55:2;;;;;;;;;;;;-1:-1:-1;;;6229:55:2;;;;;;;;;;;;;;;6357:10;6344:24;5305:162;430:5:13;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;5425:15:2;-1:-1:-1;;;;;5410:40:2;;5451:2;5455:5;5410:51;;;;;;;;;;;;;-1:-1:-1;;;;;5410:51:2;-1:-1:-1;;;;;5410:51:2;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5410:51:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5410:51:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;366:31:2;;;;;;:::o;701:193:12:-;430:5:13;;781:4:12;;-1:-1:-1;;;;;430:5:13;416:10;:19;408:41;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;-1:-1:-1;;;408:41:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;798:15:12;;;;;;:6;:15;;;;;;;;;:25;;-1:-1:-1;;798:25:12;;;;;;;;;;839;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;882:4:12;701:193;;;;:::o;5875:177:7:-;-1:-1:-1;;;;;6010:25:7;;;5987:4;6010:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;5875:177::o;140:35:12:-;;;;;;:::o;6581:177:11:-;6643:26;6655:3;6660:8;6643:11;:26::i;:::-;6705:9;:16;;6678:24;;;;:14;:24;;;;;:43;;;39:1:-1;23:18;;45:23;;6728:24:11;;;;;;;-1:-1:-1;6581:177:11:o;9148:455:7:-;9264:4;9280:13;9296:17;9304:8;9296:7;:17::i;:::-;9280:33;;9497:5;-1:-1:-1;;;;;9485:17:7;:8;-1:-1:-1;;;;;9485:17:7;;:61;;;;9538:8;-1:-1:-1;;;;;9513:33:7;:21;9525:8;9513:11;:21::i;:::-;-1:-1:-1;;;;;9513:33:7;;9485:61;:105;;;;9557:33;9574:5;9581:8;9557:16;:33::i;10716:311::-;10818:6;-1:-1:-1;;;;;10797:27:7;:17;10805:8;10797:7;:17::i;:::-;-1:-1:-1;;;;;10797:27:7;;10789:76;;;;-1:-1:-1;;;10789:76:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10912:1;10876:24;;;:14;:24;;;;;;-1:-1:-1;;;;;10876:24:7;:38;10872:150;;10960:1;10925:24;;;:14;:24;;;;;;:37;;-1:-1:-1;;;;;;10925:37:7;;;10976:38;10940:8;;10960:1;-1:-1:-1;;;;;10976:38:7;;;;;10960:1;;10976:38;10716:311;;:::o;5440:872:11:-;5514:38;5536:5;5543:8;5514:21;:38::i;:::-;5561:18;5582:26;;;:16;:26;;;;;;;;;-1:-1:-1;;;;;5640:18:11;;;;:11;:18;;;;;:25;5582:26;;5561:18;5640:32;;5670:1;5640:32;:29;:32;:::i;:::-;-1:-1:-1;;;;;5699:18:11;;5679:17;5699:18;;;:11;:18;;;;;:34;;5615:57;;-1:-1:-1;5679:17:11;;5615:57;;5699:34;;;;;;;;;;;;;;5679:54;;5775:9;5742:11;:18;5754:5;-1:-1:-1;;;;;5742:18:11;-1:-1:-1;;;;;5742:18:11;;;;;;;;;;;;5761:10;5742:30;;;;;;;;;;;;;;;;;;;:42;;;;-1:-1:-1;;;;;5791:18:11;;;;:11;:18;;;;;;:34;;5810:14;;5791:34;;;;;;;;;;;;;;;;;:38;;;;-1:-1:-1;;;;;6195:18:11;;;;:11;:18;;;;;;:27;;;;;-1:-1:-1;;6195:27:11;;;:::i;:::-;-1:-1:-1;6258:1:11;6229:26;;;:16;:26;;;;;;:30;;;6266:27;;;;;;:40;-1:-1:-1;;5440:872:11:o;4923:231::-;4990:31;5007:3;5012:8;4990:16;:31::i;:::-;-1:-1:-1;;;;;5045:16:11;;;5028:14;5045:16;;;:11;:16;;;;;;;;:23;;39:1:-1;23:18;;45:23;;5075:31:11;;;;;;;;;;;5113:26;;;:16;:26;;;;;:35;4923:231::o;625:141:14:-;683:7;711:5;;;730:6;;;;;;:14;;;743:1;740;:4;;730:14;723:22;;;;759:1;625:141;-1:-1:-1;;;625:141:14:o;6998:612:11:-;7063:29;7075:6;7083:8;7063:11;:29::i;:::-;7267:18;7288:24;;;:14;:24;;;;;;7344:9;:16;7288:24;;7267:18;7344:23;;7365:1;7344:23;:20;:23;:::i;:::-;7319:48;;7374:17;7394:9;7404:14;7394:25;;;;;;;;;;;;;;;;7374:45;;7452:9;7428;7438:10;7428:21;;;;;;;;;;;;;;;:33;;;;7496:1;7468:9;7478:14;7468:25;;;;;;;;;;;;;;;;;:29;7506:9;:18;;;;;-1:-1:-1;;7506:18:11;;;:::i;:::-;-1:-1:-1;7558:1:11;7531:24;;;:14;:24;;;;;;:28;;;7566:25;;;;;;:38;-1:-1:-1;;6998:612:11:o;12590:357:7:-;12743:4;12764:16;:3;-1:-1:-1;;;;;12764:14:7;;:16::i;:::-;12759:51;;-1:-1:-1;12798:4:7;12791:11;;12759:51;12832:68;;-1:-1:-1;;;12832:68:7;;-1:-1:-1;;;;;12832:68:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12816:13;;12832:36;;;;;;12877:5;;12884:8;;12894:5;;12832:68;;;;;;;;;;12816:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12832:68:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12832:68:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12832:68:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12832:68:7;-1:-1:-1;;;;;;12915:25:7;-1:-1:-1;;;12915:25:7;;-1:-1:-1;;12590:357:7;;;;;;:::o;214:744:15:-;270:13;491:10;487:53;;-1:-1:-1;518:10:15;;;;;;;;;;;;-1:-1:-1;;;518:10:15;;;;;;487:53;565:5;550:12;606:78;613:9;;606:78;;639:8;;670:2;662:10;;;;606:78;;;694:19;726:6;716:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;716:17:15;87:34:-1;135:17;;-1:-1;716:17:15;-1:-1:-1;788:5:15;;-1:-1:-1;694:39:15;-1:-1:-1;;;760:10:15;;804:115;811:9;;804:115;;878:2;871:4;:9;866:2;:14;855:27;;837:6;844:7;;;;;;;837:15;;;;;;;;;;;:45;-1:-1:-1;;;;;837:45:15;;;;;;;;-1:-1:-1;905:2:15;897:10;;;;804:115;;;-1:-1:-1;943:6:15;214:744;-1:-1:-1;;;;214:744:15:o;9860:201:7:-;-1:-1:-1;;;;;9930:17:7;;9922:54;;;;;-1:-1:-1;;;9922:54:7;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9922:54:7;;;;;;;;;;;;;;;9983:25;9994:3;9999:8;9983:10;:25::i;:::-;10020:35;;10046:8;;-1:-1:-1;;;;;10020:35:7;;;10037:1;;-1:-1:-1;;;;;;;;;;;10020:35:7;10037:1;;10020:35;9860:201;;:::o;11815:258::-;11918:5;-1:-1:-1;;;;;11897:26:7;:17;11905:8;11897:7;:17::i;:::-;-1:-1:-1;;;;;11897:26:7;;11889:75;;;;-1:-1:-1;;;11889:75:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11997:23:7;;;;;;:16;:23;;;;;;:30;;12025:1;11997:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;11971:23:7;;;;;;;:16;:23;;;;;;;;:56;;;;12034:20;;;:10;:20;;;;:33;;-1:-1:-1;;;;;;12034:33:7;;;11815:258::o;508:113:14:-;566:7;594:1;589;:6;;582:14;;;;-1:-1:-1;610:5:14;;;508:113::o;11297:232:7:-;11404:1;11372:20;;;:10;:20;;;;;;-1:-1:-1;;;;;11372:20:7;:34;11364:67;;;;;-1:-1:-1;;;11364:67:7;;;;;;;;;;;;-1:-1:-1;;;11364:67:7;;;;;;;;;;;;;;;11438:20;;;;:10;:20;;;;;;;;:26;;-1:-1:-1;;;;;;11438:26:7;-1:-1:-1;;;;;11438:26:7;;;;;;;;11495:21;;:16;:21;;;;;;;:28;;:25;:28::i;:::-;-1:-1:-1;;;;;11471:21:7;;;;;;;:16;:21;;;;;:52;;;;-1:-1:-1;11297:232:7:o;10254:192::-;10319:31;10333:6;10341:8;10319:13;:31::i;:::-;10357:33;10373:6;10381:8;10357:15;:33::i;:::-;10402:38;;10431:8;;10427:1;;-1:-1:-1;;;;;10402:38:7;;;-1:-1:-1;;;;;;;;;;;10402:38:7;10427:1;;10402:38;10254:192;;:::o;451:601:0:-;511:4;965:20;;812:66;1003:23;;;;;;:42;;-1:-1:-1;;1030:15:0;;;995:51;-1:-1:-1;;451:601:0:o;221:2626:17:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;221:2626:17;;;-1:-1:-1;221:2626:17;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://4d2badfcb522c45cd317df3a7766cccc8e25cc4a4847f7c78c88f3702501316c
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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