ETH Price: $3,314.24 (+1.19%)
Gas: 4 Gwei

Token

TAKAHIRO KOMURO (TkoM)
 

Overview

Max Total Supply

298 TkoM

Holders

186

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0xde07dfbde065fac82210715934efd3aa4558a66e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KomuroDragons

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                            //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM@"7HMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMF   .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\   -MMMMMMMMMMMMMMMMMMMMF   JMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM#    MMMMMMMMMMMMMMMMMMMMM\   .MMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM]   .MMMMMMMMMMMMMMMMMMMMM`    dMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    dMMMH""7!      ?MMMMM#     -MMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMF    ^              .MMMMM#      MMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM#"`         .....g+, .MMMMMMF      dMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM#"`       ..JMMMMMMMMMMMMMMMMMMM\      ,MMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH"!          (MMMMMMMMMMMMMMMMD`_TMM!       MMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMB^      ..g#   .MMMMMMMMMMMMMMMM#    UM    ;   JMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMM9'      ..MMMM%   .MMMMMMMMMMMMMMMMF     E   .b   .MMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMM"!      .dMMMMMM#    MMMMMMMMMMMMMMMMM]         .M.   HMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMM@!     ... dMMMMMMM]   .MMMMMMMMMMMMMMMMM:         -M]   -MMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMM#=        .MN.MMMMMMMM    dMMMMMY"HMMMMMMMMM          dM#    MMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMM@!    ..M,    WMMMMMMMMF   .MMY"`    dMMMMMMM#   .b     MMM,   dMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMD`    .dMMMMp    TMMMMMMM!   (`              ?MF   .Mc    MMMb   ,MMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMD`    .NMMMMMMMR    ?MMMMMF        ..:           !   (MN.  .MMMN    MMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMF    .dMMMMMMMMMMN.   ,MMMM>     .gMMF   .MMMMh       dMM[  MMMMM|   JMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMM,  .MMMMMMMMMMMMMN,   .MM#        TM]   -MMMMM!      MMMM..MMMMMb   .MMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMN  dMMMMMMMMMMMMMMM,    W%   .,     7    TMM#=      .MMMM..MMMMMM    HMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMM..MMMMMMMMMMMMMMMMMp        MMMa               `   .MMMMMMMMMMMN    -MMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMM`.MMMMMMMMMMMMMMMMMMb      .MMMMNa,     .    .d\   (MMMMMMMMMMMMN    MMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMM  MMMMMMMMMMMMMMMMMMMN.    dMMMMMMMN,  .MMMaJMMh. .MMMMMMMMMMMMMN    dMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN    JMMMMMMMMM- MMMMMMMMMb.MMMMMMMMMMMMMMMb  .MMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN. JMMMMMMMMMM].MMMMMMMMMMMMMMMMMMMMMMMMMMM| MMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM].MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMF MMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM% MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMgMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM: MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmJMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM    //
//                                                                                                            //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

interface AggregatorV3Interface {

  function decimals()
    external
    view
    returns (
      uint8
    );

  function description()
    external
    view
    returns (
      string memory
    );

  function version()
    external
    view
    returns (
      uint256
    );

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(
    uint80 _roundId
  )
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// File @openzeppelin/contracts/security/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    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;
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// File @openzeppelin/contracts/token/ERC1155/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC1155/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// File contracts/ERC1155.sol

/* The MIT License (MIT)
 * 
 * Copyright (c) 2016-2020 zOS Global Limited
 * 
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

/* SUMMARY OF CHANGES
 * Line 36-41  Change imports to use @openzeppelin/contracts imports rather than
 *             relative imports.
 * Line 54     Remove private modifier from `_balances`.
 */


// OpenZeppelin Contracts v4.3.2 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}


// File contracts/DualERC1155ERC721.sol



pragma solidity ^0.8.8;







/// @notice ERC1155 that supports the ERC721 interface for certain tokens
contract DualERC1155ERC721 is ERC1155 {

    using Address for address;
    using Strings for uint256;

    /// @dev See {IERC721-Transfer}.
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    /// @dev See {IERC721-Approval}.
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    struct ERC721Data {
        bool exists;
        address owner;
        address approved;
    }

    // Mapping from account to number of erc721 compatible tokens owned
    mapping(address => uint256) private _erc721Balances;

    // Mapping from token ID to erc721 data
    mapping(uint256 => ERC721Data) private _erc721Data;

    constructor() ERC1155("") {}

    /// @dev See {IERC165-supportsInterface}.
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override returns (bool) {
        return interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @dev Base URI form {tokenURI}.
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /// @dev See {IERC721Metadata-tokenURI}.
    /// Concatenates the tokenId to the results of {_baseURI}.
    function tokenURI(
        uint256 tokenId
    ) public view virtual returns (string memory) {
        require(
            _erc721Data[tokenId].exists,
            "ERC721Metadata: URI query for nonexistent token"
        );

        return bytes(_baseURI()).length > 0 ?
            string(abi.encodePacked(_baseURI(), tokenId.toString())) : "";
    }

    /// @dev See {IERC721Metadata-name}.
    function name() public view virtual returns (string memory) {
        return "";
    }

    /// @dev See {IERC721Metadata-symbol}.
    function symbol() public view virtual returns (string memory) {
        return "";
    }

    /// @dev Returns a single element as a single element array
    function _asSingleArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }

    /// @dev See {IERC721-balanceOf}.
    function balanceOf(address owner) public view virtual returns (uint256 balance) {
        return _erc721Balances[owner];
    }

    /// @dev See {IERC721-ownerOf}.
    function ownerOf(
        uint256 tokenId
    ) public view virtual returns (address owner) {
        return _erc721Data[tokenId].exists ?
            _erc721Data[tokenId].owner :
            address(0);
    }

    /// @dev See {IERC721-transferFrom}.
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual {
        require(
            _erc721Data[tokenId].exists && (
                DualERC1155ERC721.ownerOf(tokenId) == msg.sender || 
                _erc721Data[tokenId].approved == msg.sender
            ),
            "ERC721: transfer caller is not owner nor approved"
        );
        _transferERC721(from, to, tokenId);
    }

    /// @dev See {IERC721-approve}.
    function approve(address to, uint256 tokenId) public virtual {
        address owner = DualERC1155ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");
        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "ERC721: approve caller is not owner nor approved for all"
        );
        _approveERC721(to, tokenId);
    }

    /// @dev See {IERC721-getApproved}.
    function getApproved(
        uint256 tokenId
    ) public view virtual returns (address operator) {
        return _erc721Data[tokenId].approved;
    }

    /// @dev See {IERC721-safeTransferFrom}.
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual {
        require(
            _erc721Data[tokenId].exists && (
                DualERC1155ERC721.ownerOf(tokenId) == msg.sender || 
                _erc721Data[tokenId].approved == msg.sender
            ),
            "ERC721: transfer caller is not owner nor approved"
        );
        _transferERC721(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /// @dev See {IERC721-safeTransferFrom}.
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual {
        safeTransferFrom(from, to, tokenId, bytes(""));
    }

    /// @dev Transfer a token as an ERC721
    function _transferERC721(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(
            _msgSender(),
            from,
            to,
            _asSingleArray(tokenId),
            _asSingleArray(1),
            ""
        );

        _approveERC721(address(0), tokenId);
        _balances[tokenId][from] -= 1;
        _balances[tokenId][to] += 1;

        // Emit ERC1155 transfer event rather than ERC721
        emit TransferSingle(_msgSender(), from, to, tokenId, 1);
    }

    /// @dev See {approve}.
    function _approveERC721(address to, uint256 tokenId) internal virtual {
        _erc721Data[tokenId].approved = to;
        emit Approval(DualERC1155ERC721.ownerOf(tokenId), to, tokenId);
    }

    /// @dev Hooks into transfers of ERC721 marked-tokens
    function _beforeTokenTransfer(
        address,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory
    ) internal override {
        for (uint256 i = 0; i < ids.length; i ++) {
            if (_erc721Data[ids[i]].exists) {
                require(
                    DualERC1155ERC721.ownerOf(ids[i]) == from,
                    "ERC721: transfer of token that is not own"
                );
                require(
                    amounts[i] == 1,
                    "ERC721: multi-transfer of token that is not multi-token"
                );
                _erc721Data[ids[i]].owner = to;
                emit Transfer(from, to, ids[i]);
                if (from != address(0)) {
                    _erc721Balances[from] -= 1;
                }
                if (to != address(0)) {
                    _erc721Balances[to] += 1;
                }
            }
        }
    }

    /// @dev Check to see if receiver contract supports IERC721Receiver.
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /// @dev Mark a token id as ERC721. MUST be called before a token is minted.
    /// Only 1 of this token is allowed to exist at any given time. This token
    /// will be visible from the ERC721 interface of this contract.
    function _registerERC721(uint256 tokenId) internal {
        _erc721Data[tokenId].exists = true;
    }
}


// File contracts/IDUtils.sol



pragma solidity ^0.8.8;

/// @notice A helper type to enforce stronger type-checking for token IDs
type ID is uint256;

/// @title IDUtils
/// @notice Provides utility functions for working with the ID type
library IDUtils {

    /// @notice Get the ID after a given ID
    /// @param id The ID
    /// @return The next ID
    function next(ID id) internal pure returns (ID) {
        return ID.wrap(ID.unwrap(id) + 1);
    }

    /// @notice Whether and ID comes after another ID
    /// @param a The first ID
    /// @param b The second ID
    /// @return If the first comes after the second or not
    function gt(ID a, ID b) internal pure returns (bool) {
        return ID.unwrap(a) > ID.unwrap(b);
    }
}


// File contracts/MerkleDropUniqueToken.sol



pragma solidity ^0.8.8;





/// @title Merkle Drop Unique Token
/// @notice Supports two classes of tokens: drop tokens and unique tokens. Drop
/// tokens can be distributed using merkle drops and unique tokens are 1 of 1s
/// that can be purchased if enough drop tokens are held.
contract MerkleDropUniqueToken is DualERC1155ERC721, Ownable, ReentrancyGuard {

    /// @dev Counter used to create new tokens
    ID public nextId = ID.wrap(0);

    constructor() DualERC1155ERC721() {}

    struct DropToken {
        bool exists;
        uint256 supply;
    }

    /// @notice Describes which IDs correspond to drop tokens and their supply
    mapping(ID => DropToken) public dropTokens;

    /// @notice List of drop token IDs
    ID[] public dropTokenList;

    /// @notice Emitted when a new types of drop token are created
    /// @param firstId ID of the first drop token
    /// @param amounts Amounts of the drop tokens
    event DropTokensCreated(ID firstId, uint256[] amounts);

    function _createDropTokens(uint256[] memory _amounts) internal {
        emit DropTokensCreated(nextId, _amounts);
        for (uint i = 0; i < _amounts.length; i ++) {
            dropTokens[nextId] = DropToken(true, _amounts[i]);
            dropTokenList.push(nextId);
            nextId = IDUtils.next(nextId);
        }
    }

    /// @notice Create new types of drop token
    /// @param _amounts Amounts of the drop tokens
    function createDropTokens(uint256[] calldata _amounts) external onlyOwner {
        _createDropTokens(_amounts);
    }

    struct MerkleDrop {
        bool exists;
        bytes32 merkleRoot;
        mapping(ID => uint256) amounts;
        mapping(address => bool) claimed;
    }

    /// @notice The ID of the next merkle drop
    uint256 public nextMerkleDropId = 0;

    /// @notice Describes existing merkle drops
    mapping(uint256 => MerkleDrop) public merkleDrops;

    /// @notice Emitted when a new merkle drop is created
    /// @param merkleDropId The ID of the merkle drop
    /// @param merkleRoot The root of the merkle tree
    /// @param ids The IDs of the drop tokens in this drop
    /// @param amounts The amounts of the drops tokens correspond to `ids`
    event MerkleDropCreated(
        uint256 merkleDropId,
        bytes32 merkleRoot,
        ID[] ids,
        uint256[] amounts
    );

    /// @notice Create a new merkle drop to drop multiple drop tokens at once
    /// @param _merkleRoot The hex root of the merkle tree. The leaves of the
    /// tree must be the address of the recepient as well as the ids and
    /// amounts of each of the drop tokens they will be eligible to claim. They
    /// should be keccak256 abi packed in address, uint256[], uint256[] format.
    /// The merkle tree should be constructed using keccak256 with sorted
    /// pairs.
    /// @param _ids The IDs of the drop tokens in this drop
    /// @param _amounts The amounts of the drops tokens correspond to `ids`
    /// @return The ID of the new merkle drop
    function createMerkleDrop(
        bytes32 _merkleRoot,
        ID[] calldata _ids,
        uint256[] calldata _amounts
    ) external onlyOwner returns (uint256) {
        require(
            _amounts.length == _ids.length,
            "Mismatch between IDs and amounts"
        );
        ID lastId = ID.wrap(0);
        for (uint256 i = 0; i < _ids.length; i ++) {
            require(
                i == 0 || IDUtils.gt(_ids[i], lastId),
                "Non-ascending IDs"
            );
            lastId = _ids[i];
            require(dropTokens[_ids[i]].exists, "Drop token does not exist");
            require(
                _amounts[i] <= dropTokens[_ids[i]].supply,
                "Not enough drop token supply"
            );
        }
        for (uint256 i = 0; i < _ids.length; i ++) {
            dropTokens[_ids[i]].supply -= _amounts[i];
            merkleDrops[nextMerkleDropId].amounts[_ids[i]] = _amounts[i];
        }
        merkleDrops[nextMerkleDropId].merkleRoot = _merkleRoot;
        merkleDrops[nextMerkleDropId].exists = true;

        emit MerkleDropCreated(nextMerkleDropId, _merkleRoot, _ids, _amounts);

        return nextMerkleDropId ++;
    }

    /// @notice Check whether part of a merkle drop is claimed by an account
    /// @param _merkleDropId The ID of the merkle drop
    /// @param _account The account to check
    function isMerkleDropClaimed(
        uint256 _merkleDropId,
        address _account
    ) public view returns (bool) {
        require(merkleDrops[_merkleDropId].exists, "Drop does not exist");
        return merkleDrops[_merkleDropId].claimed[_account];
    }

    /// @notice Emitted when part of a merkle drop is claimed
    /// @param merkleDropId The ID of the merkle drop
    /// @param account The recepient
    /// @param ids The IDs of the drop tokens received
    /// @param amounts The amounts of the drops tokens correspond to `ids`
    event MerkleDropClaimed(
        uint256 merkleDropId,
        address account,
        ID[] ids,
        uint256[] amounts
    );

    /// @notice Claim part of a merkle drop
    /// @param _merkleDropId The ID of the merkle drop
    /// @param _proof The hex proof of the leaf in the tree. The leaves of the
    /// tree must be the address of the recepient as well as the ids and
    /// amounts of each of the drop tokens they will be eligible to claim. They
    /// should be keccak256 abi packed in address, uint256[], uint256[] format.
    /// The merkle tree should be constructed using keccak256 with sorted
    /// pairs.
    /// @param _ids The IDs of the drop tokens to be received
    /// @param _amounts The amounts of the drops tokens correspond to `ids`
    function claimMerkleDrop(
        uint256 _merkleDropId,
        bytes32[] calldata _proof,
        ID[] calldata _ids,
        uint256[] calldata _amounts
    ) external nonReentrant {
        _claimMerkleDrop(_merkleDropId, _proof, _ids, _amounts, msg.sender);
    }

    function _claimMerkleDrop(
        uint256 _merkleDropId,
        bytes32[] calldata _proof,
        ID[] calldata _ids,
        uint256[] calldata _amounts,
        address _account
    ) internal {
        require(merkleDrops[_merkleDropId].exists, "Drop does not exist");
        require(
            _amounts.length == _ids.length,
            "Mismatch between IDs and amounts"
        );
        require(
            !merkleDrops[_merkleDropId].claimed[_account],
            "Drop already claimed"
        );
        ID lastId = ID.wrap(0);
        for (uint256 i = 0; i < _ids.length; i ++) {
            require(
                i == 0 || IDUtils.gt(_ids[i], lastId),
                "Non-ascending IDs"
            );
            lastId = _ids[i];
            require(dropTokens[_ids[i]].exists, "Drop token does not exist");
            require(
                _amounts[i] <= merkleDrops[_merkleDropId].amounts[_ids[i]],
                "Not enough drop tokens in drop"
            );
        }
        bytes32 leaf = keccak256(abi.encodePacked(_account, _ids, _amounts));
        require(
            MerkleProof.verify(_proof, merkleDrops[_merkleDropId].merkleRoot, leaf),
            "Invalid proof"
        );
        for (uint256 i = 0; i < _ids.length; i ++) {
            merkleDrops[_merkleDropId].amounts[_ids[i]] -= _amounts[i];
            _mint(_account, ID.unwrap(_ids[i]), _amounts[i], "");
        }
        merkleDrops[_merkleDropId].claimed[_account] = true;

        emit MerkleDropClaimed(_merkleDropId, _account, _ids, _amounts);
    }

    /// @notice Emitted when a merkle drop is cancelled
    /// @param merkleDropId The ID of the merkle drop
    event MerkleDropCancelled(uint256 merkleDropId);

    /// @notice Cancel an existing merkle drop
    /// @param _merkleDropId The ID of the merkle drop
    function cancelMerkleDrop(uint256 _merkleDropId) external onlyOwner {
        require(merkleDrops[_merkleDropId].exists, "Drop does not exist");
        merkleDrops[_merkleDropId].exists = false;
        emit MerkleDropCancelled(_merkleDropId);
    }

    /// @notice Emitted when drop tokens are manually distributed
    /// @param to The address to which the tokens are minted
    /// @param id The ID of the token being minted
    /// @param amount The amount of the token being minted
    event DropTokensDistributed(address to, ID id, uint256 amount);

    /// @notice Manually distribute drop tokens to an address
    /// @param _to The address to which the tokens are minted
    /// @param _id The ID of the token being minted
    /// @param _amount The amount of the token being minted
    function distributeDropTokens(
        address _to,
        ID _id,
        uint256 _amount
    ) external onlyOwner {
        require(dropTokens[_id].exists, "Drop token does not exist");
        require(dropTokens[_id].supply >= _amount, "Not enough drop tokens remaining");

        dropTokens[_id].supply -= _amount;
        _mint(_to, ID.unwrap(_id), _amount, "");

        emit DropTokensDistributed(_to, _id, _amount);
    }

    function _dropTokenBalanceOf(address _account) internal view returns (uint256) {
        uint256 balance = 0;
        for (uint256 i = 0; i < dropTokenList.length; i ++) {
            balance += balanceOf(_account, ID.unwrap(dropTokenList[i]));
        }
        return balance;
    }

    /// @notice Emitted when drop tokens are burned by a holder
    /// @param account The address of the token holder
    /// @param id The ID of the token being burned
    /// @param amount The amount of the token being burned
    event DropTokensBurned(address account, ID id, uint256 amount);

    /// @notice Emitted when drop tokens are burned by a holder
    /// @param _id The ID of the token to burn
    /// @param _amount The amount of the token to burn
    function burnDropTokens( ID _id, uint256 _amount) external {
        require(dropTokens[_id].exists, "Drop token does not exist");

        _burn(msg.sender, ID.unwrap(_id), _amount);

        emit DropTokensBurned(msg.sender, _id, _amount);
    }

    /// @notice Whether unique tokens are availible to be purchased
    bool public uniquesPurchasable = false;

    struct Unique {
        bool exists;
        bool customPrice;
        bool minted;
        uint256 price;
        bool customDropTokenRequirement;
        uint256 dropTokenRequirement;
    }

    /// @notice Describes which unique tokens are associated with which IDs 
    mapping(ID => Unique) public uniques;

    /// @notice Emitted when unique tokens are created
    /// @param firstId The id of the first new unique token
    /// @param amount The number of new unique tokens created
    event UniquesCreated(ID firstId, uint256 amount);

    function _createUniques(uint256 _amount) internal {
        emit UniquesCreated(nextId, _amount);
        for (uint i = 0; i < _amount; i ++) {
            uniques[nextId].exists = true;
            _registerERC721(ID.unwrap(nextId));
            nextId = IDUtils.next(nextId);
        }
    }

    /// @notice Create a new unique token
    /// @param _amount The number of new unique tokens created
    function createUniques(uint256 _amount) external onlyOwner {
        _createUniques(_amount);
    }

    /// @notice The default price of all unique tokens without a custom setting
    uint256 public defaultPrice = 10**18;

    /// @notice The default drop token requirement of all unique tokens without a
    /// custom setting
    uint256 public defaultDropTokenRequirement = 1;

    /// @notice Emitted when a unique token is purchased
    /// @param account The account who purchased the token
    /// @param id The ID of the token purchased
    /// @param price The price the token sold for
    event UniquePurchased(address account, ID id, uint256 price);

    /// @notice Purchase a unique token
    /// @param _id The ID of the token to be purchased
    function purchaseUnique(ID _id) external payable nonReentrant {
        require(uniquesPurchasable, "Uniques not currently purchasable");
        require(uniques[_id].exists, "Not a valid unique id");
        require(!uniques[_id].minted, "Not enough uniques remaining");
        _purchaseUnique(_id, msg.sender, msg.value);
    }

    function _purchaseUnique(
        ID _id,
        address _account,
        uint256 _value
    ) internal {
        require(
            uniques[_id].customDropTokenRequirement ?
                _dropTokenBalanceOf(_account) >=
                    uniques[_id].dropTokenRequirement :
                _dropTokenBalanceOf(_account) >= defaultDropTokenRequirement,
            "Not enough drop tokens to qualify"
        );
        uint256 price = uniques[_id].customPrice ?
            uniques[_id].price : defaultPrice;

        require(_value == price, "Incorrect payment");

        _mint(_account, ID.unwrap(_id), 1, "");
        uniques[_id].minted = true;

        emit UniquePurchased(_account, _id, price);
    }

    /// @notice Claim part of a merkle drop and purchase a unique token
    /// @param _merkleDropId The ID of the merkle drop
    /// @param _proof The hex proof of the leaf in the tree. The leaves of the
    /// tree must be the address of the recepient as well as the ids and
    /// amounts of each of the drop tokens they will be eligible to claim. They
    /// should be keccak256 abi packed in address, uint256[], uint256[] format.
    /// The merkle tree should be constructed using keccak256 with sorted
    /// pairs.
    /// @param _ids The IDs of the drop tokens to be received
    /// @param _amounts The amounts of the drops tokens correspond to `ids`
    /// @param _uniqueId The ID of the token to be purchased
    function claimMerkleDropAndPurchaseUnique(
        uint256 _merkleDropId,
        bytes32[] calldata _proof,
        ID[] calldata _ids,
        uint256[] calldata _amounts,
        ID _uniqueId
    ) external payable nonReentrant {
        require(uniquesPurchasable, "Uniques not currently purchasable");
        require(uniques[_uniqueId].exists, "Not a valid unique id");
        require(!uniques[_uniqueId].minted, "Not enough uniques remaining");
        _claimMerkleDrop(_merkleDropId, _proof, _ids, _amounts, msg.sender);
        _purchaseUnique(_uniqueId, msg.sender, msg.value);
    }

    /// @notice Emitted when funds are withdrawn from the contract
    /// @param to The address to which the funds were sent
    /// @param amount The amount of funds sent in wei
    event FundsWithdrawn(address to, uint256 amount);

    /// @notice Withdraw funds from the contract
    /// @param _to The address to which the funds were sent
    /// @param _amount The amount of funds sent, in wei
    function withdrawFunds(
        address payable _to,
        uint256 _amount
    ) external onlyOwner nonReentrant {
        require(_amount <= address(this).balance, "Not enough funds");
        _to.transfer(_amount);
        emit FundsWithdrawn(_to, _amount);
    }

    /// @notice Emitted when uniquesPurchasable is updated
    /// @param purchasable Whether unique tokens are now purchasable
    event UniquesPurchasableUpdated(bool purchasable);

    /// @notice Toggle whether unique tokens are purchasable or not
    function toggleUniquesPurchasable() external onlyOwner {
        uniquesPurchasable = !uniquesPurchasable;
        emit UniquesPurchasableUpdated(uniquesPurchasable);
    }

    /// @notice Emitted when the default price of unique tokens is updated
    /// @param price The new price, in wei
    event DefaultPriceUpdated(uint256 price);

    /// @notice Set the default price of unique tokens
    /// @param _price The new price, in wei
    function setDefaultPrice(uint256 _price) external onlyOwner {
        defaultPrice = _price;
        emit DefaultPriceUpdated(_price);
    }

    /// @notice Emitted when the default drop token requirement to purchase
    /// unique tokens is updated
    /// @param requirement The new drop token requirement
    event DefaultDropTokenRequirementUpdated(uint256 requirement);

    /// @notice Set the default drop token requirement to purchase unique tokens
    /// @param _dropTokenRequirement The new drop token requirement
    function setDefaultDropTokenRequirement(
        uint256 _dropTokenRequirement
    ) external onlyOwner {
        defaultDropTokenRequirement = _dropTokenRequirement;
        emit DefaultDropTokenRequirementUpdated(_dropTokenRequirement);
    }

    /// @notice Emitted when the price of a unique token is updated
    /// @param id The id of the unique token
    /// @param price The new price, in wei
    event UniquePriceUpdated(ID id, uint256 price);

    /// @notice Set the price of a specific unique token
    /// @param _id The id of the unique token
    /// @param _price The new price, in wei
    function setUniquePrice(ID _id, uint256 _price) external onlyOwner {
        require(uniques[_id].exists, "Not a valid unique id");
        uniques[_id].customPrice = true;
        uniques[_id].price = _price;
        emit UniquePriceUpdated(_id, _price);
    }

    /// @notice Emitted when the drop token requirement to purchase a unique
    /// token is updated
    /// @param id The id of the unique token
    /// @param requirement The new drop token requirement
    event UniqueDropTokenRequirementUpdated(ID id, uint256 requirement);

    /// @notice Set the minimum drop token requirement to purchase a specific
    /// unique token
    /// @param _id The id of the unique token
    /// @param _dropTokenRequirement The new drop token requirement
    function setUniqueDropTokenRequirement(
        ID _id,
        uint256 _dropTokenRequirement
    ) external onlyOwner {
        require(uniques[_id].exists, "Not a valid unique id");
        uniques[_id].customDropTokenRequirement = true;
        uniques[_id].dropTokenRequirement = _dropTokenRequirement;
        emit UniqueDropTokenRequirementUpdated(_id, _dropTokenRequirement);
    }

    /// @notice Emitted when the price of a unique token is set back to default
    /// @param id The ID of the unique token
    event UniquePriceDefault(ID id);

    /// @notice Set the price of a specific unique token back to default
    /// @param _id The ID of the unique token
    function setUniquePriceDefault(ID _id) external onlyOwner {
        require(uniques[_id].exists, "Not a valid unique id");
        uniques[_id].customPrice = false;
        emit UniquePriceDefault(_id);
    }

    /// @notice Emitted when the drop token requirement of a unique token is set
    /// back to default
    /// @param id The ID of the unique token
    event UniqueDropTokenRequirementDefault(ID id);

    /// @notice Set the drop token requirement of a specific unique token back to
    /// default
    /// @param _id The ID of the unique token
    function setUniqueDropTokenRequirementDefault(ID _id) external onlyOwner {
        require(uniques[_id].exists, "Not a valid unique id");
        uniques[_id].customDropTokenRequirement = false;
        emit UniqueDropTokenRequirementDefault(_id);
    }
}


// File contracts/interfaces/IHydra.sol

pragma solidity ^0.8.9;

/// @notice Interface for KomuroDragons contract Hydra bidding
interface IHydra {
    /// @notice Whether or not an account is eligible to bid on the Hydra
    /// @param _account The address of the account
    /// @return Whether the account is eligible or not
    function canBidOnHydra(address _account) external view returns (bool);
}


// File contracts/KomuroDragons.sol



pragma solidity ^0.8.8;





/// @title Komuro Dragons
contract KomuroDragons is MerkleDropUniqueToken, IHydra {

    using Strings for uint256;

    /// @param _priceFeed Address of a chainlink AggregatorV3 price feed that
    /// controls the Hydra's dynamic URI
    /// @param _positiveHydraUri Hydra URI when price is going up
    /// @param _neutralHydraUri Hydra URI when price is neutral
    /// @param _negativeHydraUri Hydra URI when price is going down
    /// @param _tokenBaseURI The base URI for ERC721 metadata
    /// @param _name The token name for ERC721 metadata
    /// @param _symbol The token symbol for ERC721 metadata
    constructor(
        address _priceFeed,
        string memory _positiveHydraUri,
        string memory _neutralHydraUri,
        string memory _negativeHydraUri,
        string memory _tokenBaseURI,
        string memory _name,
        string memory _symbol
    ) MerkleDropUniqueToken() {
        baseURI = _tokenBaseURI;
        tokenSymbol = _symbol;
        tokenName = _name;
        uint256[] memory dropTokenAmounts = new uint256[](15);
        for (uint i = 0; i < 4; i ++) {
            dropTokenAmounts[i] = 2500;
        }
        for (uint i = 4; i < 15; i ++) {
            dropTokenAmounts[i] = 1;
        }
        _createDropTokens(dropTokenAmounts);
        // Hydra
        _initHydra(
            _priceFeed,
            _positiveHydraUri,
            _neutralHydraUri,
            _negativeHydraUri
        );
    }

    /// @notice Whether or not the hydra has been minted
    bool public isHydraMinted = false;

    /// @notice The token ID of the Hydra token
    ID public hydraId;

    /// @dev The three states the Hydra can exist in - depends on price feed
    enum HydraState {
        Positive,
        Neutral,
        Negative
    }

    /// @dev See {IERC165-supportsInterface}.
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override returns (bool) {
        return interfaceId == type(IHydra).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @notice Get the metadata URI for a given token
    /// @param _id The id of the token
    /// @return Metadata URI for the token
    /// @dev See {IERC1155MetadataURI-uri}.
    function uri(
        uint256 _id
    ) public view virtual override returns (string memory) {
        return tokenURI(_id);
    }

    /// @notice Get the metadata URI for a given token
    /// @param _id The id of the token
    /// @return Metadata URI for the token
    /// @dev See {IERC721Metadata-tokenURI}.
    function tokenURI (
        uint256 _id
    ) public view virtual override returns (string memory) {
        if (isHydraMinted && _id == ID.unwrap(hydraId)) {
            return _hydraUri();
        } else {
            return bytes(_baseURI()).length > 0 ?
                string(abi.encodePacked(_baseURI(), _id.toString())) : "";
        }
    }

    /// @dev Used as the base of {IERC721Metadata-tokenURI}.
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    /// @notice The token name
    /// @dev See {IERC721Metadata-name}.
    function name() public view override returns (string memory) {
        return tokenName;
    }

    /// @notice The token symbol
    /// @dev See {IERC721Metadata-symbol}.
    function symbol() public view override returns (string memory) {
        return tokenSymbol;
    }

    /// @notice The base URI for ERC721 metadata
    string public baseURI;

    /// @notice Emitted when `baseURI` is updated
    /// @param value The new value of `baseURI`
    event BaseURIUpdated(string value);

    /// @notice Update the value of `baseURI`
    /// @param _value The new value of `baseURI`
    function setBaseURI(string calldata _value) external onlyOwner {
        baseURI = _value;
        emit BaseURIUpdated(_value);
    }

    /// @notice The token name for ERC721 metadata
    string public tokenName;

    /// @notice Emitted when `tokenName` is updated
    /// @param value The new value of `tokenName`
    event TokenNameUpdated(string value);

    /// @notice Update the value of `tokenName`
    /// @param _value The new value of `tokenName`
    function setTokenName(string calldata _value) external onlyOwner {
        tokenName = _value;
        emit TokenNameUpdated(_value);
    }

    /// @notice The token symbol for ERC721 metadata
    string public tokenSymbol;

    /// @notice Emitted when `tokenSymbol` is updated
    /// @param value The new value of `tokenSymbol`
    event TokenSymbolUpdated(string value);

    /// @notice Update the value of `tokenSymbol`
    /// @param _value The new value of `tokenSymbol`
    function setTokenSymbol(string calldata _value) external onlyOwner {
        tokenSymbol = _value;
        emit TokenSymbolUpdated(_value);
    }

    /// @notice The Hydra URI when price is going up
    string public hydraUriPositive;

    /// @notice Emitted when `hydraUriPositive` is updated
    /// @param uri The new uri
    event HydraUriPositiveUpdated(string uri);

    /// @notice Set `hydraUriPositive`
    /// @param _uri The new uri
    function setHydraUriPositive(string calldata _uri) external onlyOwner {
        hydraUriPositive = _uri;
        emit HydraUriPositiveUpdated(_uri);
    }

    /// @notice The Hydra URI when price is neutral
    string public hydraUriNeutral;

    /// @notice Emitted when `hydraUriNeutral` is updated
    /// @param uri The new uri
    event HydraUriNeutralUpdated(string uri);

    /// @notice Set `hydraUriNeutral`
    /// @param _uri The new uri
    function setHydraUriNeutral(string calldata _uri) external onlyOwner {
        hydraUriNeutral = _uri;
        emit HydraUriNeutralUpdated(_uri);
    }

    /// @notice The Hydra URI when price is going down
    string public hydraUriNegative;

    /// @notice Emitted when `hydraUriNegative` is updated
    /// @param uri The new uri
    event HydraUriNegativeUpdated(string uri);

    /// @notice Set `hydraUriNegative`
    /// @param _uri The new uri
    function setHydraUriNegative(string calldata _uri) external onlyOwner {
        hydraUriNegative = _uri;
        emit HydraUriNegativeUpdated(_uri);
    }

    /// @notice The number of price feed rounds to go back and get the "before"
    /// time in price difference calculations
    uint80 public pricePeriod = 1;

    /// @notice Emitted when `pricePeriod` is updated
    /// @param value The new value
    event PricePeriodUpdated(uint80 value);

    /// @notice Set `pricePeriod`
    /// @param _value The new value
    function setPricePeriod(uint80 _value) external onlyOwner {
        pricePeriod = _value;
        emit PricePeriodUpdated(_value);
    }

    /// @notice The multiplier used in price difference calculations to increase
    /// resolution
    int256 public priceMultiplier = 10000;

    /// @notice Emitted when `priceMultiplier` is updated
    /// @param value The new value
    event PriceMultiplierUpdated(int256 value);

    /// @notice Set `priceMultiplier`
    /// @param _value The new value
    function setPriceMultiplier(int256 _value) external onlyOwner {
        priceMultiplier = _value;
        emit PriceMultiplierUpdated(_value);
    }

    /// @notice The minimum positive price difference after being multiplied by
    /// the `priceMultiplier` to count as a positive change, the negative of
    /// this for negative change
    int256 public minPriceDifference = 30;

    /// @notice Emitted when `minPriceDifference` is updated
    /// @param value The new value
    event MinPriceDifferenceUpdated(int256 value);

    /// @notice Set `minPriceDifference`
    /// @param _value The new value
    function setMinPriceDifference(int256 _value) external onlyOwner {
        minPriceDifference = _value;
        emit MinPriceDifferenceUpdated(_value);
    }

    /// @notice The chainlink AggregatorV3Interface-compatible contract that
    /// provides price feed information for the Hydra's dynamic URI feature
    AggregatorV3Interface public priceFeed;

    /// @notice Emitted when the price feed is updated
    /// @param priceFeed The address of the price feed contract
    event PriceFeedUpdated(address priceFeed);

    /// @notice Update the price feed
    /// @param _priceFeed The address of the chainlink
    /// AggregatorV3Interface-compatible price feed contract
    function setPriceFeed(address _priceFeed) external onlyOwner {
        priceFeed = AggregatorV3Interface(_priceFeed);
        emit PriceFeedUpdated(_priceFeed);
    }

    /// @notice The number of drop tokens needed to take part in the Hydra
    /// auction
    uint256 public hydraDropTokenRequirement = 1;

    /// @notice Emitted when the number of drop tokens required to bid on the
    /// Hydra is updated
    /// @param requirement The number of drop tokens required
    event HydraDropTokenRequirementUpdated(uint256 requirement);

    /// @notice Set the number of drop tokens required to bid on the Hydra
    /// @param _dropTokenRequirement The number of drop tokens required
    function setHydraDropTokenRequirement(
        uint256 _dropTokenRequirement
    ) external onlyOwner {
        hydraDropTokenRequirement = _dropTokenRequirement;
        emit HydraDropTokenRequirementUpdated(_dropTokenRequirement);
    }

    function _initHydra(
        address _priceFeed,
        string memory _positiveUri,
        string memory _neutralUri,
        string memory _negativeUri
    ) internal {
        priceFeed = AggregatorV3Interface(_priceFeed);
        hydraUriPositive = _positiveUri;
        hydraUriNeutral = _neutralUri;
        hydraUriNegative = _negativeUri;
    }

    function _getHydraState() internal view returns (HydraState) {
        (uint80 roundId, int currentPrice,,,) = priceFeed.latestRoundData();
        (, int previousPrice,,,) = priceFeed.getRoundData(
            roundId - pricePeriod
        );
        int256 priceDifference = previousPrice == int256(0) ? int256(0) :
            ((currentPrice - previousPrice) * priceMultiplier) / previousPrice;
        if (priceDifference >= minPriceDifference) {
            return HydraState.Positive;
        }
        if (priceDifference <= -minPriceDifference) {
            return HydraState.Negative;
        } 
        return HydraState.Neutral;
    }

    function _hydraUri() internal view returns (string memory) {
        HydraState state = _getHydraState();
        if (state == HydraState.Positive) {
            return hydraUriPositive;
        } else if (state == HydraState.Neutral) {
            return hydraUriNeutral;
        } else {
            return hydraUriNegative;
        }
    }

    /// @notice Whether or not an account is eligible to bid on the Hydra
    /// @param _account The address of the account
    /// @return Whether the account is eligible or not
    function canBidOnHydra(
        address _account
    ) external view override returns (bool) {
        return _dropTokenBalanceOf(_account) >= hydraDropTokenRequirement;
    }

    /// @notice Transfer the hydra to another owner
    /// @param _to The address of the new owner
    function transferHydra(address _to) external onlyOwner nonReentrant {
        require(!isHydraMinted, "Not enough hydras remaining");

        hydraId = nextId;
        nextId = IDUtils.next(nextId);
        _registerERC721(ID.unwrap(hydraId));

        _mint(_to, ID.unwrap(hydraId), 1, "");

        isHydraMinted = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_priceFeed","type":"address"},{"internalType":"string","name":"_positiveHydraUri","type":"string"},{"internalType":"string","name":"_neutralHydraUri","type":"string"},{"internalType":"string","name":"_negativeHydraUri","type":"string"},{"internalType":"string","name":"_tokenBaseURI","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"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":"account","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":"string","name":"value","type":"string"}],"name":"BaseURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requirement","type":"uint256"}],"name":"DefaultDropTokenRequirementUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"DefaultPriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"ID","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DropTokensBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"ID","name":"firstId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"DropTokensCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"ID","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DropTokensDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requirement","type":"uint256"}],"name":"HydraDropTokenRequirementUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"HydraUriNegativeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"HydraUriNeutralUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"HydraUriPositiveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"merkleDropId","type":"uint256"}],"name":"MerkleDropCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"merkleDropId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"ID[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"MerkleDropClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"merkleDropId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"ID[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"MerkleDropCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int256","name":"value","type":"int256"}],"name":"MinPriceDifferenceUpdated","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":false,"internalType":"address","name":"priceFeed","type":"address"}],"name":"PriceFeedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int256","name":"value","type":"int256"}],"name":"PriceMultiplierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint80","name":"value","type":"uint80"}],"name":"PricePeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"TokenNameUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"TokenSymbolUpdated","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"ID","name":"id","type":"uint256"}],"name":"UniqueDropTokenRequirementDefault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"ID","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requirement","type":"uint256"}],"name":"UniqueDropTokenRequirementUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"ID","name":"id","type":"uint256"}],"name":"UniquePriceDefault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"ID","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"UniquePriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"ID","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"UniquePurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"ID","name":"firstId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UniquesCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"purchasable","type":"bool"}],"name":"UniquesPurchasableUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"ID","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"canBidOnHydra","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_merkleDropId","type":"uint256"}],"name":"cancelMerkleDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_merkleDropId","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"ID[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"claimMerkleDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_merkleDropId","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"ID[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"ID","name":"_uniqueId","type":"uint256"}],"name":"claimMerkleDropAndPurchaseUnique","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"createDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"ID[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"createMerkleDrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createUniques","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultDropTokenRequirement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"ID","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"distributeDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dropTokenList","outputs":[{"internalType":"ID","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"ID","name":"","type":"uint256"}],"name":"dropTokens","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hydraDropTokenRequirement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hydraId","outputs":[{"internalType":"ID","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hydraUriNegative","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hydraUriNeutral","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hydraUriPositive","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHydraMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_merkleDropId","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"isMerkleDropClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleDrops","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPriceDifference","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"ID","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextMerkleDropId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"priceFeed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceMultiplier","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePeriod","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"ID","name":"_id","type":"uint256"}],"name":"purchaseUnique","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"string","name":"_value","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dropTokenRequirement","type":"uint256"}],"name":"setDefaultDropTokenRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setDefaultPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dropTokenRequirement","type":"uint256"}],"name":"setHydraDropTokenRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setHydraUriNegative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setHydraUriNeutral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setHydraUriPositive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"_value","type":"int256"}],"name":"setMinPriceDifference","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceFeed","type":"address"}],"name":"setPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"_value","type":"int256"}],"name":"setPriceMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint80","name":"_value","type":"uint80"}],"name":"setPricePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_value","type":"string"}],"name":"setTokenName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_value","type":"string"}],"name":"setTokenSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"ID","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_dropTokenRequirement","type":"uint256"}],"name":"setUniqueDropTokenRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"ID","name":"_id","type":"uint256"}],"name":"setUniqueDropTokenRequirementDefault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"ID","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setUniquePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"ID","name":"_id","type":"uint256"}],"name":"setUniquePriceDefault","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":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleUniquesPurchasable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"_to","type":"address"}],"name":"transferHydra","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"ID","name":"","type":"uint256"}],"name":"uniques","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bool","name":"customPrice","type":"bool"},{"internalType":"bool","name":"minted","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"customDropTokenRequirement","type":"bool"},{"internalType":"uint256","name":"dropTokenRequirement","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniquesPurchasable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260006007819055600a55600c805460ff19908116909155670de0b6b3a7640000600e556001600f81905560108054909216909155601880546001600160501b03191682179055612710601955601e601a55601c553480156200006557600080fd5b5060405162005fd738038062005fd783398101604081905262000088916200054c565b604080516020810190915260008152620000a281620001cc565b50620000ae33620001e5565b60016006558251620000c8906012906020860190620003bc565b508051620000de906014906020840190620003bc565b508151620000f4906013906020850190620003bc565b5060408051600f8082526102008201909252600091602082016101e08036833701905050905060005b60048110156200015f576109c48282815181106200013f576200013f62000668565b602090810291909101015280620001568162000694565b9150506200011d565b5060045b600f811015620001a457600182828151811062000184576200018462000668565b6020908102919091010152806200019b8162000694565b91505062000163565b50620001b08162000237565b620001be8888888862000344565b50505050505050506200075a565b8051620001e1906002906020840190620003bc565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f3731a338f8f64b03c8926594af5b3e21a65d514032548693122b4ebca95e0deb600754826040516200026c929190620006b2565b60405180910390a160005b8151811015620001e1576040518060400160405280600115158152602001838381518110620002aa57620002aa62000668565b60209081029190910181015190915260078054600090815260088352604081208451815460ff19169015151781559383015160019485015590546009805494850181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af9092018290556200032c9190620003a7811b62002a6e17901c565b600755806200033b8162000694565b91505062000277565b601b80546001600160a01b0319166001600160a01b038616179055825162000374906015906020860190620003bc565b5081516200038a906016906020850190620003bc565b508051620003a0906017906020840190620003bc565b5050505050565b6000620003b682600162000702565b92915050565b828054620003ca906200071d565b90600052602060002090601f016020900481019282620003ee576000855562000439565b82601f106200040957805160ff191683800117855562000439565b8280016001018555821562000439579182015b82811115620004395782518255916020019190600101906200041c565b50620004479291506200044b565b5090565b5b808211156200044757600081556001016200044c565b80516001600160a01b03811681146200047a57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620004a757600080fd5b81516001600160401b0380821115620004c457620004c46200047f565b604051601f8301601f19908116603f01168101908282118183101715620004ef57620004ef6200047f565b816040528381526020925086838588010111156200050c57600080fd5b600091505b8382101562000530578582018301518183018401529082019062000511565b83821115620005425760008385830101525b9695505050505050565b600080600080600080600060e0888a0312156200056857600080fd5b620005738862000462565b60208901519097506001600160401b03808211156200059157600080fd5b6200059f8b838c0162000495565b975060408a0151915080821115620005b657600080fd5b620005c48b838c0162000495565b965060608a0151915080821115620005db57600080fd5b620005e98b838c0162000495565b955060808a01519150808211156200060057600080fd5b6200060e8b838c0162000495565b945060a08a01519150808211156200062557600080fd5b620006338b838c0162000495565b935060c08a01519150808211156200064a57600080fd5b50620006598a828b0162000495565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415620006ab57620006ab6200067e565b5060010190565b6000604082018483526020604081850152818551808452606086019150828701935060005b81811015620006f557845183529383019391830191600101620006d7565b5090979650505050505050565b600082198211156200071857620007186200067e565b500190565b600181811c908216806200073257607f821691505b602082108114156200075457634e487b7160e01b600052602260045260246000fd5b50919050565b61586d806200076a6000396000f3fe6080604052600436106104305760003560e01c80636f4d612311610229578063ba51b1b41161012e578063dfd015d8116100b6578063ee478b821161007a578063ee478b8214610d55578063f242432a14610d8f578063f2fde38b14610daf578063f911fdf714610dcf578063f9a71b7c14610def57600080fd5b8063dfd015d814610cb7578063e1edd7b614610cca578063e69e04b314610ce0578063e89ff99014610cf6578063e985e9c514610d0c57600080fd5b8063c87b56dd116100fd578063c87b56dd14610c2b578063ce5f718114610c4b578063d16f90c714610c6b578063d50cb88b14610c81578063d7c757e614610c9757600080fd5b8063ba51b1b414610bb6578063be8a328014610bd6578063c107532914610beb578063c75c653414610c0b57600080fd5b80637f71a423116101b15780639f944f16116101805780639f944f1614610b2c578063a0adb48914610b41578063a22cb46514610b56578063a4f29aad14610b76578063b88d4fde14610b9657600080fd5b80637f71a42314610ab95780638da5cb5b14610ad957806395d89b4114610af75780639b0d872e14610b0c57600080fd5b8063741bef1a116101f8578063741bef1a14610a37578063744a1b1714610a57578063748b0d2d14610a775780637b61c32014610a915780637d28014014610aa657600080fd5b80636f4d6123146109ac57806370a08231146109cc578063715018a614610a02578063724e78da14610a1757600080fd5b8063326414161161033a57806356ba172c116102c257806364ca9b0b1161028657806364ca9b0b1461092c5780636c02a931146109425780636c0360eb146109575780636d3c7ec51461096c5780636d745fbc1461098c57600080fd5b806356ba172c14610896578063586ce206146108b65780635eb5fe4f146108d657806361b8ce8c146108f65780636352211e1461090c57600080fd5b80634ca2e529116103095780634ca2e529146107555780634cab80e3146107a65780634d6e2319146108345780634e1273f41461084957806355f804b31461087657600080fd5b806332641416146106d55780633480b9b9146106f557806342842e0e146107155780634ba4f20d1461073557600080fd5b80630e89341c116103bd57806326bbd9d11161038c57806326bbd9d114610635578063278709cc146106555780632b791c27146106755780632eb2c2d6146106955780632f1ceb57146106b557600080fd5b80630e89341c146105bb5780631af75696146105db5780631ce3c37e146105fb57806323b872dd1461061557600080fd5b8063081812fc11610404578063081812fc146104dc578063095ea7b31461052d5780630b22d4251461054d5780630bf66e38146105635780630c56175f1461058357600080fd5b8062fdd58e1461043557806301ffc9a714610468578063054a25851461049857806306fdde03146104ba575b600080fd5b34801561044157600080fd5b50610455610450366004614640565b610e0f565b6040519081526020015b60405180910390f35b34801561047457600080fd5b50610488610483366004614682565b610ea6565b604051901515815260200161045f565b3480156104a457600080fd5b506104b86104b33660046146a6565b610ed1565b005b3480156104c657600080fd5b506104cf610fe0565b60405161045f919061471b565b3480156104e857600080fd5b506105156104f736600461472e565b6000908152600460205260409020600101546001600160a01b031690565b6040516001600160a01b03909116815260200161045f565b34801561053957600080fd5b506104b8610548366004614640565b611072565b34801561055957600080fd5b50610455601c5481565b34801561056f57600080fd5b5061048861057e3660046146a6565b6111a6565b34801561058f57600080fd5b506018546105a3906001600160501b031681565b6040516001600160501b03909116815260200161045f565b3480156105c757600080fd5b506104cf6105d636600461472e565b6111bc565b3480156105e757600080fd5b506104556105f636600461472e565b6111c7565b34801561060757600080fd5b506010546104889060ff1681565b34801561062157600080fd5b506104b8610630366004614747565b6111e8565b34801561064157600080fd5b506104b861065036600461472e565b611260565b34801561066157600080fd5b506104b861067036600461472e565b6112c6565b34801561068157600080fd5b506104b8610690366004614788565b611325565b3480156106a157600080fd5b506104b86106b03660046148f3565b6113a4565b3480156106c157600080fd5b506104b86106d03660046149a0565b61143b565b3480156106e157600080fd5b506104b86106f0366004614a5c565b6114a3565b34801561070157600080fd5b506104b861071036600461472e565b61150d565b34801561072157600080fd5b506104b8610730366004614747565b61156c565b34801561074157600080fd5b506104b86107503660046149a0565b611587565b34801561076157600080fd5b5061078f61077036600461472e565b6008602052600090815260409020805460019091015460ff9091169082565b60408051921515835260208301919091520161045f565b3480156107b257600080fd5b506107ff6107c136600461472e565b600d60205260009081526040902080546001820154600283015460039093015460ff8084169461010085048216946201000090048216939291169086565b6040805196151587529415156020870152921515938501939093526060840152901515608083015260a082015260c00161045f565b34801561084057600080fd5b506104cf6115ef565b34801561085557600080fd5b50610869610864366004614a9d565b61167d565b60405161045f9190614ba4565b34801561088257600080fd5b506104b86108913660046149a0565b6117a6565b3480156108a257600080fd5b506104b86108b136600461472e565b61180e565b3480156108c257600080fd5b506104b86108d136600461472e565b6118b1565b3480156108e257600080fd5b506104b86108f136600461472e565b611952565b34801561090257600080fd5b5061045560075481565b34801561091857600080fd5b5061051561092736600461472e565b6119f2565b34801561093857600080fd5b50610455600f5481565b34801561094e57600080fd5b506104cf611a30565b34801561096357600080fd5b506104cf611a3d565b34801561097857600080fd5b506104b861098736600461472e565b611a4a565b34801561099857600080fd5b506104b86109a7366004614bb7565b611aa9565b3480156109b857600080fd5b506104886109c7366004614c5a565b611aef565b3480156109d857600080fd5b506104556109e73660046146a6565b6001600160a01b031660009081526003602052604090205490565b348015610a0e57600080fd5b506104b8611b4d565b348015610a2357600080fd5b506104b8610a323660046146a6565b611b83565b348015610a4357600080fd5b50601b54610515906001600160a01b031681565b348015610a6357600080fd5b506104b8610a72366004614788565b611bfb565b348015610a8357600080fd5b50600c546104889060ff1681565b348015610a9d57600080fd5b506104cf611caf565b6104b8610ab436600461472e565b611cbc565b348015610ac557600080fd5b506104b8610ad4366004614c8a565b611dac565b348015610ae557600080fd5b506005546001600160a01b0316610515565b348015610b0357600080fd5b506104cf611ef7565b348015610b1857600080fd5b506104b8610b2736600461472e565b611f06565b348015610b3857600080fd5b506104cf611f3c565b348015610b4d57600080fd5b506104b8611f49565b348015610b6257600080fd5b506104b8610b71366004614cbf565b611fc0565b348015610b8257600080fd5b506104b8610b913660046149a0565b611fcb565b348015610ba257600080fd5b506104b8610bb1366004614cf2565b612033565b348015610bc257600080fd5b506104b8610bd13660046149a0565b6120d9565b348015610be257600080fd5b506104cf612141565b348015610bf757600080fd5b506104b8610c06366004614640565b61214e565b348015610c1757600080fd5b506104b8610c26366004614788565b612265565b348015610c3757600080fd5b506104cf610c4636600461472e565b61231b565b348015610c5757600080fd5b506104b8610c6636600461472e565b61239a565b348015610c7757600080fd5b5061045560115481565b348015610c8d57600080fd5b5061045560195481565b348015610ca357600080fd5b50610455610cb2366004614d5d565b6123f9565b6104b8610cc5366004614dd6565b612765565b348015610cd657600080fd5b50610455600a5481565b348015610cec57600080fd5b50610455600e5481565b348015610d0257600080fd5b50610455601a5481565b348015610d1857600080fd5b50610488610d27366004614e80565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610d6157600080fd5b5061078f610d7036600461472e565b600b602052600090815260409020805460019091015460ff9091169082565b348015610d9b57600080fd5b506104b8610daa366004614eae565b61286c565b348015610dbb57600080fd5b506104b8610dca3660046146a6565b6128f3565b348015610ddb57600080fd5b506104b8610dea3660046149a0565b61298b565b348015610dfb57600080fd5b506104b8610e0a366004614f2b565b6129f3565b60006001600160a01b038316610e805760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b0319821663017ecdc760e31b1480610ecb5750610ecb82612a7b565b92915050565b6005546001600160a01b03163314610efb5760405162461bcd60e51b8152600401610e7790614f48565b60026006541415610f1e5760405162461bcd60e51b8152600401610e7790614f7d565b600260065560105460ff1615610f765760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768206879647261732072656d61696e696e6700000000006044820152606401610e77565b6007546011819055610f8790612a6e565b600755601154610fac906000908152600460205260409020805460ff19166001179055565b610fca81601154600160405180602001604052806000815250612abb565b506010805460ff19166001908117909155600655565b606060138054610fef90614fb4565b80601f016020809104026020016040519081016040528092919081815260200182805461101b90614fb4565b80156110685780601f1061103d57610100808354040283529160200191611068565b820191906000526020600020905b81548152906001019060200180831161104b57829003601f168201915b5050505050905090565b600061107d826119f2565b9050806001600160a01b0316836001600160a01b031614156110eb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610e77565b336001600160a01b038216148061112557506001600160a01b038116600090815260016020908152604080832033845290915290205460ff165b6111975760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610e77565b6111a18383612bb9565b505050565b6000601c546111b483612c2a565b101592915050565b6060610ecb8261231b565b600981815481106111d757600080fd5b600091825260209091200154905081565b60008181526004602052604090205460ff16801561123957503361120b826119f2565b6001600160a01b0316148061123957506000818152600460205260409020600101546001600160a01b031633145b6112555760405162461bcd60e51b8152600401610e7790614fef565b6111a1838383612c85565b6005546001600160a01b0316331461128a5760405162461bcd60e51b8152600401610e7790614f48565b600f8190556040518181527fce05855d721d34fbc1d75cf594b1da6281aec39b19baedecb11b26ac52400644906020015b60405180910390a150565b6005546001600160a01b031633146112f05760405162461bcd60e51b8152600401610e7790614f48565b601c8190556040518181527f1b99ce7981720e08940e8370ac7ea5c54d410a332d93bfa1a7558dbb5b09e5f5906020016112bb565b60008281526008602052604090205460ff166113535760405162461bcd60e51b8152600401610e7790615040565b61135e338383612dca565b60408051338152602081018490529081018290527fcce11b536b4501edbbba185d706a9c8cea0017e41774087252bf7d3e17f2398a906060015b60405180910390a15050565b6001600160a01b0385163314806113c057506113c08533610d27565b6114275760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610e77565b6114348585858585612f1c565b5050505050565b6005546001600160a01b031633146114655760405162461bcd60e51b8152600401610e7790614f48565b6114716015838361459b565b507fe43d2cfc5354d1876e0e2b7db2fe84a72c8d0a61fae92be75a9387c2d45f16b78282604051611398929190615077565b6005546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610e7790614f48565b61150982828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061310792505050565b5050565b6005546001600160a01b031633146115375760405162461bcd60e51b8152600401610e7790614f48565b60198190556040518181527f80ebf2a570aa6c698d8116be366bcb2ebbdb3540bac473ccff3d3923f250962a906020016112bb565b6111a183838360405180602001604052806000815250612033565b6005546001600160a01b031633146115b15760405162461bcd60e51b8152600401610e7790614f48565b6115bd6017838361459b565b507fb356f7bafd7e8477fd75c9fc6bd20f20ac0f5fe1e656d25c5c2d27cb5d51bb788282604051611398929190615077565b601680546115fc90614fb4565b80601f016020809104026020016040519081016040528092919081815260200182805461162890614fb4565b80156116755780601f1061164a57610100808354040283529160200191611675565b820191906000526020600020905b81548152906001019060200180831161165857829003601f168201915b505050505081565b606081518351146116e25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610e77565b600083516001600160401b038111156116fd576116fd6147aa565b604051908082528060200260200182016040528015611726578160200160208202803683370190505b50905060005b845181101561179e5761177185828151811061174a5761174a6150a6565b6020026020010151858381518110611764576117646150a6565b6020026020010151610e0f565b828281518110611783576117836150a6565b6020908102919091010152611797816150d2565b905061172c565b509392505050565b6005546001600160a01b031633146117d05760405162461bcd60e51b8152600401610e7790614f48565b6117dc6012838361459b565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051611398929190615077565b6005546001600160a01b031633146118385760405162461bcd60e51b8152600401610e7790614f48565b6000818152600d602052604090205460ff166118665760405162461bcd60e51b8152600401610e77906150ed565b6000818152600d602052604090819020600201805460ff19169055517f80ac96271f40fc07290e59c97a078503fa6267ec7d0a3f7e4134709979da69ec906112bb9083815260200190565b6005546001600160a01b031633146118db5760405162461bcd60e51b8152600401610e7790614f48565b6000818152600d602052604090205460ff166119095760405162461bcd60e51b8152600401610e77906150ed565b6000818152600d602052604090819020805461ff0019169055517f733e6f3e872a3652b6014dfdd22bd41f65167c3a99fc197be6249e5ea45bb99f906112bb9083815260200190565b6005546001600160a01b0316331461197c5760405162461bcd60e51b8152600401610e7790614f48565b6000818152600b602052604090205460ff166119aa5760405162461bcd60e51b8152600401610e779061511c565b6000818152600b602052604090819020805460ff19169055517f7de64b85af3f19efac76278bd3bc19658d500246baf18b928548b5d8d3d68c39906112bb9083815260200190565b60008181526004602052604081205460ff16611a0f576000610ecb565b5060009081526004602052604090205461010090046001600160a01b031690565b601380546115fc90614fb4565b601280546115fc90614fb4565b6005546001600160a01b03163314611a745760405162461bcd60e51b8152600401610e7790614f48565b600e8190556040518181527fa1b7fe14aabd5aa4c4fe325670188552c5684c9d5d72a0f50dd696332da525ab906020016112bb565b60026006541415611acc5760405162461bcd60e51b8152600401610e7790614f7d565b6002600655611ae187878787878787336131ff565b505060016006555050505050565b6000828152600b602052604081205460ff16611b1d5760405162461bcd60e51b8152600401610e779061511c565b506000828152600b602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b6005546001600160a01b03163314611b775760405162461bcd60e51b8152600401610e7790614f48565b611b816000613681565b565b6005546001600160a01b03163314611bad5760405162461bcd60e51b8152600401610e7790614f48565b601b80546001600160a01b0319166001600160a01b0383169081179091556040519081527fe5b20b8497e4f3e2435ef9c20e2e26b47497ee13745ce1c681ad6640653119e6906020016112bb565b6005546001600160a01b03163314611c255760405162461bcd60e51b8152600401610e7790614f48565b6000828152600d602052604090205460ff16611c535760405162461bcd60e51b8152600401610e77906150ed565b6000828152600d602052604090819020805461ff001916610100178155600101829055517f8bfe5ccc6c11bcab178616cd3c776298c9cfba223909a6366103d26c3654453f906113989084908490918252602082015260400190565b601480546115fc90614fb4565b60026006541415611cdf5760405162461bcd60e51b8152600401610e7790614f7d565b6002600655600c5460ff16611d065760405162461bcd60e51b8152600401610e7790615149565b6000818152600d602052604090205460ff16611d345760405162461bcd60e51b8152600401610e77906150ed565b6000818152600d602052604090205462010000900460ff1615611d995760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820756e69717565732072656d61696e696e67000000006044820152606401610e77565b611da48133346136d3565b506001600655565b6005546001600160a01b03163314611dd65760405162461bcd60e51b8152600401610e7790614f48565b60008281526008602052604090205460ff16611e045760405162461bcd60e51b8152600401610e7790615040565b600082815260086020526040902060010154811115611e655760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f7567682064726f7020746f6b656e732072656d61696e696e676044820152606401610e77565b60008281526008602052604081206001018054839290611e8690849061518a565b92505081905550611ea883838360405180602001604052806000815250612abb565b604080516001600160a01b0385168152602081018490529081018290527fc1974b7c1dd593742d11e6c493b141fc51d844f65543eba7dc7df849b29f75a29060600160405180910390a1505050565b606060148054610fef90614fb4565b6005546001600160a01b03163314611f305760405162461bcd60e51b8152600401610e7790614f48565b611f3981613877565b50565b601580546115fc90614fb4565b6005546001600160a01b03163314611f735760405162461bcd60e51b8152600401610e7790614f48565b600c805460ff8082161560ff1990921682179092556040519116151581527f669025bb44b8906e7c34f9b3b4cafafff2890a3420b757c4f1a79b9821d6c98d9060200160405180910390a1565b61150933838361391b565b6005546001600160a01b03163314611ff55760405162461bcd60e51b8152600401610e7790614f48565b6120016013838361459b565b507f69aeecc8fc25d355e362852ad7b53f01e8b8da03290a1f7241151a02d84f41988282604051611398929190615077565b60008281526004602052604090205460ff168015612084575033612056836119f2565b6001600160a01b0316148061208457506000828152600460205260409020600101546001600160a01b031633145b6120a05760405162461bcd60e51b8152600401610e7790614fef565b6120ab848484612c85565b6120b7848484846139fc565b6120d35760405162461bcd60e51b8152600401610e77906151a1565b50505050565b6005546001600160a01b031633146121035760405162461bcd60e51b8152600401610e7790614f48565b61210f6014838361459b565b507fd3019ff78698f6f81b4084fc56c4b111b7c198f93bce60fe82abb6c7c8c19cb68282604051611398929190615077565b601780546115fc90614fb4565b6005546001600160a01b031633146121785760405162461bcd60e51b8152600401610e7790614f48565b6002600654141561219b5760405162461bcd60e51b8152600401610e7790614f7d565b6002600655478111156121e35760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610e77565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612219573d6000803e3d6000fd5b50604080516001600160a01b0384168152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910160405180910390a150506001600655565b6005546001600160a01b0316331461228f5760405162461bcd60e51b8152600401610e7790614f48565b6000828152600d602052604090205460ff166122bd5760405162461bcd60e51b8152600401610e77906150ed565b6000828152600d60205260409081902060028101805460ff19166001179055600301829055517f141160f8fa8a19d54ee79ff26fc11269cebc4e1b20a73ec09399986c43942022906113989084908490918252602082015260400190565b60105460609060ff168015612331575060115482145b1561233e57610ecb613afb565b6000612348613bec565b51116123635760405180602001604052806000815250610ecb565b61236b613bec565b61237483613bfb565b6040516020016123859291906151f3565b60405160208183030381529060405292915050565b6005546001600160a01b031633146123c45760405162461bcd60e51b8152600401610e7790614f48565b601a8190556040518181527f4ee453ab201a2fcc04f75f6fd050e58a65c6f9814abff87bd557513df84333fa906020016112bb565b6005546000906001600160a01b031633146124265760405162461bcd60e51b8152600401610e7790614f48565b8184146124755760405162461bcd60e51b815260206004820181905260248201527f4d69736d61746368206265747765656e2049447320616e6420616d6f756e74736044820152606401610e77565b6000805b858110156125fc578015806124aa57506124aa87878381811061249e5761249e6150a6565b90506020020135831090565b6124ea5760405162461bcd60e51b81526020600482015260116024820152704e6f6e2d617363656e64696e672049447360781b6044820152606401610e77565b8686828181106124fc576124fc6150a6565b9050602002013591506008600088888481811061251b5761251b6150a6565b602090810292909201358352508101919091526040016000205460ff166125545760405162461bcd60e51b8152600401610e7790615040565b6008600088888481811061256a5761256a6150a6565b90506020020135815260200190815260200160002060010154858583818110612595576125956150a6565b9050602002013511156125ea5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f7567682064726f7020746f6b656e20737570706c79000000006044820152606401610e77565b806125f4816150d2565b915050612479565b5060005b858110156126d55784848281811061261a5761261a6150a6565b9050602002013560086000898985818110612637576126376150a6565b905060200201358152602001908152602001600020600101600082825461265e919061518a565b909155508590508482818110612676576126766150a6565b90506020020135600b6000600a54815260200190815260200160002060020160008989858181106126a9576126a96150a6565b9050602002013581526020019081526020016000208190555080806126cd906150d2565b915050612600565b50600a80546000908152600b602052604080822060019081018b90558354835291819020805460ff1916909217909155905490517f49db68d3ad63ff144d9ae3e18774591c398e2081a09a9ab2be6db5c4963a90509161273e918a908a908a908a908a90615284565b60405180910390a1600a8054906000612756836150d2565b90915550979650505050505050565b600260065414156127885760405162461bcd60e51b8152600401610e7790614f7d565b6002600655600c5460ff166127af5760405162461bcd60e51b8152600401610e7790615149565b6000818152600d602052604090205460ff166127dd5760405162461bcd60e51b8152600401610e77906150ed565b6000818152600d602052604090205462010000900460ff16156128425760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820756e69717565732072656d61696e696e67000000006044820152606401610e77565b61285288888888888888336131ff565b61285d8133346136d3565b50506001600655505050505050565b6001600160a01b03851633148061288857506128888533610d27565b6128e65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610e77565b6114348585858585613cf8565b6005546001600160a01b0316331461291d5760405162461bcd60e51b8152600401610e7790614f48565b6001600160a01b0381166129825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e77565b611f3981613681565b6005546001600160a01b031633146129b55760405162461bcd60e51b8152600401610e7790614f48565b6129c16016838361459b565b507f01686b5ff25520eb5f802a82cdf857d98179a60b382a9c7c24818d158e2b6be38282604051611398929190615077565b6005546001600160a01b03163314612a1d5760405162461bcd60e51b8152600401610e7790614f48565b6018805469ffffffffffffffffffff19166001600160501b0383169081179091556040519081527fdd06884a6f4be3e83c4de9824d65fe4cae453bdfb60ceb72fe67c0ed83ee4165906020016112bb565b6000610ecb8260016152c4565b60006001600160e01b031982166380ac58cd60e01b1480612aac57506001600160e01b03198216635b5e139f60e01b145b80610ecb5750610ecb82613e03565b6001600160a01b038416612b1b5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610e77565b33612b3b81600087612b2c88613e53565b612b3588613e53565b87613e9e565b6000848152602081815260408083206001600160a01b038916845290915281208054859290612b6b9084906152c4565b909155505060408051858152602081018590526001600160a01b038088169260009291851691600080516020615818833981519152910160405180910390a461143481600087878787614142565b600081815260046020526040902060010180546001600160a01b0319166001600160a01b0384169081179091558190612bf1826119f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080805b600954811015612c7e57612c608460098381548110612c5057612c506150a6565b9060005260206000200154610e0f565b612c6a90836152c4565b915080612c76816150d2565b915050612c2f565b5092915050565b6001600160a01b038216612ce75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e77565b612d15338484612cf685613e53565b612d006001613e53565b60405180602001604052806000815250613e9e565b612d20600082612bb9565b6000818152602081815260408083206001600160a01b03871684529091528120805460019290612d5190849061518a565b90915550506000818152602081815260408083206001600160a01b03861684529091528120805460019290612d879084906152c4565b909155505060408051828152600160208201526001600160a01b0384811692908616913391600080516020615818833981519152910160405180910390a4505050565b6001600160a01b038316612e2c5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610e77565b33612e4681856000612e3d87613e53565b612d0087613e53565b6000838152602081815260408083206001600160a01b038816845290915290205482811015612ec35760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610e77565b6000848152602081815260408083206001600160a01b0389811680865291845282852088870390558251898152938401889052909290861691600080516020615818833981519152910160405180910390a45050505050565b8151835114612f7e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610e77565b6001600160a01b038416612fa45760405162461bcd60e51b8152600401610e77906152dc565b33612fb3818787878787613e9e565b60005b8451811015613099576000858281518110612fd357612fd36150a6565b602002602001015190506000858381518110612ff157612ff16150a6565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156130415760405162461bcd60e51b8152600401610e7790615321565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061307e9084906152c4565b9250508190555050505080613092906150d2565b9050612fb6565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516130e992919061536b565b60405180910390a46130ff81878787878761429e565b505050505050565b7f3731a338f8f64b03c8926594af5b3e21a65d514032548693122b4ebca95e0deb6007548260405161313a929190615399565b60405180910390a160005b8151811015611509576040518060400160405280600115158152602001838381518110613174576131746150a6565b60209081029190910181015190915260078054600090815260088352604081208451815460ff19169015151781559390920151600193840155546009805493840181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af9091018190556131ea90612a6e565b600755806131f7816150d2565b915050613145565b6000888152600b602052604090205460ff1661322d5760405162461bcd60e51b8152600401610e779061511c565b81841461327c5760405162461bcd60e51b815260206004820181905260248201527f4d69736d61746368206265747765656e2049447320616e6420616d6f756e74736044820152606401610e77565b6000888152600b602090815260408083206001600160a01b038516845260030190915290205460ff16156132e95760405162461bcd60e51b8152602060048201526014602482015273111c9bdc08185b1c9958591e4818db185a5b595960621b6044820152606401610e77565b6000805b8581101561346f57801580613312575061331287878381811061249e5761249e6150a6565b6133525760405162461bcd60e51b81526020600482015260116024820152704e6f6e2d617363656e64696e672049447360781b6044820152606401610e77565b868682818110613364576133646150a6565b90506020020135915060086000888884818110613383576133836150a6565b602090810292909201358352508101919091526040016000205460ff166133bc5760405162461bcd60e51b8152600401610e7790615040565b60008a8152600b60205260408120600201908888848181106133e0576133e06150a6565b90506020020135815260200190815260200160002054858583818110613408576134086150a6565b90506020020135111561345d5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f7567682064726f7020746f6b656e7320696e2064726f7000006044820152606401610e77565b80613467816150d2565b9150506132ed565b506000828787878760405160200161348b9594939291906153b2565b6040516020818303038152906040528051906020012090506134f189898080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508f8152600b602052604090206001015492508591506143599050565b61352d5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610e77565b60005b868110156136025785858281811061354a5761354a6150a6565b90506020020135600b60008d815260200190815260200160002060020160008a8a8581811061357b5761357b6150a6565b905060200201358152602001908152602001600020600082825461359f919061518a565b909155506135f09050848989848181106135bb576135bb6150a6565b905060200201358888858181106135d4576135d46150a6565b9050602002013560405180602001604052806000815250612abb565b806135fa816150d2565b915050613530565b5060008a8152600b602090815260408083206001600160a01b038716845260030190915290819020805460ff19166001179055517fe46324e2978564401e781b828a88893d1890db3d2ca87a31f9e434700ccc59ca9061366d908c9086908b908b908b908b9061541f565b60405180910390a150505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000838152600d602052604090206002015460ff166136ff57600f546136f883612c2a565b101561371d565b6000838152600d602052604090206003015461371a83612c2a565b10155b6137735760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682064726f7020746f6b656e7320746f207175616c69666044820152607960f81b6064820152608401610e77565b6000838152600d6020526040812054610100900460ff1661379657600e546137a9565b6000848152600d60205260409020600101545b90508082146137ee5760405162461bcd60e51b8152602060048201526011602482015270125b98dbdc9c9958dd081c185e5b595b9d607a1b6044820152606401610e77565b61380a8385600160405180602001604052806000815250612abb565b6000848152600d6020908152604091829020805462ff000019166201000017905581516001600160a01b03861681529081018690529081018290527effa6dafca6841a6c6ef4b27b00551a4beefdf0c452ef893fd4e8c5ff89c2889060600160405180910390a150505050565b60075460408051918252602082018390527fbd91b8312c17ea3448e7539d4df4c6787bf8909232324245dd89b1c26c209f94910160405180910390a160005b8181101561150957600780546000908152600d60205260409020805460ff19166001179055546138fb906000908152600460205260409020805460ff19166001179055565b613906600754612a6e565b60075580613913816150d2565b9150506138b6565b816001600160a01b0316836001600160a01b0316141561398f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610e77565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b15613aef57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613a4090339089908890889060040161544a565b6020604051808303816000875af1925050508015613a7b575060408051601f3d908101601f19168201909252613a7891810190615487565b60015b613ad5573d808015613aa9576040519150601f19603f3d011682016040523d82523d6000602084013e613aae565b606091505b508051613acd5760405162461bcd60e51b8152600401610e77906151a1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613af3565b5060015b949350505050565b60606000613b07614408565b90506000816002811115613b1d57613b1d6154a4565b1415613bb45760158054613b3090614fb4565b80601f0160208091040260200160405190810160405280929190818152602001828054613b5c90614fb4565b8015613ba95780601f10613b7e57610100808354040283529160200191613ba9565b820191906000526020600020905b815481529060010190602001808311613b8c57829003601f168201915b505050505091505090565b6001816002811115613bc857613bc86154a4565b1415613bdb5760168054613b3090614fb4565b60178054613b3090614fb4565b5090565b606060128054610fef90614fb4565b606081613c1f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613c495780613c33816150d2565b9150613c429050600a836154d0565b9150613c23565b6000816001600160401b03811115613c6357613c636147aa565b6040519080825280601f01601f191660200182016040528015613c8d576020820181803683370190505b5090505b8415613af357613ca260018361518a565b9150613caf600a866154e4565b613cba9060306152c4565b60f81b818381518110613ccf57613ccf6150a6565b60200101906001600160f81b031916908160001a905350613cf1600a866154d0565b9450613c91565b6001600160a01b038416613d1e5760405162461bcd60e51b8152600401610e77906152dc565b33613d2e818787612b2c88613e53565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015613d6f5760405162461bcd60e51b8152600401610e7790615321565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290613dac9084906152c4565b909155505060408051868152602081018690526001600160a01b03808916928a82169291861691600080516020615818833981519152910160405180910390a4613dfa828888888888614142565b50505050505050565b60006001600160e01b03198216636cdb3d1360e11b1480613e3457506001600160e01b031982166303a24d0760e21b145b80610ecb57506301ffc9a760e01b6001600160e01b0319831614610ecb565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613e8d57613e8d6150a6565b602090810291909101015292915050565b60005b8351811015613dfa5760046000858381518110613ec057613ec06150a6565b60209081029190910181015182528101919091526040016000205460ff161561413057856001600160a01b0316613f0f858381518110613f0257613f026150a6565b60200260200101516119f2565b6001600160a01b031614613f775760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610e77565b828181518110613f8957613f896150a6565b60200260200101516001146140065760405162461bcd60e51b815260206004820152603760248201527f4552433732313a206d756c74692d7472616e73666572206f6620746f6b656e2060448201527f74686174206973206e6f74206d756c74692d746f6b656e0000000000000000006064820152608401610e77565b846004600086848151811061401d5761401d6150a6565b6020026020010151815260200190815260200160002060000160016101000a8154816001600160a01b0302191690836001600160a01b0316021790555083818151811061406c5761406c6150a6565b6020026020010151856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001600160a01b038616156140f2576001600160a01b03861660009081526003602052604081208054600192906140ec90849061518a565b90915550505b6001600160a01b03851615614130576001600160a01b038516600090815260036020526040812080546001929061412a9084906152c4565b90915550505b8061413a816150d2565b915050613ea1565b6001600160a01b0384163b156130ff5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061418690899089908890889088906004016154f8565b6020604051808303816000875af19250505080156141c1575060408051601f3d908101601f191682019092526141be91810190615487565b60015b61426e576141cd61553d565b806308c379a0141561420757506141e2615559565b806141ed5750614209565b8060405162461bcd60e51b8152600401610e77919061471b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610e77565b6001600160e01b0319811663f23a6e6160e01b14613dfa5760405162461bcd60e51b8152600401610e77906155e2565b6001600160a01b0384163b156130ff5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906142e2908990899088908890889060040161562a565b6020604051808303816000875af192505050801561431d575060408051601f3d908101601f1916820190925261431a91810190615487565b60015b614329576141cd61553d565b6001600160e01b0319811663bc197c8160e01b14613dfa5760405162461bcd60e51b8152600401610e77906155e2565b600081815b85518110156143fd57600086828151811061437b5761437b6150a6565b602002602001015190508083116143bd5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506143ea565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806143f5816150d2565b91505061435e565b509092149392505050565b6000806000601b60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015614460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144849190615688565b5050601b546018549395509193506000926001600160a01b0390921691639a6fc8f591506144bb906001600160501b0316866156e0565b6040516001600160e01b031960e084901b1681526001600160501b03909116600482015260240160a060405180830381865afa1580156144ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145239190615688565b505050915050600080821461455a5760195482906145418286615708565b61454b9190615747565b61455591906157cc565b61455d565b60005b9050601a54811261457357600094505050505090565b601a5461457f906157fa565b811361459057600294505050505090565b600194505050505090565b8280546145a790614fb4565b90600052602060002090601f0160209004810192826145c9576000855561460f565b82601f106145e25782800160ff1982351617855561460f565b8280016001018555821561460f579182015b8281111561460f5782358255916020019190600101906145f4565b50613be89291505b80821115613be85760008155600101614617565b6001600160a01b0381168114611f3957600080fd5b6000806040838503121561465357600080fd5b823561465e8161462b565b946020939093013593505050565b6001600160e01b031981168114611f3957600080fd5b60006020828403121561469457600080fd5b813561469f8161466c565b9392505050565b6000602082840312156146b857600080fd5b813561469f8161462b565b60005b838110156146de5781810151838201526020016146c6565b838111156120d35750506000910152565b600081518084526147078160208601602086016146c3565b601f01601f19169290920160200192915050565b60208152600061469f60208301846146ef565b60006020828403121561474057600080fd5b5035919050565b60008060006060848603121561475c57600080fd5b83356147678161462b565b925060208401356147778161462b565b929592945050506040919091013590565b6000806040838503121561479b57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156147e5576147e56147aa565b6040525050565b60006001600160401b03821115614805576148056147aa565b5060051b60200190565b600082601f83011261482057600080fd5b8135602061482d826147ec565b60405161483a82826147c0565b83815260059390931b850182019282810191508684111561485a57600080fd5b8286015b84811015614875578035835291830191830161485e565b509695505050505050565b600082601f83011261489157600080fd5b81356001600160401b038111156148aa576148aa6147aa565b6040516148c1601f8301601f1916602001826147c0565b8181528460208386010111156148d657600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561490b57600080fd5b85356149168161462b565b945060208601356149268161462b565b935060408601356001600160401b038082111561494257600080fd5b61494e89838a0161480f565b9450606088013591508082111561496457600080fd5b61497089838a0161480f565b9350608088013591508082111561498657600080fd5b5061499388828901614880565b9150509295509295909350565b600080602083850312156149b357600080fd5b82356001600160401b03808211156149ca57600080fd5b818501915085601f8301126149de57600080fd5b8135818111156149ed57600080fd5b8660208285010111156149ff57600080fd5b60209290920196919550909350505050565b60008083601f840112614a2357600080fd5b5081356001600160401b03811115614a3a57600080fd5b6020830191508360208260051b8501011115614a5557600080fd5b9250929050565b60008060208385031215614a6f57600080fd5b82356001600160401b03811115614a8557600080fd5b614a9185828601614a11565b90969095509350505050565b60008060408385031215614ab057600080fd5b82356001600160401b0380821115614ac757600080fd5b818501915085601f830112614adb57600080fd5b81356020614ae8826147ec565b604051614af582826147c0565b83815260059390931b8501820192828101915089841115614b1557600080fd5b948201945b83861015614b3c578535614b2d8161462b565b82529482019490820190614b1a565b96505086013592505080821115614b5257600080fd5b50614b5f8582860161480f565b9150509250929050565b600081518084526020808501945080840160005b83811015614b9957815187529582019590820190600101614b7d565b509495945050505050565b60208152600061469f6020830184614b69565b60008060008060008060006080888a031215614bd257600080fd5b8735965060208801356001600160401b0380821115614bf057600080fd5b614bfc8b838c01614a11565b909850965060408a0135915080821115614c1557600080fd5b614c218b838c01614a11565b909650945060608a0135915080821115614c3a57600080fd5b50614c478a828b01614a11565b989b979a50959850939692959293505050565b60008060408385031215614c6d57600080fd5b823591506020830135614c7f8161462b565b809150509250929050565b600080600060608486031215614c9f57600080fd5b8335614caa8161462b565b95602085013595506040909401359392505050565b60008060408385031215614cd257600080fd5b8235614cdd8161462b565b915060208301358015158114614c7f57600080fd5b60008060008060808587031215614d0857600080fd5b8435614d138161462b565b93506020850135614d238161462b565b92506040850135915060608501356001600160401b03811115614d4557600080fd5b614d5187828801614880565b91505092959194509250565b600080600080600060608688031215614d7557600080fd5b8535945060208601356001600160401b0380821115614d9357600080fd5b614d9f89838a01614a11565b90965094506040880135915080821115614db857600080fd5b50614dc588828901614a11565b969995985093965092949392505050565b60008060008060008060008060a0898b031215614df257600080fd5b8835975060208901356001600160401b0380821115614e1057600080fd5b614e1c8c838d01614a11565b909950975060408b0135915080821115614e3557600080fd5b614e418c838d01614a11565b909750955060608b0135915080821115614e5a57600080fd5b50614e678b828c01614a11565b999c989b50969995989497949560800135949350505050565b60008060408385031215614e9357600080fd5b8235614e9e8161462b565b91506020830135614c7f8161462b565b600080600080600060a08688031215614ec657600080fd5b8535614ed18161462b565b94506020860135614ee18161462b565b9350604086013592506060860135915060808601356001600160401b03811115614f0a57600080fd5b61499388828901614880565b6001600160501b0381168114611f3957600080fd5b600060208284031215614f3d57600080fd5b813561469f81614f16565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600181811c90821680614fc857607f821691505b60208210811415614fe957634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526019908201527f44726f7020746f6b656e20646f6573206e6f7420657869737400000000000000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156150e6576150e66150bc565b5060010190565b602080825260159082015274139bdd0818481d985b1a59081d5b9a5c5d59481a59605a1b604082015260600190565b602080825260139082015272111c9bdc08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b60208082526021908201527f556e6971756573206e6f742063757272656e746c79207075726368617361626c6040820152606560f81b606082015260800190565b60008282101561519c5761519c6150bc565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516152058184602088016146c3565b8351908301906152198183602088016146c3565b01949350505050565b8183526000602080850194508260005b85811015614b9957813587529582019590820190600101615232565b81835260006001600160fb1b0383111561526757600080fd5b8260051b8083602087013760009401602001938452509192915050565b8681528560208201526080604082015260006152a4608083018688615222565b82810360608401526152b781858761524e565b9998505050505050505050565b600082198211156152d7576152d76150bc565b500190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061537e6040830185614b69565b82810360208401526153908185614b69565b95945050505050565b828152604060208201526000613af36040830184614b69565b6bffffffffffffffffffffffff198660601b1681526000601482018660005b878110156153ef5781358352602092830192909101906001016153d1565b50506001600160fb1b0384111561540557600080fd5b8360051b8086833760009101908152979650505050505050565b8681526001600160a01b03861660208201526080604082018190526000906152a49083018688615222565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061547d908301846146ef565b9695505050505050565b60006020828403121561549957600080fd5b815161469f8161466c565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826154df576154df6154ba565b500490565b6000826154f3576154f36154ba565b500690565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090615532908301846146ef565b979650505050505050565b600060033d11156155565760046000803e5060005160e01c5b90565b600060443d10156155675790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561559657505050505090565b82850191508151818111156155ae5750505050505090565b843d87010160208285010111156155c85750505050505090565b6155d7602082860101876147c0565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061565690830186614b69565b82810360608401526156688186614b69565b9050828103608084015261567c81856146ef565b98975050505050505050565b600080600080600060a086880312156156a057600080fd5b85516156ab81614f16565b8095505060208601519350604086015192506060860151915060808601516156d281614f16565b809150509295509295909350565b60006001600160501b0383811690831681811015615700576157006150bc565b039392505050565b60008083128015600160ff1b850184121615615726576157266150bc565b6001600160ff1b0384018313811615615741576157416150bc565b50500390565b60006001600160ff1b038184138284138082168684048611161561576d5761576d6150bc565b600160ff1b600087128281168783058912161561578c5761578c6150bc565b600087129250878205871284841616156157a8576157a86150bc565b878505871281841616156157be576157be6150bc565b505050929093029392505050565b6000826157db576157db6154ba565b600160ff1b8214600019841416156157f5576157f56150bc565b500590565b6000600160ff1b821415615810576158106150bc565b506000039056fec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a2646970667358221220e1225b47975ea9abaf0d75054e8631e5ec97e6a64b9c00d341a0feb872f7312b64736f6c634300080a00330000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841900000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d596a4b7353426545536f693557367132386b3874747a6776473357326a61654231453745693944653174343700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d596a4b7353426545536f693557367132386b3874747a6776473357326a61654231453745693944653174343700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d596a4b7353426545536f693557367132386b3874747a6776473357326a61654231453745693944653174343700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d52515a526b686752446e43755369425067735469676747635154316f4e787a547679313576536d65547861672f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f54414b414849524f204b4f4d55524f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004546b6f4d00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106104305760003560e01c80636f4d612311610229578063ba51b1b41161012e578063dfd015d8116100b6578063ee478b821161007a578063ee478b8214610d55578063f242432a14610d8f578063f2fde38b14610daf578063f911fdf714610dcf578063f9a71b7c14610def57600080fd5b8063dfd015d814610cb7578063e1edd7b614610cca578063e69e04b314610ce0578063e89ff99014610cf6578063e985e9c514610d0c57600080fd5b8063c87b56dd116100fd578063c87b56dd14610c2b578063ce5f718114610c4b578063d16f90c714610c6b578063d50cb88b14610c81578063d7c757e614610c9757600080fd5b8063ba51b1b414610bb6578063be8a328014610bd6578063c107532914610beb578063c75c653414610c0b57600080fd5b80637f71a423116101b15780639f944f16116101805780639f944f1614610b2c578063a0adb48914610b41578063a22cb46514610b56578063a4f29aad14610b76578063b88d4fde14610b9657600080fd5b80637f71a42314610ab95780638da5cb5b14610ad957806395d89b4114610af75780639b0d872e14610b0c57600080fd5b8063741bef1a116101f8578063741bef1a14610a37578063744a1b1714610a57578063748b0d2d14610a775780637b61c32014610a915780637d28014014610aa657600080fd5b80636f4d6123146109ac57806370a08231146109cc578063715018a614610a02578063724e78da14610a1757600080fd5b8063326414161161033a57806356ba172c116102c257806364ca9b0b1161028657806364ca9b0b1461092c5780636c02a931146109425780636c0360eb146109575780636d3c7ec51461096c5780636d745fbc1461098c57600080fd5b806356ba172c14610896578063586ce206146108b65780635eb5fe4f146108d657806361b8ce8c146108f65780636352211e1461090c57600080fd5b80634ca2e529116103095780634ca2e529146107555780634cab80e3146107a65780634d6e2319146108345780634e1273f41461084957806355f804b31461087657600080fd5b806332641416146106d55780633480b9b9146106f557806342842e0e146107155780634ba4f20d1461073557600080fd5b80630e89341c116103bd57806326bbd9d11161038c57806326bbd9d114610635578063278709cc146106555780632b791c27146106755780632eb2c2d6146106955780632f1ceb57146106b557600080fd5b80630e89341c146105bb5780631af75696146105db5780631ce3c37e146105fb57806323b872dd1461061557600080fd5b8063081812fc11610404578063081812fc146104dc578063095ea7b31461052d5780630b22d4251461054d5780630bf66e38146105635780630c56175f1461058357600080fd5b8062fdd58e1461043557806301ffc9a714610468578063054a25851461049857806306fdde03146104ba575b600080fd5b34801561044157600080fd5b50610455610450366004614640565b610e0f565b6040519081526020015b60405180910390f35b34801561047457600080fd5b50610488610483366004614682565b610ea6565b604051901515815260200161045f565b3480156104a457600080fd5b506104b86104b33660046146a6565b610ed1565b005b3480156104c657600080fd5b506104cf610fe0565b60405161045f919061471b565b3480156104e857600080fd5b506105156104f736600461472e565b6000908152600460205260409020600101546001600160a01b031690565b6040516001600160a01b03909116815260200161045f565b34801561053957600080fd5b506104b8610548366004614640565b611072565b34801561055957600080fd5b50610455601c5481565b34801561056f57600080fd5b5061048861057e3660046146a6565b6111a6565b34801561058f57600080fd5b506018546105a3906001600160501b031681565b6040516001600160501b03909116815260200161045f565b3480156105c757600080fd5b506104cf6105d636600461472e565b6111bc565b3480156105e757600080fd5b506104556105f636600461472e565b6111c7565b34801561060757600080fd5b506010546104889060ff1681565b34801561062157600080fd5b506104b8610630366004614747565b6111e8565b34801561064157600080fd5b506104b861065036600461472e565b611260565b34801561066157600080fd5b506104b861067036600461472e565b6112c6565b34801561068157600080fd5b506104b8610690366004614788565b611325565b3480156106a157600080fd5b506104b86106b03660046148f3565b6113a4565b3480156106c157600080fd5b506104b86106d03660046149a0565b61143b565b3480156106e157600080fd5b506104b86106f0366004614a5c565b6114a3565b34801561070157600080fd5b506104b861071036600461472e565b61150d565b34801561072157600080fd5b506104b8610730366004614747565b61156c565b34801561074157600080fd5b506104b86107503660046149a0565b611587565b34801561076157600080fd5b5061078f61077036600461472e565b6008602052600090815260409020805460019091015460ff9091169082565b60408051921515835260208301919091520161045f565b3480156107b257600080fd5b506107ff6107c136600461472e565b600d60205260009081526040902080546001820154600283015460039093015460ff8084169461010085048216946201000090048216939291169086565b6040805196151587529415156020870152921515938501939093526060840152901515608083015260a082015260c00161045f565b34801561084057600080fd5b506104cf6115ef565b34801561085557600080fd5b50610869610864366004614a9d565b61167d565b60405161045f9190614ba4565b34801561088257600080fd5b506104b86108913660046149a0565b6117a6565b3480156108a257600080fd5b506104b86108b136600461472e565b61180e565b3480156108c257600080fd5b506104b86108d136600461472e565b6118b1565b3480156108e257600080fd5b506104b86108f136600461472e565b611952565b34801561090257600080fd5b5061045560075481565b34801561091857600080fd5b5061051561092736600461472e565b6119f2565b34801561093857600080fd5b50610455600f5481565b34801561094e57600080fd5b506104cf611a30565b34801561096357600080fd5b506104cf611a3d565b34801561097857600080fd5b506104b861098736600461472e565b611a4a565b34801561099857600080fd5b506104b86109a7366004614bb7565b611aa9565b3480156109b857600080fd5b506104886109c7366004614c5a565b611aef565b3480156109d857600080fd5b506104556109e73660046146a6565b6001600160a01b031660009081526003602052604090205490565b348015610a0e57600080fd5b506104b8611b4d565b348015610a2357600080fd5b506104b8610a323660046146a6565b611b83565b348015610a4357600080fd5b50601b54610515906001600160a01b031681565b348015610a6357600080fd5b506104b8610a72366004614788565b611bfb565b348015610a8357600080fd5b50600c546104889060ff1681565b348015610a9d57600080fd5b506104cf611caf565b6104b8610ab436600461472e565b611cbc565b348015610ac557600080fd5b506104b8610ad4366004614c8a565b611dac565b348015610ae557600080fd5b506005546001600160a01b0316610515565b348015610b0357600080fd5b506104cf611ef7565b348015610b1857600080fd5b506104b8610b2736600461472e565b611f06565b348015610b3857600080fd5b506104cf611f3c565b348015610b4d57600080fd5b506104b8611f49565b348015610b6257600080fd5b506104b8610b71366004614cbf565b611fc0565b348015610b8257600080fd5b506104b8610b913660046149a0565b611fcb565b348015610ba257600080fd5b506104b8610bb1366004614cf2565b612033565b348015610bc257600080fd5b506104b8610bd13660046149a0565b6120d9565b348015610be257600080fd5b506104cf612141565b348015610bf757600080fd5b506104b8610c06366004614640565b61214e565b348015610c1757600080fd5b506104b8610c26366004614788565b612265565b348015610c3757600080fd5b506104cf610c4636600461472e565b61231b565b348015610c5757600080fd5b506104b8610c6636600461472e565b61239a565b348015610c7757600080fd5b5061045560115481565b348015610c8d57600080fd5b5061045560195481565b348015610ca357600080fd5b50610455610cb2366004614d5d565b6123f9565b6104b8610cc5366004614dd6565b612765565b348015610cd657600080fd5b50610455600a5481565b348015610cec57600080fd5b50610455600e5481565b348015610d0257600080fd5b50610455601a5481565b348015610d1857600080fd5b50610488610d27366004614e80565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610d6157600080fd5b5061078f610d7036600461472e565b600b602052600090815260409020805460019091015460ff9091169082565b348015610d9b57600080fd5b506104b8610daa366004614eae565b61286c565b348015610dbb57600080fd5b506104b8610dca3660046146a6565b6128f3565b348015610ddb57600080fd5b506104b8610dea3660046149a0565b61298b565b348015610dfb57600080fd5b506104b8610e0a366004614f2b565b6129f3565b60006001600160a01b038316610e805760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b0319821663017ecdc760e31b1480610ecb5750610ecb82612a7b565b92915050565b6005546001600160a01b03163314610efb5760405162461bcd60e51b8152600401610e7790614f48565b60026006541415610f1e5760405162461bcd60e51b8152600401610e7790614f7d565b600260065560105460ff1615610f765760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768206879647261732072656d61696e696e6700000000006044820152606401610e77565b6007546011819055610f8790612a6e565b600755601154610fac906000908152600460205260409020805460ff19166001179055565b610fca81601154600160405180602001604052806000815250612abb565b506010805460ff19166001908117909155600655565b606060138054610fef90614fb4565b80601f016020809104026020016040519081016040528092919081815260200182805461101b90614fb4565b80156110685780601f1061103d57610100808354040283529160200191611068565b820191906000526020600020905b81548152906001019060200180831161104b57829003601f168201915b5050505050905090565b600061107d826119f2565b9050806001600160a01b0316836001600160a01b031614156110eb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610e77565b336001600160a01b038216148061112557506001600160a01b038116600090815260016020908152604080832033845290915290205460ff165b6111975760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610e77565b6111a18383612bb9565b505050565b6000601c546111b483612c2a565b101592915050565b6060610ecb8261231b565b600981815481106111d757600080fd5b600091825260209091200154905081565b60008181526004602052604090205460ff16801561123957503361120b826119f2565b6001600160a01b0316148061123957506000818152600460205260409020600101546001600160a01b031633145b6112555760405162461bcd60e51b8152600401610e7790614fef565b6111a1838383612c85565b6005546001600160a01b0316331461128a5760405162461bcd60e51b8152600401610e7790614f48565b600f8190556040518181527fce05855d721d34fbc1d75cf594b1da6281aec39b19baedecb11b26ac52400644906020015b60405180910390a150565b6005546001600160a01b031633146112f05760405162461bcd60e51b8152600401610e7790614f48565b601c8190556040518181527f1b99ce7981720e08940e8370ac7ea5c54d410a332d93bfa1a7558dbb5b09e5f5906020016112bb565b60008281526008602052604090205460ff166113535760405162461bcd60e51b8152600401610e7790615040565b61135e338383612dca565b60408051338152602081018490529081018290527fcce11b536b4501edbbba185d706a9c8cea0017e41774087252bf7d3e17f2398a906060015b60405180910390a15050565b6001600160a01b0385163314806113c057506113c08533610d27565b6114275760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610e77565b6114348585858585612f1c565b5050505050565b6005546001600160a01b031633146114655760405162461bcd60e51b8152600401610e7790614f48565b6114716015838361459b565b507fe43d2cfc5354d1876e0e2b7db2fe84a72c8d0a61fae92be75a9387c2d45f16b78282604051611398929190615077565b6005546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610e7790614f48565b61150982828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061310792505050565b5050565b6005546001600160a01b031633146115375760405162461bcd60e51b8152600401610e7790614f48565b60198190556040518181527f80ebf2a570aa6c698d8116be366bcb2ebbdb3540bac473ccff3d3923f250962a906020016112bb565b6111a183838360405180602001604052806000815250612033565b6005546001600160a01b031633146115b15760405162461bcd60e51b8152600401610e7790614f48565b6115bd6017838361459b565b507fb356f7bafd7e8477fd75c9fc6bd20f20ac0f5fe1e656d25c5c2d27cb5d51bb788282604051611398929190615077565b601680546115fc90614fb4565b80601f016020809104026020016040519081016040528092919081815260200182805461162890614fb4565b80156116755780601f1061164a57610100808354040283529160200191611675565b820191906000526020600020905b81548152906001019060200180831161165857829003601f168201915b505050505081565b606081518351146116e25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610e77565b600083516001600160401b038111156116fd576116fd6147aa565b604051908082528060200260200182016040528015611726578160200160208202803683370190505b50905060005b845181101561179e5761177185828151811061174a5761174a6150a6565b6020026020010151858381518110611764576117646150a6565b6020026020010151610e0f565b828281518110611783576117836150a6565b6020908102919091010152611797816150d2565b905061172c565b509392505050565b6005546001600160a01b031633146117d05760405162461bcd60e51b8152600401610e7790614f48565b6117dc6012838361459b565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051611398929190615077565b6005546001600160a01b031633146118385760405162461bcd60e51b8152600401610e7790614f48565b6000818152600d602052604090205460ff166118665760405162461bcd60e51b8152600401610e77906150ed565b6000818152600d602052604090819020600201805460ff19169055517f80ac96271f40fc07290e59c97a078503fa6267ec7d0a3f7e4134709979da69ec906112bb9083815260200190565b6005546001600160a01b031633146118db5760405162461bcd60e51b8152600401610e7790614f48565b6000818152600d602052604090205460ff166119095760405162461bcd60e51b8152600401610e77906150ed565b6000818152600d602052604090819020805461ff0019169055517f733e6f3e872a3652b6014dfdd22bd41f65167c3a99fc197be6249e5ea45bb99f906112bb9083815260200190565b6005546001600160a01b0316331461197c5760405162461bcd60e51b8152600401610e7790614f48565b6000818152600b602052604090205460ff166119aa5760405162461bcd60e51b8152600401610e779061511c565b6000818152600b602052604090819020805460ff19169055517f7de64b85af3f19efac76278bd3bc19658d500246baf18b928548b5d8d3d68c39906112bb9083815260200190565b60008181526004602052604081205460ff16611a0f576000610ecb565b5060009081526004602052604090205461010090046001600160a01b031690565b601380546115fc90614fb4565b601280546115fc90614fb4565b6005546001600160a01b03163314611a745760405162461bcd60e51b8152600401610e7790614f48565b600e8190556040518181527fa1b7fe14aabd5aa4c4fe325670188552c5684c9d5d72a0f50dd696332da525ab906020016112bb565b60026006541415611acc5760405162461bcd60e51b8152600401610e7790614f7d565b6002600655611ae187878787878787336131ff565b505060016006555050505050565b6000828152600b602052604081205460ff16611b1d5760405162461bcd60e51b8152600401610e779061511c565b506000828152600b602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b6005546001600160a01b03163314611b775760405162461bcd60e51b8152600401610e7790614f48565b611b816000613681565b565b6005546001600160a01b03163314611bad5760405162461bcd60e51b8152600401610e7790614f48565b601b80546001600160a01b0319166001600160a01b0383169081179091556040519081527fe5b20b8497e4f3e2435ef9c20e2e26b47497ee13745ce1c681ad6640653119e6906020016112bb565b6005546001600160a01b03163314611c255760405162461bcd60e51b8152600401610e7790614f48565b6000828152600d602052604090205460ff16611c535760405162461bcd60e51b8152600401610e77906150ed565b6000828152600d602052604090819020805461ff001916610100178155600101829055517f8bfe5ccc6c11bcab178616cd3c776298c9cfba223909a6366103d26c3654453f906113989084908490918252602082015260400190565b601480546115fc90614fb4565b60026006541415611cdf5760405162461bcd60e51b8152600401610e7790614f7d565b6002600655600c5460ff16611d065760405162461bcd60e51b8152600401610e7790615149565b6000818152600d602052604090205460ff16611d345760405162461bcd60e51b8152600401610e77906150ed565b6000818152600d602052604090205462010000900460ff1615611d995760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820756e69717565732072656d61696e696e67000000006044820152606401610e77565b611da48133346136d3565b506001600655565b6005546001600160a01b03163314611dd65760405162461bcd60e51b8152600401610e7790614f48565b60008281526008602052604090205460ff16611e045760405162461bcd60e51b8152600401610e7790615040565b600082815260086020526040902060010154811115611e655760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f7567682064726f7020746f6b656e732072656d61696e696e676044820152606401610e77565b60008281526008602052604081206001018054839290611e8690849061518a565b92505081905550611ea883838360405180602001604052806000815250612abb565b604080516001600160a01b0385168152602081018490529081018290527fc1974b7c1dd593742d11e6c493b141fc51d844f65543eba7dc7df849b29f75a29060600160405180910390a1505050565b606060148054610fef90614fb4565b6005546001600160a01b03163314611f305760405162461bcd60e51b8152600401610e7790614f48565b611f3981613877565b50565b601580546115fc90614fb4565b6005546001600160a01b03163314611f735760405162461bcd60e51b8152600401610e7790614f48565b600c805460ff8082161560ff1990921682179092556040519116151581527f669025bb44b8906e7c34f9b3b4cafafff2890a3420b757c4f1a79b9821d6c98d9060200160405180910390a1565b61150933838361391b565b6005546001600160a01b03163314611ff55760405162461bcd60e51b8152600401610e7790614f48565b6120016013838361459b565b507f69aeecc8fc25d355e362852ad7b53f01e8b8da03290a1f7241151a02d84f41988282604051611398929190615077565b60008281526004602052604090205460ff168015612084575033612056836119f2565b6001600160a01b0316148061208457506000828152600460205260409020600101546001600160a01b031633145b6120a05760405162461bcd60e51b8152600401610e7790614fef565b6120ab848484612c85565b6120b7848484846139fc565b6120d35760405162461bcd60e51b8152600401610e77906151a1565b50505050565b6005546001600160a01b031633146121035760405162461bcd60e51b8152600401610e7790614f48565b61210f6014838361459b565b507fd3019ff78698f6f81b4084fc56c4b111b7c198f93bce60fe82abb6c7c8c19cb68282604051611398929190615077565b601780546115fc90614fb4565b6005546001600160a01b031633146121785760405162461bcd60e51b8152600401610e7790614f48565b6002600654141561219b5760405162461bcd60e51b8152600401610e7790614f7d565b6002600655478111156121e35760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610e77565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612219573d6000803e3d6000fd5b50604080516001600160a01b0384168152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910160405180910390a150506001600655565b6005546001600160a01b0316331461228f5760405162461bcd60e51b8152600401610e7790614f48565b6000828152600d602052604090205460ff166122bd5760405162461bcd60e51b8152600401610e77906150ed565b6000828152600d60205260409081902060028101805460ff19166001179055600301829055517f141160f8fa8a19d54ee79ff26fc11269cebc4e1b20a73ec09399986c43942022906113989084908490918252602082015260400190565b60105460609060ff168015612331575060115482145b1561233e57610ecb613afb565b6000612348613bec565b51116123635760405180602001604052806000815250610ecb565b61236b613bec565b61237483613bfb565b6040516020016123859291906151f3565b60405160208183030381529060405292915050565b6005546001600160a01b031633146123c45760405162461bcd60e51b8152600401610e7790614f48565b601a8190556040518181527f4ee453ab201a2fcc04f75f6fd050e58a65c6f9814abff87bd557513df84333fa906020016112bb565b6005546000906001600160a01b031633146124265760405162461bcd60e51b8152600401610e7790614f48565b8184146124755760405162461bcd60e51b815260206004820181905260248201527f4d69736d61746368206265747765656e2049447320616e6420616d6f756e74736044820152606401610e77565b6000805b858110156125fc578015806124aa57506124aa87878381811061249e5761249e6150a6565b90506020020135831090565b6124ea5760405162461bcd60e51b81526020600482015260116024820152704e6f6e2d617363656e64696e672049447360781b6044820152606401610e77565b8686828181106124fc576124fc6150a6565b9050602002013591506008600088888481811061251b5761251b6150a6565b602090810292909201358352508101919091526040016000205460ff166125545760405162461bcd60e51b8152600401610e7790615040565b6008600088888481811061256a5761256a6150a6565b90506020020135815260200190815260200160002060010154858583818110612595576125956150a6565b9050602002013511156125ea5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f7567682064726f7020746f6b656e20737570706c79000000006044820152606401610e77565b806125f4816150d2565b915050612479565b5060005b858110156126d55784848281811061261a5761261a6150a6565b9050602002013560086000898985818110612637576126376150a6565b905060200201358152602001908152602001600020600101600082825461265e919061518a565b909155508590508482818110612676576126766150a6565b90506020020135600b6000600a54815260200190815260200160002060020160008989858181106126a9576126a96150a6565b9050602002013581526020019081526020016000208190555080806126cd906150d2565b915050612600565b50600a80546000908152600b602052604080822060019081018b90558354835291819020805460ff1916909217909155905490517f49db68d3ad63ff144d9ae3e18774591c398e2081a09a9ab2be6db5c4963a90509161273e918a908a908a908a908a90615284565b60405180910390a1600a8054906000612756836150d2565b90915550979650505050505050565b600260065414156127885760405162461bcd60e51b8152600401610e7790614f7d565b6002600655600c5460ff166127af5760405162461bcd60e51b8152600401610e7790615149565b6000818152600d602052604090205460ff166127dd5760405162461bcd60e51b8152600401610e77906150ed565b6000818152600d602052604090205462010000900460ff16156128425760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820756e69717565732072656d61696e696e67000000006044820152606401610e77565b61285288888888888888336131ff565b61285d8133346136d3565b50506001600655505050505050565b6001600160a01b03851633148061288857506128888533610d27565b6128e65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610e77565b6114348585858585613cf8565b6005546001600160a01b0316331461291d5760405162461bcd60e51b8152600401610e7790614f48565b6001600160a01b0381166129825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e77565b611f3981613681565b6005546001600160a01b031633146129b55760405162461bcd60e51b8152600401610e7790614f48565b6129c16016838361459b565b507f01686b5ff25520eb5f802a82cdf857d98179a60b382a9c7c24818d158e2b6be38282604051611398929190615077565b6005546001600160a01b03163314612a1d5760405162461bcd60e51b8152600401610e7790614f48565b6018805469ffffffffffffffffffff19166001600160501b0383169081179091556040519081527fdd06884a6f4be3e83c4de9824d65fe4cae453bdfb60ceb72fe67c0ed83ee4165906020016112bb565b6000610ecb8260016152c4565b60006001600160e01b031982166380ac58cd60e01b1480612aac57506001600160e01b03198216635b5e139f60e01b145b80610ecb5750610ecb82613e03565b6001600160a01b038416612b1b5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610e77565b33612b3b81600087612b2c88613e53565b612b3588613e53565b87613e9e565b6000848152602081815260408083206001600160a01b038916845290915281208054859290612b6b9084906152c4565b909155505060408051858152602081018590526001600160a01b038088169260009291851691600080516020615818833981519152910160405180910390a461143481600087878787614142565b600081815260046020526040902060010180546001600160a01b0319166001600160a01b0384169081179091558190612bf1826119f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080805b600954811015612c7e57612c608460098381548110612c5057612c506150a6565b9060005260206000200154610e0f565b612c6a90836152c4565b915080612c76816150d2565b915050612c2f565b5092915050565b6001600160a01b038216612ce75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e77565b612d15338484612cf685613e53565b612d006001613e53565b60405180602001604052806000815250613e9e565b612d20600082612bb9565b6000818152602081815260408083206001600160a01b03871684529091528120805460019290612d5190849061518a565b90915550506000818152602081815260408083206001600160a01b03861684529091528120805460019290612d879084906152c4565b909155505060408051828152600160208201526001600160a01b0384811692908616913391600080516020615818833981519152910160405180910390a4505050565b6001600160a01b038316612e2c5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610e77565b33612e4681856000612e3d87613e53565b612d0087613e53565b6000838152602081815260408083206001600160a01b038816845290915290205482811015612ec35760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610e77565b6000848152602081815260408083206001600160a01b0389811680865291845282852088870390558251898152938401889052909290861691600080516020615818833981519152910160405180910390a45050505050565b8151835114612f7e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610e77565b6001600160a01b038416612fa45760405162461bcd60e51b8152600401610e77906152dc565b33612fb3818787878787613e9e565b60005b8451811015613099576000858281518110612fd357612fd36150a6565b602002602001015190506000858381518110612ff157612ff16150a6565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156130415760405162461bcd60e51b8152600401610e7790615321565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061307e9084906152c4565b9250508190555050505080613092906150d2565b9050612fb6565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516130e992919061536b565b60405180910390a46130ff81878787878761429e565b505050505050565b7f3731a338f8f64b03c8926594af5b3e21a65d514032548693122b4ebca95e0deb6007548260405161313a929190615399565b60405180910390a160005b8151811015611509576040518060400160405280600115158152602001838381518110613174576131746150a6565b60209081029190910181015190915260078054600090815260088352604081208451815460ff19169015151781559390920151600193840155546009805493840181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af9091018190556131ea90612a6e565b600755806131f7816150d2565b915050613145565b6000888152600b602052604090205460ff1661322d5760405162461bcd60e51b8152600401610e779061511c565b81841461327c5760405162461bcd60e51b815260206004820181905260248201527f4d69736d61746368206265747765656e2049447320616e6420616d6f756e74736044820152606401610e77565b6000888152600b602090815260408083206001600160a01b038516845260030190915290205460ff16156132e95760405162461bcd60e51b8152602060048201526014602482015273111c9bdc08185b1c9958591e4818db185a5b595960621b6044820152606401610e77565b6000805b8581101561346f57801580613312575061331287878381811061249e5761249e6150a6565b6133525760405162461bcd60e51b81526020600482015260116024820152704e6f6e2d617363656e64696e672049447360781b6044820152606401610e77565b868682818110613364576133646150a6565b90506020020135915060086000888884818110613383576133836150a6565b602090810292909201358352508101919091526040016000205460ff166133bc5760405162461bcd60e51b8152600401610e7790615040565b60008a8152600b60205260408120600201908888848181106133e0576133e06150a6565b90506020020135815260200190815260200160002054858583818110613408576134086150a6565b90506020020135111561345d5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f7567682064726f7020746f6b656e7320696e2064726f7000006044820152606401610e77565b80613467816150d2565b9150506132ed565b506000828787878760405160200161348b9594939291906153b2565b6040516020818303038152906040528051906020012090506134f189898080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508f8152600b602052604090206001015492508591506143599050565b61352d5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610e77565b60005b868110156136025785858281811061354a5761354a6150a6565b90506020020135600b60008d815260200190815260200160002060020160008a8a8581811061357b5761357b6150a6565b905060200201358152602001908152602001600020600082825461359f919061518a565b909155506135f09050848989848181106135bb576135bb6150a6565b905060200201358888858181106135d4576135d46150a6565b9050602002013560405180602001604052806000815250612abb565b806135fa816150d2565b915050613530565b5060008a8152600b602090815260408083206001600160a01b038716845260030190915290819020805460ff19166001179055517fe46324e2978564401e781b828a88893d1890db3d2ca87a31f9e434700ccc59ca9061366d908c9086908b908b908b908b9061541f565b60405180910390a150505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000838152600d602052604090206002015460ff166136ff57600f546136f883612c2a565b101561371d565b6000838152600d602052604090206003015461371a83612c2a565b10155b6137735760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682064726f7020746f6b656e7320746f207175616c69666044820152607960f81b6064820152608401610e77565b6000838152600d6020526040812054610100900460ff1661379657600e546137a9565b6000848152600d60205260409020600101545b90508082146137ee5760405162461bcd60e51b8152602060048201526011602482015270125b98dbdc9c9958dd081c185e5b595b9d607a1b6044820152606401610e77565b61380a8385600160405180602001604052806000815250612abb565b6000848152600d6020908152604091829020805462ff000019166201000017905581516001600160a01b03861681529081018690529081018290527effa6dafca6841a6c6ef4b27b00551a4beefdf0c452ef893fd4e8c5ff89c2889060600160405180910390a150505050565b60075460408051918252602082018390527fbd91b8312c17ea3448e7539d4df4c6787bf8909232324245dd89b1c26c209f94910160405180910390a160005b8181101561150957600780546000908152600d60205260409020805460ff19166001179055546138fb906000908152600460205260409020805460ff19166001179055565b613906600754612a6e565b60075580613913816150d2565b9150506138b6565b816001600160a01b0316836001600160a01b0316141561398f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610e77565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b15613aef57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613a4090339089908890889060040161544a565b6020604051808303816000875af1925050508015613a7b575060408051601f3d908101601f19168201909252613a7891810190615487565b60015b613ad5573d808015613aa9576040519150601f19603f3d011682016040523d82523d6000602084013e613aae565b606091505b508051613acd5760405162461bcd60e51b8152600401610e77906151a1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613af3565b5060015b949350505050565b60606000613b07614408565b90506000816002811115613b1d57613b1d6154a4565b1415613bb45760158054613b3090614fb4565b80601f0160208091040260200160405190810160405280929190818152602001828054613b5c90614fb4565b8015613ba95780601f10613b7e57610100808354040283529160200191613ba9565b820191906000526020600020905b815481529060010190602001808311613b8c57829003601f168201915b505050505091505090565b6001816002811115613bc857613bc86154a4565b1415613bdb5760168054613b3090614fb4565b60178054613b3090614fb4565b5090565b606060128054610fef90614fb4565b606081613c1f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613c495780613c33816150d2565b9150613c429050600a836154d0565b9150613c23565b6000816001600160401b03811115613c6357613c636147aa565b6040519080825280601f01601f191660200182016040528015613c8d576020820181803683370190505b5090505b8415613af357613ca260018361518a565b9150613caf600a866154e4565b613cba9060306152c4565b60f81b818381518110613ccf57613ccf6150a6565b60200101906001600160f81b031916908160001a905350613cf1600a866154d0565b9450613c91565b6001600160a01b038416613d1e5760405162461bcd60e51b8152600401610e77906152dc565b33613d2e818787612b2c88613e53565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015613d6f5760405162461bcd60e51b8152600401610e7790615321565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290613dac9084906152c4565b909155505060408051868152602081018690526001600160a01b03808916928a82169291861691600080516020615818833981519152910160405180910390a4613dfa828888888888614142565b50505050505050565b60006001600160e01b03198216636cdb3d1360e11b1480613e3457506001600160e01b031982166303a24d0760e21b145b80610ecb57506301ffc9a760e01b6001600160e01b0319831614610ecb565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613e8d57613e8d6150a6565b602090810291909101015292915050565b60005b8351811015613dfa5760046000858381518110613ec057613ec06150a6565b60209081029190910181015182528101919091526040016000205460ff161561413057856001600160a01b0316613f0f858381518110613f0257613f026150a6565b60200260200101516119f2565b6001600160a01b031614613f775760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610e77565b828181518110613f8957613f896150a6565b60200260200101516001146140065760405162461bcd60e51b815260206004820152603760248201527f4552433732313a206d756c74692d7472616e73666572206f6620746f6b656e2060448201527f74686174206973206e6f74206d756c74692d746f6b656e0000000000000000006064820152608401610e77565b846004600086848151811061401d5761401d6150a6565b6020026020010151815260200190815260200160002060000160016101000a8154816001600160a01b0302191690836001600160a01b0316021790555083818151811061406c5761406c6150a6565b6020026020010151856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001600160a01b038616156140f2576001600160a01b03861660009081526003602052604081208054600192906140ec90849061518a565b90915550505b6001600160a01b03851615614130576001600160a01b038516600090815260036020526040812080546001929061412a9084906152c4565b90915550505b8061413a816150d2565b915050613ea1565b6001600160a01b0384163b156130ff5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061418690899089908890889088906004016154f8565b6020604051808303816000875af19250505080156141c1575060408051601f3d908101601f191682019092526141be91810190615487565b60015b61426e576141cd61553d565b806308c379a0141561420757506141e2615559565b806141ed5750614209565b8060405162461bcd60e51b8152600401610e77919061471b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610e77565b6001600160e01b0319811663f23a6e6160e01b14613dfa5760405162461bcd60e51b8152600401610e77906155e2565b6001600160a01b0384163b156130ff5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906142e2908990899088908890889060040161562a565b6020604051808303816000875af192505050801561431d575060408051601f3d908101601f1916820190925261431a91810190615487565b60015b614329576141cd61553d565b6001600160e01b0319811663bc197c8160e01b14613dfa5760405162461bcd60e51b8152600401610e77906155e2565b600081815b85518110156143fd57600086828151811061437b5761437b6150a6565b602002602001015190508083116143bd5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506143ea565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806143f5816150d2565b91505061435e565b509092149392505050565b6000806000601b60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015614460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144849190615688565b5050601b546018549395509193506000926001600160a01b0390921691639a6fc8f591506144bb906001600160501b0316866156e0565b6040516001600160e01b031960e084901b1681526001600160501b03909116600482015260240160a060405180830381865afa1580156144ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145239190615688565b505050915050600080821461455a5760195482906145418286615708565b61454b9190615747565b61455591906157cc565b61455d565b60005b9050601a54811261457357600094505050505090565b601a5461457f906157fa565b811361459057600294505050505090565b600194505050505090565b8280546145a790614fb4565b90600052602060002090601f0160209004810192826145c9576000855561460f565b82601f106145e25782800160ff1982351617855561460f565b8280016001018555821561460f579182015b8281111561460f5782358255916020019190600101906145f4565b50613be89291505b80821115613be85760008155600101614617565b6001600160a01b0381168114611f3957600080fd5b6000806040838503121561465357600080fd5b823561465e8161462b565b946020939093013593505050565b6001600160e01b031981168114611f3957600080fd5b60006020828403121561469457600080fd5b813561469f8161466c565b9392505050565b6000602082840312156146b857600080fd5b813561469f8161462b565b60005b838110156146de5781810151838201526020016146c6565b838111156120d35750506000910152565b600081518084526147078160208601602086016146c3565b601f01601f19169290920160200192915050565b60208152600061469f60208301846146ef565b60006020828403121561474057600080fd5b5035919050565b60008060006060848603121561475c57600080fd5b83356147678161462b565b925060208401356147778161462b565b929592945050506040919091013590565b6000806040838503121561479b57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156147e5576147e56147aa565b6040525050565b60006001600160401b03821115614805576148056147aa565b5060051b60200190565b600082601f83011261482057600080fd5b8135602061482d826147ec565b60405161483a82826147c0565b83815260059390931b850182019282810191508684111561485a57600080fd5b8286015b84811015614875578035835291830191830161485e565b509695505050505050565b600082601f83011261489157600080fd5b81356001600160401b038111156148aa576148aa6147aa565b6040516148c1601f8301601f1916602001826147c0565b8181528460208386010111156148d657600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561490b57600080fd5b85356149168161462b565b945060208601356149268161462b565b935060408601356001600160401b038082111561494257600080fd5b61494e89838a0161480f565b9450606088013591508082111561496457600080fd5b61497089838a0161480f565b9350608088013591508082111561498657600080fd5b5061499388828901614880565b9150509295509295909350565b600080602083850312156149b357600080fd5b82356001600160401b03808211156149ca57600080fd5b818501915085601f8301126149de57600080fd5b8135818111156149ed57600080fd5b8660208285010111156149ff57600080fd5b60209290920196919550909350505050565b60008083601f840112614a2357600080fd5b5081356001600160401b03811115614a3a57600080fd5b6020830191508360208260051b8501011115614a5557600080fd5b9250929050565b60008060208385031215614a6f57600080fd5b82356001600160401b03811115614a8557600080fd5b614a9185828601614a11565b90969095509350505050565b60008060408385031215614ab057600080fd5b82356001600160401b0380821115614ac757600080fd5b818501915085601f830112614adb57600080fd5b81356020614ae8826147ec565b604051614af582826147c0565b83815260059390931b8501820192828101915089841115614b1557600080fd5b948201945b83861015614b3c578535614b2d8161462b565b82529482019490820190614b1a565b96505086013592505080821115614b5257600080fd5b50614b5f8582860161480f565b9150509250929050565b600081518084526020808501945080840160005b83811015614b9957815187529582019590820190600101614b7d565b509495945050505050565b60208152600061469f6020830184614b69565b60008060008060008060006080888a031215614bd257600080fd5b8735965060208801356001600160401b0380821115614bf057600080fd5b614bfc8b838c01614a11565b909850965060408a0135915080821115614c1557600080fd5b614c218b838c01614a11565b909650945060608a0135915080821115614c3a57600080fd5b50614c478a828b01614a11565b989b979a50959850939692959293505050565b60008060408385031215614c6d57600080fd5b823591506020830135614c7f8161462b565b809150509250929050565b600080600060608486031215614c9f57600080fd5b8335614caa8161462b565b95602085013595506040909401359392505050565b60008060408385031215614cd257600080fd5b8235614cdd8161462b565b915060208301358015158114614c7f57600080fd5b60008060008060808587031215614d0857600080fd5b8435614d138161462b565b93506020850135614d238161462b565b92506040850135915060608501356001600160401b03811115614d4557600080fd5b614d5187828801614880565b91505092959194509250565b600080600080600060608688031215614d7557600080fd5b8535945060208601356001600160401b0380821115614d9357600080fd5b614d9f89838a01614a11565b90965094506040880135915080821115614db857600080fd5b50614dc588828901614a11565b969995985093965092949392505050565b60008060008060008060008060a0898b031215614df257600080fd5b8835975060208901356001600160401b0380821115614e1057600080fd5b614e1c8c838d01614a11565b909950975060408b0135915080821115614e3557600080fd5b614e418c838d01614a11565b909750955060608b0135915080821115614e5a57600080fd5b50614e678b828c01614a11565b999c989b50969995989497949560800135949350505050565b60008060408385031215614e9357600080fd5b8235614e9e8161462b565b91506020830135614c7f8161462b565b600080600080600060a08688031215614ec657600080fd5b8535614ed18161462b565b94506020860135614ee18161462b565b9350604086013592506060860135915060808601356001600160401b03811115614f0a57600080fd5b61499388828901614880565b6001600160501b0381168114611f3957600080fd5b600060208284031215614f3d57600080fd5b813561469f81614f16565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600181811c90821680614fc857607f821691505b60208210811415614fe957634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526019908201527f44726f7020746f6b656e20646f6573206e6f7420657869737400000000000000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156150e6576150e66150bc565b5060010190565b602080825260159082015274139bdd0818481d985b1a59081d5b9a5c5d59481a59605a1b604082015260600190565b602080825260139082015272111c9bdc08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b60208082526021908201527f556e6971756573206e6f742063757272656e746c79207075726368617361626c6040820152606560f81b606082015260800190565b60008282101561519c5761519c6150bc565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516152058184602088016146c3565b8351908301906152198183602088016146c3565b01949350505050565b8183526000602080850194508260005b85811015614b9957813587529582019590820190600101615232565b81835260006001600160fb1b0383111561526757600080fd5b8260051b8083602087013760009401602001938452509192915050565b8681528560208201526080604082015260006152a4608083018688615222565b82810360608401526152b781858761524e565b9998505050505050505050565b600082198211156152d7576152d76150bc565b500190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061537e6040830185614b69565b82810360208401526153908185614b69565b95945050505050565b828152604060208201526000613af36040830184614b69565b6bffffffffffffffffffffffff198660601b1681526000601482018660005b878110156153ef5781358352602092830192909101906001016153d1565b50506001600160fb1b0384111561540557600080fd5b8360051b8086833760009101908152979650505050505050565b8681526001600160a01b03861660208201526080604082018190526000906152a49083018688615222565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061547d908301846146ef565b9695505050505050565b60006020828403121561549957600080fd5b815161469f8161466c565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826154df576154df6154ba565b500490565b6000826154f3576154f36154ba565b500690565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090615532908301846146ef565b979650505050505050565b600060033d11156155565760046000803e5060005160e01c5b90565b600060443d10156155675790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561559657505050505090565b82850191508151818111156155ae5750505050505090565b843d87010160208285010111156155c85750505050505090565b6155d7602082860101876147c0565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061565690830186614b69565b82810360608401526156688186614b69565b9050828103608084015261567c81856146ef565b98975050505050505050565b600080600080600060a086880312156156a057600080fd5b85516156ab81614f16565b8095505060208601519350604086015192506060860151915060808601516156d281614f16565b809150509295509295909350565b60006001600160501b0383811690831681811015615700576157006150bc565b039392505050565b60008083128015600160ff1b850184121615615726576157266150bc565b6001600160ff1b0384018313811615615741576157416150bc565b50500390565b60006001600160ff1b038184138284138082168684048611161561576d5761576d6150bc565b600160ff1b600087128281168783058912161561578c5761578c6150bc565b600087129250878205871284841616156157a8576157a86150bc565b878505871281841616156157be576157be6150bc565b505050929093029392505050565b6000826157db576157db6154ba565b600160ff1b8214600019841416156157f5576157f56150bc565b500590565b6000600160ff1b821415615810576158106150bc565b506000039056fec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a2646970667358221220e1225b47975ea9abaf0d75054e8631e5ec97e6a64b9c00d341a0feb872f7312b64736f6c634300080a0033

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

0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841900000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d596a4b7353426545536f693557367132386b3874747a6776473357326a61654231453745693944653174343700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d596a4b7353426545536f693557367132386b3874747a6776473357326a61654231453745693944653174343700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d596a4b7353426545536f693557367132386b3874747a6776473357326a61654231453745693944653174343700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d52515a526b686752446e43755369425067735469676747635154316f4e787a547679313576536d65547861672f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f54414b414849524f204b4f4d55524f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004546b6f4d00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _priceFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [1] : _positiveHydraUri (string): https://gateway.pinata.cloud/ipfs/QmYjKsSBeESoi5W6q28k8ttzgvG3W2jaeB1E7Ei9De1t47
Arg [2] : _neutralHydraUri (string): https://gateway.pinata.cloud/ipfs/QmYjKsSBeESoi5W6q28k8ttzgvG3W2jaeB1E7Ei9De1t47
Arg [3] : _negativeHydraUri (string): https://gateway.pinata.cloud/ipfs/QmYjKsSBeESoi5W6q28k8ttzgvG3W2jaeB1E7Ei9De1t47
Arg [4] : _tokenBaseURI (string): https://gateway.pinata.cloud/ipfs/QmRQZRkhgRDnCuSiBPgsTiggGcQT1oNxzTvy15vSmeTxag/
Arg [5] : _name (string): TAKAHIRO KOMURO
Arg [6] : _symbol (string): TkoM

-----Encoded View---------------
27 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [5] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [8] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [9] : 732f516d596a4b7353426545536f693557367132386b3874747a677647335732
Arg [10] : 6a61654231453745693944653174343700000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [12] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [13] : 732f516d596a4b7353426545536f693557367132386b3874747a677647335732
Arg [14] : 6a61654231453745693944653174343700000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [16] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [17] : 732f516d596a4b7353426545536f693557367132386b3874747a677647335732
Arg [18] : 6a61654231453745693944653174343700000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [20] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [21] : 732f516d52515a526b686752446e43755369425067735469676747635154316f
Arg [22] : 4e787a547679313576536d65547861672f000000000000000000000000000000
Arg [23] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [24] : 54414b414849524f204b4f4d55524f0000000000000000000000000000000000
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [26] : 546b6f4d00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

86685:11761:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44055:231;;;;;;;;;;-1:-1:-1;44055:231:0;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;44055:231:0;;;;;;;;88545:225;;;;;;;;;;-1:-1:-1;88545:225:0;;;;;:::i;:::-;;:::i;:::-;;;1203:14:1;;1196:22;1178:41;;1166:2;1151:18;88545:225:0;1038:187:1;98104:339:0;;;;;;;;;;-1:-1:-1;98104:339:0;;;;;:::i;:::-;;:::i;:::-;;89900:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61499:156::-;;;;;;;;;;-1:-1:-1;61499:156:0;;;;;:::i;:::-;61582:16;61618:20;;;:11;:20;;;;;:29;;;-1:-1:-1;;;;;61618:29:0;;61499:156;;;;-1:-1:-1;;;;;2582:32:1;;;2564:51;;2552:2;2537:18;61499:156:0;2418:203:1;61039:411:0;;;;;;;;;;-1:-1:-1;61039:411:0;;;;;:::i;:::-;;:::i;95545:44::-;;;;;;;;;;;;;;;;97815:179;;;;;;;;;;-1:-1:-1;97815:179:0;;;;;:::i;:::-;;:::i;93183:29::-;;;;;;;;;;-1:-1:-1;93183:29:0;;;;-1:-1:-1;;;;;93183:29:0;;;;;;-1:-1:-1;;;;;2788:35:1;;;2770:54;;2758:2;2743:18;93183:29:0;2626:204:1;88963:134:0;;;;;;;;;;-1:-1:-1;88963:134:0;;;;;:::i;:::-;;:::i;67409:25::-;;;;;;;;;;-1:-1:-1;67409:25:0;;;;;:::i;:::-;;:::i;88216:33::-;;;;;;;;;;-1:-1:-1;88216:33:0;;;;;;;;60539:455;;;;;;;;;;-1:-1:-1;60539:455:0;;;;;:::i;:::-;;:::i;83230:249::-;;;;;;;;;;-1:-1:-1;83230:249:0;;;;;:::i;:::-;;:::i;95983:243::-;;;;;;;;;;-1:-1:-1;95983:243:0;;;;;:::i;:::-;;:::i;76707:253::-;;;;;;;;;;-1:-1:-1;76707:253:0;;;;;:::i;:::-;;:::i;45994:442::-;;;;;;;;;;-1:-1:-1;45994:442:0;;;;;:::i;:::-;;:::i;91950:157::-;;;;;;;;;;-1:-1:-1;91950:157:0;;;;;:::i;:::-;;:::i;68121:120::-;;;;;;;;;;-1:-1:-1;68121:120:0;;;;;:::i;:::-;;:::i;93948:151::-;;;;;;;;;;-1:-1:-1;93948:151:0;;;;;:::i;:::-;;:::i;62408:183::-;;;;;;;;;;-1:-1:-1;62408:183:0;;;;;:::i;:::-;;:::i;92890:157::-;;;;;;;;;;-1:-1:-1;92890:157:0;;;;;:::i;:::-;;:::i;67318:42::-;;;;;;;;;;-1:-1:-1;67318:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8712:14:1;;8705:22;8687:41;;8759:2;8744:18;;8737:34;;;;8660:18;67318:42:0;8519:258:1;77368:36:0;;;;;;;;;;-1:-1:-1;77368:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9070:14:1;;9063:22;9045:41;;9129:14;;9122:22;9117:2;9102:18;;9095:50;9188:14;;9181:22;9161:18;;;9154:50;;;;9235:2;9220:18;;9213:34;9291:14;;9284:22;9278:3;9263:19;;9256:51;9338:3;9323:19;;9316:35;9032:3;9017:19;77368:36:0;8782:575:1;92168:29:0;;;;;;;;;;;;;:::i;44452:524::-;;;;;;;;;;-1:-1:-1;44452:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;90510:136::-;;;;;;;;;;-1:-1:-1;90510:136:0;;;;;:::i;:::-;;:::i;85894:257::-;;;;;;;;;;-1:-1:-1;85894:257:0;;;;;:::i;:::-;;:::i;85319:212::-;;;;;;;;;;-1:-1:-1;85319:212:0;;;;;:::i;:::-;;:::i;74671:254::-;;;;;;;;;;-1:-1:-1;74671:254:0;;;;;:::i;:::-;;:::i;67076:29::-;;;;;;;;;;;;;;;;60274:215;;;;;;;;;;-1:-1:-1;60274:215:0;;;;;:::i;:::-;;:::i;78407:46::-;;;;;;;;;;;;;;;;90706:23;;;;;;;;;;;;;:::i;90240:21::-;;;;;;;;;;;;;:::i;82688:143::-;;;;;;;;;;-1:-1:-1;82688:143:0;;;;;:::i;:::-;;:::i;72500:275::-;;;;;;;;;;-1:-1:-1;72500:275:0;;;;;:::i;:::-;;:::i;71145:268::-;;;;;;;;;;-1:-1:-1;71145:268:0;;;;;:::i;:::-;;:::i;60101:128::-;;;;;;;;;;-1:-1:-1;60101:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;60199:22:0;60164:15;60199:22;;;:15;:22;;;;;;;60101:128;14690:94;;;;;;;;;;;;;:::i;95275:169::-;;;;;;;;;;-1:-1:-1;95275:169:0;;;;;:::i;:::-;;:::i;94900:38::-;;;;;;;;;;-1:-1:-1;94900:38:0;;;;-1:-1:-1;;;;;94900:38:0;;;83851:266;;;;;;;;;;-1:-1:-1;83851:266:0;;;;;:::i;:::-;;:::i;77037:38::-;;;;;;;;;;-1:-1:-1;77037:38:0;;;;;;;;91192:25;;;;;;;;;;;;;:::i;78846:335::-;;;;;;:::i;:::-;;:::i;75485:443::-;;;;;;;;;;-1:-1:-1;75485:443:0;;;;;:::i;:::-;;:::i;14039:87::-;;;;;;;;;;-1:-1:-1;14112:6:0;;-1:-1:-1;;;;;14112:6:0;14039:87;;90082:100;;;;;;;;;;;;;:::i;78065:101::-;;;;;;;;;;-1:-1:-1;78065:101:0;;;;;:::i;:::-;;:::i;91696:30::-;;;;;;;;;;;;;:::i;82235:175::-;;;;;;;;;;;;;:::i;45049:155::-;;;;;;;;;;-1:-1:-1;45049:155:0;;;;;:::i;:::-;;:::i;90988:142::-;;;;;;;;;;-1:-1:-1;90988:142:0;;;;;:::i;:::-;;:::i;61709:645::-;;;;;;;;;;-1:-1:-1;61709:645:0;;;;;:::i;:::-;;:::i;91486:148::-;;;;;;;;;;-1:-1:-1;91486:148:0;;;;;:::i;:::-;;:::i;92636:30::-;;;;;;;;;;;;;:::i;81696:274::-;;;;;;;;;;-1:-1:-1;81696:274:0;;;;;:::i;:::-;;:::i;84627:396::-;;;;;;;;;;-1:-1:-1;84627:396:0;;;;;:::i;:::-;;:::i;89291:357::-;;;;;;;;;;-1:-1:-1;89291:357:0;;;;;:::i;:::-;;:::i;94577:160::-;;;;;;;;;;-1:-1:-1;94577:160:0;;;;;:::i;:::-;;:::i;88307:17::-;;;;;;;;;;;;;;;;93680:37;;;;;;;;;;;;;;;;69738:1219;;;;;;;;;;-1:-1:-1;69738:1219:0;;;;;:::i;:::-;;:::i;80674:606::-;;;;;;:::i;:::-;;:::i;68466:35::-;;;;;;;;;;;;;;;;78255:36;;;;;;;;;;;;;;;;94300:37;;;;;;;;;;;;;;;;45276:168;;;;;;;;;;-1:-1:-1;45276:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;45399:27:0;;;45375:4;45399:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;45276:168;68559:49;;;;;;;;;;-1:-1:-1;68559:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;45516:401;;;;;;;;;;-1:-1:-1;45516:401:0;;;;;:::i;:::-;;:::i;14939:192::-;;;;;;;;;;-1:-1:-1;14939:192:0;;;;;:::i;:::-;;:::i;92418:154::-;;;;;;;;;;-1:-1:-1;92418:154:0;;;;;:::i;:::-;;:::i;93431:139::-;;;;;;;;;;-1:-1:-1;93431:139:0;;;;;:::i;:::-;;:::i;44055:231::-;44141:7;-1:-1:-1;;;;;44169:21:0;;44161:77;;;;-1:-1:-1;;;44161:77:0;;19232:2:1;44161:77:0;;;19214:21:1;19271:2;19251:18;;;19244:30;19310:34;19290:18;;;19283:62;-1:-1:-1;;;19361:18:1;;;19354:41;19412:19;;44161:77:0;;;;;;;;;-1:-1:-1;44256:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;44256:22:0;;;;;;;;;;;;44055:231::o;88545:225::-;88646:4;-1:-1:-1;;;;;;88670:39:0;;-1:-1:-1;;;88670:39:0;;:92;;;88726:36;88750:11;88726:23;:36::i;:::-;88663:99;88545:225;-1:-1:-1;;88545:225:0:o;98104:339::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;11243:1:::1;11839:7;;:19;;11831:63;;;;-1:-1:-1::0;;;11831:63:0::1;;;;;;;:::i;:::-;11243:1;11972:7;:18:::0;98192:13:::2;::::0;::::2;;98191:14;98183:54;;;::::0;-1:-1:-1;;;98183:54:0;;20365:2:1;98183:54:0::2;::::0;::::2;20347:21:1::0;20404:2;20384:18;;;20377:30;20443:29;20423:18;;;20416:57;20490:18;;98183:54:0::2;20163:351:1::0;98183:54:0::2;98260:6;::::0;98250:7:::2;:16:::0;;;98286:20:::2;::::0;:12:::2;:20::i;:::-;98277:6;:29:::0;98343:7:::2;::::0;98317:35:::2;::::0;65770:20;;;;:11;:20;;;;;:34;;-1:-1:-1;;65770:34:0;65800:4;65770:34;;;65708:104;98317:35:::2;98365:37;98371:3;98386:7;;98396:1;98365:37;;;;;;;;;;;::::0;:5:::2;:37::i;:::-;-1:-1:-1::0;98415:13:0::2;:20:::0;;-1:-1:-1;;98415:20:0::2;98431:4;98415:20:::0;;::::2;::::0;;;12151:7:::1;:22:::0;98104:339::o;89900:96::-;89946:13;89979:9;89972:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89900:96;:::o;61039:411::-;61111:13;61127:34;61153:7;61127:25;:34::i;:::-;61111:50;;61186:5;-1:-1:-1;;;;;61180:11:0;:2;-1:-1:-1;;;;;61180:11:0;;;61172:57;;;;-1:-1:-1;;;61172:57:0;;21106:2:1;61172:57:0;;;21088:21:1;21145:2;21125:18;;;21118:30;21184:34;21164:18;;;21157:62;-1:-1:-1;;;21235:18:1;;;21228:31;21276:19;;61172:57:0;20904:397:1;61172:57:0;61262:10;-1:-1:-1;;;;;61262:19:0;;;;:58;;-1:-1:-1;;;;;;45399:27:0;;45375:4;45399:27;;;:18;:27;;;;;;;;61309:10;45399:37;;;;;;;;;;61285:35;61240:164;;;;-1:-1:-1;;;61240:164:0;;21508:2:1;61240:164:0;;;21490:21:1;21547:2;21527:18;;;21520:30;21586:34;21566:18;;;21559:62;21657:26;21637:18;;;21630:54;21701:19;;61240:164:0;21306:420:1;61240:164:0;61415:27;61430:2;61434:7;61415:14;:27::i;:::-;61100:350;61039:411;;:::o;97815:179::-;97904:4;97961:25;;97928:29;97948:8;97928:19;:29::i;:::-;:58;;;97815:179;-1:-1:-1;;97815:179:0:o;88963:134::-;89043:13;89076;89085:3;89076:8;:13::i;67409:25::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67409:25:0;:::o;60539:455::-;60686:20;;;;:11;:20;;;;;:27;;;:178;;;;-1:-1:-1;60774:10:0;60736:34;60762:7;60736:25;:34::i;:::-;-1:-1:-1;;;;;60736:48:0;;:113;;;-1:-1:-1;60806:20:0;;;;:11;:20;;;;;:29;;;-1:-1:-1;;;;;60806:29:0;60839:10;60806:43;60736:113;60664:277;;;;-1:-1:-1;;;60664:277:0;;;;;;;:::i;:::-;60952:34;60968:4;60974:2;60978:7;60952:15;:34::i;83230:249::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;83347:27:::1;:51:::0;;;83414:57:::1;::::0;616:25:1;;;83414:57:0::1;::::0;604:2:1;589:18;83414:57:0::1;;;;;;;;83230:249:::0;:::o;95983:243::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;96098:25:::1;:49:::0;;;96163:55:::1;::::0;616:25:1;;;96163:55:0::1;::::0;604:2:1;589:18;96163:55:0::1;470:177:1::0;76707:253:0;76785:15;;;;:10;:15;;;;;:22;;;76777:60;;;;-1:-1:-1;;;76777:60:0;;;;;;;:::i;:::-;76850:42;76856:10;76878:3;76884:7;76850:5;:42::i;:::-;76910;;;76927:10;22728:51:1;;22810:2;22795:18;;22788:34;;;22838:18;;;22831:34;;;76910:42:0;;22716:2:1;22701:18;76910:42:0;;;;;;;;76707:253;;:::o;45994:442::-;-1:-1:-1;;;;;46227:20:0;;12901:10;46227:20;;:60;;-1:-1:-1;46251:36:0;46268:4;12901:10;45276:168;:::i;46251:36::-;46205:160;;;;-1:-1:-1;;;46205:160:0;;23078:2:1;46205:160:0;;;23060:21:1;23117:2;23097:18;;;23090:30;23156:34;23136:18;;;23129:62;-1:-1:-1;;;23207:18:1;;;23200:48;23265:19;;46205:160:0;22876:414:1;46205:160:0;46376:52;46399:4;46405:2;46409:3;46414:7;46423:4;46376:22;:52::i;:::-;45994:442;;;;;:::o;91950:157::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;92031:23:::1;:16;92050:4:::0;;92031:23:::1;:::i;:::-;;92070:29;92094:4;;92070:29;;;;;;;:::i;68121:120::-:0;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;68206:27:::1;68224:8;;68206:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;68206:17:0::1;::::0;-1:-1:-1;;;68206:27:0:i:1;:::-;68121:120:::0;;:::o;93948:151::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;94021:15:::1;:24:::0;;;94061:30:::1;::::0;616:25:1;;;94061:30:0::1;::::0;604:2:1;589:18;94061:30:0::1;470:177:1::0;62408:183:0;62537:46;62554:4;62560:2;62564:7;62573:9;;;;;;;;;;;;62537:16;:46::i;92890:157::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;92971:23:::1;:16;92990:4:::0;;92971:23:::1;:::i;:::-;;93010:29;93034:4;;93010:29;;;;;;;:::i;92168:::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44452:524::-;44608:16;44669:3;:10;44650:8;:15;:29;44642:83;;;;-1:-1:-1;;;44642:83:0;;23892:2:1;44642:83:0;;;23874:21:1;23931:2;23911:18;;;23904:30;23970:34;23950:18;;;23943:62;-1:-1:-1;;;24021:18:1;;;24014:39;24070:19;;44642:83:0;23690:405:1;44642:83:0;44738:30;44785:8;:15;-1:-1:-1;;;;;44771:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44771:30:0;;44738:63;;44819:9;44814:122;44838:8;:15;44834:1;:19;44814:122;;;44894:30;44904:8;44913:1;44904:11;;;;;;;;:::i;:::-;;;;;;;44917:3;44921:1;44917:6;;;;;;;;:::i;:::-;;;;;;;44894:9;:30::i;:::-;44875:13;44889:1;44875:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;44855:3;;;:::i;:::-;;;44814:122;;;-1:-1:-1;44955:13:0;44452:524;-1:-1:-1;;;44452:524:0:o;90510:136::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;90584:16:::1;:7;90594:6:::0;;90584:16:::1;:::i;:::-;;90616:22;90631:6;;90616:22;;;;;;;:::i;85894:257::-:0;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;85986:12:::1;::::0;;;:7:::1;:12;::::0;;;;:19;::::1;;85978:53;;;;-1:-1:-1::0;;;85978:53:0::1;;;;;;;:::i;:::-;86084:5;86042:12:::0;;;:7:::1;:12;::::0;;;;;;:39:::1;;:47:::0;;-1:-1:-1;;86042:47:0::1;::::0;;86105:38;::::1;::::0;::::1;::::0;86050:3;616:25:1;;604:2;589:18;;470:177;85319:212:0;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;85396:12:::1;::::0;;;:7:::1;:12;::::0;;;;:19;::::1;;85388:53;;;;-1:-1:-1::0;;;85388:53:0::1;;;;;;;:::i;:::-;85479:5;85452:12:::0;;;:7:::1;:12;::::0;;;;;;:32;;-1:-1:-1;;85452:32:0::1;::::0;;85500:23;::::1;::::0;::::1;::::0;85460:3;616:25:1;;604:2;589:18;;470:177;74671:254:0;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;74758:26:::1;::::0;;;:11:::1;:26;::::0;;;;:33;::::1;;74750:65;;;;-1:-1:-1::0;;;74750:65:0::1;;;;;;;:::i;:::-;74862:5;74826:26:::0;;;:11:::1;:26;::::0;;;;;;:41;;-1:-1:-1;;74826:41:0::1;::::0;;74883:34;::::1;::::0;::::1;::::0;74838:13;616:25:1;;604:2;589:18;;470:177;60274:215:0;60353:13;60386:20;;;:11;:20;;;;;:27;;;:95;;60479:1;60386:95;;;-1:-1:-1;60429:20:0;;;;:11;:20;;;;;:26;;;;-1:-1:-1;;;;;60429:26:0;;60274:215::o;90706:23::-;;;;;;;:::i;90240:21::-;;;;;;;:::i;82688:143::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;82759:12:::1;:21:::0;;;82796:27:::1;::::0;616:25:1;;;82796:27:0::1;::::0;604:2:1;589:18;82796:27:0::1;470:177:1::0;72500:275:0;11243:1;11839:7;;:19;;11831:63;;;;-1:-1:-1;;;11831:63:0;;;;;;;:::i;:::-;11243:1;11972:7;:18;72700:67:::1;72717:13:::0;72732:6;;72740:4;;72746:8;;72756:10:::1;72700:16;:67::i;:::-;-1:-1:-1::0;;11199:1:0;12151:7;:22;-1:-1:-1;;;;;72500:275:0:o;71145:268::-;71261:4;71286:26;;;:11;:26;;;;;:33;;;71278:65;;;;-1:-1:-1;;;71278:65:0;;;;;;;:::i;:::-;-1:-1:-1;71361:26:0;;;;:11;:26;;;;;;;;-1:-1:-1;;;;;71361:44:0;;;;:34;;:44;;;;;;;;71145:268;;;;:::o;14690:94::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;14755:21:::1;14773:1;14755:9;:21::i;:::-;14690:94::o:0;95275:169::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;95347:9:::1;:45:::0;;-1:-1:-1;;;;;;95347:45:0::1;-1:-1:-1::0;;;;;95347:45:0;::::1;::::0;;::::1;::::0;;;95408:28:::1;::::0;2564:51:1;;;95408:28:0::1;::::0;2552:2:1;2537:18;95408:28:0::1;2418:203:1::0;83851:266:0;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;83937:12:::1;::::0;;;:7:::1;:12;::::0;;;;:19;::::1;;83929:53;;;;-1:-1:-1::0;;;83929:53:0::1;;;;;;;:::i;:::-;83993:12;::::0;;;:7:::1;:12;::::0;;;;;;:31;;-1:-1:-1;;83993:31:0::1;;;::::0;;84020:4:::1;84035:18;:27:::0;;;84078:31;::::1;::::0;::::1;::::0;84001:3;;84056:6;;25399:25:1;;;25455:2;25440:18;;25433:34;25387:2;25372:18;;25202:271;91192:25:0;;;;;;;:::i;78846:335::-;11243:1;11839:7;;:19;;11831:63;;;;-1:-1:-1;;;11831:63:0;;;;;;;:::i;:::-;11243:1;11972:7;:18;78927::::1;::::0;::::1;;78919:64;;;;-1:-1:-1::0;;;78919:64:0::1;;;;;;;:::i;:::-;79002:12;::::0;;;:7:::1;:12;::::0;;;;:19;::::1;;78994:53;;;;-1:-1:-1::0;;;78994:53:0::1;;;;;;;:::i;:::-;79067:12;::::0;;;:7:::1;:12;::::0;;;;:19;;;::::1;;;79066:20;79058:61;;;::::0;-1:-1:-1;;;79058:61:0;;26082:2:1;79058:61:0::1;::::0;::::1;26064:21:1::0;26121:2;26101:18;;;26094:30;26160;26140:18;;;26133:58;26208:18;;79058:61:0::1;25880:352:1::0;79058:61:0::1;79130:43;79146:3;79151:10;79163:9;79130:15;:43::i;:::-;-1:-1:-1::0;11199:1:0;12151:7;:22;78846:335::o;75485:443::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;75625:15:::1;::::0;;;:10:::1;:15;::::0;;;;:22;::::1;;75617:60;;;;-1:-1:-1::0;;;75617:60:0::1;;;;;;;:::i;:::-;75696:15;::::0;;;:10:::1;:15;::::0;;;;:22:::1;;::::0;:33;-1:-1:-1;75696:33:0::1;75688:78;;;::::0;-1:-1:-1;;;75688:78:0;;26439:2:1;75688:78:0::1;::::0;::::1;26421:21:1::0;;;26458:18;;;26451:30;26517:34;26497:18;;;26490:62;26569:18;;75688:78:0::1;26237:356:1::0;75688:78:0::1;75779:15;::::0;;;:10:::1;:15;::::0;;;;:22:::1;;:33:::0;;75805:7;;75779:15;:33:::1;::::0;75805:7;;75779:33:::1;:::i;:::-;;;;;;;;75823:39;75829:3;75844;75850:7;75823:39;;;;;;;;;;;::::0;:5:::1;:39::i;:::-;75880:40;::::0;;-1:-1:-1;;;;;22746:32:1;;22728:51;;22810:2;22795:18;;22788:34;;;22838:18;;;22831:34;;;75880:40:0::1;::::0;22716:2:1;22701:18;75880:40:0::1;;;;;;;75485:443:::0;;;:::o;90082:100::-;90130:13;90163:11;90156:18;;;;;:::i;78065:101::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;78135:23:::1;78150:7;78135:14;:23::i;:::-;78065:101:::0;:::o;91696:30::-;;;;;;;:::i;82235:175::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;82323:18:::1;::::0;;::::1;::::0;;::::1;82322:19;-1:-1:-1::0;;82301:40:0;;::::1;::::0;::::1;::::0;;;82357:45:::1;::::0;82383:18;;1203:14:1;1196:22;1178:41;;82357:45:0::1;::::0;1166:2:1;1151:18;82357:45:0::1;;;;;;;82235:175::o:0;45049:155::-;45144:52;12901:10;45177:8;45187;45144:18;:52::i;90988:142::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;91064:18:::1;:9;91076:6:::0;;91064:18:::1;:::i;:::-;;91098:24;91115:6;;91098:24;;;;;;;:::i;61709:645::-:0;61888:20;;;;:11;:20;;;;;:27;;;:178;;;;-1:-1:-1;61976:10:0;61938:34;61964:7;61938:25;:34::i;:::-;-1:-1:-1;;;;;61938:48:0;;:113;;;-1:-1:-1;62008:20:0;;;;:11;:20;;;;;:29;;;-1:-1:-1;;;;;62008:29:0;62041:10;62008:43;61938:113;61866:277;;;;-1:-1:-1;;;61866:277:0;;;;;;;:::i;:::-;62154:34;62170:4;62176:2;62180:7;62154:15;:34::i;:::-;62221:47;62244:4;62250:2;62254:7;62263:4;62221:22;:47::i;:::-;62199:147;;;;-1:-1:-1;;;62199:147:0;;;;;;;:::i;:::-;61709:645;;;;:::o;91486:148::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;91564:20:::1;:11;91578:6:::0;;91564:20:::1;:::i;:::-;;91600:26;91619:6;;91600:26;;;;;;;:::i;92636:30::-:0;;;;;;;:::i;81696:274::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;11243:1:::1;11839:7;;:19;;11831:63;;;;-1:-1:-1::0;;;11831:63:0::1;;;;;;;:::i;:::-;11243:1;11972:7;:18:::0;81844:21:::2;81833:32:::0;::::2;;81825:61;;;::::0;-1:-1:-1;;;81825:61:0;;27349:2:1;81825:61:0::2;::::0;::::2;27331:21:1::0;27388:2;27368:18;;;27361:30;-1:-1:-1;;;27407:18:1;;;27400:46;27463:18;;81825:61:0::2;27147:340:1::0;81825:61:0::2;81897:21;::::0;-1:-1:-1;;;;;81897:12:0;::::2;::::0;:21;::::2;;;::::0;81910:7;;81897:21:::2;::::0;;;81910:7;81897:12;:21;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;81934:28:0::2;::::0;;-1:-1:-1;;;;;27692:32:1;;27674:51;;27756:2;27741:18;;27734:34;;;81934:28:0::2;::::0;27647:18:1;81934:28:0::2;;;;;;;-1:-1:-1::0;;11199:1:0::1;12151:7;:22:::0;81696:274::o;84627:396::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;84768:12:::1;::::0;;;:7:::1;:12;::::0;;;;:19;::::1;;84760:53;;;;-1:-1:-1::0;;;84760:53:0::1;;;;;;;:::i;:::-;84824:12;::::0;;;:7:::1;:12;::::0;;;;;;:39:::1;::::0;::::1;:46:::0;;-1:-1:-1;;84824:46:0::1;84866:4;84824:46;::::0;;84881:33:::1;;:57:::0;;;84954:61;::::1;::::0;::::1;::::0;84832:3;;84917:21;;25399:25:1;;;25455:2;25440:18;;25433:34;25387:2;25372:18;;25202:271;89291:357:0;89407:13;;89377;;89407;;:42;;;;;89441:7;;89424:3;:25;89407:42;89403:238;;;89473:11;:9;:11::i;89403:238::-;89551:1;89530:10;:8;:10::i;:::-;89524:24;:28;:105;;;;;;;;;;;;;;;;;89596:10;:8;:10::i;:::-;89608:14;:3;:12;:14::i;:::-;89579:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;89517:112;89291:357;-1:-1:-1;;89291:357:0:o;94577:160::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;94653:18:::1;:27:::0;;;94696:33:::1;::::0;616:25:1;;;94696:33:0::1;::::0;604:2:1;589:18;94696:33:0::1;470:177:1::0;69738:1219:0;14112:6;;69896:7;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;69938:30;;::::1;69916:112;;;::::0;-1:-1:-1;;;69916:112:0;;28456:2:1;69916:112:0::1;::::0;::::1;28438:21:1::0;;;28475:18;;;28468:30;28534:34;28514:18;;;28507:62;28586:18;;69916:112:0::1;28254:356:1::0;69916:112:0::1;70039:9;70077::::0;70072:442:::1;70092:15:::0;;::::1;70072:442;;;70156:6:::0;;;:37:::1;;;70166:27;70177:4;;70182:1;70177:7;;;;;;;:::i;:::-;;;;;;;70186:6;-1:-1:-1::0;66554:27:0;66483:106;70166:27:::1;70130:116;;;::::0;-1:-1:-1;;;70130:116:0;;28817:2:1;70130:116:0::1;::::0;::::1;28799:21:1::0;28856:2;28836:18;;;28829:30;-1:-1:-1;;;28875:18:1;;;28868:47;28932:18;;70130:116:0::1;28615:341:1::0;70130:116:0::1;70270:4;;70275:1;70270:7;;;;;;;:::i;:::-;;;;;;;70261:16;;70300:10;:19;70311:4;;70316:1;70311:7;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;70300:19:::0;;-1:-1:-1;70300:19:0;::::1;::::0;;;;;;-1:-1:-1;70300:19:0;:26;::::1;;70292:64;;;;-1:-1:-1::0;;;70292:64:0::1;;;;;;;:::i;:::-;70412:10;:19;70423:4;;70428:1;70423:7;;;;;;;:::i;:::-;;;;;;;70412:19;;;;;;;;;;;:26;;;70397:8;;70406:1;70397:11;;;;;;;:::i;:::-;;;;;;;:41;;70371:131;;;::::0;-1:-1:-1;;;70371:131:0;;29163:2:1;70371:131:0::1;::::0;::::1;29145:21:1::0;29202:2;29182:18;;;29175:30;29241;29221:18;;;29214:58;29289:18;;70371:131:0::1;28961:352:1::0;70371:131:0::1;70109:4:::0;::::1;::::0;::::1;:::i;:::-;;;;70072:442;;;;70529:9;70524:186;70544:15:::0;;::::1;70524:186;;;70612:8;;70621:1;70612:11;;;;;;;:::i;:::-;;;;;;;70582:10;:19;70593:4;;70598:1;70593:7;;;;;;;:::i;:::-;;;;;;;70582:19;;;;;;;;;;;:26;;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;70687:8:0;;-1:-1:-1;70687:8:0;70696:1;70687:11;;::::1;;;;;:::i;:::-;;;;;;;70638;:29;70650:16;;70638:29;;;;;;;;;;;:37;;:46;70676:4;;70681:1;70676:7;;;;;;;:::i;:::-;;;;;;;70638:46;;;;;;;;;;;:60;;;;70561:4;;;;;:::i;:::-;;;;70524:186;;;-1:-1:-1::0;70732:16:0::1;::::0;;70720:29:::1;::::0;;;:11:::1;:29;::::0;;;;;:40:::1;::::0;;::::1;:54:::0;;;70797:16;;70785:29;;;;;;:43;;-1:-1:-1;;70785:43:0::1;::::0;;::::1;::::0;;;70864:16;;70846:64;;::::1;::::0;::::1;::::0;70763:11;;70895:4;;;;70901:8;;;;70846:64:::1;:::i;:::-;;;;;;;;70930:16;:19:::0;;;:16:::1;:19;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;70923:26:0;69738:1219;-1:-1:-1;;;;;;;69738:1219:0:o;80674:606::-;11243:1;11839:7;;:19;;11831:63;;;;-1:-1:-1;;;11831:63:0;;;;;;;:::i;:::-;11243:1;11972:7;:18;80930::::1;::::0;::::1;;80922:64;;;;-1:-1:-1::0;;;80922:64:0::1;;;;;;;:::i;:::-;81005:18;::::0;;;:7:::1;:18;::::0;;;;:25;::::1;;80997:59;;;;-1:-1:-1::0;;;80997:59:0::1;;;;;;;:::i;:::-;81076:18;::::0;;;:7:::1;:18;::::0;;;;:25;;;::::1;;;81075:26;81067:67;;;::::0;-1:-1:-1;;;81067:67:0;;26082:2:1;81067:67:0::1;::::0;::::1;26064:21:1::0;26121:2;26101:18;;;26094:30;26160;26140:18;;;26133:58;26208:18;;81067:67:0::1;25880:352:1::0;81067:67:0::1;81145;81162:13;81177:6;;81185:4;;81191:8;;81201:10;81145:16;:67::i;:::-;81223:49;81239:9;81250:10;81262:9;81223:15;:49::i;:::-;-1:-1:-1::0;;11199:1:0;12151:7;:22;-1:-1:-1;;;;;;80674:606:0:o;45516:401::-;-1:-1:-1;;;;;45724:20:0;;12901:10;45724:20;;:60;;-1:-1:-1;45748:36:0;45765:4;12901:10;45276:168;:::i;45748:36::-;45702:151;;;;-1:-1:-1;;;45702:151:0;;31022:2:1;45702:151:0;;;31004:21:1;31061:2;31041:18;;;31034:30;31100:34;31080:18;;;31073:62;-1:-1:-1;;;31151:18:1;;;31144:39;31200:19;;45702:151:0;30820:405:1;45702:151:0;45864:45;45882:4;45888:2;45892;45896:6;45904:4;45864:17;:45::i;14939:192::-;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15028:22:0;::::1;15020:73;;;::::0;-1:-1:-1;;;15020:73:0;;31432:2:1;15020:73:0::1;::::0;::::1;31414:21:1::0;31471:2;31451:18;;;31444:30;31510:34;31490:18;;;31483:62;-1:-1:-1;;;31561:18:1;;;31554:36;31607:19;;15020:73:0::1;31230:402:1::0;15020:73:0::1;15104:19;15114:8;15104:9;:19::i;92418:154::-:0;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;92498:22:::1;:15;92516:4:::0;;92498:22:::1;:::i;:::-;;92536:28;92559:4;;92536:28;;;;;;;:::i;93431:139::-:0;14112:6;;-1:-1:-1;;;;;14112:6:0;12901:10;14259:23;14251:68;;;;-1:-1:-1;;;14251:68:0;;;;;;;:::i;:::-;93500:11:::1;:20:::0;;-1:-1:-1;;93500:20:0::1;-1:-1:-1::0;;;;;93500:20:0;::::1;::::0;;::::1;::::0;;;93536:26:::1;::::0;2770:54:1;;;93536:26:0::1;::::0;2758:2:1;2743:18;93536:26:0::1;2626:204:1::0;66197:100:0;66241:2;66271:17;66281:2;66287:1;66271:17;:::i;58592:291::-;58693:4;-1:-1:-1;;;;;;58717:40:0;;-1:-1:-1;;;58717:40:0;;:105;;-1:-1:-1;;;;;;;58774:48:0;;-1:-1:-1;;;58774:48:0;58717:105;:158;;;;58839:36;58863:11;58839:23;:36::i;50470:569::-;-1:-1:-1;;;;;50623:16:0;;50615:62;;;;-1:-1:-1;;;50615:62:0;;31972:2:1;50615:62:0;;;31954:21:1;32011:2;31991:18;;;31984:30;32050:34;32030:18;;;32023:62;-1:-1:-1;;;32101:18:1;;;32094:31;32142:19;;50615:62:0;31770:397:1;50615:62:0;12901:10;50734:102;12901:10;50690:16;50777:2;50781:21;50799:2;50781:17;:21::i;:::-;50804:25;50822:6;50804:17;:25::i;:::-;50831:4;50734:20;:102::i;:::-;50849:9;:13;;;;;;;;;;;-1:-1:-1;;;;;50849:17:0;;;;;;;;;:27;;50870:6;;50849:9;:27;;50870:6;;50849:27;:::i;:::-;;;;-1:-1:-1;;50892:52:0;;;25399:25:1;;;25455:2;25440:18;;25433:34;;;-1:-1:-1;;;;;50892:52:0;;;;50925:1;;50892:52;;;;-1:-1:-1;;;;;;;;;;;50892:52:0;25372:18:1;50892:52:0;;;;;;;50957:74;50988:8;51006:1;51010:2;51014;51018:6;51026:4;50957:30;:74::i;63330:196::-;63411:20;;;;:11;:20;;;;;:29;;:34;;-1:-1:-1;;;;;;63411:34:0;-1:-1:-1;;;;;63411:34:0;;;;;;;;:20;;63470:34;63411:20;63470:25;:34::i;:::-;-1:-1:-1;;;;;63461:57:0;;;;;;;;;;;63330:196;;:::o;75936:290::-;76006:7;;;76056:138;76080:13;:20;76076:24;;76056:138;;;76134:48;76144:8;76164:13;76178:1;76164:16;;;;;;;;:::i;:::-;;;;;;;;;76134:9;:48::i;:::-;76123:59;;;;:::i;:::-;;-1:-1:-1;76102:4:0;;;;:::i;:::-;;;;76056:138;;;-1:-1:-1;76211:7:0;75936:290;-1:-1:-1;;75936:290:0:o;62643:650::-;-1:-1:-1;;;;;62781:16:0;;62773:65;;;;-1:-1:-1;;;62773:65:0;;32627:2:1;62773:65:0;;;32609:21:1;32666:2;32646:18;;;32639:30;32705:34;32685:18;;;32678:62;-1:-1:-1;;;32756:18:1;;;32749:34;32800:19;;62773:65:0;32425:400:1;62773:65:0;62851:181;12901:10;62913:4;62932:2;62949:23;62964:7;62949:14;:23::i;:::-;62987:17;63002:1;62987:14;:17::i;:::-;62851:181;;;;;;;;;;;;:20;:181::i;:::-;63045:35;63068:1;63072:7;63045:14;:35::i;:::-;63091:9;:18;;;;;;;;;;;-1:-1:-1;;;;;63091:24:0;;;;;;;;;:29;;63119:1;;63091:9;:29;;63119:1;;63091:29;:::i;:::-;;;;-1:-1:-1;;63131:9:0;:18;;;;;;;;;;;-1:-1:-1;;;;;63131:22:0;;;;;;;;;:27;;63157:1;;63131:9;:27;;63157:1;;63131:27;:::i;:::-;;;;-1:-1:-1;;63235:50:0;;;25399:25:1;;;63283:1:0;25455:2:1;25440:18;;25433:34;-1:-1:-1;;;;;63235:50:0;;;;;;;;12901:10;;-1:-1:-1;;;;;;;;;;;63235:50:0;25372:18:1;63235:50:0;;;;;;;62643:650;;;:::o;52380:648::-;-1:-1:-1;;;;;52507:18:0;;52499:66;;;;-1:-1:-1;;;52499:66:0;;33293:2:1;52499:66:0;;;33275:21:1;33332:2;33312:18;;;33305:30;33371:34;33351:18;;;33344:62;-1:-1:-1;;;33422:18:1;;;33415:33;33465:19;;52499:66:0;33091:399:1;52499:66:0;12901:10;52622:102;12901:10;52653:4;52578:16;52671:21;52689:2;52671:17;:21::i;:::-;52694:25;52712:6;52694:17;:25::i;52622:102::-;52737:19;52759:13;;;;;;;;;;;-1:-1:-1;;;;;52759:19:0;;;;;;;;;;52797:21;;;;52789:70;;;;-1:-1:-1;;;52789:70:0;;33697:2:1;52789:70:0;;;33679:21:1;33736:2;33716:18;;;33709:30;33775:34;33755:18;;;33748:62;-1:-1:-1;;;33826:18:1;;;33819:34;33870:19;;52789:70:0;33495:400:1;52789:70:0;52895:9;:13;;;;;;;;;;;-1:-1:-1;;;;;52895:19:0;;;;;;;;;;;;52917:20;;;52895:42;;52966:54;;25399:25:1;;;25440:18;;;25433:34;;;52895:19:0;;52966:54;;;;-1:-1:-1;;;;;;;;;;;52966:54:0;25372:18:1;52966:54:0;;;;;;;52488:540;;52380:648;;;:::o;48078:1074::-;48305:7;:14;48291:3;:10;:28;48283:81;;;;-1:-1:-1;;;48283:81:0;;34102:2:1;48283:81:0;;;34084:21:1;34141:2;34121:18;;;34114:30;34180:34;34160:18;;;34153:62;-1:-1:-1;;;34231:18:1;;;34224:38;34279:19;;48283:81:0;33900:404:1;48283:81:0;-1:-1:-1;;;;;48383:16:0;;48375:66;;;;-1:-1:-1;;;48375:66:0;;;;;;;:::i;:::-;12901:10;48498:60;12901:10;48529:4;48535:2;48539:3;48544:7;48553:4;48498:20;:60::i;:::-;48576:9;48571:421;48595:3;:10;48591:1;:14;48571:421;;;48627:10;48640:3;48644:1;48640:6;;;;;;;;:::i;:::-;;;;;;;48627:19;;48661:14;48678:7;48686:1;48678:10;;;;;;;;:::i;:::-;;;;;;;;;;;;48705:19;48727:13;;;;;;;;;;-1:-1:-1;;;;;48727:19:0;;;;;;;;;;;;48678:10;;-1:-1:-1;48769:21:0;;;;48761:76;;;;-1:-1:-1;;;48761:76:0;;;;;;;:::i;:::-;48881:9;:13;;;;;;;;;;;-1:-1:-1;;;;;48881:19:0;;;;;;;;;;48903:20;;;48881:42;;48953:17;;;;;;;:27;;48903:20;;48881:9;48953:27;;48903:20;;48953:27;:::i;:::-;;;;;;;;48612:380;;;48607:3;;;;:::i;:::-;;;48571:421;;;;49039:2;-1:-1:-1;;;;;49009:47:0;49033:4;-1:-1:-1;;;;;49009:47:0;49023:8;-1:-1:-1;;;;;49009:47:0;;49043:3;49048:7;49009:47;;;;;;;:::i;:::-;;;;;;;;49069:75;49105:8;49115:4;49121:2;49125:3;49130:7;49139:4;49069:35;:75::i;:::-;48272:880;48078:1074;;;;;:::o;67676:337::-;67755:35;67773:6;;67781:8;67755:35;;;;;;;:::i;:::-;;;;;;;;67806:6;67801:205;67822:8;:15;67818:1;:19;67801:205;;;67881:28;;;;;;;;67891:4;67881:28;;;;;;67897:8;67906:1;67897:11;;;;;;;;:::i;:::-;;;;;;;;;;;;67881:28;;;67871:6;;;67860:18;;;;:10;:18;;;;;:49;;;;-1:-1:-1;;67860:49:0;;;;;;;;;;;;-1:-1:-1;67860:49:0;;;;67943:6;67924:13;:26;;;;;;;;;;;;;;;;;67974:20;;:12;:20::i;:::-;67965:6;:29;67839:4;;;;:::i;:::-;;;;67801:205;;72783:1608;73006:26;;;;:11;:26;;;;;:33;;;72998:65;;;;-1:-1:-1;;;72998:65:0;;;;;;;:::i;:::-;73096:30;;;73074:112;;;;-1:-1:-1;;;73074:112:0;;28456:2:1;73074:112:0;;;28438:21:1;;;28475:18;;;28468:30;28534:34;28514:18;;;28507:62;28586:18;;73074:112:0;28254:356:1;73074:112:0;73220:26;;;;:11;:26;;;;;;;;-1:-1:-1;;;;;73220:44:0;;;;:34;;:44;;;;;;;;73219:45;73197:115;;;;-1:-1:-1;;;73197:115:0;;36158:2:1;73197:115:0;;;36140:21:1;36197:2;36177:18;;;36170:30;-1:-1:-1;;;36216:18:1;;;36209:50;36276:18;;73197:115:0;35956:344:1;73197:115:0;73323:9;73361;73356:461;73376:15;;;73356:461;;;73440:6;;;:37;;;73450:27;73461:4;;73466:1;73461:7;;;;;;;:::i;73450:27::-;73414:116;;;;-1:-1:-1;;;73414:116:0;;28817:2:1;73414:116:0;;;28799:21:1;28856:2;28836:18;;;28829:30;-1:-1:-1;;;28875:18:1;;;28868:47;28932:18;;73414:116:0;28615:341:1;73414:116:0;73554:4;;73559:1;73554:7;;;;;;;:::i;:::-;;;;;;;73545:16;;73584:10;:19;73595:4;;73600:1;73595:7;;;;;;;:::i;:::-;;;;;;;;;;73584:19;;-1:-1:-1;73584:19:0;;;;;;;;-1:-1:-1;73584:19:0;:26;;;73576:64;;;;-1:-1:-1;;;73576:64:0;;;;;;;:::i;:::-;73696:26;;;;:11;:26;;;;;:34;;;73731:4;;73736:1;73731:7;;;;;;;:::i;:::-;;;;;;;73696:43;;;;;;;;;;;;73681:8;;73690:1;73681:11;;;;;;;:::i;:::-;;;;;;;:58;;73655:150;;;;-1:-1:-1;;;73655:150:0;;36507:2:1;73655:150:0;;;36489:21:1;36546:2;36526:18;;;36519:30;36585:32;36565:18;;;36558:60;36635:18;;73655:150:0;36305:354:1;73655:150:0;73393:4;;;;:::i;:::-;;;;73356:461;;;;73827:12;73869:8;73879:4;;73885:8;;73852:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73842:53;;;;;;73827:68;;73928:71;73947:6;;73928:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73955:26:0;;;:11;:26;;;;;:37;;;;-1:-1:-1;73994:4:0;;-1:-1:-1;73928:18:0;;-1:-1:-1;73928:71:0:i;:::-;73906:134;;;;-1:-1:-1;;;73906:134:0;;37812:2:1;73906:134:0;;;37794:21:1;37851:2;37831:18;;;37824:30;-1:-1:-1;;;37870:18:1;;;37863:43;37923:18;;73906:134:0;37610:337:1;73906:134:0;74056:9;74051:195;74071:15;;;74051:195;;;74156:8;;74165:1;74156:11;;;;;;;:::i;:::-;;;;;;;74109;:26;74121:13;74109:26;;;;;;;;;;;:34;;:43;74144:4;;74149:1;74144:7;;;;;;;:::i;:::-;;;;;;;74109:43;;;;;;;;;;;;:58;;;;;;;:::i;:::-;;;;-1:-1:-1;74182:52:0;;-1:-1:-1;74188:8:0;74208:4;;74213:1;74208:7;;;;;;;:::i;:::-;;;;;;;74218:8;;74227:1;74218:11;;;;;;;:::i;:::-;;;;;;;74182:52;;;;;;;;;;;;:5;:52::i;:::-;74088:4;;;;:::i;:::-;;;;74051:195;;;-1:-1:-1;74256:26:0;;;;:11;:26;;;;;;;;-1:-1:-1;;;;;74256:44:0;;;;:34;;:44;;;;;;;:51;;-1:-1:-1;;74256:51:0;74303:4;74256:51;;;74325:58;;;;;74268:13;;74291:8;;74368:4;;;;74374:8;;;;74325:58;:::i;:::-;;;;;;;;72987:1404;;72783:1608;;;;;;;;:::o;15139:173::-;15214:6;;;-1:-1:-1;;;;;15231:17:0;;;-1:-1:-1;;;;;;15231:17:0;;;;;;;15264:40;;15214:6;;;15231:17;15214:6;;15264:40;;15195:16;;15264:40;15184:128;15139:173;:::o;79189:739::-;79332:12;;;;:7;:12;;;;;:39;;;;;:226;;79531:27;;79498:29;79518:8;79498:19;:29::i;:::-;:60;;79332:226;;;79445:12;;;;:7;:12;;;;;:33;;;79391:29;79411:8;79391:19;:29::i;:::-;:87;;79332:226;79310:309;;;;-1:-1:-1;;;79310:309:0;;38887:2:1;79310:309:0;;;38869:21:1;38926:2;38906:18;;;38899:30;38965:34;38945:18;;;38938:62;-1:-1:-1;;;39016:18:1;;;39009:31;39057:19;;79310:309:0;38685:397:1;79310:309:0;79630:13;79646:12;;;:7;:12;;;;;:24;;;;;;:73;;79707:12;;79646:73;;;79686:12;;;;:7;:12;;;;;:18;;;79646:73;79630:89;;79750:5;79740:6;:15;79732:45;;;;-1:-1:-1;;;79732:45:0;;39289:2:1;79732:45:0;;;39271:21:1;39328:2;39308:18;;;39301:30;-1:-1:-1;;;39347:18:1;;;39340:47;39404:18;;79732:45:0;39087:341:1;79732:45:0;79790:38;79796:8;79816:3;79822:1;79790:38;;;;;;;;;;;;:5;:38::i;:::-;79839:12;;;;:7;:12;;;;;;;;;:26;;-1:-1:-1;;79839:26:0;;;;;79883:37;;-1:-1:-1;;;;;22746:32:1;;22728:51;;22795:18;;;22788:34;;;22838:18;;;22831:34;;;79883:37:0;;22716:2:1;22701:18;79883:37:0;;;;;;;79299:629;79189:739;;;:::o;77650:300::-;77731:6;;77716:31;;;25399:25:1;;;25455:2;25440:18;;25433:34;;;77716:31:0;;25372:18:1;77716:31:0;;;;;;;77763:6;77758:185;77779:7;77775:1;:11;77758:185;;;77817:6;;;77809:15;;;;:7;:15;;;;;:29;;-1:-1:-1;;77809:29:0;77834:4;77809:29;;;77879:6;77853:34;;65770:20;;;;:11;:20;;;;;:34;;-1:-1:-1;;65770:34:0;65800:4;65770:34;;;65708:104;77853:34;77911:20;77924:6;;77911:12;:20::i;:::-;77902:6;:29;77788:4;;;;:::i;:::-;;;;77758:185;;54264:331;54419:8;-1:-1:-1;;;;;54410:17:0;:5;-1:-1:-1;;;;;54410:17:0;;;54402:71;;;;-1:-1:-1;;;54402:71:0;;39635:2:1;54402:71:0;;;39617:21:1;39674:2;39654:18;;;39647:30;39713:34;39693:18;;;39686:62;-1:-1:-1;;;39764:18:1;;;39757:39;39813:19;;54402:71:0;39433:405:1;54402:71:0;-1:-1:-1;;;;;54484:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;54484:46:0;;;;;;;;;;54546:41;;1178::1;;;54546::0;;1151:18:1;54546:41:0;;;;;;;54264:331;;;:::o;64670:799::-;64825:4;-1:-1:-1;;;;;64846:13:0;;32674:20;32722:8;64842:620;;64882:72;;-1:-1:-1;;;64882:72:0;;-1:-1:-1;;;;;64882:36:0;;;;;:72;;12901:10;;64933:4;;64939:7;;64948:5;;64882:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64882:72:0;;;;;;;;-1:-1:-1;;64882:72:0;;;;;;;;;;;;:::i;:::-;;;64878:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65124:13:0;;65120:272;;65167:60;;-1:-1:-1;;;65167:60:0;;;;;;;:::i;65120:272::-;65342:6;65336:13;65327:6;65323:2;65319:15;65312:38;64878:529;-1:-1:-1;;;;;;65005:51:0;-1:-1:-1;;;65005:51:0;;-1:-1:-1;64998:58:0;;64842:620;-1:-1:-1;65446:4:0;64842:620;64670:799;;;;;;:::o;97273:351::-;97317:13;97343:16;97362;:14;:16::i;:::-;97343:35;-1:-1:-1;97402:19:0;97393:5;:28;;;;;;;;:::i;:::-;;97389:228;;;97445:16;97438:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97273:351;:::o;97389:228::-;97492:18;97483:5;:27;;;;;;;;:::i;:::-;;97479:138;;;97534:15;97527:22;;;;;:::i;97479:138::-;97589:16;97582:23;;;;;:::i;97479:138::-;97332:292;97273:351;:::o;89718:100::-;89770:13;89803:7;89796:14;;;;;:::i;7729:723::-;7785:13;8006:10;8002:53;;-1:-1:-1;;8033:10:0;;;;;;;;;;;;-1:-1:-1;;;8033:10:0;;;;;7729:723::o;8002:53::-;8080:5;8065:12;8121:78;8128:9;;8121:78;;8154:8;;;;:::i;:::-;;-1:-1:-1;8177:10:0;;-1:-1:-1;8185:2:0;8177:10;;:::i;:::-;;;8121:78;;;8209:19;8241:6;-1:-1:-1;;;;;8231:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8231:17:0;;8209:39;;8259:154;8266:10;;8259:154;;8293:11;8303:1;8293:11;;:::i;:::-;;-1:-1:-1;8362:10:0;8370:2;8362:5;:10;:::i;:::-;8349:24;;:2;:24;:::i;:::-;8336:39;;8319:6;8326;8319:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8319:56:0;;;;;;;;-1:-1:-1;8390:11:0;8399:2;8390:11;;:::i;:::-;;;8259:154;;46900:820;-1:-1:-1;;;;;47088:16:0;;47080:66;;;;-1:-1:-1;;;47080:66:0;;;;;;;:::i;:::-;12901:10;47203:96;12901:10;47234:4;47240:2;47244:21;47262:2;47244:17;:21::i;47203:96::-;47312:19;47334:13;;;;;;;;;;;-1:-1:-1;;;;;47334:19:0;;;;;;;;;;47372:21;;;;47364:76;;;;-1:-1:-1;;;47364:76:0;;;;;;;:::i;:::-;47476:9;:13;;;;;;;;;;;-1:-1:-1;;;;;47476:19:0;;;;;;;;;;47498:20;;;47476:42;;47540:17;;;;;;;:27;;47498:20;;47476:9;47540:27;;47498:20;;47540:27;:::i;:::-;;;;-1:-1:-1;;47585:46:0;;;25399:25:1;;;25455:2;25440:18;;25433:34;;;-1:-1:-1;;;;;47585:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47585:46:0;25372:18:1;47585:46:0;;;;;;;47644:68;47675:8;47685:4;47691:2;47695;47699:6;47707:4;47644:30;:68::i;:::-;47069:651;;46900:820;;;;;:::o;43078:310::-;43180:4;-1:-1:-1;;;;;;43217:41:0;;-1:-1:-1;;;43217:41:0;;:110;;-1:-1:-1;;;;;;;43275:52:0;;-1:-1:-1;;;43275:52:0;43217:110;:163;;;-1:-1:-1;;;;;;;;;;40595:40:0;;;43344:36;40486:157;57353:198;57473:16;;;57487:1;57473:16;;;;;;;;;57419;;57448:22;;57473:16;;;;;;;;;;;;-1:-1:-1;57473:16:0;57448:41;;57511:7;57500:5;57506:1;57500:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;57538:5;57353:198;-1:-1:-1;;57353:198:0:o;63593:995::-;63815:9;63810:771;63834:3;:10;63830:1;:14;63810:771;;;63871:11;:19;63883:3;63887:1;63883:6;;;;;;;;:::i;:::-;;;;;;;;;;;;63871:19;;;;;;;;;;-1:-1:-1;63871:19:0;:26;;;63867:703;;;63985:4;-1:-1:-1;;;;;63948:41:0;:33;63974:3;63978:1;63974:6;;;;;;;;:::i;:::-;;;;;;;63948:25;:33::i;:::-;-1:-1:-1;;;;;63948:41:0;;63918:156;;;;-1:-1:-1;;;63918:156:0;;41299:2:1;63918:156:0;;;41281:21:1;41338:2;41318:18;;;41311:30;41377:34;41357:18;;;41350:62;-1:-1:-1;;;41428:18:1;;;41421:39;41477:19;;63918:156:0;41097:405:1;63918:156:0;64123:7;64131:1;64123:10;;;;;;;;:::i;:::-;;;;;;;64137:1;64123:15;64093:144;;;;-1:-1:-1;;;64093:144:0;;41709:2:1;64093:144:0;;;41691:21:1;41748:2;41728:18;;;41721:30;41787:34;41767:18;;;41760:62;41858:25;41838:18;;;41831:53;41901:19;;64093:144:0;41507:419:1;64093:144:0;64284:2;64256:11;:19;64268:3;64272:1;64268:6;;;;;;;;:::i;:::-;;;;;;;64256:19;;;;;;;;;;;:25;;;:30;;;;;-1:-1:-1;;;;;64256:30:0;;;;;-1:-1:-1;;;;;64256:30:0;;;;;;64329:3;64333:1;64329:6;;;;;;;;:::i;:::-;;;;;;;64325:2;-1:-1:-1;;;;;64310:26:0;64319:4;-1:-1:-1;;;;;64310:26:0;;;;;;;;;;;-1:-1:-1;;;;;64359:18:0;;;64355:93;;-1:-1:-1;;;;;64402:21:0;;;;;;:15;:21;;;;;:26;;64427:1;;64402:21;:26;;64427:1;;64402:26;:::i;:::-;;;;-1:-1:-1;;64355:93:0;-1:-1:-1;;;;;64470:16:0;;;64466:89;;-1:-1:-1;;;;;64511:19:0;;;;;;:15;:19;;;;;:24;;64534:1;;64511:19;:24;;64534:1;;64511:24;:::i;:::-;;;;-1:-1:-1;;64466:89:0;63846:4;;;;:::i;:::-;;;;63810:771;;55780:744;-1:-1:-1;;;;;55995:13:0;;32674:20;32722:8;55991:526;;56031:72;;-1:-1:-1;;;56031:72:0;;-1:-1:-1;;;;;56031:38:0;;;;;:72;;56070:8;;56080:4;;56086:2;;56090:6;;56098:4;;56031:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56031:72:0;;;;;;;;-1:-1:-1;;56031:72:0;;;;;;;;;;;;:::i;:::-;;;56027:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;56379:6;56372:14;;-1:-1:-1;;;56372:14:0;;;;;;;;:::i;56027:479::-;;;56428:62;;-1:-1:-1;;;56428:62:0;;43559:2:1;56428:62:0;;;43541:21:1;43598:2;43578:18;;;43571:30;43637:34;43617:18;;;43610:62;-1:-1:-1;;;43688:18:1;;;43681:50;43748:19;;56428:62:0;43357:416:1;56027:479:0;-1:-1:-1;;;;;;56153:55:0;;-1:-1:-1;;;56153:55:0;56149:154;;56233:50;;-1:-1:-1;;;56233:50:0;;;;;;;:::i;56532:813::-;-1:-1:-1;;;;;56772:13:0;;32674:20;32722:8;56768:570;;56808:79;;-1:-1:-1;;;56808:79:0;;-1:-1:-1;;;;;56808:43:0;;;;;:79;;56852:8;;56862:4;;56868:3;;56873:7;;56882:4;;56808:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56808:79:0;;;;;;;;-1:-1:-1;;56808:79:0;;;;;;;;;;;;:::i;:::-;;;56804:523;;;;:::i;:::-;-1:-1:-1;;;;;;56969:60:0;;-1:-1:-1;;;56969:60:0;56965:159;;57054:50;;-1:-1:-1;;;57054:50:0;;;;;;;:::i;16164:830::-;16289:4;16329;16289;16346:525;16370:5;:12;16366:1;:16;16346:525;;;16404:20;16427:5;16433:1;16427:8;;;;;;;;:::i;:::-;;;;;;;16404:31;;16472:12;16456;:28;16452:408;;16609:44;;;;;;45176:19:1;;;45211:12;;;45204:28;;;45248:12;;16609:44:0;;;;;;;;;;;;16599:55;;;;;;16584:70;;16452:408;;;16799:44;;;;;;45176:19:1;;;45211:12;;;45204:28;;;45248:12;;16799:44:0;;;;;;;;;;;;16789:55;;;;;;16774:70;;16452:408;-1:-1:-1;16384:3:0;;;;:::i;:::-;;;;16346:525;;;-1:-1:-1;16966:20:0;;;;16164:830;-1:-1:-1;;;16164:830:0:o;96605:660::-;96654:10;96678:14;96694:16;96717:9;;;;;;;;;-1:-1:-1;;;;;96717:9:0;-1:-1:-1;;;;;96717:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;96782:9:0;;96829:11;;96677:67;;-1:-1:-1;96677:67:0;;-1:-1:-1;96758:17:0;;-1:-1:-1;;;;;96782:9:0;;;;:22;;-1:-1:-1;96819:21:0;;-1:-1:-1;;;;;96829:11:0;96677:67;96819:21;:::i;:::-;96782:69;;-1:-1:-1;;;;;;96782:69:0;;;;;;;-1:-1:-1;;;;;2788:35:1;;;96782:69:0;;;2770:54:1;2743:18;;96782:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;96755:96;;;;;;96862:22;96911:1;96887:13;:26;:120;;96975:15;;96994:13;;96943:28;96994:13;96943:12;:28;:::i;:::-;96942:48;;;;:::i;:::-;96941:66;;;;:::i;:::-;96887:120;;;96923:1;96887:120;96862:145;;97041:18;;97022:15;:37;97018:96;;97083:19;97076:26;;;;;;96605:660;:::o;97018:96::-;97148:18;;97147:19;;;:::i;:::-;97128:15;:38;97124:97;;97190:19;97183:26;;;;;;96605:660;:::o;97124:97::-;97239:18;97232:25;;;;;;96605:660;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;652:131::-;-1:-1:-1;;;;;;726:32:1;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;:::-;1022:5;788:245;-1:-1:-1;;;788:245:1:o;1230:247::-;1289:6;1342:2;1330:9;1321:7;1317:23;1313:32;1310:52;;;1358:1;1355;1348:12;1310:52;1397:9;1384:23;1416:31;1441:5;1416:31;:::i;1482:258::-;1554:1;1564:113;1578:6;1575:1;1572:13;1564:113;;;1654:11;;;1648:18;1635:11;;;1628:39;1600:2;1593:10;1564:113;;;1695:6;1692:1;1689:13;1686:48;;;-1:-1:-1;;1730:1:1;1712:16;;1705:27;1482:258::o;1745:::-;1787:3;1825:5;1819:12;1852:6;1847:3;1840:19;1868:63;1924:6;1917:4;1912:3;1908:14;1901:4;1894:5;1890:16;1868:63;:::i;:::-;1985:2;1964:15;-1:-1:-1;;1960:29:1;1951:39;;;;1992:4;1947:50;;1745:258;-1:-1:-1;;1745:258:1:o;2008:220::-;2157:2;2146:9;2139:21;2120:4;2177:45;2218:2;2207:9;2203:18;2195:6;2177:45;:::i;2233:180::-;2292:6;2345:2;2333:9;2324:7;2320:23;2316:32;2313:52;;;2361:1;2358;2351:12;2313:52;-1:-1:-1;2384:23:1;;2233:180;-1:-1:-1;2233:180:1:o;3040:456::-;3117:6;3125;3133;3186:2;3174:9;3165:7;3161:23;3157:32;3154:52;;;3202:1;3199;3192:12;3154:52;3241:9;3228:23;3260:31;3285:5;3260:31;:::i;:::-;3310:5;-1:-1:-1;3367:2:1;3352:18;;3339:32;3380:33;3339:32;3380:33;:::i;:::-;3040:456;;3432:7;;-1:-1:-1;;;3486:2:1;3471:18;;;;3458:32;;3040:456::o;3501:271::-;3592:6;3600;3653:2;3641:9;3632:7;3628:23;3624:32;3621:52;;;3669:1;3666;3659:12;3621:52;-1:-1:-1;;3692:23:1;;;3762:2;3747:18;;;3734:32;;-1:-1:-1;3501:271:1:o;3777:127::-;3838:10;3833:3;3829:20;3826:1;3819:31;3869:4;3866:1;3859:15;3893:4;3890:1;3883:15;3909:249;4019:2;4000:13;;-1:-1:-1;;3996:27:1;3984:40;;-1:-1:-1;;;;;4039:34:1;;4075:22;;;4036:62;4033:88;;;4101:18;;:::i;:::-;4137:2;4130:22;-1:-1:-1;;3909:249:1:o;4163:183::-;4223:4;-1:-1:-1;;;;;4248:6:1;4245:30;4242:56;;;4278:18;;:::i;:::-;-1:-1:-1;4323:1:1;4319:14;4335:4;4315:25;;4163:183::o;4351:724::-;4405:5;4458:3;4451:4;4443:6;4439:17;4435:27;4425:55;;4476:1;4473;4466:12;4425:55;4512:6;4499:20;4538:4;4561:43;4601:2;4561:43;:::i;:::-;4633:2;4627:9;4645:31;4673:2;4665:6;4645:31;:::i;:::-;4711:18;;;4803:1;4799:10;;;;4787:23;;4783:32;;;4745:15;;;;-1:-1:-1;4827:15:1;;;4824:35;;;4855:1;4852;4845:12;4824:35;4891:2;4883:6;4879:15;4903:142;4919:6;4914:3;4911:15;4903:142;;;4985:17;;4973:30;;5023:12;;;;4936;;4903:142;;;-1:-1:-1;5063:6:1;4351:724;-1:-1:-1;;;;;;4351:724:1:o;5080:555::-;5122:5;5175:3;5168:4;5160:6;5156:17;5152:27;5142:55;;5193:1;5190;5183:12;5142:55;5229:6;5216:20;-1:-1:-1;;;;;5251:2:1;5248:26;5245:52;;;5277:18;;:::i;:::-;5326:2;5320:9;5338:67;5393:2;5374:13;;-1:-1:-1;;5370:27:1;5399:4;5366:38;5320:9;5338:67;:::i;:::-;5429:2;5421:6;5414:18;5475:3;5468:4;5463:2;5455:6;5451:15;5447:26;5444:35;5441:55;;;5492:1;5489;5482:12;5441:55;5556:2;5549:4;5541:6;5537:17;5530:4;5522:6;5518:17;5505:54;5603:1;5579:15;;;5596:4;5575:26;5568:37;;;;5583:6;5080:555;-1:-1:-1;;;5080:555:1:o;5640:1071::-;5794:6;5802;5810;5818;5826;5879:3;5867:9;5858:7;5854:23;5850:33;5847:53;;;5896:1;5893;5886:12;5847:53;5935:9;5922:23;5954:31;5979:5;5954:31;:::i;:::-;6004:5;-1:-1:-1;6061:2:1;6046:18;;6033:32;6074:33;6033:32;6074:33;:::i;:::-;6126:7;-1:-1:-1;6184:2:1;6169:18;;6156:32;-1:-1:-1;;;;;6237:14:1;;;6234:34;;;6264:1;6261;6254:12;6234:34;6287:61;6340:7;6331:6;6320:9;6316:22;6287:61;:::i;:::-;6277:71;;6401:2;6390:9;6386:18;6373:32;6357:48;;6430:2;6420:8;6417:16;6414:36;;;6446:1;6443;6436:12;6414:36;6469:63;6524:7;6513:8;6502:9;6498:24;6469:63;:::i;:::-;6459:73;;6585:3;6574:9;6570:19;6557:33;6541:49;;6615:2;6605:8;6602:16;6599:36;;;6631:1;6628;6621:12;6599:36;;6654:51;6697:7;6686:8;6675:9;6671:24;6654:51;:::i;:::-;6644:61;;;5640:1071;;;;;;;;:::o;6716:592::-;6787:6;6795;6848:2;6836:9;6827:7;6823:23;6819:32;6816:52;;;6864:1;6861;6854:12;6816:52;6904:9;6891:23;-1:-1:-1;;;;;6974:2:1;6966:6;6963:14;6960:34;;;6990:1;6987;6980:12;6960:34;7028:6;7017:9;7013:22;7003:32;;7073:7;7066:4;7062:2;7058:13;7054:27;7044:55;;7095:1;7092;7085:12;7044:55;7135:2;7122:16;7161:2;7153:6;7150:14;7147:34;;;7177:1;7174;7167:12;7147:34;7222:7;7217:2;7208:6;7204:2;7200:15;7196:24;7193:37;7190:57;;;7243:1;7240;7233:12;7190:57;7274:2;7266:11;;;;;7296:6;;-1:-1:-1;6716:592:1;;-1:-1:-1;;;;6716:592:1:o;7313:367::-;7376:8;7386:6;7440:3;7433:4;7425:6;7421:17;7417:27;7407:55;;7458:1;7455;7448:12;7407:55;-1:-1:-1;7481:20:1;;-1:-1:-1;;;;;7513:30:1;;7510:50;;;7556:1;7553;7546:12;7510:50;7593:4;7585:6;7581:17;7569:29;;7653:3;7646:4;7636:6;7633:1;7629:14;7621:6;7617:27;7613:38;7610:47;7607:67;;;7670:1;7667;7660:12;7607:67;7313:367;;;;;:::o;7685:437::-;7771:6;7779;7832:2;7820:9;7811:7;7807:23;7803:32;7800:52;;;7848:1;7845;7838:12;7800:52;7888:9;7875:23;-1:-1:-1;;;;;7913:6:1;7910:30;7907:50;;;7953:1;7950;7943:12;7907:50;7992:70;8054:7;8045:6;8034:9;8030:22;7992:70;:::i;:::-;8081:8;;7966:96;;-1:-1:-1;7685:437:1;-1:-1:-1;;;;7685:437:1:o;9362:1277::-;9480:6;9488;9541:2;9529:9;9520:7;9516:23;9512:32;9509:52;;;9557:1;9554;9547:12;9509:52;9597:9;9584:23;-1:-1:-1;;;;;9667:2:1;9659:6;9656:14;9653:34;;;9683:1;9680;9673:12;9653:34;9721:6;9710:9;9706:22;9696:32;;9766:7;9759:4;9755:2;9751:13;9747:27;9737:55;;9788:1;9785;9778:12;9737:55;9824:2;9811:16;9846:4;9869:43;9909:2;9869:43;:::i;:::-;9941:2;9935:9;9953:31;9981:2;9973:6;9953:31;:::i;:::-;10019:18;;;10107:1;10103:10;;;;10095:19;;10091:28;;;10053:15;;;;-1:-1:-1;10131:19:1;;;10128:39;;;10163:1;10160;10153:12;10128:39;10187:11;;;;10207:217;10223:6;10218:3;10215:15;10207:217;;;10303:3;10290:17;10320:31;10345:5;10320:31;:::i;:::-;10364:18;;10240:12;;;;10402;;;;10207:217;;;10443:6;-1:-1:-1;;10487:18:1;;10474:32;;-1:-1:-1;;10518:16:1;;;10515:36;;;10547:1;10544;10537:12;10515:36;;10570:63;10625:7;10614:8;10603:9;10599:24;10570:63;:::i;:::-;10560:73;;;9362:1277;;;;;:::o;10644:435::-;10697:3;10735:5;10729:12;10762:6;10757:3;10750:19;10788:4;10817:2;10812:3;10808:12;10801:19;;10854:2;10847:5;10843:14;10875:1;10885:169;10899:6;10896:1;10893:13;10885:169;;;10960:13;;10948:26;;10994:12;;;;11029:15;;;;10921:1;10914:9;10885:169;;;-1:-1:-1;11070:3:1;;10644:435;-1:-1:-1;;;;;10644:435:1:o;11084:261::-;11263:2;11252:9;11245:21;11226:4;11283:56;11335:2;11324:9;11320:18;11312:6;11283:56;:::i;11350:1180::-;11540:6;11548;11556;11564;11572;11580;11588;11641:3;11629:9;11620:7;11616:23;11612:33;11609:53;;;11658:1;11655;11648:12;11609:53;11694:9;11681:23;11671:33;;11755:2;11744:9;11740:18;11727:32;-1:-1:-1;;;;;11819:2:1;11811:6;11808:14;11805:34;;;11835:1;11832;11825:12;11805:34;11874:70;11936:7;11927:6;11916:9;11912:22;11874:70;:::i;:::-;11963:8;;-1:-1:-1;11848:96:1;-1:-1:-1;12051:2:1;12036:18;;12023:32;;-1:-1:-1;12067:16:1;;;12064:36;;;12096:1;12093;12086:12;12064:36;12135:72;12199:7;12188:8;12177:9;12173:24;12135:72;:::i;:::-;12226:8;;-1:-1:-1;12109:98:1;-1:-1:-1;12314:2:1;12299:18;;12286:32;;-1:-1:-1;12330:16:1;;;12327:36;;;12359:1;12356;12349:12;12327:36;;12398:72;12462:7;12451:8;12440:9;12436:24;12398:72;:::i;:::-;11350:1180;;;;-1:-1:-1;11350:1180:1;;-1:-1:-1;11350:1180:1;;;;12372:98;;-1:-1:-1;;;11350:1180:1:o;12535:315::-;12603:6;12611;12664:2;12652:9;12643:7;12639:23;12635:32;12632:52;;;12680:1;12677;12670:12;12632:52;12716:9;12703:23;12693:33;;12776:2;12765:9;12761:18;12748:32;12789:31;12814:5;12789:31;:::i;:::-;12839:5;12829:15;;;12535:315;;;;;:::o;13091:406::-;13191:6;13199;13207;13260:2;13248:9;13239:7;13235:23;13231:32;13228:52;;;13276:1;13273;13266:12;13228:52;13315:9;13302:23;13334:31;13359:5;13334:31;:::i;:::-;13384:5;13436:2;13421:18;;13408:32;;-1:-1:-1;13487:2:1;13472:18;;;13459:32;;13091:406;-1:-1:-1;;;13091:406:1:o;13502:416::-;13567:6;13575;13628:2;13616:9;13607:7;13603:23;13599:32;13596:52;;;13644:1;13641;13634:12;13596:52;13683:9;13670:23;13702:31;13727:5;13702:31;:::i;:::-;13752:5;-1:-1:-1;13809:2:1;13794:18;;13781:32;13851:15;;13844:23;13832:36;;13822:64;;13882:1;13879;13872:12;13923:665;14018:6;14026;14034;14042;14095:3;14083:9;14074:7;14070:23;14066:33;14063:53;;;14112:1;14109;14102:12;14063:53;14151:9;14138:23;14170:31;14195:5;14170:31;:::i;:::-;14220:5;-1:-1:-1;14277:2:1;14262:18;;14249:32;14290:33;14249:32;14290:33;:::i;:::-;14342:7;-1:-1:-1;14396:2:1;14381:18;;14368:32;;-1:-1:-1;14451:2:1;14436:18;;14423:32;-1:-1:-1;;;;;14467:30:1;;14464:50;;;14510:1;14507;14500:12;14464:50;14533:49;14574:7;14565:6;14554:9;14550:22;14533:49;:::i;:::-;14523:59;;;13923:665;;;;;;;:::o;15101:864::-;15255:6;15263;15271;15279;15287;15340:2;15328:9;15319:7;15315:23;15311:32;15308:52;;;15356:1;15353;15346:12;15308:52;15392:9;15379:23;15369:33;;15453:2;15442:9;15438:18;15425:32;-1:-1:-1;;;;;15517:2:1;15509:6;15506:14;15503:34;;;15533:1;15530;15523:12;15503:34;15572:70;15634:7;15625:6;15614:9;15610:22;15572:70;:::i;:::-;15661:8;;-1:-1:-1;15546:96:1;-1:-1:-1;15749:2:1;15734:18;;15721:32;;-1:-1:-1;15765:16:1;;;15762:36;;;15794:1;15791;15784:12;15762:36;;15833:72;15897:7;15886:8;15875:9;15871:24;15833:72;:::i;:::-;15101:864;;;;-1:-1:-1;15101:864:1;;-1:-1:-1;15924:8:1;;15807:98;15101:864;-1:-1:-1;;;15101:864:1:o;15970:1272::-;16192:6;16200;16208;16216;16224;16232;16240;16248;16301:3;16289:9;16280:7;16276:23;16272:33;16269:53;;;16318:1;16315;16308:12;16269:53;16354:9;16341:23;16331:33;;16415:2;16404:9;16400:18;16387:32;-1:-1:-1;;;;;16479:2:1;16471:6;16468:14;16465:34;;;16495:1;16492;16485:12;16465:34;16534:70;16596:7;16587:6;16576:9;16572:22;16534:70;:::i;:::-;16623:8;;-1:-1:-1;16508:96:1;-1:-1:-1;16711:2:1;16696:18;;16683:32;;-1:-1:-1;16727:16:1;;;16724:36;;;16756:1;16753;16746:12;16724:36;16795:72;16859:7;16848:8;16837:9;16833:24;16795:72;:::i;:::-;16886:8;;-1:-1:-1;16769:98:1;-1:-1:-1;16974:2:1;16959:18;;16946:32;;-1:-1:-1;16990:16:1;;;16987:36;;;17019:1;17016;17009:12;16987:36;;17058:72;17122:7;17111:8;17100:9;17096:24;17058:72;:::i;:::-;15970:1272;;;;-1:-1:-1;15970:1272:1;;;;;;17032:98;;17231:3;17216:19;17203:33;;15970:1272;-1:-1:-1;;;;15970:1272:1:o;17247:388::-;17315:6;17323;17376:2;17364:9;17355:7;17351:23;17347:32;17344:52;;;17392:1;17389;17382:12;17344:52;17431:9;17418:23;17450:31;17475:5;17450:31;:::i;:::-;17500:5;-1:-1:-1;17557:2:1;17542:18;;17529:32;17570:33;17529:32;17570:33;:::i;17903:734::-;18007:6;18015;18023;18031;18039;18092:3;18080:9;18071:7;18067:23;18063:33;18060:53;;;18109:1;18106;18099:12;18060:53;18148:9;18135:23;18167:31;18192:5;18167:31;:::i;:::-;18217:5;-1:-1:-1;18274:2:1;18259:18;;18246:32;18287:33;18246:32;18287:33;:::i;:::-;18339:7;-1:-1:-1;18393:2:1;18378:18;;18365:32;;-1:-1:-1;18444:2:1;18429:18;;18416:32;;-1:-1:-1;18499:3:1;18484:19;;18471:33;-1:-1:-1;;;;;18516:30:1;;18513:50;;;18559:1;18556;18549:12;18513:50;18582:49;18623:7;18614:6;18603:9;18599:22;18582:49;:::i;18642:133::-;-1:-1:-1;;;;;18720:5:1;18716:34;18709:5;18706:45;18696:73;;18765:1;18762;18755:12;18780:245;18838:6;18891:2;18879:9;18870:7;18866:23;18862:32;18859:52;;;18907:1;18904;18897:12;18859:52;18946:9;18933:23;18965:30;18989:5;18965:30;:::i;19442:356::-;19644:2;19626:21;;;19663:18;;;19656:30;19722:34;19717:2;19702:18;;19695:62;19789:2;19774:18;;19442:356::o;19803:355::-;20005:2;19987:21;;;20044:2;20024:18;;;20017:30;20083:33;20078:2;20063:18;;20056:61;20149:2;20134:18;;19803:355::o;20519:380::-;20598:1;20594:12;;;;20641;;;20662:61;;20716:4;20708:6;20704:17;20694:27;;20662:61;20769:2;20761:6;20758:14;20738:18;20735:38;20732:161;;;20815:10;20810:3;20806:20;20803:1;20796:31;20850:4;20847:1;20840:15;20878:4;20875:1;20868:15;20732:161;;20519:380;;;:::o;21731:413::-;21933:2;21915:21;;;21972:2;21952:18;;;21945:30;22011:34;22006:2;21991:18;;21984:62;-1:-1:-1;;;22077:2:1;22062:18;;22055:47;22134:3;22119:19;;21731:413::o;22149:349::-;22351:2;22333:21;;;22390:2;22370:18;;;22363:30;22429:27;22424:2;22409:18;;22402:55;22489:2;22474:18;;22149:349::o;23295:390::-;23454:2;23443:9;23436:21;23493:6;23488:2;23477:9;23473:18;23466:34;23550:6;23542;23537:2;23526:9;23522:18;23509:48;23606:1;23577:22;;;23601:2;23573:31;;;23566:42;;;;23669:2;23648:15;;;-1:-1:-1;;23644:29:1;23629:45;23625:54;;23295:390;-1:-1:-1;23295:390:1:o;24100:127::-;24161:10;24156:3;24152:20;24149:1;24142:31;24192:4;24189:1;24182:15;24216:4;24213:1;24206:15;24232:127;24293:10;24288:3;24284:20;24281:1;24274:31;24324:4;24321:1;24314:15;24348:4;24345:1;24338:15;24364:135;24403:3;-1:-1:-1;;24424:17:1;;24421:43;;;24444:18;;:::i;:::-;-1:-1:-1;24491:1:1;24480:13;;24364:135::o;24504:345::-;24706:2;24688:21;;;24745:2;24725:18;;;24718:30;-1:-1:-1;;;24779:2:1;24764:18;;24757:51;24840:2;24825:18;;24504:345::o;24854:343::-;25056:2;25038:21;;;25095:2;25075:18;;;25068:30;-1:-1:-1;;;25129:2:1;25114:18;;25107:49;25188:2;25173:18;;24854:343::o;25478:397::-;25680:2;25662:21;;;25719:2;25699:18;;;25692:30;25758:34;25753:2;25738:18;;25731:62;-1:-1:-1;;;25824:2:1;25809:18;;25802:31;25865:3;25850:19;;25478:397::o;26598:125::-;26638:4;26666:1;26663;26660:8;26657:34;;;26671:18;;:::i;:::-;-1:-1:-1;26708:9:1;;26598:125::o;26728:414::-;26930:2;26912:21;;;26969:2;26949:18;;;26942:30;27008:34;27003:2;26988:18;;26981:62;-1:-1:-1;;;27074:2:1;27059:18;;27052:48;27132:3;27117:19;;26728:414::o;27779:470::-;27958:3;27996:6;27990:13;28012:53;28058:6;28053:3;28046:4;28038:6;28034:17;28012:53;:::i;:::-;28128:13;;28087:16;;;;28150:57;28128:13;28087:16;28184:4;28172:17;;28150:57;:::i;:::-;28223:20;;27779:470;-1:-1:-1;;;;27779:470:1:o;29318:431::-;29434:6;29429:3;29422:19;29404:3;29460:4;29489:2;29484:3;29480:12;29473:19;;29515:5;29538:1;29548:176;29562:6;29559:1;29556:13;29548:176;;;29623:20;;29611:33;;29664:12;;;;29699:15;;;;29584:1;29577:9;29548:176;;29754:354;29842:19;;;29824:3;-1:-1:-1;;;;;29873:31:1;;29870:51;;;29917:1;29914;29907:12;29870:51;29953:6;29950:1;29946:14;30005:8;29998:5;29991:4;29986:3;29982:14;29969:45;30082:1;30037:18;;30057:4;30033:29;30071:13;;;-1:-1:-1;30033:29:1;;29754:354;-1:-1:-1;;29754:354:1:o;30113:702::-;30469:6;30458:9;30451:25;30512:6;30507:2;30496:9;30492:18;30485:34;30555:3;30550:2;30539:9;30535:18;30528:31;30432:4;30582:90;30667:3;30656:9;30652:19;30644:6;30636;30582:90;:::i;:::-;30720:9;30712:6;30708:22;30703:2;30692:9;30688:18;30681:50;30748:61;30802:6;30794;30786;30748:61;:::i;:::-;30740:69;30113:702;-1:-1:-1;;;;;;;;;30113:702:1:o;31637:128::-;31677:3;31708:1;31704:6;31701:1;31698:13;31695:39;;;31714:18;;:::i;:::-;-1:-1:-1;31750:9:1;;31637:128::o;34309:401::-;34511:2;34493:21;;;34550:2;34530:18;;;34523:30;34589:34;34584:2;34569:18;;34562:62;-1:-1:-1;;;34655:2:1;34640:18;;34633:35;34700:3;34685:19;;34309:401::o;34715:406::-;34917:2;34899:21;;;34956:2;34936:18;;;34929:30;34995:34;34990:2;34975:18;;34968:62;-1:-1:-1;;;35061:2:1;35046:18;;35039:40;35111:3;35096:19;;34715:406::o;35126:465::-;35383:2;35372:9;35365:21;35346:4;35409:56;35461:2;35450:9;35446:18;35438:6;35409:56;:::i;:::-;35513:9;35505:6;35501:22;35496:2;35485:9;35481:18;35474:50;35541:44;35578:6;35570;35541:44;:::i;:::-;35533:52;35126:465;-1:-1:-1;;;;;35126:465:1:o;35596:355::-;35826:6;35815:9;35808:25;35869:2;35864;35853:9;35849:18;35842:30;35789:4;35889:56;35941:2;35930:9;35926:18;35918:6;35889:56;:::i;36664:941::-;37029:26;37025:31;37016:6;37012:2;37008:15;37004:53;36999:3;36992:66;36974:3;37089:2;37084:3;37080:12;37138:6;37162:1;37172:209;37186:6;37183:1;37180:13;37172:209;;;37249:20;;37235:35;;37293:4;37319:14;;;;37356:15;;;;37208:1;37201:9;37172:209;;;-1:-1:-1;;;;;;;37393:31:1;;37390:51;;;37437:1;37434;37427:12;37390:51;37471:6;37468:1;37464:14;37515:6;37507;37500:5;37487:35;37579:1;37541:18;;37568:13;;;37541:18;36664:941;-1:-1:-1;;;;;;;36664:941:1:o;37952:728::-;38290:25;;;-1:-1:-1;;;;;38351:32:1;;38346:2;38331:18;;38324:60;38420:3;38415:2;38400:18;;38393:31;;;-1:-1:-1;;38447:90:1;;38517:19;;38509:6;38501;38447:90;:::i;39843:489::-;-1:-1:-1;;;;;40112:15:1;;;40094:34;;40164:15;;40159:2;40144:18;;40137:43;40211:2;40196:18;;40189:34;;;40259:3;40254:2;40239:18;;40232:31;;;40037:4;;40280:46;;40306:19;;40298:6;40280:46;:::i;:::-;40272:54;39843:489;-1:-1:-1;;;;;;39843:489:1:o;40337:249::-;40406:6;40459:2;40447:9;40438:7;40434:23;40430:32;40427:52;;;40475:1;40472;40465:12;40427:52;40507:9;40501:16;40526:30;40550:5;40526:30;:::i;40591:127::-;40652:10;40647:3;40643:20;40640:1;40633:31;40683:4;40680:1;40673:15;40707:4;40704:1;40697:15;40723:127;40784:10;40779:3;40775:20;40772:1;40765:31;40815:4;40812:1;40805:15;40839:4;40836:1;40829:15;40855:120;40895:1;40921;40911:35;;40926:18;;:::i;:::-;-1:-1:-1;40960:9:1;;40855:120::o;40980:112::-;41012:1;41038;41028:35;;41043:18;;:::i;:::-;-1:-1:-1;41077:9:1;;40980:112::o;41931:561::-;-1:-1:-1;;;;;42228:15:1;;;42210:34;;42280:15;;42275:2;42260:18;;42253:43;42327:2;42312:18;;42305:34;;;42370:2;42355:18;;42348:34;;;42190:3;42413;42398:19;;42391:32;;;42153:4;;42440:46;;42466:19;;42458:6;42440:46;:::i;:::-;42432:54;41931:561;-1:-1:-1;;;;;;;41931:561:1:o;42497:179::-;42532:3;42574:1;42556:16;42553:23;42550:120;;;42620:1;42617;42614;42599:23;-1:-1:-1;42657:1:1;42651:8;42646:3;42642:18;42550:120;42497:179;:::o;42681:671::-;42720:3;42762:4;42744:16;42741:26;42738:39;;;42681:671;:::o;42738:39::-;42804:2;42798:9;-1:-1:-1;;42869:16:1;42865:25;;42862:1;42798:9;42841:50;42920:4;42914:11;42944:16;-1:-1:-1;;;;;43050:2:1;43043:4;43035:6;43031:17;43028:25;43023:2;43015:6;43012:14;43009:45;43006:58;;;43057:5;;;;;42681:671;:::o;43006:58::-;43094:6;43088:4;43084:17;43073:28;;43130:3;43124:10;43157:2;43149:6;43146:14;43143:27;;;43163:5;;;;;;42681:671;:::o;43143:27::-;43247:2;43228:16;43222:4;43218:27;43214:36;43207:4;43198:6;43193:3;43189:16;43185:27;43182:69;43179:82;;;43254:5;;;;;;42681:671;:::o;43179:82::-;43270:57;43321:4;43312:6;43304;43300:19;43296:30;43290:4;43270:57;:::i;:::-;-1:-1:-1;43343:3:1;;42681:671;-1:-1:-1;;;;;42681:671:1:o;43778:404::-;43980:2;43962:21;;;44019:2;43999:18;;;43992:30;44058:34;44053:2;44038:18;;44031:62;-1:-1:-1;;;44124:2:1;44109:18;;44102:38;44172:3;44157:19;;43778:404::o;44187:827::-;-1:-1:-1;;;;;44584:15:1;;;44566:34;;44636:15;;44631:2;44616:18;;44609:43;44546:3;44683:2;44668:18;;44661:31;;;44509:4;;44715:57;;44752:19;;44744:6;44715:57;:::i;:::-;44820:9;44812:6;44808:22;44803:2;44792:9;44788:18;44781:50;44854:44;44891:6;44883;44854:44;:::i;:::-;44840:58;;44947:9;44939:6;44935:22;44929:3;44918:9;44914:19;44907:51;44975:33;45001:6;44993;44975:33;:::i;:::-;44967:41;44187:827;-1:-1:-1;;;;;;;;44187:827:1:o;45271:565::-;45374:6;45382;45390;45398;45406;45459:3;45447:9;45438:7;45434:23;45430:33;45427:53;;;45476:1;45473;45466:12;45427:53;45508:9;45502:16;45527:30;45551:5;45527:30;:::i;:::-;45576:5;45566:15;;;45621:2;45610:9;45606:18;45600:25;45590:35;;45665:2;45654:9;45650:18;45644:25;45634:35;;45709:2;45698:9;45694:18;45688:25;45678:35;;45758:3;45747:9;45743:19;45737:26;45772:32;45796:7;45772:32;:::i;:::-;45823:7;45813:17;;;45271:565;;;;;;;;:::o;45841:233::-;45880:4;-1:-1:-1;;;;;45981:10:1;;;;45951;;46003:12;;;46000:38;;;46018:18;;:::i;:::-;46055:13;;45841:233;-1:-1:-1;;;45841:233:1:o;46079:267::-;46118:4;46147:9;;;46172:10;;-1:-1:-1;;;46191:19:1;;46184:27;;46168:44;46165:70;;;46215:18;;:::i;:::-;-1:-1:-1;;;;;46262:27:1;;46255:35;;46247:44;;46244:70;;;46294:18;;:::i;:::-;-1:-1:-1;;46331:9:1;;46079:267::o;46351:553::-;46390:7;-1:-1:-1;;;;;46460:9:1;;;46488;;;46513:11;;;46532:10;;;46526:17;;46509:35;46506:61;;;46547:18;;:::i;:::-;-1:-1:-1;;;46623:1:1;46616:9;;46641:11;;;46661;;;46654:19;;46637:37;46634:63;;;46677:18;;:::i;:::-;46723:1;46720;46716:9;46706:19;;46770:1;46766:2;46761:11;46758:1;46754:19;46749:2;46745;46741:11;46737:37;46734:63;;;46777:18;;:::i;:::-;46842:1;46838:2;46833:11;46830:1;46826:19;46821:2;46817;46813:11;46809:37;46806:63;;;46849:18;;:::i;:::-;-1:-1:-1;;;46889:9:1;;;;;46351:553;-1:-1:-1;;;46351:553:1:o;46909:193::-;46948:1;46974;46964:35;;46979:18;;:::i;:::-;-1:-1:-1;;;47015:18:1;;-1:-1:-1;;47035:13:1;;47011:38;47008:64;;;47052:18;;:::i;:::-;-1:-1:-1;47086:10:1;;46909:193::o;47107:136::-;47142:3;-1:-1:-1;;;47163:22:1;;47160:48;;;47188:18;;:::i;:::-;-1:-1:-1;47228:1:1;47224:13;;47107:136::o

Swarm Source

ipfs://e1225b47975ea9abaf0d75054e8631e5ec97e6a64b9c00d341a0feb872f7312b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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