ETH Price: $3,831.41 (-11.93%)
Gas: 0.59 Gwei

Contract

0x68Cd21D362C2DAe66909afD810e391fA152B2379
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...235127082025-10-05 16:17:355 days ago1759681055IN
0x68Cd21D3...A152B2379
0 ETH0.000005490.22313346
Set Approval For...234830172025-10-01 12:41:359 days ago1759322495IN
0x68Cd21D3...A152B2379
0 ETH0.000051562.09159602
Set Approval For...234521642025-09-27 5:09:1114 days ago1758949751IN
0x68Cd21D3...A152B2379
0 ETH0.000021330.8630626
Set Approval For...234521632025-09-27 5:08:5914 days ago1758949739IN
0x68Cd21D3...A152B2379
0 ETH0.000021440.86749823
Set Approval For...234521622025-09-27 5:08:4714 days ago1758949727IN
0x68Cd21D3...A152B2379
0 ETH0.000024210.98309124
Set Approval For...234015622025-09-20 3:21:1121 days ago1758338471IN
0x68Cd21D3...A152B2379
0 ETH0.000016140.65358438
Set Approval For...234015612025-09-20 3:20:5921 days ago1758338459IN
0x68Cd21D3...A152B2379
0 ETH0.000016090.65128837
Set Approval For...228663672025-07-07 9:17:1196 days ago1751879831IN
0x68Cd21D3...A152B2379
0 ETH0.000071992.92274124
Set Approval For...228663662025-07-07 9:16:5996 days ago1751879819IN
0x68Cd21D3...A152B2379
0 ETH0.000072962.95216058
Set Approval For...228663652025-07-07 9:16:4796 days ago1751879807IN
0x68Cd21D3...A152B2379
0 ETH0.000073212.96941856
Set Approval For...227004462025-06-14 4:36:35119 days ago1749875795IN
0x68Cd21D3...A152B2379
0 ETH0.000024340.98488404
Set Approval For...225722302025-05-27 6:07:11137 days ago1748326031IN
0x68Cd21D3...A152B2379
0 ETH0.000039341.59262186
Set Approval For...224323762025-05-07 14:35:11156 days ago1746628511IN
0x68Cd21D3...A152B2379
0 ETH0.000163173.49964562
Set Approval For...224323722025-05-07 14:34:11156 days ago1746628451IN
0x68Cd21D3...A152B2379
0 ETH0.000141223.03423924
Set Approval For...221289542025-03-26 5:22:11199 days ago1742966531IN
0x68Cd21D3...A152B2379
0 ETH0.000040470.86965869
Set Approval For...220631572025-03-17 0:54:59208 days ago1742172899IN
0x68Cd21D3...A152B2379
0 ETH0.000025840.55535025
Set Approval For...219319272025-02-26 17:13:47226 days ago1740590027IN
0x68Cd21D3...A152B2379
0 ETH0.000034581.4
Set Approval For...219319262025-02-26 17:13:35226 days ago1740590015IN
0x68Cd21D3...A152B2379
0 ETH0.000029651.2
Set Approval For...219066292025-02-23 4:26:23230 days ago1740284783IN
0x68Cd21D3...A152B2379
0 ETH0.00005461.17318881
Set Approval For...218827692025-02-19 20:21:35233 days ago1739996495IN
0x68Cd21D3...A152B2379
0 ETH0.000024651
Set Approval For...218827662025-02-19 20:20:59233 days ago1739996459IN
0x68Cd21D3...A152B2379
0 ETH0.000024711
Set Approval For...218827632025-02-19 20:20:23233 days ago1739996423IN
0x68Cd21D3...A152B2379
0 ETH0.000032021.3
Set Approval For...218682542025-02-17 19:42:11235 days ago1739821331IN
0x68Cd21D3...A152B2379
0 ETH0.000085933.48887767
Set Approval For...218151682025-02-10 9:17:23243 days ago1739179043IN
0x68Cd21D3...A152B2379
0 ETH0.000037550.8068604
Set Approval For...218103972025-02-09 17:17:11243 days ago1739121431IN
0x68Cd21D3...A152B2379
0 ETH0.000061981.32929491
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-148615602022-05-28 17:19:421231 days ago1653758382
0x68Cd21D3...A152B2379
601.75 ETH
-148244142022-05-22 16:27:161237 days ago1653236836
0x68Cd21D3...A152B2379
68 ETH
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AnimeMetaverse

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license
/**
 *Submitted for verification at Etherscan.io on 2022-04-26
*/

// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.9;

library AddressUtils {

  /**
   * 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 _addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address _addr) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(_addr) }
    return size > 0;
  }

}

library MerkleProof {
function verify(
    bytes32[] memory proof,
    bytes32 root,
    bytes32 leaf
  )
    internal
    pure
    returns (bool)
  {
    bytes32 computedHash = leaf;

    for (uint256 i = 0; i < proof.length; i++) {
      bytes32 proofElement = proof[i];

      if (computedHash < proofElement) {
        // Hash(current computed hash + current element of the proof)
        computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
      } else {
        // Hash(current element of the proof + current computed hash)
        computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
      }
    }

    // Check if the computed hash (root) is equal to the provided root
    return computedHash == root;
  }
}

/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata
{

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

}


/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @param _operator The address which called `safeTransferFrom` function.
   * @param _from The address which previously owned the token.
   * @param _tokenId The NFT identifier which is being transferred.
   * @param _data Additional data with no specified format.
   * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}


/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721
{

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external;

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.  This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The contract MUST allow multiple operators per owner.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @notice Count all NFTs assigned to an owner.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @notice Find the owner of an NFT.
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Query if an address is an authorized operator for another address.
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}


/**
 * @dev A standard for detecting smart contract interfaces. 
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);
    
}


/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}


/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can receive NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApproval;

   /**
   * @dev Mapping from owner address to count of their tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || idToApproval[_tokenId] == msg.sender
      || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_APPROVED_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(
    uint256 _tokenId
  )
  {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to "".
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);
  }

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    override
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    idToApproval[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @notice This works even if sender does not own any tokens at the time.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external
    override
  {
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return _owner Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    override
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }
  
  function ownerOfInternal(
    uint256 _tokenId
  )
    internal
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApproval[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    override
    view
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @notice Does NO checks.
   * @dev Actually performs the transfer.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);

    emit Transfer(from, _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from owner.
   * @param _from Address from which we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] -= 1;
    delete idToOwner[_tokenId];
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to owner.
   * @param _to Address to which we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] += 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage (gas optimization) of owner NFT count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @dev Actually perform the safeTransferFrom.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    private
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    if (_to.isContract())
    {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(
    uint256 _tokenId
  )
    private
  {
    delete idToApproval[_tokenId];
  }

}



/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;


  /**
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   * @return _name Representing name.
   */
  function name()
    external
    override
    view
    returns (string memory _name)
  {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    override
    view
    returns (string memory _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */


}

// OmegaM

contract AnimeMetaverse is NFTokenMetadata, Ownable 
{
    // Properties
    address payable feeAddress;

    // OmegaM
    uint constant public nftPrice = 0.25 ether;
    uint constant public maxNft   = 5000;   // Total nfts
    
    // Switches
    bool public isMintingActive     = false;  // Is minting open? Yes or no.
    bool public isWhiteListActive   = false;  // Is the public sale open or is it only whitelisted?
    bool public isMerkleActive      = true;   // OmegaM

    // Mappings 
    mapping(address => bool) private    whiteList; // Map of addresses on the whitelist.
    mapping(address => uint256) public  nftClaimed; // Map of how many nfts are minted per address.

    // Vars
    uint256 public current_minted = 0;
    // OmegaM
    uint public mintLimit = 1;
    
    // URI Data
    // OmegaM
    string private metaAddress = "https://mint.animemetaverse.ai/metadata/";
    string constant private jsonAppend = ".json";

    // Events
    event Minted(address sender, uint256 count);

    // Merkle tree support

    bytes32 public merkleRoot;

    constructor()
    {
        // OmegaM
        nftName     = "Anime Metaverse: Soulmates";
        nftSymbol   = "AMS";
        feeAddress  = payable(msg.sender);
    }

    function tokenURI(uint tokenID) external view returns (string memory)
    {   // @dev Token URIs are generated dynamically on view requests. 
        // This is to allow easy server changes and reduce gas fees for minting. -ssa2
        require(tokenID > 0, "Token does not exist.");
        require(tokenID <= current_minted, "Token hasn't been minted yet.");

        bytes32 thisToken;
        bytes memory concat;
        thisToken = uintToBytes(tokenID);
        concat = abi.encodePacked(metaAddress, thisToken, jsonAppend);
        return string(concat);
    }

    function setMerkleRoot (bytes32 merkle) external onlyOwner {
      require(merkle[0] != 0, "merkle root value is invalid");

        merkleRoot = merkle;
    }


    // Toggle whether any gals can be minted at all.
    function toggleMinting() public onlyOwner
    {
        isMintingActive = !isMintingActive;
    }

    // Toggle if we're in the Whitelist or Public Sale.
    function toggleWhiteList() public onlyOwner
    {
        isWhiteListActive = !isWhiteListActive;
    }

    function toggleMerkle () public onlyOwner {
      isMerkleActive = !isMerkleActive;      
    }

    // Add a list of wallet addresses to the Whitelist.
    function addToWhiteList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add the null address");

            whiteList[addresses[i]] = true;
        }
    }

    // Tells the world if a given address is whitelisted or not.
    function onWhiteList(address addr) external view returns (bool) {
        return whiteList[addr];
    }

    // }:)
    function removeFromwhiteList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cant add null address");

            whiteList[addresses[i]] = false;
        }
    }

    // Public annoucement how many nfts a given address has minted.
    function claimedBy(address owner) external view returns (uint256) {
        require(owner != address(0), 'The zero address cannot mint anything.');

        return nftClaimed[owner];
    }

    // Address  ETH gets sent to when withdrawing.
    function updateRecipient(address payable _newAddress) public onlyOwner
    {
        feeAddress = _newAddress;
    }

    // Takes care of converting an integer into the raw bytes of it's abi-encodable string.
    function uintToBytes(uint v) private pure returns (bytes32 ret) {
        if (v == 0)
        {
            ret = '0';
        }
        else
        {
            while (v > 0) 
            {
                ret = bytes32(uint(ret) / (2 ** 8));
                ret |= bytes32(((v % 10) + 48) * 2 ** (8 * 31));
                v /= 10;
            }
        }
        return ret;
    }

    function verify(bytes32[] calldata proof)
        public
        view
        returns (bool)
    {
        require(merkleRoot[0] != 0, "merkle root not set");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }

    // Public Sale minting function
    function mint(uint8 _mintNum, bytes32[] calldata _proof) public payable
    {
        require(isMintingActive, "Minting not available yet or paused for next round");
        require(_mintNum > 0, "At least one art is needed");
        require(_mintNum + nftClaimed[msg.sender] <= mintLimit, "Can't mint more than 1 limit per Wallet.");
        require(msg.value >= nftPrice * _mintNum, "NFTs are expensive, need more ETH to afford that.");
        require(current_minted + _mintNum <= maxNft, "Not enough of those left in stock.");
        require(_proof.length <= 10, "Invalid proof");
        
        if (isMerkleActive)
        {
            require(verify(_proof), "Not in the Merkle tree, only for exclusive invitees");
        }

        if(isWhiteListActive)
        {
            require(whiteList[msg.sender], "Only for exclusive invitees...");
        }

        for(uint i = 0; i < _mintNum; i++)
        {
            current_minted += 1;
            super._mint(msg.sender, current_minted);
            nftClaimed[msg.sender] += 1;
        }

        emit Minted(msg.sender, _mintNum);
    }

    // Emergency Devmint function if something gets messed up.
    function devMint(uint8 _mintNum) external onlyOwner 
    {
        require(_mintNum + current_minted <= maxNft, "Cannot mint more the total supply.");
        for(uint256 i = 0; i < _mintNum; i++) 
        {
            current_minted += 1;
            nftClaimed[msg.sender] += 1;
            super._mint(msg.sender, current_minted);
        }
    }

    // Withdraw the ETH stored in the contract.
    function withdrawETH() external onlyOwner 
    {
        feeAddress.transfer(address(this).balance);
    }

    // Update the metadata URI to a new server or IPFS if needed.
    function updateURI(string calldata _URI) external onlyOwner 
    {
        metaAddress = _URI;
    }

    // Update how many can be purchased at a time if need be.
    function updateLimit(uint newLimit) external onlyOwner
    {
        mintLimit = newLimit;
    }

    // Get how many nfts are minted right now.
    function totalSupply() public view returns(uint) 
    {
        return current_minted;
    }

    // Get how many nfts can be minted.    
    function maxSupply() public pure returns(uint) 
    {
        return maxNft;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"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":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"claimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"current_minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintNum","type":"uint8"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMerkleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintNum","type":"uint8"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nftClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"onWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromwhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkle","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMerkle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newAddress","type":"address"}],"name":"updateRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600860146101000a81548160ff0219169083151502179055506000600860156101000a81548160ff0219169083151502179055506001600860166101000a81548160ff0219169083151502179055506000600b556001600c556040518060600160405280602881526020016200589960289139600d908051906020019062000090929190620002b6565b503480156200009e57600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601a81526020017f416e696d65204d65746176657273653a20536f756c6d617465730000000000008152506005908051906020019062000220929190620002b6565b506040518060400160405280600381526020017f414d530000000000000000000000000000000000000000000000000000000000815250600690805190602001906200026e929190620002b6565b5033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003cb565b828054620002c49062000395565b90600052602060002090601f016020900481019282620002e8576000855562000334565b82601f106200030357805160ff191683800117855562000334565b8280016001018555821562000334579182015b828111156200033357825182559160200191906001019062000316565b5b50905062000343919062000347565b5090565b5b808211156200036257600081600090555060010162000348565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ae57607f821691505b60208210811415620003c557620003c462000366565b5b50919050565b6154be80620003db6000396000f3fe60806040526004361061025c5760003560e01c80637cb6475911610144578063b61c5e69116100b6578063e086e5ec1161007a578063e086e5ec146108db578063e985e9c5146108f2578063f2fde38b1461092f578063f3fe3bc314610958578063fae0959a14610983578063feec756c146109ac5761025c565b8063b61c5e6914610805578063b88d4fde14610821578063c30f4a5a1461084a578063c87b56dd14610873578063d5abeb01146108b05761025c565b8063974fbca811610108578063974fbca8146106e3578063976116381461070c578063996517cf14610749578063a22cb46514610774578063ade983fb1461079d578063b22d0c83146107c85761025c565b80637cb64759146106225780637d55094d1461064b578063860d248a146106625780638da5cb5b1461068d57806395d89b41146106b85761025c565b80633497d165116101dd57806363430b38116101a157806363430b38146105125780636352211e146105295780636ac437b014610566578063707e25771461059157806370a08231146105bc578063740d73f3146105f95761025c565b80633497d1651461044157806342787f4d1461046a57806342842e0e146104815780634e14f8ea146104aa578063573f5dae146104e75761025c565b806318160ddd1161022457806318160ddd1461035a5780631fb26d5b1461038557806323b872dd146103b057806329998d4b146103d95780632eb4a7ab146104165761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630d39fc811461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613f12565b6109d5565b6040516102959190613f5a565b60405180910390f35b3480156102aa57600080fd5b506102b3610a3c565b6040516102c0919061400e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190614066565b610ace565b6040516102fd91906140d4565b60405180910390f35b34801561031257600080fd5b5061032d6004803603810190610328919061411b565b610be9565b005b34801561033b57600080fd5b50610344610fcc565b604051610351919061416a565b60405180910390f35b34801561036657600080fd5b5061036f610fd8565b60405161037c919061416a565b60405180910390f35b34801561039157600080fd5b5061039a610fe2565b6040516103a7919061416a565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d29190614185565b610fe8565b005b3480156103e557600080fd5b5061040060048036038101906103fb91906141d8565b61143a565b60405161040d919061416a565b60405180910390f35b34801561042257600080fd5b5061042b6114f2565b604051610438919061421e565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190614272565b6114f8565b005b34801561047657600080fd5b5061047f6116b8565b005b34801561048d57600080fd5b506104a860048036038101906104a39190614185565b6117ad565b005b3480156104b657600080fd5b506104d160048036038101906104cc91906141d8565b6117cd565b6040516104de919061416a565b60405180910390f35b3480156104f357600080fd5b506104fc6117e5565b6040516105099190613f5a565b60405180910390f35b34801561051e57600080fd5b506105276117f8565b005b34801561053557600080fd5b50610550600480360381019061054b9190614066565b6118ed565b60405161055d91906140d4565b60405180910390f35b34801561057257600080fd5b5061057b6119d3565b6040516105889190613f5a565b60405180910390f35b34801561059d57600080fd5b506105a66119e6565b6040516105b3919061416a565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906141d8565b6119ec565b6040516105f0919061416a565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190614304565b611aa6565b005b34801561062e57600080fd5b506106496004803603810190610644919061437d565b611cab565b005b34801561065757600080fd5b50610660611dfe565b005b34801561066e57600080fd5b50610677611ef3565b604051610684919061400e565b60405180910390f35b34801561069957600080fd5b506106a2611f2c565b6040516106af91906140d4565b60405180910390f35b3480156106c457600080fd5b506106cd611f52565b6040516106da919061400e565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190614304565b611fe4565b005b34801561071857600080fd5b50610733600480360381019061072e9190614400565b6121e9565b6040516107409190613f5a565b60405180910390f35b34801561075557600080fd5b5061075e6122ee565b60405161076b919061416a565b60405180910390f35b34801561078057600080fd5b5061079b60048036038101906107969190614479565b6122f4565b005b3480156107a957600080fd5b506107b26123f1565b6040516107bf9190613f5a565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea91906141d8565b612404565b6040516107fc9190613f5a565b60405180910390f35b61081f600480360381019061081a91906144b9565b61245a565b005b34801561082d57600080fd5b506108486004803603810190610843919061456f565b612854565b005b34801561085657600080fd5b50610871600480360381019061086c919061464d565b6128ab565b005b34801561087f57600080fd5b5061089a60048036038101906108959190614066565b61298a565b6040516108a7919061400e565b60405180910390f35b3480156108bc57600080fd5b506108c5612a89565b6040516108d2919061416a565b60405180910390f35b3480156108e757600080fd5b506108f0612a93565b005b3480156108fe57600080fd5b506109196004803603810190610914919061469a565b612bc7565b6040516109269190613f5a565b60405180910390f35b34801561093b57600080fd5b50610956600480360381019061095191906141d8565b612c5b565b005b34801561096457600080fd5b5061096d612e8d565b60405161097a919061400e565b60405180910390f35b34801561098f57600080fd5b506109aa60048036038101906109a59190614066565b612ec6565b005b3480156109b857600080fd5b506109d360048036038101906109ce9190614718565b612f99565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060058054610a4b90614774565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7790614774565b8015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba3919061400e565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610ce25750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50919061400e565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d919061400e565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d919061400e565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6703782dace9d9000081565b6000600b54905090565b600b5481565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806110b957503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061114a5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b8919061400e565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295919061400e565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303700000000000000000000000000000000000000000000000000008152509061137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d919061400e565b60405180910390fd5b5061143186866130a6565b50505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614818565b60405180910390fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b7919061400e565b60405180910390fd5b50611388600b548260ff166115d59190614867565b1115611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d9061492f565b60405180910390fd5b60005b8160ff168110156116b4576001600b60008282546116379190614867565b925050819055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461168e9190614867565b925050819055506116a133600b5461315b565b80806116ac9061494f565b915050611619565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611780576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611777919061400e565b60405180910390fd5b50600860169054906101000a900460ff1615600860166101000a81548160ff021916908315150217905550565b6117c883838360405180602001604052806000815250613349565b505050565b600a6020528060005260406000206000915090505481565b600860159054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b7919061400e565b60405180910390fd5b50600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c4919061400e565b60405180910390fd5b50919050565b600860149054906101000a900460ff1681565b61138881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c919061400e565b60405180910390fd5b50611a9f82613917565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b65919061400e565b60405180910390fd5b5060005b82829050811015611ca657600073ffffffffffffffffffffffffffffffffffffffff16838383818110611ba857611ba7614998565b5b9050602002016020810190611bbd91906141d8565b73ffffffffffffffffffffffffffffffffffffffff161415611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90614a13565b60405180910390fd5b600160096000858585818110611c2d57611c2c614998565b5b9050602002016020810190611c4291906141d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c9e9061494f565b915050611b72565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a919061400e565b60405180910390fd5b50600060f81b81600060208110611d8d57611d8c614998565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb90614a7f565b60405180910390fd5b80600e8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd919061400e565b60405180910390fd5b50600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054611f6190614774565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8d90614774565b8015611fda5780601f10611faf57610100808354040283529160200191611fda565b820191906000526020600020905b815481529060010190602001808311611fbd57829003601f168201915b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a3919061400e565b60405180910390fd5b5060005b828290508110156121e457600073ffffffffffffffffffffffffffffffffffffffff168383838181106120e6576120e5614998565b5b90506020020160208101906120fb91906141d8565b73ffffffffffffffffffffffffffffffffffffffff161415612152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214990614aeb565b60405180910390fd5b60006009600085858581811061216b5761216a614998565b5b905060200201602081019061218091906141d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806121dc9061494f565b9150506120b0565b505050565b60008060f81b600e5460006020811061220557612204614998565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390614b57565b60405180910390fd5b60003360405160200161227f9190614bbf565b6040516020818303038152906040528051906020012090506122e5848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483613960565b91505092915050565b600c5481565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123e59190613f5a565b60405180910390a35050565b600860169054906101000a900460ff1681565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600860149054906101000a900460ff166124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a090614c4c565b60405180910390fd5b60008360ff16116124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e690614cb8565b60405180910390fd5b600c54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548460ff166125409190614867565b1115612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890614d4a565b60405180910390fd5b8260ff166703782dace9d900006125989190614d6a565b3410156125da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d190614e36565b60405180910390fd5b6113888360ff16600b546125ee9190614867565b111561262f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262690614ec8565b60405180910390fd5b600a828290501115612676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266d90614f34565b60405180910390fd5b600860169054906101000a900460ff16156126d55761269582826121e9565b6126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90614fc6565b60405180910390fd5b5b600860159054906101000a900460ff161561277757600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90615032565b60405180910390fd5b5b60005b8360ff16811015612815576001600b60008282546127989190614867565b925050819055506127ab33600b5461315b565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127fb9190614867565b92505081905550808061280d9061494f565b91505061277a565b507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe338460405161284792919061508d565b60405180910390a1505050565b6128a485858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613349565b5050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296a919061400e565b60405180910390fd5b508181600d9190612985929190613e0d565b505050565b6060600082116129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c690615102565b60405180910390fd5b600b54821115612a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0b9061516e565b60405180910390fd5b60006060612a2184613a17565b9150600d826040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001612a6e9392919061527f565b60405160208183030381529060405290508092505050919050565b6000611388905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b52919061400e565b60405180910390fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612bc4573d6000803e3d6000fd5b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1a919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090612dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc3919061400e565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f85919061400e565b60405180910390fd5b5080600c8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090613061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613058919061400e565b60405180910390fd5b5080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506130e782613ace565b6130f18183613b07565b6130fb8383613c72565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fa919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d5919061400e565b60405180910390fd5b506132e98282613c72565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061341a57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806134ab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090613522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613519919061400e565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906135ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f6919061400e565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906136de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d5919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377e919061400e565b60405180910390fd5b5061379287876130a6565b6137b18773ffffffffffffffffffffffffffffffffffffffff16613dfa565b1561390d5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016137f79493929190615309565b602060405180830381600087803b15801561381157600080fd5b505af1158015613825573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613849919061536a565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f30303330303500000000000000000000000000000000000000000000000000008152509061390a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613901919061400e565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008082905060005b8551811015613a0957600086828151811061398757613986614998565b5b60200260200101519050808310156139c95782816040516020016139ac929190615397565b6040516020818303038152906040528051906020012092506139f5565b80836040516020016139dc929190615397565b6040516020818303038152906040528051906020012092505b508080613a019061494f565b915050613969565b508381149150509392505050565b600080821415613a49577f30000000000000000000000000000000000000000000000000000000000000009050613ac9565b5b6000821115613ac8576101008160001c613a6491906153f2565b60001b90507f01000000000000000000000000000000000000000000000000000000000000006030600a84613a999190615423565b613aa39190614867565b613aad9190614d6a565b60001b81179050600a82613ac191906153f2565b9150613a4a565b5b919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090613be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd7919061400e565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c319190615454565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d43919061400e565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613def9190614867565b925050819055505050565b600080823b905060008111915050919050565b828054613e1990614774565b90600052602060002090601f016020900481019282613e3b5760008555613e82565b82601f10613e5457803560ff1916838001178555613e82565b82800160010185558215613e82579182015b82811115613e81578235825591602001919060010190613e66565b5b509050613e8f9190613e93565b5090565b5b80821115613eac576000816000905550600101613e94565b5090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613eef81613eba565b8114613efa57600080fd5b50565b600081359050613f0c81613ee6565b92915050565b600060208284031215613f2857613f27613eb0565b5b6000613f3684828501613efd565b91505092915050565b60008115159050919050565b613f5481613f3f565b82525050565b6000602082019050613f6f6000830184613f4b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613faf578082015181840152602081019050613f94565b83811115613fbe576000848401525b50505050565b6000601f19601f8301169050919050565b6000613fe082613f75565b613fea8185613f80565b9350613ffa818560208601613f91565b61400381613fc4565b840191505092915050565b600060208201905081810360008301526140288184613fd5565b905092915050565b6000819050919050565b61404381614030565b811461404e57600080fd5b50565b6000813590506140608161403a565b92915050565b60006020828403121561407c5761407b613eb0565b5b600061408a84828501614051565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140be82614093565b9050919050565b6140ce816140b3565b82525050565b60006020820190506140e960008301846140c5565b92915050565b6140f8816140b3565b811461410357600080fd5b50565b600081359050614115816140ef565b92915050565b6000806040838503121561413257614131613eb0565b5b600061414085828601614106565b925050602061415185828601614051565b9150509250929050565b61416481614030565b82525050565b600060208201905061417f600083018461415b565b92915050565b60008060006060848603121561419e5761419d613eb0565b5b60006141ac86828701614106565b93505060206141bd86828701614106565b92505060406141ce86828701614051565b9150509250925092565b6000602082840312156141ee576141ed613eb0565b5b60006141fc84828501614106565b91505092915050565b6000819050919050565b61421881614205565b82525050565b6000602082019050614233600083018461420f565b92915050565b600060ff82169050919050565b61424f81614239565b811461425a57600080fd5b50565b60008135905061426c81614246565b92915050565b60006020828403121561428857614287613eb0565b5b60006142968482850161425d565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126142c4576142c361429f565b5b8235905067ffffffffffffffff8111156142e1576142e06142a4565b5b6020830191508360208202830111156142fd576142fc6142a9565b5b9250929050565b6000806020838503121561431b5761431a613eb0565b5b600083013567ffffffffffffffff81111561433957614338613eb5565b5b614345858286016142ae565b92509250509250929050565b61435a81614205565b811461436557600080fd5b50565b60008135905061437781614351565b92915050565b60006020828403121561439357614392613eb0565b5b60006143a184828501614368565b91505092915050565b60008083601f8401126143c0576143bf61429f565b5b8235905067ffffffffffffffff8111156143dd576143dc6142a4565b5b6020830191508360208202830111156143f9576143f86142a9565b5b9250929050565b6000806020838503121561441757614416613eb0565b5b600083013567ffffffffffffffff81111561443557614434613eb5565b5b614441858286016143aa565b92509250509250929050565b61445681613f3f565b811461446157600080fd5b50565b6000813590506144738161444d565b92915050565b600080604083850312156144905761448f613eb0565b5b600061449e85828601614106565b92505060206144af85828601614464565b9150509250929050565b6000806000604084860312156144d2576144d1613eb0565b5b60006144e08682870161425d565b935050602084013567ffffffffffffffff81111561450157614500613eb5565b5b61450d868287016143aa565b92509250509250925092565b60008083601f84011261452f5761452e61429f565b5b8235905067ffffffffffffffff81111561454c5761454b6142a4565b5b602083019150836001820283011115614568576145676142a9565b5b9250929050565b60008060008060006080868803121561458b5761458a613eb0565b5b600061459988828901614106565b95505060206145aa88828901614106565b94505060406145bb88828901614051565b935050606086013567ffffffffffffffff8111156145dc576145db613eb5565b5b6145e888828901614519565b92509250509295509295909350565b60008083601f84011261460d5761460c61429f565b5b8235905067ffffffffffffffff81111561462a576146296142a4565b5b602083019150836001820283011115614646576146456142a9565b5b9250929050565b6000806020838503121561466457614663613eb0565b5b600083013567ffffffffffffffff81111561468257614681613eb5565b5b61468e858286016145f7565b92509250509250929050565b600080604083850312156146b1576146b0613eb0565b5b60006146bf85828601614106565b92505060206146d085828601614106565b9150509250929050565b60006146e582614093565b9050919050565b6146f5816146da565b811461470057600080fd5b50565b600081359050614712816146ec565b92915050565b60006020828403121561472e5761472d613eb0565b5b600061473c84828501614703565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061478c57607f821691505b602082108114156147a05761479f614745565b5b50919050565b7f546865207a65726f20616464726573732063616e6e6f74206d696e7420616e7960008201527f7468696e672e0000000000000000000000000000000000000000000000000000602082015250565b6000614802602683613f80565b915061480d826147a6565b604082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061487282614030565b915061487d83614030565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148b2576148b1614838565b5b828201905092915050565b7f43616e6e6f74206d696e74206d6f72652074686520746f74616c20737570706c60008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614919602283613f80565b9150614924826148bd565b604082019050919050565b600060208201905081810360008301526149488161490c565b9050919050565b600061495a82614030565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561498d5761498c614838565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f742061646420746865206e756c6c20616464726573730000000000600082015250565b60006149fd601b83613f80565b9150614a08826149c7565b602082019050919050565b60006020820190508181036000830152614a2c816149f0565b9050919050565b7f6d65726b6c6520726f6f742076616c756520697320696e76616c696400000000600082015250565b6000614a69601c83613f80565b9150614a7482614a33565b602082019050919050565b60006020820190508181036000830152614a9881614a5c565b9050919050565b7f43616e7420616464206e756c6c20616464726573730000000000000000000000600082015250565b6000614ad5601583613f80565b9150614ae082614a9f565b602082019050919050565b60006020820190508181036000830152614b0481614ac8565b9050919050565b7f6d65726b6c6520726f6f74206e6f742073657400000000000000000000000000600082015250565b6000614b41601383613f80565b9150614b4c82614b0b565b602082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b60008160601b9050919050565b6000614b8f82614b77565b9050919050565b6000614ba182614b84565b9050919050565b614bb9614bb4826140b3565b614b96565b82525050565b6000614bcb8284614ba8565b60148201915081905092915050565b7f4d696e74696e67206e6f7420617661696c61626c6520796574206f722070617560008201527f73656420666f72206e65787420726f756e640000000000000000000000000000602082015250565b6000614c36603283613f80565b9150614c4182614bda565b604082019050919050565b60006020820190508181036000830152614c6581614c29565b9050919050565b7f4174206c65617374206f6e6520617274206973206e6565646564000000000000600082015250565b6000614ca2601a83613f80565b9150614cad82614c6c565b602082019050919050565b60006020820190508181036000830152614cd181614c95565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e2031206c696d69742070657260008201527f2057616c6c65742e000000000000000000000000000000000000000000000000602082015250565b6000614d34602883613f80565b9150614d3f82614cd8565b604082019050919050565b60006020820190508181036000830152614d6381614d27565b9050919050565b6000614d7582614030565b9150614d8083614030565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614db957614db8614838565b5b828202905092915050565b7f4e4654732061726520657870656e736976652c206e656564206d6f726520455460008201527f4820746f206166666f726420746861742e000000000000000000000000000000602082015250565b6000614e20603183613f80565b9150614e2b82614dc4565b604082019050919050565b60006020820190508181036000830152614e4f81614e13565b9050919050565b7f4e6f7420656e6f756768206f662074686f7365206c65667420696e2073746f6360008201527f6b2e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614eb2602283613f80565b9150614ebd82614e56565b604082019050919050565b60006020820190508181036000830152614ee181614ea5565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614f1e600d83613f80565b9150614f2982614ee8565b602082019050919050565b60006020820190508181036000830152614f4d81614f11565b9050919050565b7f4e6f7420696e20746865204d65726b6c6520747265652c206f6e6c7920666f7260008201527f206578636c757369766520696e76697465657300000000000000000000000000602082015250565b6000614fb0603383613f80565b9150614fbb82614f54565b604082019050919050565b60006020820190508181036000830152614fdf81614fa3565b9050919050565b7f4f6e6c7920666f72206578636c757369766520696e7669746565732e2e2e0000600082015250565b600061501c601e83613f80565b915061502782614fe6565b602082019050919050565b6000602082019050818103600083015261504b8161500f565b9050919050565b6000819050919050565b600061507761507261506d84614239565b615052565b614030565b9050919050565b6150878161505c565b82525050565b60006040820190506150a260008301856140c5565b6150af602083018461507e565b9392505050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006150ec601583613f80565b91506150f7826150b6565b602082019050919050565b6000602082019050818103600083015261511b816150df565b9050919050565b7f546f6b656e206861736e2774206265656e206d696e746564207965742e000000600082015250565b6000615158601d83613f80565b915061516382615122565b602082019050919050565b600060208201905081810360008301526151878161514b565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546151bb81614774565b6151c5818661518e565b945060018216600081146151e057600181146151f157615224565b60ff19831686528186019350615224565b6151fa85615199565b60005b8381101561521c578154818901526001820191506020810190506151fd565b838801955050505b50505092915050565b6000819050919050565b61524861524382614205565b61522d565b82525050565b600061525982613f75565b615263818561518e565b9350615273818560208601613f91565b80840191505092915050565b600061528b82866151ae565b91506152978285615237565b6020820191506152a7828461524e565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b60006152db826152b4565b6152e581856152bf565b93506152f5818560208601613f91565b6152fe81613fc4565b840191505092915050565b600060808201905061531e60008301876140c5565b61532b60208301866140c5565b615338604083018561415b565b818103606083015261534a81846152d0565b905095945050505050565b60008151905061536481613ee6565b92915050565b6000602082840312156153805761537f613eb0565b5b600061538e84828501615355565b91505092915050565b60006153a38285615237565b6020820191506153b38284615237565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153fd82614030565b915061540883614030565b925082615418576154176153c3565b5b828204905092915050565b600061542e82614030565b915061543983614030565b925082615449576154486153c3565b5b828206905092915050565b600061545f82614030565b915061546a83614030565b92508282101561547d5761547c614838565b5b82820390509291505056fea26469706673582212203f6456c8d27e03575e589d7360a083b613b5d827c81acd8deac957055c5647c064736f6c6343000809003368747470733a2f2f6d696e742e616e696d656d65746176657273652e61692f6d657461646174612f

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80637cb6475911610144578063b61c5e69116100b6578063e086e5ec1161007a578063e086e5ec146108db578063e985e9c5146108f2578063f2fde38b1461092f578063f3fe3bc314610958578063fae0959a14610983578063feec756c146109ac5761025c565b8063b61c5e6914610805578063b88d4fde14610821578063c30f4a5a1461084a578063c87b56dd14610873578063d5abeb01146108b05761025c565b8063974fbca811610108578063974fbca8146106e3578063976116381461070c578063996517cf14610749578063a22cb46514610774578063ade983fb1461079d578063b22d0c83146107c85761025c565b80637cb64759146106225780637d55094d1461064b578063860d248a146106625780638da5cb5b1461068d57806395d89b41146106b85761025c565b80633497d165116101dd57806363430b38116101a157806363430b38146105125780636352211e146105295780636ac437b014610566578063707e25771461059157806370a08231146105bc578063740d73f3146105f95761025c565b80633497d1651461044157806342787f4d1461046a57806342842e0e146104815780634e14f8ea146104aa578063573f5dae146104e75761025c565b806318160ddd1161022457806318160ddd1461035a5780631fb26d5b1461038557806323b872dd146103b057806329998d4b146103d95780632eb4a7ab146104165761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630d39fc811461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613f12565b6109d5565b6040516102959190613f5a565b60405180910390f35b3480156102aa57600080fd5b506102b3610a3c565b6040516102c0919061400e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190614066565b610ace565b6040516102fd91906140d4565b60405180910390f35b34801561031257600080fd5b5061032d6004803603810190610328919061411b565b610be9565b005b34801561033b57600080fd5b50610344610fcc565b604051610351919061416a565b60405180910390f35b34801561036657600080fd5b5061036f610fd8565b60405161037c919061416a565b60405180910390f35b34801561039157600080fd5b5061039a610fe2565b6040516103a7919061416a565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d29190614185565b610fe8565b005b3480156103e557600080fd5b5061040060048036038101906103fb91906141d8565b61143a565b60405161040d919061416a565b60405180910390f35b34801561042257600080fd5b5061042b6114f2565b604051610438919061421e565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190614272565b6114f8565b005b34801561047657600080fd5b5061047f6116b8565b005b34801561048d57600080fd5b506104a860048036038101906104a39190614185565b6117ad565b005b3480156104b657600080fd5b506104d160048036038101906104cc91906141d8565b6117cd565b6040516104de919061416a565b60405180910390f35b3480156104f357600080fd5b506104fc6117e5565b6040516105099190613f5a565b60405180910390f35b34801561051e57600080fd5b506105276117f8565b005b34801561053557600080fd5b50610550600480360381019061054b9190614066565b6118ed565b60405161055d91906140d4565b60405180910390f35b34801561057257600080fd5b5061057b6119d3565b6040516105889190613f5a565b60405180910390f35b34801561059d57600080fd5b506105a66119e6565b6040516105b3919061416a565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906141d8565b6119ec565b6040516105f0919061416a565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190614304565b611aa6565b005b34801561062e57600080fd5b506106496004803603810190610644919061437d565b611cab565b005b34801561065757600080fd5b50610660611dfe565b005b34801561066e57600080fd5b50610677611ef3565b604051610684919061400e565b60405180910390f35b34801561069957600080fd5b506106a2611f2c565b6040516106af91906140d4565b60405180910390f35b3480156106c457600080fd5b506106cd611f52565b6040516106da919061400e565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190614304565b611fe4565b005b34801561071857600080fd5b50610733600480360381019061072e9190614400565b6121e9565b6040516107409190613f5a565b60405180910390f35b34801561075557600080fd5b5061075e6122ee565b60405161076b919061416a565b60405180910390f35b34801561078057600080fd5b5061079b60048036038101906107969190614479565b6122f4565b005b3480156107a957600080fd5b506107b26123f1565b6040516107bf9190613f5a565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea91906141d8565b612404565b6040516107fc9190613f5a565b60405180910390f35b61081f600480360381019061081a91906144b9565b61245a565b005b34801561082d57600080fd5b506108486004803603810190610843919061456f565b612854565b005b34801561085657600080fd5b50610871600480360381019061086c919061464d565b6128ab565b005b34801561087f57600080fd5b5061089a60048036038101906108959190614066565b61298a565b6040516108a7919061400e565b60405180910390f35b3480156108bc57600080fd5b506108c5612a89565b6040516108d2919061416a565b60405180910390f35b3480156108e757600080fd5b506108f0612a93565b005b3480156108fe57600080fd5b506109196004803603810190610914919061469a565b612bc7565b6040516109269190613f5a565b60405180910390f35b34801561093b57600080fd5b50610956600480360381019061095191906141d8565b612c5b565b005b34801561096457600080fd5b5061096d612e8d565b60405161097a919061400e565b60405180910390f35b34801561098f57600080fd5b506109aa60048036038101906109a59190614066565b612ec6565b005b3480156109b857600080fd5b506109d360048036038101906109ce9190614718565b612f99565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060058054610a4b90614774565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7790614774565b8015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba3919061400e565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610ce25750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50919061400e565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d919061400e565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d919061400e565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6703782dace9d9000081565b6000600b54905090565b600b5481565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806110b957503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061114a5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b8919061400e565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295919061400e565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303700000000000000000000000000000000000000000000000000008152509061137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d919061400e565b60405180910390fd5b5061143186866130a6565b50505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614818565b60405180910390fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b7919061400e565b60405180910390fd5b50611388600b548260ff166115d59190614867565b1115611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d9061492f565b60405180910390fd5b60005b8160ff168110156116b4576001600b60008282546116379190614867565b925050819055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461168e9190614867565b925050819055506116a133600b5461315b565b80806116ac9061494f565b915050611619565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611780576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611777919061400e565b60405180910390fd5b50600860169054906101000a900460ff1615600860166101000a81548160ff021916908315150217905550565b6117c883838360405180602001604052806000815250613349565b505050565b600a6020528060005260406000206000915090505481565b600860159054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b7919061400e565b60405180910390fd5b50600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c4919061400e565b60405180910390fd5b50919050565b600860149054906101000a900460ff1681565b61138881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c919061400e565b60405180910390fd5b50611a9f82613917565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b65919061400e565b60405180910390fd5b5060005b82829050811015611ca657600073ffffffffffffffffffffffffffffffffffffffff16838383818110611ba857611ba7614998565b5b9050602002016020810190611bbd91906141d8565b73ffffffffffffffffffffffffffffffffffffffff161415611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90614a13565b60405180910390fd5b600160096000858585818110611c2d57611c2c614998565b5b9050602002016020810190611c4291906141d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c9e9061494f565b915050611b72565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a919061400e565b60405180910390fd5b50600060f81b81600060208110611d8d57611d8c614998565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb90614a7f565b60405180910390fd5b80600e8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd919061400e565b60405180910390fd5b50600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054611f6190614774565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8d90614774565b8015611fda5780601f10611faf57610100808354040283529160200191611fda565b820191906000526020600020905b815481529060010190602001808311611fbd57829003601f168201915b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a3919061400e565b60405180910390fd5b5060005b828290508110156121e457600073ffffffffffffffffffffffffffffffffffffffff168383838181106120e6576120e5614998565b5b90506020020160208101906120fb91906141d8565b73ffffffffffffffffffffffffffffffffffffffff161415612152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214990614aeb565b60405180910390fd5b60006009600085858581811061216b5761216a614998565b5b905060200201602081019061218091906141d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806121dc9061494f565b9150506120b0565b505050565b60008060f81b600e5460006020811061220557612204614998565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390614b57565b60405180910390fd5b60003360405160200161227f9190614bbf565b6040516020818303038152906040528051906020012090506122e5848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483613960565b91505092915050565b600c5481565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123e59190613f5a565b60405180910390a35050565b600860169054906101000a900460ff1681565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600860149054906101000a900460ff166124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a090614c4c565b60405180910390fd5b60008360ff16116124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e690614cb8565b60405180910390fd5b600c54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548460ff166125409190614867565b1115612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890614d4a565b60405180910390fd5b8260ff166703782dace9d900006125989190614d6a565b3410156125da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d190614e36565b60405180910390fd5b6113888360ff16600b546125ee9190614867565b111561262f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262690614ec8565b60405180910390fd5b600a828290501115612676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266d90614f34565b60405180910390fd5b600860169054906101000a900460ff16156126d55761269582826121e9565b6126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90614fc6565b60405180910390fd5b5b600860159054906101000a900460ff161561277757600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90615032565b60405180910390fd5b5b60005b8360ff16811015612815576001600b60008282546127989190614867565b925050819055506127ab33600b5461315b565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127fb9190614867565b92505081905550808061280d9061494f565b91505061277a565b507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe338460405161284792919061508d565b60405180910390a1505050565b6128a485858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613349565b5050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296a919061400e565b60405180910390fd5b508181600d9190612985929190613e0d565b505050565b6060600082116129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c690615102565b60405180910390fd5b600b54821115612a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0b9061516e565b60405180910390fd5b60006060612a2184613a17565b9150600d826040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001612a6e9392919061527f565b60405160208183030381529060405290508092505050919050565b6000611388905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b52919061400e565b60405180910390fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612bc4573d6000803e3d6000fd5b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1a919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090612dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc3919061400e565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f85919061400e565b60405180910390fd5b5080600c8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090613061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613058919061400e565b60405180910390fd5b5080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506130e782613ace565b6130f18183613b07565b6130fb8383613c72565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fa919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d5919061400e565b60405180910390fd5b506132e98282613c72565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061341a57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806134ab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090613522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613519919061400e565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906135ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f6919061400e565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906136de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d5919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377e919061400e565b60405180910390fd5b5061379287876130a6565b6137b18773ffffffffffffffffffffffffffffffffffffffff16613dfa565b1561390d5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016137f79493929190615309565b602060405180830381600087803b15801561381157600080fd5b505af1158015613825573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613849919061536a565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f30303330303500000000000000000000000000000000000000000000000000008152509061390a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613901919061400e565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008082905060005b8551811015613a0957600086828151811061398757613986614998565b5b60200260200101519050808310156139c95782816040516020016139ac929190615397565b6040516020818303038152906040528051906020012092506139f5565b80836040516020016139dc929190615397565b6040516020818303038152906040528051906020012092505b508080613a019061494f565b915050613969565b508381149150509392505050565b600080821415613a49577f30000000000000000000000000000000000000000000000000000000000000009050613ac9565b5b6000821115613ac8576101008160001c613a6491906153f2565b60001b90507f01000000000000000000000000000000000000000000000000000000000000006030600a84613a999190615423565b613aa39190614867565b613aad9190614d6a565b60001b81179050600a82613ac191906153f2565b9150613a4a565b5b919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090613be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd7919061400e565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c319190615454565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d43919061400e565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613def9190614867565b925050819055505050565b600080823b905060008111915050919050565b828054613e1990614774565b90600052602060002090601f016020900481019282613e3b5760008555613e82565b82601f10613e5457803560ff1916838001178555613e82565b82800160010185558215613e82579182015b82811115613e81578235825591602001919060010190613e66565b5b509050613e8f9190613e93565b5090565b5b80821115613eac576000816000905550600101613e94565b5090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613eef81613eba565b8114613efa57600080fd5b50565b600081359050613f0c81613ee6565b92915050565b600060208284031215613f2857613f27613eb0565b5b6000613f3684828501613efd565b91505092915050565b60008115159050919050565b613f5481613f3f565b82525050565b6000602082019050613f6f6000830184613f4b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613faf578082015181840152602081019050613f94565b83811115613fbe576000848401525b50505050565b6000601f19601f8301169050919050565b6000613fe082613f75565b613fea8185613f80565b9350613ffa818560208601613f91565b61400381613fc4565b840191505092915050565b600060208201905081810360008301526140288184613fd5565b905092915050565b6000819050919050565b61404381614030565b811461404e57600080fd5b50565b6000813590506140608161403a565b92915050565b60006020828403121561407c5761407b613eb0565b5b600061408a84828501614051565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140be82614093565b9050919050565b6140ce816140b3565b82525050565b60006020820190506140e960008301846140c5565b92915050565b6140f8816140b3565b811461410357600080fd5b50565b600081359050614115816140ef565b92915050565b6000806040838503121561413257614131613eb0565b5b600061414085828601614106565b925050602061415185828601614051565b9150509250929050565b61416481614030565b82525050565b600060208201905061417f600083018461415b565b92915050565b60008060006060848603121561419e5761419d613eb0565b5b60006141ac86828701614106565b93505060206141bd86828701614106565b92505060406141ce86828701614051565b9150509250925092565b6000602082840312156141ee576141ed613eb0565b5b60006141fc84828501614106565b91505092915050565b6000819050919050565b61421881614205565b82525050565b6000602082019050614233600083018461420f565b92915050565b600060ff82169050919050565b61424f81614239565b811461425a57600080fd5b50565b60008135905061426c81614246565b92915050565b60006020828403121561428857614287613eb0565b5b60006142968482850161425d565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126142c4576142c361429f565b5b8235905067ffffffffffffffff8111156142e1576142e06142a4565b5b6020830191508360208202830111156142fd576142fc6142a9565b5b9250929050565b6000806020838503121561431b5761431a613eb0565b5b600083013567ffffffffffffffff81111561433957614338613eb5565b5b614345858286016142ae565b92509250509250929050565b61435a81614205565b811461436557600080fd5b50565b60008135905061437781614351565b92915050565b60006020828403121561439357614392613eb0565b5b60006143a184828501614368565b91505092915050565b60008083601f8401126143c0576143bf61429f565b5b8235905067ffffffffffffffff8111156143dd576143dc6142a4565b5b6020830191508360208202830111156143f9576143f86142a9565b5b9250929050565b6000806020838503121561441757614416613eb0565b5b600083013567ffffffffffffffff81111561443557614434613eb5565b5b614441858286016143aa565b92509250509250929050565b61445681613f3f565b811461446157600080fd5b50565b6000813590506144738161444d565b92915050565b600080604083850312156144905761448f613eb0565b5b600061449e85828601614106565b92505060206144af85828601614464565b9150509250929050565b6000806000604084860312156144d2576144d1613eb0565b5b60006144e08682870161425d565b935050602084013567ffffffffffffffff81111561450157614500613eb5565b5b61450d868287016143aa565b92509250509250925092565b60008083601f84011261452f5761452e61429f565b5b8235905067ffffffffffffffff81111561454c5761454b6142a4565b5b602083019150836001820283011115614568576145676142a9565b5b9250929050565b60008060008060006080868803121561458b5761458a613eb0565b5b600061459988828901614106565b95505060206145aa88828901614106565b94505060406145bb88828901614051565b935050606086013567ffffffffffffffff8111156145dc576145db613eb5565b5b6145e888828901614519565b92509250509295509295909350565b60008083601f84011261460d5761460c61429f565b5b8235905067ffffffffffffffff81111561462a576146296142a4565b5b602083019150836001820283011115614646576146456142a9565b5b9250929050565b6000806020838503121561466457614663613eb0565b5b600083013567ffffffffffffffff81111561468257614681613eb5565b5b61468e858286016145f7565b92509250509250929050565b600080604083850312156146b1576146b0613eb0565b5b60006146bf85828601614106565b92505060206146d085828601614106565b9150509250929050565b60006146e582614093565b9050919050565b6146f5816146da565b811461470057600080fd5b50565b600081359050614712816146ec565b92915050565b60006020828403121561472e5761472d613eb0565b5b600061473c84828501614703565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061478c57607f821691505b602082108114156147a05761479f614745565b5b50919050565b7f546865207a65726f20616464726573732063616e6e6f74206d696e7420616e7960008201527f7468696e672e0000000000000000000000000000000000000000000000000000602082015250565b6000614802602683613f80565b915061480d826147a6565b604082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061487282614030565b915061487d83614030565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148b2576148b1614838565b5b828201905092915050565b7f43616e6e6f74206d696e74206d6f72652074686520746f74616c20737570706c60008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614919602283613f80565b9150614924826148bd565b604082019050919050565b600060208201905081810360008301526149488161490c565b9050919050565b600061495a82614030565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561498d5761498c614838565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f742061646420746865206e756c6c20616464726573730000000000600082015250565b60006149fd601b83613f80565b9150614a08826149c7565b602082019050919050565b60006020820190508181036000830152614a2c816149f0565b9050919050565b7f6d65726b6c6520726f6f742076616c756520697320696e76616c696400000000600082015250565b6000614a69601c83613f80565b9150614a7482614a33565b602082019050919050565b60006020820190508181036000830152614a9881614a5c565b9050919050565b7f43616e7420616464206e756c6c20616464726573730000000000000000000000600082015250565b6000614ad5601583613f80565b9150614ae082614a9f565b602082019050919050565b60006020820190508181036000830152614b0481614ac8565b9050919050565b7f6d65726b6c6520726f6f74206e6f742073657400000000000000000000000000600082015250565b6000614b41601383613f80565b9150614b4c82614b0b565b602082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b60008160601b9050919050565b6000614b8f82614b77565b9050919050565b6000614ba182614b84565b9050919050565b614bb9614bb4826140b3565b614b96565b82525050565b6000614bcb8284614ba8565b60148201915081905092915050565b7f4d696e74696e67206e6f7420617661696c61626c6520796574206f722070617560008201527f73656420666f72206e65787420726f756e640000000000000000000000000000602082015250565b6000614c36603283613f80565b9150614c4182614bda565b604082019050919050565b60006020820190508181036000830152614c6581614c29565b9050919050565b7f4174206c65617374206f6e6520617274206973206e6565646564000000000000600082015250565b6000614ca2601a83613f80565b9150614cad82614c6c565b602082019050919050565b60006020820190508181036000830152614cd181614c95565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e2031206c696d69742070657260008201527f2057616c6c65742e000000000000000000000000000000000000000000000000602082015250565b6000614d34602883613f80565b9150614d3f82614cd8565b604082019050919050565b60006020820190508181036000830152614d6381614d27565b9050919050565b6000614d7582614030565b9150614d8083614030565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614db957614db8614838565b5b828202905092915050565b7f4e4654732061726520657870656e736976652c206e656564206d6f726520455460008201527f4820746f206166666f726420746861742e000000000000000000000000000000602082015250565b6000614e20603183613f80565b9150614e2b82614dc4565b604082019050919050565b60006020820190508181036000830152614e4f81614e13565b9050919050565b7f4e6f7420656e6f756768206f662074686f7365206c65667420696e2073746f6360008201527f6b2e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614eb2602283613f80565b9150614ebd82614e56565b604082019050919050565b60006020820190508181036000830152614ee181614ea5565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614f1e600d83613f80565b9150614f2982614ee8565b602082019050919050565b60006020820190508181036000830152614f4d81614f11565b9050919050565b7f4e6f7420696e20746865204d65726b6c6520747265652c206f6e6c7920666f7260008201527f206578636c757369766520696e76697465657300000000000000000000000000602082015250565b6000614fb0603383613f80565b9150614fbb82614f54565b604082019050919050565b60006020820190508181036000830152614fdf81614fa3565b9050919050565b7f4f6e6c7920666f72206578636c757369766520696e7669746565732e2e2e0000600082015250565b600061501c601e83613f80565b915061502782614fe6565b602082019050919050565b6000602082019050818103600083015261504b8161500f565b9050919050565b6000819050919050565b600061507761507261506d84614239565b615052565b614030565b9050919050565b6150878161505c565b82525050565b60006040820190506150a260008301856140c5565b6150af602083018461507e565b9392505050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006150ec601583613f80565b91506150f7826150b6565b602082019050919050565b6000602082019050818103600083015261511b816150df565b9050919050565b7f546f6b656e206861736e2774206265656e206d696e746564207965742e000000600082015250565b6000615158601d83613f80565b915061516382615122565b602082019050919050565b600060208201905081810360008301526151878161514b565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546151bb81614774565b6151c5818661518e565b945060018216600081146151e057600181146151f157615224565b60ff19831686528186019350615224565b6151fa85615199565b60005b8381101561521c578154818901526001820191506020810190506151fd565b838801955050505b50505092915050565b6000819050919050565b61524861524382614205565b61522d565b82525050565b600061525982613f75565b615263818561518e565b9350615273818560208601613f91565b80840191505092915050565b600061528b82866151ae565b91506152978285615237565b6020820191506152a7828461524e565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b60006152db826152b4565b6152e581856152bf565b93506152f5818560208601613f91565b6152fe81613fc4565b840191505092915050565b600060808201905061531e60008301876140c5565b61532b60208301866140c5565b615338604083018561415b565b818103606083015261534a81846152d0565b905095945050505050565b60008151905061536481613ee6565b92915050565b6000602082840312156153805761537f613eb0565b5b600061538e84828501615355565b91505092915050565b60006153a38285615237565b6020820191506153b38284615237565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153fd82614030565b915061540883614030565b925082615418576154176153c3565b5b828204905092915050565b600061542e82614030565b915061543983614030565b925082615449576154486153c3565b5b828206905092915050565b600061545f82614030565b915061546a83614030565b92508282101561547d5761547c614838565b5b82820390509291505056fea26469706673582212203f6456c8d27e03575e589d7360a083b613b5d827c81acd8deac957055c5647c064736f6c63430008090033

Deployed Bytecode Sourcemap

27347:6967:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11043:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26810:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21026:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18600:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27477:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34078:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28070:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17826:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30724:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28423:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33149:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29730:97;;;;;;;;;;;;;:::i;:::-;;17071:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27954:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27686:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29616:106;;;;;;;;;;;;;:::i;:::-;;20364:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27608:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27526:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19890:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29892:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29224:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29451:100;;;;;;;;;;;;;:::i;:::-;;11652:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11772:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27046:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30369:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31604:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28125:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19364:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27787:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30244:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31945:1132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16451:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33749:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28638:578;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34226:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33565:109;;;;;;;;;;;;;:::i;:::-;;21478:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12597:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11596:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33923:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30976:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11043:172;11153:4;11176:19;:33;11196:12;11176:33;;;;;;;;;;;;;;;;;;;;;;;;;;;11169:40;;11043:172;;;:::o;26810:120::-;26878:19;26917:7;26909:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26810:120;:::o;21026:183::-;21155:7;21131:8;15414:1;15383:33;;:9;:19;15393:8;15383:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15418:13;;;;;;;;;;;;;;;;;15375:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21181:12:::1;:22;21194:8;21181:22;;;;;;;;;;;;;;;;;;;;;21174:29;;21026:183:::0;;;;:::o;18600:352::-;18713:8;14567:18;14588:9;:19;14598:8;14588:19;;;;;;;;;;;;;;;;;;;;;14567:40;;14644:10;14630:24;;:10;:24;;;:68;;;;14658:16;:28;14675:10;14658:28;;;;;;;;;;;;;;;:40;14687:10;14658:40;;;;;;;;;;;;;;;;;;;;;;;;;14630:68;14707:21;;;;;;;;;;;;;;;;;14614:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18741:8:::1;15414:1;15383:33;;:9;:19;15393:8;15383:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15418:13;;;;;;;;;;;;;;;;::::0;15375:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18761:18:::2;18782:9;:19;18792:8;18782:19;;;;;;;;;;;;;;;;;;;;;18761:40;;18829:10;18816:23;;:9;:23;;;;18841:8;;;;;;;;;;;;;;;;::::0;18808:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18884:9;18859:12;:22;18872:8;18859:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;18937:8;18926:9;18905:41;;18914:10;18905:41;;;;;;;;;;;;18754:198;14742:1:::1;14560:189:::0;18600:352;;;:::o;27477:42::-;27509:10;27477:42;:::o;34078:95::-;34121:4;34151:14;;34144:21;;34078:95;:::o;28070:33::-;;;;:::o;17826:353::-;17959:8;14947:18;14968:9;:19;14978:8;14968:19;;;;;;;;;;;;;;;;;;;;;14947:40;;15024:10;15010:24;;:10;:24;;;:71;;;;15071:10;15045:36;;:12;:22;15058:8;15045:22;;;;;;;;;;;;;;;;;;;;;:36;;;15010:71;:122;;;;15092:16;:28;15109:10;15092:28;;;;;;;;;;;;;;;:40;15121:10;15092:40;;;;;;;;;;;;;;;;;;;;;;;;;15010:122;15141:30;;;;;;;;;;;;;;;;;14994:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17987:8:::1;15414:1;15383:33;;:9;:19;15393:8;15383:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15418:13;;;;;;;;;;;;;;;;::::0;15375:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18007:18:::2;18028:9;:19;18038:8;18028:19;;;;;;;;;;;;;;;;;;;;;18007:40;;18076:5;18062:19;;:10;:19;;;18083:9;;;;;;;;;;;;;;;;::::0;18054:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18123:1;18108:17;;:3;:17;;;;18127:12;;;;;;;;;;;;;;;;::::0;18100:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18149:24;18159:3;18164:8;18149:9;:24::i;:::-;18000:179;15185:1:::1;14940:252:::0;17826:353;;;;:::o;30724:192::-;30781:7;30826:1;30809:19;;:5;:19;;;;30801:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;30891:10;:17;30902:5;30891:17;;;;;;;;;;;;;;;;30884:24;;30724:192;;;:::o;28423:25::-;;;;:::o;33149:359::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27558:4:::1;33237:14;;33226:8;:25;;;;;;:::i;:::-;:35;;33218:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;33315:9;33311:190;33334:8;33330:12;;:1;:12;33311:190;;;33392:1;33374:14;;:19;;;;;;;:::i;:::-;;;;;;;;33434:1;33408:10;:22;33419:10;33408:22;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;33450:39;33462:10;33474:14;;33450:11;:39::i;:::-;33344:3;;;;;:::i;:::-;;;;33311:190;;;;33149:359:::0;:::o;29730:97::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29799:14:::1;;;;;;;;;;;29798:15;29781:14;;:32;;;;;;;;;;;;;;;;;;29730:97::o:0;17071:179::-;17201:43;17219:5;17226:3;17231:8;17201:43;;;;;;;;;;;;:17;:43::i;:::-;17071:179;;;:::o;27954:46::-;;;;;;;;;;;;;;;;;:::o;27686:39::-;;;;;;;;;;;;;:::o;29616:106::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29697:17:::1;;;;;;;;;;;29696:18;29676:17;;:38;;;;;;;;;;;;;;;;;;29616:106::o:0;20364:208::-;20461:14;20496:9;:19;20506:8;20496:19;;;;;;;;;;;;;;;;;;;;;20487:28;;20548:1;20530:20;;:6;:20;;;;20552:13;;;;;;;;;;;;;;;;;20522:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20364:208;;;:::o;27608:39::-;;;;;;;;;;;;;:::o;27526:36::-;27558:4;27526:36;:::o;19890:204::-;19987:7;20032:1;20014:20;;:6;:20;;;;20036:12;;;;;;;;;;;;;;;;;20006:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20063:25;20081:6;20063:17;:25::i;:::-;20056:32;;19890:204;;;:::o;29892:278::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29981:9:::1;29976:187;30000:9;;:16;;29996:1;:20;29976:187;;;30070:1;30046:26;;:9;;30056:1;30046:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;30038:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;30147:4;30121:9;:23;30131:9;;30141:1;30131:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;30121:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;30018:3;;;;;:::i;:::-;;;;29976:187;;;;29892:278:::0;;:::o;29224:163::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29313:1:::1;29300:14;;:6;29307:1;29300:9;;;;;;;:::i;:::-;;;;;:14;;;;;29292:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;29373:6;29360:10;:19;;;;29224:163:::0;:::o;29451:100::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29528:15:::1;;;;;;;;;;;29527:16;29509:15;;:34;;;;;;;;;;;;;;;;;;29451:100::o:0;11652:65::-;;;;;;;;;;;;;;;;;;;:::o;11772:20::-;;;;;;;;;;;;;:::o;27046:128::-;27116:21;27159:9;27149:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27046:128;:::o;30369:278::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30463:9:::1;30458:182;30482:9;;:16;;30478:1;:20;30458:182;;;30552:1;30528:26;;:9;;30538:1;30528:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;30520:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30623:5;30597:9;:23;30607:9;;30617:1;30607:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;30597:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;30500:3;;;;;:::i;:::-;;;;30458:182;;;;30369:278:::0;;:::o;31604:296::-;31694:4;31741:1;31724:18;;:10;;31735:1;31724:13;;;;;;;:::i;:::-;;;;;:18;;;;;31716:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;31777:12;31819:10;31802:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;31792:39;;;;;;31777:54;;31849:43;31868:5;;31849:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31875:10;;31887:4;31849:18;:43::i;:::-;31842:50;;;31604:296;;;;:::o;28125:25::-;;;;:::o;19364:232::-;19521:9;19479:16;:28;19496:10;19479:28;;;;;;;;;;;;;;;:39;19508:9;19479:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;19569:9;19542:48;;19557:10;19542:48;;;19580:9;19542:48;;;;;;:::i;:::-;;;;;;;;19364:232;;:::o;27787:38::-;;;;;;;;;;;;;:::o;30244:105::-;30302:4;30326:9;:15;30336:4;30326:15;;;;;;;;;;;;;;;;;;;;;;;;;30319:22;;30244:105;;;:::o;31945:1132::-;32041:15;;;;;;;;;;;32033:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;32141:1;32130:8;:12;;;32122:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;32229:9;;32203:10;:22;32214:10;32203:22;;;;;;;;;;;;;;;;32192:8;:33;;;;;;:::i;:::-;:46;;32184:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;32326:8;32315:19;;27509:10;32315:19;;;;:::i;:::-;32302:9;:32;;32294:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;27558:4;32424:8;32407:25;;:14;;:25;;;;:::i;:::-;:35;;32399:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;32517:2;32500:6;;:13;;:19;;32492:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;32562:14;;;;;;;;;;;32558:134;;;32610:14;32617:6;;32610;:14::i;:::-;32602:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;32558:134;32707:17;;;;;;;;;;;32704:122;;;32758:9;:21;32768:10;32758:21;;;;;;;;;;;;;;;;;;;;;;;;;32750:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32704:122;32842:6;32838:186;32858:8;32854:12;;:1;:12;32838:186;;;32915:1;32897:14;;:19;;;;;;;:::i;:::-;;;;;;;;32931:39;32943:10;32955:14;;32931:11;:39::i;:::-;33011:1;32985:10;:22;32996:10;32985:22;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;32868:3;;;;;:::i;:::-;;;;32838:186;;;;33041:28;33048:10;33060:8;33041:28;;;;;;;:::i;:::-;;;;;;;;31945:1132;;;:::o;16451:209::-;16608:46;16626:5;16633:3;16638:8;16648:5;;16608:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;16451:209;;;;;:::o;33749:103::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;33840:4:::1;;33826:11;:18;;;;;;;:::i;:::-;;33749:103:::0;;:::o;28638:578::-;28693:13;28896:1;28886:7;:11;28878:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;28953:14;;28942:7;:25;;28934:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29014:17;29042:19;29084:20;29096:7;29084:11;:20::i;:::-;29072:32;;29141:11;29154:9;29165:10;;;;;;;;;;;;;;;;;29124:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29115:61;;29201:6;29187:21;;;;28638:578;;;:::o;34226:85::-;34267:4;27558;34290:13;;34226:85;:::o;33565:109::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;33624:10:::1;;;;;;;;;;;:19;;:42;33644:21;33624:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;33565:109::o:0;21478:192::-;21606:4;21629:16;:24;21646:6;21629:24;;;;;;;;;;;;;;;:35;21654:9;21629:35;;;;;;;;;;;;;;;;;;;;;;;;;21622:42;;21478:192;;;;:::o;12597:238::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12719:1:::1;12698:23;;:9;:23;;;;12723:31;;;;;;;;;;;;;;;;::::0;12690:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12795:9;12767:38;;12788:5;;;;;;;;;;;12767:38;;;;;;;;;;;;12820:9;12812:5;;:17;;;;;;;;;;;;;;;;;;12597:238:::0;:::o;11596:51::-;;;;;;;;;;;;;;;;;;;:::o;33923:99::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;34006:8:::1;33994:9;:20;;;;33923:99:::0;:::o;30976:119::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31076:11:::1;31063:10;;:24;;;;;;;;;;;;;;;;;;30976:119:::0;:::o;21861:275::-;21950:12;21965:9;:19;21975:8;21965:19;;;;;;;;;;;;;;;;;;;;;21950:34;;21991:24;22006:8;21991:14;:24::i;:::-;22024:30;22039:4;22045:8;22024:14;:30::i;:::-;22061:26;22073:3;22078:8;22061:11;:26::i;:::-;22121:8;22116:3;22101:29;;22110:4;22101:29;;;;;;;;;;;;21943:193;21861:275;;:::o;22527:297::-;22648:1;22633:17;;:3;:17;;;;22652:12;;;;;;;;;;;;;;;;;22625:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22711:1;22680:33;;:9;:19;22690:8;22680:19;;;;;;;;;;;;;;;;;;;;;:33;;;22715:18;;;;;;;;;;;;;;;;;22672:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22743:26;22755:3;22760:8;22743:11;:26::i;:::-;22809:8;22804:3;22783:35;;22800:1;22783:35;;;;;;;;;;;;22527:297;;:::o;25263:590::-;25411:8;14947:18;14968:9;:19;14978:8;14968:19;;;;;;;;;;;;;;;;;;;;;14947:40;;15024:10;15010:24;;:10;:24;;;:71;;;;15071:10;15045:36;;:12;:22;15058:8;15045:22;;;;;;;;;;;;;;;;;;;;;:36;;;15010:71;:122;;;;15092:16;:28;15109:10;15092:28;;;;;;;;;;;;;;;:40;15121:10;15092:40;;;;;;;;;;;;;;;;;;;;;;;;;15010:122;15141:30;;;;;;;;;;;;;;;;;14994:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25439:8:::1;15414:1;15383:33;;:9;:19;15393:8;15383:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15418:13;;;;;;;;;;;;;;;;::::0;15375:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25459:18:::2;25480:9;:19;25490:8;25480:19;;;;;;;;;;;;;;;;;;;;;25459:40;;25528:5;25514:19;;:10;:19;;;25535:9;;;;;;;;;;;;;;;;::::0;25506:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25575:1;25560:17;;:3;:17;;;;25579:12;;;;;;;;;;;;;;;;::::0;25552:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25601:24;25611:3;25616:8;25601:9;:24::i;:::-;25638:16;:3;:14;;;:16::i;:::-;25634:214;;;25670:13;25706:3;25686:41;;;25728:10;25740:5;25747:8;25757:5;25686:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25670:93;;13785:10;25790:24;;25780:34;;;:6;:34;;;;25816:23;;;;;;;;;;;;;;;;::::0;25772:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25661:187;25634:214;25452:401;15185:1:::1;14940:252:::0;25263:590;;;;;:::o;24822:163::-;24926:7;24952:19;:27;24972:6;24952:27;;;;;;;;;;;;;;;;24945:34;;24822:163;;;:::o;1047:755::-;1173:4;1189:20;1212:4;1189:27;;1230:9;1225:464;1249:5;:12;1245:1;:16;1225:464;;;1277:20;1300:5;1306:1;1300:8;;;;;;;;:::i;:::-;;;;;;;;1277:31;;1338:12;1323;:27;1319:363;;;1476:12;1490;1459:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1449:55;;;;;;1434:70;;1319:363;;;1644:12;1658;1627:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1617:55;;;;;;1602:70;;1319:363;1268:421;1263:3;;;;;:::i;:::-;;;;1225:464;;;;1792:4;1776:12;:20;1769:27;;;1047:755;;;;;:::o;31196:400::-;31247:11;31280:1;31275;:6;31271:297;;;31307:9;;;31271:297;;;31367:190;31378:1;31374;:5;31367:190;;;31441:6;31433:3;31428:9;;:20;;;;:::i;:::-;31420:29;;31414:35;;31501:13;31495:2;31489;31485:1;:6;;;;:::i;:::-;31484:13;;;;:::i;:::-;31483:31;;;;:::i;:::-;31475:40;;31468:47;;;;31539:2;31534:7;;;;;:::i;:::-;;;31367:190;;;31271:297;31196:400;;;:::o;25986:110::-;26068:12;:22;26081:8;26068:22;;;;;;;;;;;;26061:29;;;;;;;;;;;25986:110;:::o;23784:234::-;23924:5;23901:28;;:9;:19;23911:8;23901:19;;;;;;;;;;;;;;;;;;;;;:28;;;23931:9;;;;;;;;;;;;;;;;;23893:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23978:1;23948:19;:26;23968:5;23948:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;23993:9;:19;24003:8;23993:19;;;;;;;;;;;;23986:26;;;;;;;;;;;23784:234;;:::o;24285:242::-;24428:1;24397:33;;:9;:19;24407:8;24397:19;;;;;;;;;;;;;;;;;;;;;:33;;;24432:18;;;;;;;;;;;;;;;;;24389:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24482:3;24460:9;:19;24470:8;24460:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;24520:1;24492:19;:24;24512:3;24492:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;24285:242;;:::o;426:589::-;484:4;497:12;980:5;968:18;960:26;;1008:1;1001:4;:8;994:15;;;426:589;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:77::-;6287:7;6316:5;6305:16;;6250:77;;;:::o;6333:118::-;6420:24;6438:5;6420:24;:::i;:::-;6415:3;6408:37;6333:118;;:::o;6457:222::-;6550:4;6588:2;6577:9;6573:18;6565:26;;6601:71;6669:1;6658:9;6654:17;6645:6;6601:71;:::i;:::-;6457:222;;;;:::o;6685:86::-;6720:7;6760:4;6753:5;6749:16;6738:27;;6685:86;;;:::o;6777:118::-;6848:22;6864:5;6848:22;:::i;:::-;6841:5;6838:33;6828:61;;6885:1;6882;6875:12;6828:61;6777:118;:::o;6901:135::-;6945:5;6983:6;6970:20;6961:29;;6999:31;7024:5;6999:31;:::i;:::-;6901:135;;;;:::o;7042:325::-;7099:6;7148:2;7136:9;7127:7;7123:23;7119:32;7116:119;;;7154:79;;:::i;:::-;7116:119;7274:1;7299:51;7342:7;7333:6;7322:9;7318:22;7299:51;:::i;:::-;7289:61;;7245:115;7042:325;;;;:::o;7373:117::-;7482:1;7479;7472:12;7496:117;7605:1;7602;7595:12;7619:117;7728:1;7725;7718:12;7759:568;7832:8;7842:6;7892:3;7885:4;7877:6;7873:17;7869:27;7859:122;;7900:79;;:::i;:::-;7859:122;8013:6;8000:20;7990:30;;8043:18;8035:6;8032:30;8029:117;;;8065:79;;:::i;:::-;8029:117;8179:4;8171:6;8167:17;8155:29;;8233:3;8225:4;8217:6;8213:17;8203:8;8199:32;8196:41;8193:128;;;8240:79;;:::i;:::-;8193:128;7759:568;;;;;:::o;8333:559::-;8419:6;8427;8476:2;8464:9;8455:7;8451:23;8447:32;8444:119;;;8482:79;;:::i;:::-;8444:119;8630:1;8619:9;8615:17;8602:31;8660:18;8652:6;8649:30;8646:117;;;8682:79;;:::i;:::-;8646:117;8795:80;8867:7;8858:6;8847:9;8843:22;8795:80;:::i;:::-;8777:98;;;;8573:312;8333:559;;;;;:::o;8898:122::-;8971:24;8989:5;8971:24;:::i;:::-;8964:5;8961:35;8951:63;;9010:1;9007;9000:12;8951:63;8898:122;:::o;9026:139::-;9072:5;9110:6;9097:20;9088:29;;9126:33;9153:5;9126:33;:::i;:::-;9026:139;;;;:::o;9171:329::-;9230:6;9279:2;9267:9;9258:7;9254:23;9250:32;9247:119;;;9285:79;;:::i;:::-;9247:119;9405:1;9430:53;9475:7;9466:6;9455:9;9451:22;9430:53;:::i;:::-;9420:63;;9376:117;9171:329;;;;:::o;9523:568::-;9596:8;9606:6;9656:3;9649:4;9641:6;9637:17;9633:27;9623:122;;9664:79;;:::i;:::-;9623:122;9777:6;9764:20;9754:30;;9807:18;9799:6;9796:30;9793:117;;;9829:79;;:::i;:::-;9793:117;9943:4;9935:6;9931:17;9919:29;;9997:3;9989:4;9981:6;9977:17;9967:8;9963:32;9960:41;9957:128;;;10004:79;;:::i;:::-;9957:128;9523:568;;;;;:::o;10097:559::-;10183:6;10191;10240:2;10228:9;10219:7;10215:23;10211:32;10208:119;;;10246:79;;:::i;:::-;10208:119;10394:1;10383:9;10379:17;10366:31;10424:18;10416:6;10413:30;10410:117;;;10446:79;;:::i;:::-;10410:117;10559:80;10631:7;10622:6;10611:9;10607:22;10559:80;:::i;:::-;10541:98;;;;10337:312;10097:559;;;;;:::o;10662:116::-;10732:21;10747:5;10732:21;:::i;:::-;10725:5;10722:32;10712:60;;10768:1;10765;10758:12;10712:60;10662:116;:::o;10784:133::-;10827:5;10865:6;10852:20;10843:29;;10881:30;10905:5;10881:30;:::i;:::-;10784:133;;;;:::o;10923:468::-;10988:6;10996;11045:2;11033:9;11024:7;11020:23;11016:32;11013:119;;;11051:79;;:::i;:::-;11013:119;11171:1;11196:53;11241:7;11232:6;11221:9;11217:22;11196:53;:::i;:::-;11186:63;;11142:117;11298:2;11324:50;11366:7;11357:6;11346:9;11342:22;11324:50;:::i;:::-;11314:60;;11269:115;10923:468;;;;;:::o;11397:700::-;11490:6;11498;11506;11555:2;11543:9;11534:7;11530:23;11526:32;11523:119;;;11561:79;;:::i;:::-;11523:119;11681:1;11706:51;11749:7;11740:6;11729:9;11725:22;11706:51;:::i;:::-;11696:61;;11652:115;11834:2;11823:9;11819:18;11806:32;11865:18;11857:6;11854:30;11851:117;;;11887:79;;:::i;:::-;11851:117;12000:80;12072:7;12063:6;12052:9;12048:22;12000:80;:::i;:::-;11982:98;;;;11777:313;11397:700;;;;;:::o;12116:552::-;12173:8;12183:6;12233:3;12226:4;12218:6;12214:17;12210:27;12200:122;;12241:79;;:::i;:::-;12200:122;12354:6;12341:20;12331:30;;12384:18;12376:6;12373:30;12370:117;;;12406:79;;:::i;:::-;12370:117;12520:4;12512:6;12508:17;12496:29;;12574:3;12566:4;12558:6;12554:17;12544:8;12540:32;12537:41;12534:128;;;12581:79;;:::i;:::-;12534:128;12116:552;;;;;:::o;12674:963::-;12771:6;12779;12787;12795;12803;12852:3;12840:9;12831:7;12827:23;12823:33;12820:120;;;12859:79;;:::i;:::-;12820:120;12979:1;13004:53;13049:7;13040:6;13029:9;13025:22;13004:53;:::i;:::-;12994:63;;12950:117;13106:2;13132:53;13177:7;13168:6;13157:9;13153:22;13132:53;:::i;:::-;13122:63;;13077:118;13234:2;13260:53;13305:7;13296:6;13285:9;13281:22;13260:53;:::i;:::-;13250:63;;13205:118;13390:2;13379:9;13375:18;13362:32;13421:18;13413:6;13410:30;13407:117;;;13443:79;;:::i;:::-;13407:117;13556:64;13612:7;13603:6;13592:9;13588:22;13556:64;:::i;:::-;13538:82;;;;13333:297;12674:963;;;;;;;;:::o;13657:553::-;13715:8;13725:6;13775:3;13768:4;13760:6;13756:17;13752:27;13742:122;;13783:79;;:::i;:::-;13742:122;13896:6;13883:20;13873:30;;13926:18;13918:6;13915:30;13912:117;;;13948:79;;:::i;:::-;13912:117;14062:4;14054:6;14050:17;14038:29;;14116:3;14108:4;14100:6;14096:17;14086:8;14082:32;14079:41;14076:128;;;14123:79;;:::i;:::-;14076:128;13657:553;;;;;:::o;14216:529::-;14287:6;14295;14344:2;14332:9;14323:7;14319:23;14315:32;14312:119;;;14350:79;;:::i;:::-;14312:119;14498:1;14487:9;14483:17;14470:31;14528:18;14520:6;14517:30;14514:117;;;14550:79;;:::i;:::-;14514:117;14663:65;14720:7;14711:6;14700:9;14696:22;14663:65;:::i;:::-;14645:83;;;;14441:297;14216:529;;;;;:::o;14751:474::-;14819:6;14827;14876:2;14864:9;14855:7;14851:23;14847:32;14844:119;;;14882:79;;:::i;:::-;14844:119;15002:1;15027:53;15072:7;15063:6;15052:9;15048:22;15027:53;:::i;:::-;15017:63;;14973:117;15129:2;15155:53;15200:7;15191:6;15180:9;15176:22;15155:53;:::i;:::-;15145:63;;15100:118;14751:474;;;;;:::o;15231:104::-;15276:7;15305:24;15323:5;15305:24;:::i;:::-;15294:35;;15231:104;;;:::o;15341:138::-;15422:32;15448:5;15422:32;:::i;:::-;15415:5;15412:43;15402:71;;15469:1;15466;15459:12;15402:71;15341:138;:::o;15485:155::-;15539:5;15577:6;15564:20;15555:29;;15593:41;15628:5;15593:41;:::i;:::-;15485:155;;;;:::o;15646:345::-;15713:6;15762:2;15750:9;15741:7;15737:23;15733:32;15730:119;;;15768:79;;:::i;:::-;15730:119;15888:1;15913:61;15966:7;15957:6;15946:9;15942:22;15913:61;:::i;:::-;15903:71;;15859:125;15646:345;;;;:::o;15997:180::-;16045:77;16042:1;16035:88;16142:4;16139:1;16132:15;16166:4;16163:1;16156:15;16183:320;16227:6;16264:1;16258:4;16254:12;16244:22;;16311:1;16305:4;16301:12;16332:18;16322:81;;16388:4;16380:6;16376:17;16366:27;;16322:81;16450:2;16442:6;16439:14;16419:18;16416:38;16413:84;;;16469:18;;:::i;:::-;16413:84;16234:269;16183:320;;;:::o;16509:225::-;16649:34;16645:1;16637:6;16633:14;16626:58;16718:8;16713:2;16705:6;16701:15;16694:33;16509:225;:::o;16740:366::-;16882:3;16903:67;16967:2;16962:3;16903:67;:::i;:::-;16896:74;;16979:93;17068:3;16979:93;:::i;:::-;17097:2;17092:3;17088:12;17081:19;;16740:366;;;:::o;17112:419::-;17278:4;17316:2;17305:9;17301:18;17293:26;;17365:9;17359:4;17355:20;17351:1;17340:9;17336:17;17329:47;17393:131;17519:4;17393:131;:::i;:::-;17385:139;;17112:419;;;:::o;17537:180::-;17585:77;17582:1;17575:88;17682:4;17679:1;17672:15;17706:4;17703:1;17696:15;17723:305;17763:3;17782:20;17800:1;17782:20;:::i;:::-;17777:25;;17816:20;17834:1;17816:20;:::i;:::-;17811:25;;17970:1;17902:66;17898:74;17895:1;17892:81;17889:107;;;17976:18;;:::i;:::-;17889:107;18020:1;18017;18013:9;18006:16;;17723:305;;;;:::o;18034:221::-;18174:34;18170:1;18162:6;18158:14;18151:58;18243:4;18238:2;18230:6;18226:15;18219:29;18034:221;:::o;18261:366::-;18403:3;18424:67;18488:2;18483:3;18424:67;:::i;:::-;18417:74;;18500:93;18589:3;18500:93;:::i;:::-;18618:2;18613:3;18609:12;18602:19;;18261:366;;;:::o;18633:419::-;18799:4;18837:2;18826:9;18822:18;18814:26;;18886:9;18880:4;18876:20;18872:1;18861:9;18857:17;18850:47;18914:131;19040:4;18914:131;:::i;:::-;18906:139;;18633:419;;;:::o;19058:233::-;19097:3;19120:24;19138:5;19120:24;:::i;:::-;19111:33;;19166:66;19159:5;19156:77;19153:103;;;19236:18;;:::i;:::-;19153:103;19283:1;19276:5;19272:13;19265:20;;19058:233;;;:::o;19297:180::-;19345:77;19342:1;19335:88;19442:4;19439:1;19432:15;19466:4;19463:1;19456:15;19483:177;19623:29;19619:1;19611:6;19607:14;19600:53;19483:177;:::o;19666:366::-;19808:3;19829:67;19893:2;19888:3;19829:67;:::i;:::-;19822:74;;19905:93;19994:3;19905:93;:::i;:::-;20023:2;20018:3;20014:12;20007:19;;19666:366;;;:::o;20038:419::-;20204:4;20242:2;20231:9;20227:18;20219:26;;20291:9;20285:4;20281:20;20277:1;20266:9;20262:17;20255:47;20319:131;20445:4;20319:131;:::i;:::-;20311:139;;20038:419;;;:::o;20463:178::-;20603:30;20599:1;20591:6;20587:14;20580:54;20463:178;:::o;20647:366::-;20789:3;20810:67;20874:2;20869:3;20810:67;:::i;:::-;20803:74;;20886:93;20975:3;20886:93;:::i;:::-;21004:2;20999:3;20995:12;20988:19;;20647:366;;;:::o;21019:419::-;21185:4;21223:2;21212:9;21208:18;21200:26;;21272:9;21266:4;21262:20;21258:1;21247:9;21243:17;21236:47;21300:131;21426:4;21300:131;:::i;:::-;21292:139;;21019:419;;;:::o;21444:171::-;21584:23;21580:1;21572:6;21568:14;21561:47;21444:171;:::o;21621:366::-;21763:3;21784:67;21848:2;21843:3;21784:67;:::i;:::-;21777:74;;21860:93;21949:3;21860:93;:::i;:::-;21978:2;21973:3;21969:12;21962:19;;21621:366;;;:::o;21993:419::-;22159:4;22197:2;22186:9;22182:18;22174:26;;22246:9;22240:4;22236:20;22232:1;22221:9;22217:17;22210:47;22274:131;22400:4;22274:131;:::i;:::-;22266:139;;21993:419;;;:::o;22418:169::-;22558:21;22554:1;22546:6;22542:14;22535:45;22418:169;:::o;22593:366::-;22735:3;22756:67;22820:2;22815:3;22756:67;:::i;:::-;22749:74;;22832:93;22921:3;22832:93;:::i;:::-;22950:2;22945:3;22941:12;22934:19;;22593:366;;;:::o;22965:419::-;23131:4;23169:2;23158:9;23154:18;23146:26;;23218:9;23212:4;23208:20;23204:1;23193:9;23189:17;23182:47;23246:131;23372:4;23246:131;:::i;:::-;23238:139;;22965:419;;;:::o;23390:94::-;23423:8;23471:5;23467:2;23463:14;23442:35;;23390:94;;;:::o;23490:::-;23529:7;23558:20;23572:5;23558:20;:::i;:::-;23547:31;;23490:94;;;:::o;23590:100::-;23629:7;23658:26;23678:5;23658:26;:::i;:::-;23647:37;;23590:100;;;:::o;23696:157::-;23801:45;23821:24;23839:5;23821:24;:::i;:::-;23801:45;:::i;:::-;23796:3;23789:58;23696:157;;:::o;23859:256::-;23971:3;23986:75;24057:3;24048:6;23986:75;:::i;:::-;24086:2;24081:3;24077:12;24070:19;;24106:3;24099:10;;23859:256;;;;:::o;24121:237::-;24261:34;24257:1;24249:6;24245:14;24238:58;24330:20;24325:2;24317:6;24313:15;24306:45;24121:237;:::o;24364:366::-;24506:3;24527:67;24591:2;24586:3;24527:67;:::i;:::-;24520:74;;24603:93;24692:3;24603:93;:::i;:::-;24721:2;24716:3;24712:12;24705:19;;24364:366;;;:::o;24736:419::-;24902:4;24940:2;24929:9;24925:18;24917:26;;24989:9;24983:4;24979:20;24975:1;24964:9;24960:17;24953:47;25017:131;25143:4;25017:131;:::i;:::-;25009:139;;24736:419;;;:::o;25161:176::-;25301:28;25297:1;25289:6;25285:14;25278:52;25161:176;:::o;25343:366::-;25485:3;25506:67;25570:2;25565:3;25506:67;:::i;:::-;25499:74;;25582:93;25671:3;25582:93;:::i;:::-;25700:2;25695:3;25691:12;25684:19;;25343:366;;;:::o;25715:419::-;25881:4;25919:2;25908:9;25904:18;25896:26;;25968:9;25962:4;25958:20;25954:1;25943:9;25939:17;25932:47;25996:131;26122:4;25996:131;:::i;:::-;25988:139;;25715:419;;;:::o;26140:227::-;26280:34;26276:1;26268:6;26264:14;26257:58;26349:10;26344:2;26336:6;26332:15;26325:35;26140:227;:::o;26373:366::-;26515:3;26536:67;26600:2;26595:3;26536:67;:::i;:::-;26529:74;;26612:93;26701:3;26612:93;:::i;:::-;26730:2;26725:3;26721:12;26714:19;;26373:366;;;:::o;26745:419::-;26911:4;26949:2;26938:9;26934:18;26926:26;;26998:9;26992:4;26988:20;26984:1;26973:9;26969:17;26962:47;27026:131;27152:4;27026:131;:::i;:::-;27018:139;;26745:419;;;:::o;27170:348::-;27210:7;27233:20;27251:1;27233:20;:::i;:::-;27228:25;;27267:20;27285:1;27267:20;:::i;:::-;27262:25;;27455:1;27387:66;27383:74;27380:1;27377:81;27372:1;27365:9;27358:17;27354:105;27351:131;;;27462:18;;:::i;:::-;27351:131;27510:1;27507;27503:9;27492:20;;27170:348;;;;:::o;27524:236::-;27664:34;27660:1;27652:6;27648:14;27641:58;27733:19;27728:2;27720:6;27716:15;27709:44;27524:236;:::o;27766:366::-;27908:3;27929:67;27993:2;27988:3;27929:67;:::i;:::-;27922:74;;28005:93;28094:3;28005:93;:::i;:::-;28123:2;28118:3;28114:12;28107:19;;27766:366;;;:::o;28138:419::-;28304:4;28342:2;28331:9;28327:18;28319:26;;28391:9;28385:4;28381:20;28377:1;28366:9;28362:17;28355:47;28419:131;28545:4;28419:131;:::i;:::-;28411:139;;28138:419;;;:::o;28563:221::-;28703:34;28699:1;28691:6;28687:14;28680:58;28772:4;28767:2;28759:6;28755:15;28748:29;28563:221;:::o;28790:366::-;28932:3;28953:67;29017:2;29012:3;28953:67;:::i;:::-;28946:74;;29029:93;29118:3;29029:93;:::i;:::-;29147:2;29142:3;29138:12;29131:19;;28790:366;;;:::o;29162:419::-;29328:4;29366:2;29355:9;29351:18;29343:26;;29415:9;29409:4;29405:20;29401:1;29390:9;29386:17;29379:47;29443:131;29569:4;29443:131;:::i;:::-;29435:139;;29162:419;;;:::o;29587:163::-;29727:15;29723:1;29715:6;29711:14;29704:39;29587:163;:::o;29756:366::-;29898:3;29919:67;29983:2;29978:3;29919:67;:::i;:::-;29912:74;;29995:93;30084:3;29995:93;:::i;:::-;30113:2;30108:3;30104:12;30097:19;;29756:366;;;:::o;30128:419::-;30294:4;30332:2;30321:9;30317:18;30309:26;;30381:9;30375:4;30371:20;30367:1;30356:9;30352:17;30345:47;30409:131;30535:4;30409:131;:::i;:::-;30401:139;;30128:419;;;:::o;30553:238::-;30693:34;30689:1;30681:6;30677:14;30670:58;30762:21;30757:2;30749:6;30745:15;30738:46;30553:238;:::o;30797:366::-;30939:3;30960:67;31024:2;31019:3;30960:67;:::i;:::-;30953:74;;31036:93;31125:3;31036:93;:::i;:::-;31154:2;31149:3;31145:12;31138:19;;30797:366;;;:::o;31169:419::-;31335:4;31373:2;31362:9;31358:18;31350:26;;31422:9;31416:4;31412:20;31408:1;31397:9;31393:17;31386:47;31450:131;31576:4;31450:131;:::i;:::-;31442:139;;31169:419;;;:::o;31594:180::-;31734:32;31730:1;31722:6;31718:14;31711:56;31594:180;:::o;31780:366::-;31922:3;31943:67;32007:2;32002:3;31943:67;:::i;:::-;31936:74;;32019:93;32108:3;32019:93;:::i;:::-;32137:2;32132:3;32128:12;32121:19;;31780:366;;;:::o;32152:419::-;32318:4;32356:2;32345:9;32341:18;32333:26;;32405:9;32399:4;32395:20;32391:1;32380:9;32376:17;32369:47;32433:131;32559:4;32433:131;:::i;:::-;32425:139;;32152:419;;;:::o;32577:60::-;32605:3;32626:5;32619:12;;32577:60;;;:::o;32643:138::-;32691:9;32724:51;32742:32;32751:22;32767:5;32751:22;:::i;:::-;32742:32;:::i;:::-;32724:51;:::i;:::-;32711:64;;32643:138;;;:::o;32787:127::-;32872:35;32901:5;32872:35;:::i;:::-;32867:3;32860:48;32787:127;;:::o;32920:328::-;33039:4;33077:2;33066:9;33062:18;33054:26;;33090:71;33158:1;33147:9;33143:17;33134:6;33090:71;:::i;:::-;33171:70;33237:2;33226:9;33222:18;33213:6;33171:70;:::i;:::-;32920:328;;;;;:::o;33254:171::-;33394:23;33390:1;33382:6;33378:14;33371:47;33254:171;:::o;33431:366::-;33573:3;33594:67;33658:2;33653:3;33594:67;:::i;:::-;33587:74;;33670:93;33759:3;33670:93;:::i;:::-;33788:2;33783:3;33779:12;33772:19;;33431:366;;;:::o;33803:419::-;33969:4;34007:2;33996:9;33992:18;33984:26;;34056:9;34050:4;34046:20;34042:1;34031:9;34027:17;34020:47;34084:131;34210:4;34084:131;:::i;:::-;34076:139;;33803:419;;;:::o;34228:179::-;34368:31;34364:1;34356:6;34352:14;34345:55;34228:179;:::o;34413:366::-;34555:3;34576:67;34640:2;34635:3;34576:67;:::i;:::-;34569:74;;34652:93;34741:3;34652:93;:::i;:::-;34770:2;34765:3;34761:12;34754:19;;34413:366;;;:::o;34785:419::-;34951:4;34989:2;34978:9;34974:18;34966:26;;35038:9;35032:4;35028:20;35024:1;35013:9;35009:17;35002:47;35066:131;35192:4;35066:131;:::i;:::-;35058:139;;34785:419;;;:::o;35210:148::-;35312:11;35349:3;35334:18;;35210:148;;;;:::o;35364:141::-;35413:4;35436:3;35428:11;;35459:3;35456:1;35449:14;35493:4;35490:1;35480:18;35472:26;;35364:141;;;:::o;35535:845::-;35638:3;35675:5;35669:12;35704:36;35730:9;35704:36;:::i;:::-;35756:89;35838:6;35833:3;35756:89;:::i;:::-;35749:96;;35876:1;35865:9;35861:17;35892:1;35887:137;;;;36038:1;36033:341;;;;35854:520;;35887:137;35971:4;35967:9;35956;35952:25;35947:3;35940:38;36007:6;36002:3;35998:16;35991:23;;35887:137;;36033:341;36100:38;36132:5;36100:38;:::i;:::-;36160:1;36174:154;36188:6;36185:1;36182:13;36174:154;;;36262:7;36256:14;36252:1;36247:3;36243:11;36236:35;36312:1;36303:7;36299:15;36288:26;;36210:4;36207:1;36203:12;36198:17;;36174:154;;;36357:6;36352:3;36348:16;36341:23;;36040:334;;35854:520;;35642:738;;35535:845;;;;:::o;36386:79::-;36425:7;36454:5;36443:16;;36386:79;;;:::o;36471:157::-;36576:45;36596:24;36614:5;36596:24;:::i;:::-;36576:45;:::i;:::-;36571:3;36564:58;36471:157;;:::o;36634:377::-;36740:3;36768:39;36801:5;36768:39;:::i;:::-;36823:89;36905:6;36900:3;36823:89;:::i;:::-;36816:96;;36921:52;36966:6;36961:3;36954:4;36947:5;36943:16;36921:52;:::i;:::-;36998:6;36993:3;36989:16;36982:23;;36744:267;36634:377;;;;:::o;37017:570::-;37222:3;37244:92;37332:3;37323:6;37244:92;:::i;:::-;37237:99;;37346:75;37417:3;37408:6;37346:75;:::i;:::-;37446:2;37441:3;37437:12;37430:19;;37466:95;37557:3;37548:6;37466:95;:::i;:::-;37459:102;;37578:3;37571:10;;37017:570;;;;;;:::o;37593:98::-;37644:6;37678:5;37672:12;37662:22;;37593:98;;;:::o;37697:168::-;37780:11;37814:6;37809:3;37802:19;37854:4;37849:3;37845:14;37830:29;;37697:168;;;;:::o;37871:360::-;37957:3;37985:38;38017:5;37985:38;:::i;:::-;38039:70;38102:6;38097:3;38039:70;:::i;:::-;38032:77;;38118:52;38163:6;38158:3;38151:4;38144:5;38140:16;38118:52;:::i;:::-;38195:29;38217:6;38195:29;:::i;:::-;38190:3;38186:39;38179:46;;37961:270;37871:360;;;;:::o;38237:640::-;38432:4;38470:3;38459:9;38455:19;38447:27;;38484:71;38552:1;38541:9;38537:17;38528:6;38484:71;:::i;:::-;38565:72;38633:2;38622:9;38618:18;38609:6;38565:72;:::i;:::-;38647;38715:2;38704:9;38700:18;38691:6;38647:72;:::i;:::-;38766:9;38760:4;38756:20;38751:2;38740:9;38736:18;38729:48;38794:76;38865:4;38856:6;38794:76;:::i;:::-;38786:84;;38237:640;;;;;;;:::o;38883:141::-;38939:5;38970:6;38964:13;38955:22;;38986:32;39012:5;38986:32;:::i;:::-;38883:141;;;;:::o;39030:349::-;39099:6;39148:2;39136:9;39127:7;39123:23;39119:32;39116:119;;;39154:79;;:::i;:::-;39116:119;39274:1;39299:63;39354:7;39345:6;39334:9;39330:22;39299:63;:::i;:::-;39289:73;;39245:127;39030:349;;;;:::o;39385:397::-;39525:3;39540:75;39611:3;39602:6;39540:75;:::i;:::-;39640:2;39635:3;39631:12;39624:19;;39653:75;39724:3;39715:6;39653:75;:::i;:::-;39753:2;39748:3;39744:12;39737:19;;39773:3;39766:10;;39385:397;;;;;:::o;39788:180::-;39836:77;39833:1;39826:88;39933:4;39930:1;39923:15;39957:4;39954:1;39947:15;39974:185;40014:1;40031:20;40049:1;40031:20;:::i;:::-;40026:25;;40065:20;40083:1;40065:20;:::i;:::-;40060:25;;40104:1;40094:35;;40109:18;;:::i;:::-;40094:35;40151:1;40148;40144:9;40139:14;;39974:185;;;;:::o;40165:176::-;40197:1;40214:20;40232:1;40214:20;:::i;:::-;40209:25;;40248:20;40266:1;40248:20;:::i;:::-;40243:25;;40287:1;40277:35;;40292:18;;:::i;:::-;40277:35;40333:1;40330;40326:9;40321:14;;40165:176;;;;:::o;40347:191::-;40387:4;40407:20;40425:1;40407:20;:::i;:::-;40402:25;;40441:20;40459:1;40441:20;:::i;:::-;40436:25;;40480:1;40477;40474:8;40471:34;;;40485:18;;:::i;:::-;40471:34;40530:1;40527;40523:9;40515:17;;40347:191;;;;:::o

Swarm Source

ipfs://3f6456c8d27e03575e589d7360a083b613b5d827c81acd8deac957055c5647c0

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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