ETH Price: $2,385.35 (-3.88%)

Token

Darkest Heroes (DARKEST)
 

Overview

Max Total Supply

36 DARKEST

Holders

19

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
housebound.eth
Balance
3 DARKEST
0x3Da00d8107DE86885e1c826F4eb4E5551B97D419
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:
Hero

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-31
*/

// SPDX-License-Identifier: UNLICENSED  
                                                                                                                                            
//                                      *@@                                                     .                                           
//                                      @@@@@                                                @@ *                                           
//                                      @@@@@@@@                                          ,@@@%&                                            
//                                       @@@@@@@@@                   @@*                 @@@@@@,                                            
//                                       &@@@@@@@@@@@  .          &@@@@/@. #            @@@@@@#                                             
//                                        @@@.  @@@@@@@@       (@@@@& %@@@#*.*     @    ,(@@@@@                                             
//                                        .@@@@@&@@@@@@@@@ .@@@@@@@#.   @@@@@@, @  @   @.@@@@,                                              
//                                         @@@@@@@@@@@@@@@@&@@@@@@%%&#(*(&@@@@*%(  .   @@@@@@                                               
//                                          @@@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@  @   &@@@@@(                                               
//                                           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  %   @@@@@@                                                
//                                           %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/ .   *@@@@@                                                 
//                                            @@@@@@@@&@@@@@@@@@@@@@@@@@@@@@@@@( @  *@@@@#,                                                 
//             @@@@@@@@@@@@@                  @##%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  %   ,(.*                                                   
//          @@@@@@@@@@@@@@@@@@@                @  @@@.@@@@@@@@@@@@@@@@@@@@@@@@@ / . ,(%&&                                                   
//           @@@@@@@@@@  @@@@@@@@                                                                                                           
//            @@@@@@@      @@@@@@@                                                                                                          
//            @@@@@@@      %@@@@@@       @@@@@        @@@@@@@@@       @@@/     @@@@      @@@@@@@@@      @@@@@@    @@@@@@@@@@@@@             
//            @@@@@@@      .@@@@@@    @@@@@@@@@@@    @@@@@@@@@@@@@   @@@@@/    @@@@    @@@@@((((((   @@@@@@@@@@@  @@@@@@@@@@@@@             
//            @@@@@@@      .@@@@@@   @@@@@    @@@@   ,@@@@    @@@@@   @@@@@   @@@@@    @@@@         @@@@     @@@@     @@@@*                 
//            @@@@@@@      .@@@@@@   @@@@     @@@@    @@@@   @@@@@    @@@@@ @@@@@@     @@@@         @@@@@(            @@@@*                 
//            @@@@@@@      *@@@@@@   @@@@     @@@@    @@@@@@@@@@      @@@@@@@@@@@      @@@@@@@@@@     @@@@@@@@        @@@@*                 
//            @@@@@@@      @@@@@@@   @@@@     @@@@    @@@@   @@@@@@   @@@@@   @@@@@    @@@@               @@@@@@@     @@@@/                 
//            @@@@@@@     @@@@@@@    @@@@@@@@@@@@@    @@@@    @@@@@   @@@@@    @@@@    @@@@          .@@     @@@@     @@@@/                 
//            @@@@@@@@@@@@@@@@@      @@@@     @@@@    @@@@    @@@@@   @@@@@    @@@@@   @@@@         @@@@@@  @@@@@     @@@@/                 
//            @@@@@@@@@@@@@@         @@@@     @@@@    @@@@     @@@@   @@@@@    @@@@@   @@@@@@@@@@@@   @@@@@@@@%       @@@@/                 
                                                                                                                                            
                                                                                                                                            
//                               @@@     /@@@    @@@@@@@@   @@@@@@@@        @@@@@      &@@@@@@@    @@@@@@                                   
//                     @@@@/(#   @@@     %@@@  #@@@         @@@@  @@@@/  &@@@. @@@@   @@@        @@@@  @@@@  @&@&@@@@@@@@@@@@@              
//    , @   *        ,@@@@@.(@@  @@@&    #@@@  #@@@         @@@@   @@@&  @@@    @@@@  @@@        @@@        @@@@@@@@@@@@@@@@@@@@@&          
//    @@@/ @@@ &@@%( .@@@@@ &@@  @@@@@@@@@@@@  #@@@@@@@@    @@@@@@@@@    @@@    @@@@  @@@@@@@@    @@@@@@    @@@@@@@@@@@@@@@@@@@@@@%*        
//   .&@@. &&@@&  @*.*@@@@@ @@@  @@@&    %@@@  #@@@         @@@@  (@@@@  @@@    @@@@  @@@             @@@@@  @@@@@@@@@@@@@&*&#,             
//      .           .@@@@@@.&@@  @@@&    %@@@  #@@@         @@@@   @@@@  @@@#   @@@@  @@@        @@@    @@@  @@@@@@,&@@@@@@@@@              
//                      .@@      @@@&    #@@@  #@@@@@@@@@   @@@@   &@@@   @@@@@@@@    @@@@@@@@@@  @@@@@@@@                                  
//                               ****    .***  *********    ****    ***      @@@      *********      @@                                     
                                                                                                                                            

// Libraries below are licensed under the terms determined by their respective owners/licensors
// START OF LIBRARY SECTIONS

// File: contracts/common/meta-transactions/Initializable.sol

pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

// File: contracts/common/meta-transactions/EIP712Base.sol



pragma solidity ^0.8.0;


contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}
// File: contracts/common/meta-transactions/ContentMixin.sol



pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

// File: openzeppelin-solidity/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: contracts/common/meta-transactions/NativeMetaTransaction.sol



pragma solidity ^0.8.0;



contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

// File: openzeppelin-solidity/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: openzeppelin-solidity/contracts/utils/Context.sol



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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: openzeppelin-solidity/contracts/access/Ownable.sol



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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

// File: openzeppelin-solidity/contracts/utils/Address.sol



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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol



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-solidity/contracts/utils/introspection/IERC165.sol



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-solidity/contracts/utils/introspection/ERC165.sol



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: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol



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-solidity/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: openzeppelin-solidity/contracts/token/ERC721/extensions/IERC721Metadata.sol



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-solidity/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping (uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping (address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0
            ? string(abi.encodePacked(baseURI, tokenId.toString()))
            : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

// File: openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/ERC721Tradable.sol



pragma solidity ^0.8.0;








contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title ERC721Tradable
 * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
abstract contract ERC721Tradable is ContextMixin, ERC721Enumerable, NativeMetaTransaction, Ownable {
    using SafeMath for uint256;

    address proxyRegistryAddress;
    uint256 private _currentTokenId = 0;

    constructor(
        string memory _name,
        string memory _symbol,
        address _proxyRegistryAddress
    ) ERC721(_name, _symbol) {
        proxyRegistryAddress = _proxyRegistryAddress;
        _initializeEIP712(_name);
    }

    /**
     * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    //function mintTo(address _to) public onlyOwner {}

    // function mintTo(address _to) virtual public onlyOwner {
    //     uint256 newTokenId = _getNextTokenId();
    //     _mint(_to, newTokenId);
    //     _incrementTokenId();
    // }

    /**
     * @dev calculates the next token ID based on value of _currentTokenId
     * @return uint256 for the next token ID
     */
    function _getNextTokenId() private view returns (uint256) {
        return _currentTokenId.add(1);
    }

    /**
     * @dev increments the value of _currentTokenId
     */
    function _incrementTokenId() private {
        _currentTokenId++;
    }

    function baseTokenURI() virtual public pure returns (string memory);

    function tokenURI(uint256 _tokenId) override public pure returns (string memory) {
        return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId)));
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // if (operator == address(0x58807baD0B376efc12F5AD86aAc70E78ed67deaE)) {
        //     return true;
        // }
        
        //Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender()
        internal
        override
        view
        returns (address sender)
    {
        return ContextMixin.msgSender();
    }
}

// END OF LIBRARY SECTION

// Below starts the core code of Darkest Heroes with license identifier: Unlicensed.

// File: contracts/Hero.sol

pragma solidity ^0.8.0;

/**
 * @title DarkestHeroes
 * Hero - a contract for non-fungible heroes.
 */
contract Hero is ERC721Tradable {

    enum CharacterType {Mob, Boss, Hero}

    uint256 constant MAX_LEVELS = 5;

    uint256 constant MAX_MOB_CARDS_PER_CHARACTER = 17;
    uint256 constant MAX_BOSS_CARDS_PER_CHARACTER = 17;
    uint256 constant MAX_HERO_CARDS_PER_CHARACTER = 1;

    uint256 constant CHARACTER_SLOT_SIZE = 100;

    uint256 constant BOSS_OFFSET = 100000;
    uint256 constant HERO_OFFSET = 200000;
    uint256 constant LEVEL_OFFSET = 10000;

    uint256 constant MOB_CHARACTERS = 15;
    uint256 constant BOSS_CHARACTERS = 8;
    uint256 constant HERO_CHARACTERS = 1;

    //Note that internally all stats start numeration from zero
    uint256 constant MOB_START_LEVEL = 0;
    uint256 constant BOSS_START_LEVEL = 2;
    uint256 constant HERO_START_LEVEL = 4;

    address payable public treasuryAddress;
    
    mapping (address => bool) isWhitelisted;
    mapping (address => bool) usedWhitelist;

    mapping (address => uint) mintedCardsQty;

    uint public maximumMintPerWallet;
    uint public mintPrice;

    bool public presaleOpen = false;
    bool public publicSaleOpen = false;
    
    uint256 randomSeed;
    
    struct AllocationState {
        mapping (uint256 => uint256) mobs;
        uint256 totalMobs;
        mapping (uint256 => uint256) bosses;
        uint256 totalBosses;
        uint256 heroes;
    }
    
    AllocationState[MAX_LEVELS] state;
    
    constructor(address _proxyRegistryAddress, uint256 _randomSeed, address _treasuryAddress, uint _mintPrice, uint _maximumMintPerWallet) ERC721Tradable("Darkest Heroes", "DARKEST", _proxyRegistryAddress) {
        randomSeed = _randomSeed;
        treasuryAddress = payable(_treasuryAddress);
        mintPrice = _mintPrice;
        maximumMintPerWallet = _maximumMintPerWallet;
    }

    function baseTokenURI() override public pure returns (string memory) {
        return "ar://xrBtQVT38--FQq0Ijvkh5b5N4PqlyFhZpCktPf_WGB8/";
    }

    function contractURI() public pure returns (string memory) {
        return "ar://AeN84xga6ERUh9HguMXUHEkfYdrlGi8WuSgGt7X4k6M";
    }
    
    function mintRandomTo(address _to) internal returns (uint) {
        uint256[] memory prob_numerators = new uint256[](3);
        prob_numerators[0] = MAX_MOB_CARDS_PER_CHARACTER * MOB_CHARACTERS - state[MOB_START_LEVEL].totalMobs; //Mobs to be allocated
        prob_numerators[1] = MAX_BOSS_CARDS_PER_CHARACTER * BOSS_CHARACTERS - state[BOSS_START_LEVEL].totalBosses; //Bosses to be allocated
        prob_numerators[2] = MAX_HERO_CARDS_PER_CHARACTER * HERO_CHARACTERS - state[HERO_START_LEVEL].heroes; //Heroes to be allocated
        
        uint256 prob_denominator = prob_numerators[0] + prob_numerators[1] + prob_numerators[2];
        
        require(prob_denominator > 0, "No cards left to mint");

        uint256 random = uint256(keccak256(abi.encodePacked(blockhash(block.number - 1), randomSeed)));
        randomSeed = random;
        
        uint256 selector = random % prob_denominator;
        
        if (selector < prob_numerators[0]) {
            return mintRandomMobTo(_to, MOB_START_LEVEL, random);
        } else if (selector < prob_numerators[0] + prob_numerators[1]) {
            return mintRandomBossTo(_to, BOSS_START_LEVEL, random);
        } else {
            return mintRandomHeroTo(_to, HERO_START_LEVEL);
        }
    }

    function calculateTokenId(CharacterType _charType, uint256 _level, uint256 _character, uint256 _card) internal pure returns (uint256) {
        uint256 offset = 0;
        if (_charType == CharacterType.Mob) {
            offset = 0;
        } else if (_charType == CharacterType.Boss) {
            offset = BOSS_OFFSET;
        } else if (_charType == CharacterType.Hero) {
            offset = HERO_OFFSET;
        }
        return offset + LEVEL_OFFSET * _level + _character * CHARACTER_SLOT_SIZE + _card;
    }

    function mintSpecificTokenTo(address _to, CharacterType _charType, uint256 _level, uint256 _character, uint256 _card) internal returns (uint) {
        uint256 newTokenId = calculateTokenId(_charType, _level, _character, _card);
        
        _mint(_to, newTokenId);     
        
        if (_charType == CharacterType.Mob) {
            state[_level].mobs[_character] = state[_level].mobs[_character] + 1;
            state[_level].totalMobs = state[_level].totalMobs + 1;
        } else if (_charType == CharacterType.Boss) {
            state[_level].bosses[_character] = state[_level].bosses[_character] + 1;
            state[_level].totalBosses = state[_level].totalBosses + 1;
        } else if (_charType == CharacterType.Hero) {
            state[_level].heroes = state[_level].heroes + 1;  
        }

        return newTokenId;
    }
    
    function mintRandomMobTo(address _to, uint256 _level, uint256 random) internal returns (uint) {
        //Look up characters that have available cards
        uint256[] memory charactersAvailable = new uint256[](MOB_CHARACTERS);
        uint256 charactersAvailableQty = 0;
        for (uint i = 0; i < MOB_CHARACTERS; i = i + 1) {
            if (state[_level].mobs[i] < MAX_MOB_CARDS_PER_CHARACTER) {
                charactersAvailable[charactersAvailableQty] = i;
                charactersAvailableQty = charactersAvailableQty + 1;
            }
        }
        
        if (charactersAvailableQty == 0) {
            revert("No more monsters available");
        }
        
        //Select character randomly and calculate tokenId
        uint256 character = charactersAvailable[random % charactersAvailableQty];
        
        return mintSpecificTokenTo(_to, CharacterType.Mob, _level, character, state[_level].mobs[character]);
    }    

    function mintRandomBossTo(address _to, uint256 _level, uint256 random) internal returns (uint) {
        //Look up characters that have available cards
        uint256[] memory charactersAvailable = new uint256[](BOSS_CHARACTERS);
        uint256 charactersAvailableQty = 0;
        for (uint i = 0; i < BOSS_CHARACTERS; i = i + 1) {
            if (state[_level].bosses[i] < MAX_BOSS_CARDS_PER_CHARACTER) {
                charactersAvailable[charactersAvailableQty] = i;
                charactersAvailableQty = charactersAvailableQty + 1;
            }
        }
        
        if (charactersAvailableQty == 0) {
            revert("No more bosses available");
        }
        
        //Select character randomly and calculate tokenId
        uint256 character = charactersAvailable[random % charactersAvailableQty];
        
        return mintSpecificTokenTo(_to, CharacterType.Boss, _level, character, state[_level].bosses[character]);
    }    
    
    function mintRandomHeroTo(address _to, uint256 _level) internal returns (uint) {

        if (state[_level].heroes >= HERO_CHARACTERS) {
            revert("No more heroes available");
        }
        
        return mintSpecificTokenTo(_to, CharacterType.Hero, HERO_START_LEVEL, 0, state[HERO_START_LEVEL].heroes);
    }

    function getCharacterType(uint256 tokenId) public pure returns (CharacterType) {
        if (tokenId < BOSS_OFFSET) {
            return CharacterType.Mob;
        }
        else if (tokenId < HERO_OFFSET) {
            return CharacterType.Boss;
        }
        else {
            return CharacterType.Hero;
        }
    }

    function getLevel(uint256 tokenId) public pure returns (uint256) {
        CharacterType charType = getCharacterType(tokenId);
        uint offset = 0;
        if (charType == CharacterType.Mob) {
            offset = 0;
        } else if (charType == CharacterType.Boss) {
            offset = BOSS_OFFSET;
        } else if (charType == CharacterType.Hero) {
            offset = HERO_OFFSET;
        }
        return (tokenId - offset) / LEVEL_OFFSET;
    }

    function getCharacter(uint256 tokenId) public pure returns (uint256) {
        CharacterType charType = getCharacterType(tokenId);
        uint offset = 0;
        if (charType == CharacterType.Mob) {
            offset = 0;
        } else if (charType == CharacterType.Boss) {
            offset = BOSS_OFFSET;
        } else if (charType == CharacterType.Hero) {
            offset = HERO_OFFSET;
        }
        uint256 level = getLevel(tokenId);
        return (tokenId - offset - LEVEL_OFFSET * level) / CHARACTER_SLOT_SIZE;
    }
    
    function upgrade(uint256[] calldata tokens) external {
        //Check that proper amount of cards was supplied
        require(tokens.length == 3, "Wrong number of cards was provided");

        //Check that different cards are supplied
        require((tokens[0] != tokens[1])&&(tokens[0] != tokens[2])&&(tokens[1] != tokens[2]),"Duplicate cards were supplied");

        //Check that caller owns all supplied cards
        for (uint i = 0; i<tokens.length; i++) {
            require(_isApprovedOrOwner(msg.sender, tokens[i]), "Only owned or approved cards may be used for upgrade");
        }

        //Check that all cards are of same character type, character and level
        CharacterType charType = getCharacterType(tokens[0]);
        uint256 char = getCharacter(tokens[0]);
        uint level = getLevel(tokens[0]);
  
        for (uint i = 1; i<tokens.length; i++) {
            require(charType == getCharacterType(tokens[i]), "All cards should be of the same character type");
            require(char == getCharacter(tokens[i]), "All cards should be of the same character");
            require(level == getLevel(tokens[i]), "All cards should be of the same level");
        }

        //Check that cards are not at max level
        require(level + 1 < MAX_LEVELS, "Maxxed already");

        //Try minting the upgraded card
        mintSpecificTokenTo(_msgSender(), charType, level+1, char, getAvailableCardIndex(charType, level+1, char));

        //If minting ok - burn supplied cards
        for (uint i = 0; i<tokens.length; i++) {
            _burn(tokens[i]);
        }
    }

    function getAvailableCardIndex(CharacterType _charType, uint256 _level, uint256 _char) internal view returns (uint256) {
        if (_charType == CharacterType.Mob) {
            return state[_level].mobs[_char];
        } else if (_charType == CharacterType.Boss) {
            return state[_level].bosses[_char];
        } else if (_charType == CharacterType.Hero) {
            return state[_level].heroes;
        }
        revert();
    }

    function presaleMint(address _toAddress) external payable returns (uint) {
        
        require(!publicSaleOpen, "Presale has ended");
        require(presaleOpen, "Presale is not open");
        require(isWhitelisted[_msgSender()], "Not whitelisted");
        require(!usedWhitelist[_msgSender()], "Already used whitelist pass");

        require(msg.value == mintPrice, "Amount is not equal price");

        uint tokenId = mintRandomTo(_toAddress);

        usedWhitelist[_msgSender()] = true;
        mintedCardsQty[_msgSender()] += 1;

        treasuryAddress.call{value: msg.value}("");

        return tokenId;
    }

    function publicSaleMint(uint _qty, address _toAddress) external payable returns (uint[] memory) {
        require(_qty > 0, "Invalid quantity");
        require(publicSaleOpen, "Sale is not open");
        require(mintedCardsQty[_msgSender()] + _qty <= maximumMintPerWallet, "Mint will exceed max mint amount");
        require(msg.value == mintPrice * _qty, "Wrong ether amount");

        uint[] memory tokenIds = new uint[](_qty);

        for (
            uint256 i = 0;
            i < _qty;
            i++
        ) {
            tokenIds[i] = mintRandomTo(_toAddress);
            mintedCardsQty[_msgSender()] += 1;
        }

        treasuryAddress.call{value: msg.value}("");

        return tokenIds;
    }

    function isAddressWhitelisted(address _address) public view returns (bool) {
        return isWhitelisted[_address];
    }

    function addToWhitelist(address[] calldata _addresses) external onlyOwner {
        for(uint i = 0; i < _addresses.length; i++) {
            isWhitelisted[_addresses[i]] = true;
        } 
    }

    function removeFromWhitelist(address[] calldata _addresses) external onlyOwner {
        for(uint i = 0; i < _addresses.length; i++) {
            isWhitelisted[_addresses[i]] = false;
        } 
    }

    function setPreSaleState(bool _state) external onlyOwner {
        presaleOpen = _state;
    }

    function setPublicSaleState(bool _state) external onlyOwner {
        publicSaleOpen = _state;
        //Automatically end presale
        if (_state) {
            presaleOpen = false;
        }
    }

    function setMintPrice(uint _price) external onlyOwner {
        mintPrice = _price;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"uint256","name":"_randomSeed","type":"uint256"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_maximumMintPerWallet","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCharacter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCharacterType","outputs":[{"internalType":"enum Hero.CharacterType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isAddressWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"}],"name":"presaleMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"address","name":"_toAddress","type":"address"}],"name":"publicSaleMint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","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":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicSaleState","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a805460ff191690556000600f556016805461ffff191690553480156200002b57600080fd5b5060405162004569380380620045698339810160408190526200004e91620003ca565b6040518060400160405280600e81526020016d4461726b657374204865726f657360901b8152506040518060400160405280600781526020016611105492d154d560ca1b8152508682828160009080519060200190620000b092919062000307565b508051620000c690600190602084019062000307565b5050506000620000db6200018660201b60201c565b600d80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e80546001600160a01b0319166001600160a01b0383161790556200014f83620001a2565b505050601793909355601080546001600160a01b0319166001600160a01b039390931692909217909155601555601455506200045b565b60006200019d6200020660201b620023161760201c565b905090565b600a5460ff1615620001eb5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b620001f68162000265565b50600a805460ff19166001179055565b6000333014156200025f57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620002629050565b50335b90565b6040518060800160405280604f81526020016200451a604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600b55565b82805462000315906200041e565b90600052602060002090601f01602090048101928262000339576000855562000384565b82601f106200035457805160ff191683800117855562000384565b8280016001018555821562000384579182015b828111156200038457825182559160200191906001019062000367565b506200039292915062000396565b5090565b5b8082111562000392576000815560010162000397565b80516001600160a01b0381168114620003c557600080fd5b919050565b600080600080600060a08688031215620003e357600080fd5b620003ee86620003ad565b9450602086015193506200040560408701620003ad565b6060870151608090970151959894975095949392505050565b600181811c908216806200043357607f821691505b602082108114156200045557634e487b7160e01b600052602260045260246000fd5b50919050565b6140af806200046b6000396000f3fe60806040526004361061028c5760003560e01c80636817c76c11610164578063c5f956af116100c6578063e8a3d4851161008a578063f4a0a52811610064578063f4a0a5281461079e578063f9e23799146107be578063fcef3e71146107dd57600080fd5b8063e8a3d48514610749578063e985e9c51461075e578063f2fde38b1461077e57600080fd5b8063c5f956af146106b4578063c87b56dd146106d4578063d547cfb7146106f4578063dabb053114610709578063e43870511461072957600080fd5b80638da5cb5b11610128578063a22cb46511610102578063a22cb4651461065a578063b88d4fde1461067a578063bee6348a1461069a57600080fd5b80638da5cb5b146106075780639293a5c71461062557806395d89b411461064557600080fd5b80636817c76c1461057c57806370a0823114610592578063715018a6146105b25780637f649783146105c757806386481d40146105e757600080fd5b80631bd2a4771161020d5780633408e470116101d15780634f6ccce7116101ab5780634f6ccce71461051c578063548db1741461053c5780636352211e1461055c57600080fd5b80633408e470146104c95780633ca6fb8c146104dc57806342842e0e146104fc57600080fd5b80631bd2a4771461041157806320379ee51461043e57806323b872dd146104535780632d0335ab146104735780632f745c59146104a957600080fd5b80630c53c51c116102545780630c53c51c146103635780630f7e5970146103765780630f800356146103a357806313f44d10146103c357806318160ddd146103fc57600080fd5b806301ffc9a71461029157806306fdde03146102c65780630779834a146102e8578063081812fc14610309578063095ea7b314610341575b600080fd5b34801561029d57600080fd5b506102b16102ac366004613bee565b6107f3565b60405190151581526020015b60405180910390f35b3480156102d257600080fd5b506102db61081e565b6040516102bd9190613dd3565b6102fb6102f63660046139af565b6108b0565b6040519081526020016102bd565b34801561031557600080fd5b50610329610324366004613c45565b610b8e565b6040516001600160a01b0390911681526020016102bd565b34801561034d57600080fd5b5061036161035c366004613b65565b610c23565b005b6102db610371366004613ae7565b610d4b565b34801561038257600080fd5b506102db604051806040016040528060018152602001603160f81b81525081565b3480156103af57600080fd5b506103616103be366004613b91565b610f35565b3480156103cf57600080fd5b506102b16103de3660046139af565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561040857600080fd5b506008546102fb565b34801561041d57600080fd5b5061043161042c366004613c45565b611434565b6040516102bd9190613de6565b34801561044a57600080fd5b50600b546102fb565b34801561045f57600080fd5b5061036161046e366004613a05565b611469565b34801561047f57600080fd5b506102fb61048e3660046139af565b6001600160a01b03166000908152600c602052604090205490565b3480156104b557600080fd5b506102fb6104c4366004613b65565b6114eb565b3480156104d557600080fd5b50466102fb565b3480156104e857600080fd5b506103616104f7366004613bd3565b611581565b34801561050857600080fd5b50610361610517366004613a05565b6115fb565b34801561052857600080fd5b506102fb610537366004613c45565b611616565b34801561054857600080fd5b50610361610557366004613b91565b6116a9565b34801561056857600080fd5b50610329610577366004613c45565b611782565b34801561058857600080fd5b506102fb60155481565b34801561059e57600080fd5b506102fb6105ad3660046139af565b6117f9565b3480156105be57600080fd5b50610361611880565b3480156105d357600080fd5b506103616105e2366004613b91565b611931565b3480156105f357600080fd5b506102fb610602366004613c45565b611a0a565b34801561061357600080fd5b50600d546001600160a01b0316610329565b34801561063157600080fd5b50610361610640366004613bd3565b611a9e565b34801561065157600080fd5b506102db611b31565b34801561066657600080fd5b50610361610675366004613ab2565b611b40565b34801561068657600080fd5b50610361610695366004613a46565b611c42565b3480156106a657600080fd5b506016546102b19060ff1681565b3480156106c057600080fd5b50601054610329906001600160a01b031681565b3480156106e057600080fd5b506102db6106ef366004613c45565b611ccb565b34801561070057600080fd5b506102db611d05565b34801561071557600080fd5b506102fb610724366004613c45565b611d25565b61073c610737366004613c5e565b611ddc565b6040516102bd9190613d8f565b34801561075557600080fd5b506102db612096565b34801561076a57600080fd5b506102b16107793660046139cc565b6120b6565b34801561078a57600080fd5b506103616107993660046139af565b612182565b3480156107aa57600080fd5b506103616107b9366004613c45565b6122aa565b3480156107ca57600080fd5b506016546102b190610100900460ff1681565b3480156107e957600080fd5b506102fb60145481565b60006001600160e01b0319821663780e9d6360e01b1480610818575061081882612373565b92915050565b60606000805461082d90613e9c565b80601f016020809104026020016040519081016040528092919081815260200182805461085990613e9c565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b5050505050905090565b601654600090610100900460ff16156109105760405162461bcd60e51b815260206004820152601160248201527f50726573616c652068617320656e64656400000000000000000000000000000060448201526064015b60405180910390fd5b60165460ff166109625760405162461bcd60e51b815260206004820152601360248201527f50726573616c65206973206e6f74206f70656e000000000000000000000000006044820152606401610907565b6011600061096e6123c3565b6001600160a01b0316815260208101919091526040016000205460ff166109d75760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c697374656400000000000000000000000000000000006044820152606401610907565b601260006109e36123c3565b6001600160a01b0316815260208101919091526040016000205460ff1615610a4d5760405162461bcd60e51b815260206004820152601b60248201527f416c726561647920757365642077686974656c697374207061737300000000006044820152606401610907565b6015543414610a9e5760405162461bcd60e51b815260206004820152601960248201527f416d6f756e74206973206e6f7420657175616c207072696365000000000000006044820152606401610907565b6000610aa9836123d2565b9050600160126000610ab96123c3565b6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160136000610afe6123c3565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610b2d9190613e0e565b90915550506010546040516001600160a01b03909116903490600081818185875af1925050503d8060008114610b7f576040519150601f19603f3d011682016040523d82523d6000602084013e610b84565b606091505b5091949350505050565b6000818152600260205260408120546001600160a01b0316610c075760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610907565b506000908152600460205260409020546001600160a01b031690565b6000610c2e82611782565b9050806001600160a01b0316836001600160a01b03161415610c9c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610907565b806001600160a01b0316610cae6123c3565b6001600160a01b03161480610cca5750610cca816107796123c3565b610d3c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610907565b610d46838361263b565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610d8987828787876126a9565b610ddf5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610907565b6001600160a01b0387166000908152600c6020526040902054610e03906001612799565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610e5390899033908a90613d31565b60405180910390a1600080306001600160a01b0316888a604051602001610e7b929190613ccb565b60408051601f1981840301815290829052610e9591613caf565b6000604051808303816000865af19150503d8060008114610ed2576040519150601f19603f3d011682016040523d82523d6000602084013e610ed7565b606091505b509150915081610f295760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610907565b98975050505050505050565b60038114610f905760405162461bcd60e51b815260206004820152602260248201527f57726f6e67206e756d626572206f66206361726473207761732070726f766964604482015261195960f21b6064820152608401610907565b81816001818110610fa357610fa3613f5e565b9050602002013582826000818110610fbd57610fbd613f5e565b9050602002013514158015611004575081816002818110610fe057610fe0613f5e565b9050602002013582826000818110610ffa57610ffa613f5e565b9050602002013514155b801561104257508181600281811061101e5761101e613f5e565b905060200201358282600181811061103857611038613f5e565b9050602002013514155b61108e5760405162461bcd60e51b815260206004820152601d60248201527f4475706c6963617465206361726473207765726520737570706c6965640000006044820152606401610907565b60005b8181101561113f576110bb338484848181106110af576110af613f5e565b905060200201356127ac565b61112d5760405162461bcd60e51b815260206004820152603460248201527f4f6e6c79206f776e6564206f7220617070726f766564206361726473206d617960448201527f206265207573656420666f7220757067726164650000000000000000000000006064820152608401610907565b8061113781613ed7565b915050611091565b5060006111648383600081811061115857611158613f5e565b90506020020135611434565b9050600061118a8484600081811061117e5761117e613f5e565b90506020020135611d25565b905060006111b0858560008181106111a4576111a4613f5e565b90506020020135611a0a565b905060015b84811015611360576111d286868381811061115857611158613f5e565b60028111156111e3576111e3613f32565b8460028111156111f5576111f5613f32565b146112685760405162461bcd60e51b815260206004820152602e60248201527f416c6c2063617264732073686f756c64206265206f66207468652073616d652060448201527f63686172616374657220747970650000000000000000000000000000000000006064820152608401610907565b61127d86868381811061117e5761117e613f5e565b83146112dd5760405162461bcd60e51b815260206004820152602960248201527f416c6c2063617264732073686f756c64206265206f66207468652073616d652060448201526831b430b930b1ba32b960b91b6064820152608401610907565b6112f28686838181106111a4576111a4613f5e565b821461134e5760405162461bcd60e51b815260206004820152602560248201527f416c6c2063617264732073686f756c64206265206f66207468652073616d65206044820152641b195d995b60da1b6064820152608401610907565b8061135881613ed7565b9150506111b5565b50600561136e826001613e0e565b106113bb5760405162461bcd60e51b815260206004820152600e60248201527f4d617878656420616c72656164790000000000000000000000000000000000006044820152606401610907565b6113ed6113c66123c3565b846113d2846001613e0e565b856113e8886113e2886001613e0e565b8961287b565b612954565b5060005b8481101561142c5761141a86868381811061140e5761140e613f5e565b90506020020135612b6b565b8061142481613ed7565b9150506113f1565b505050505050565b6000620186a082101561144957506000919050565b62030d4082101561145c57506001919050565b506002919050565b919050565b61147a6114746123c3565b826127ac565b6114e05760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610907565b610d46838383612c12565b60006114f6836117f9565b82106115585760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610907565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6115896123c3565b6001600160a01b03166115a4600d546001600160a01b031690565b6001600160a01b0316146115e85760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b6016805460ff1916911515919091179055565b610d4683838360405180602001604052806000815250611c42565b600061162160085490565b82106116845760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610907565b6008828154811061169757611697613f5e565b90600052602060002001549050919050565b6116b16123c3565b6001600160a01b03166116cc600d546001600160a01b031690565b6001600160a01b0316146117105760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b60005b81811015610d465760006011600085858581811061173357611733613f5e565b905060200201602081019061174891906139af565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061177a81613ed7565b915050611713565b6000818152600260205260408120546001600160a01b0316806108185760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610907565b60006001600160a01b0382166118645760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610907565b506001600160a01b031660009081526003602052604090205490565b6118886123c3565b6001600160a01b03166118a3600d546001600160a01b031690565b6001600160a01b0316146118e75760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b6119396123c3565b6001600160a01b0316611954600d546001600160a01b031690565b6001600160a01b0316146119985760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b60005b81811015610d46576001601160008585858181106119bb576119bb613f5e565b90506020020160208101906119d091906139af565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a0281613ed7565b91505061199b565b600080611a1683611434565b9050600080826002811115611a2d57611a2d613f32565b1415611a3b57506000611a7f565b6001826002811115611a4f57611a4f613f32565b1415611a5f5750620186a0611a7f565b6002826002811115611a7357611a73613f32565b1415611a7f575062030d405b612710611a8c8286613e59565b611a969190613e26565b949350505050565b611aa66123c3565b6001600160a01b0316611ac1600d546001600160a01b031690565b6001600160a01b031614611b055760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b60168054821580156101000261ff001990921691909117909155611b2e576016805460ff191690555b50565b60606001805461082d90613e9c565b611b486123c3565b6001600160a01b0316826001600160a01b03161415611ba95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610907565b8060056000611bb66123c3565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611bfa6123c3565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c36911515815260200190565b60405180910390a35050565b611c53611c4d6123c3565b836127ac565b611cb95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610907565b611cc584848484612dbd565b50505050565b6060611cd5611d05565b611cde83612e3b565b604051602001611cef929190613d02565b6040516020818303038152906040529050919050565b6060604051806060016040528060318152602001613ff960319139905090565b600080611d3183611434565b9050600080826002811115611d4857611d48613f32565b1415611d5657506000611d9a565b6001826002811115611d6a57611d6a613f32565b1415611d7a5750620186a0611d9a565b6002826002811115611d8e57611d8e613f32565b1415611d9a575062030d405b6000611da585611a0a565b90506064611db582612710613e3a565b611dbf8488613e59565b611dc99190613e59565b611dd39190613e26565b95945050505050565b606060008311611e2e5760405162461bcd60e51b815260206004820152601060248201527f496e76616c6964207175616e74697479000000000000000000000000000000006044820152606401610907565b601654610100900460ff16611e855760405162461bcd60e51b815260206004820152601060248201527f53616c65206973206e6f74206f70656e000000000000000000000000000000006044820152606401610907565b6014548360136000611e956123c3565b6001600160a01b03166001600160a01b0316815260200190815260200160002054611ec09190613e0e565b1115611f0e5760405162461bcd60e51b815260206004820181905260248201527f4d696e742077696c6c20657863656564206d6178206d696e7420616d6f756e746044820152606401610907565b82601554611f1c9190613e3a565b3414611f6a5760405162461bcd60e51b815260206004820152601260248201527f57726f6e6720657468657220616d6f756e7400000000000000000000000000006044820152606401610907565b60008367ffffffffffffffff811115611f8557611f85613f74565b604051908082528060200260200182016040528015611fae578160200160208202803683370190505b50905060005b8481101561203857611fc5846123d2565b828281518110611fd757611fd7613f5e565b602002602001018181525050600160136000611ff16123c3565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546120209190613e0e565b9091555081905061203081613ed7565b915050611fb4565b506010546040516001600160a01b03909116903490600081818185875af1925050503d8060008114612086576040519150601f19603f3d011682016040523d82523d6000602084013e61208b565b606091505b509195945050505050565b606060405180606001604052806030815260200161402a60309139905090565b600e5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561210357600080fd5b505afa158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190613c28565b6001600160a01b03161415612154576001915050610818565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff16611a96565b61218a6123c3565b6001600160a01b03166121a5600d546001600160a01b031690565b6001600160a01b0316146121e95760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b6001600160a01b03811661224e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610907565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6122b26123c3565b6001600160a01b03166122cd600d546001600160a01b031690565b6001600160a01b0316146123115760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b601555565b60003330141561236d57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506123709050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b14806123a457506001600160e01b03198216635b5e139f60e01b145b8061081857506301ffc9a760e01b6001600160e01b0319831614610818565b60006123cd612316565b905090565b604080516003808252608082019092526000918291906020820160608036833701905050601954909150612408600f6011613e3a565b6124129190613e59565b8160008151811061242557612425613f5e565b602090810291909101015260255461243f60086011613e3a565b6124499190613e59565b8160018151811061245c5761245c613f5e565b6020908102919091010152603054612475600180613e3a565b61247f9190613e59565b8160028151811061249257612492613f5e565b6020026020010181815250506000816002815181106124b3576124b3613f5e565b6020026020010151826001815181106124ce576124ce613f5e565b6020026020010151836000815181106124e9576124e9613f5e565b60200260200101516124fb9190613e0e565b6125059190613e0e565b9050600081116125575760405162461bcd60e51b815260206004820152601560248201527f4e6f206361726473206c65667420746f206d696e7400000000000000000000006044820152606401610907565b6000612564600143613e59565b601754604080519240602084015282015260600160408051601f1981840301815291905280516020909101206017819055905060006125a38383613ef2565b9050836000815181106125b8576125b8613f5e565b60200260200101518110156125dd576125d386600084612f51565b9695505050505050565b836001815181106125f0576125f0613f5e565b60200260200101518460008151811061260b5761260b613f5e565b602002602001015161261d9190613e0e565b811015612630576125d3866002846130b1565b6125d3866004613206565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061267082611782565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b03861661270f5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610907565b600161272261271d87613289565b613306565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612770573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006127a58284613e0e565b9392505050565b6000818152600260205260408120546001600160a01b03166128255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610907565b600061283083611782565b9050806001600160a01b0316846001600160a01b0316148061286b5750836001600160a01b031661286084610b8e565b6001600160a01b0316145b80611a965750611a9681856120b6565b60008084600281111561289057612890613f32565b14156128c957601883600581106128a9576128a9613f5e565b6005020160000160008381526020019081526020016000205490506127a5565b60018460028111156128dd576128dd613f32565b141561291657601883600581106128f6576128f6613f5e565b6005020160020160008381526020019081526020016000205490506127a5565b600284600281111561292a5761292a613f32565b141561028c576018836005811061294357612943613f5e565b600502016004015490509392505050565b60008061296386868686613336565b905061296f87826133d4565b600086600281111561298357612983613f32565b1415612a37576018856005811061299c5761299c613f5e565b60008681526005919091029190910160205260409020546129be906001613e0e565b601886600581106129d1576129d1613f5e565b6005020160000160008681526020019081526020016000208190555060188560058110612a0057612a00613f5e565b60050201600101546001612a149190613e0e565b60188660058110612a2757612a27613f5e565b60050201600101819055506125d3565b6001866002811115612a4b57612a4b613f32565b1415612b025760188560058110612a6457612a64613f5e565b600502016002016000858152602001908152602001600020546001612a899190613e0e565b60188660058110612a9c57612a9c613f5e565b6005020160020160008681526020019081526020016000208190555060188560058110612acb57612acb613f5e565b60050201600301546001612adf9190613e0e565b60188660058110612af257612af2613f5e565b60050201600301819055506125d3565b6002866002811115612b1657612b16613f32565b14156125d35760188560058110612b2f57612b2f613f5e565b60050201600401546001612b439190613e0e565b60188660058110612b5657612b56613f5e565b60050201600401819055509695505050505050565b6000612b7682611782565b9050612b8481600084613522565b612b8f60008361263b565b6001600160a01b0381166000908152600360205260408120805460019290612bb8908490613e59565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b826001600160a01b0316612c2582611782565b6001600160a01b031614612c8d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610907565b6001600160a01b038216612cef5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610907565b612cfa838383613522565b612d0560008261263b565b6001600160a01b0383166000908152600360205260408120805460019290612d2e908490613e59565b90915550506001600160a01b0382166000908152600360205260408120805460019290612d5c908490613e0e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612dc8848484612c12565b612dd4848484846135da565b611cc55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610907565b606081612e5f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e895780612e7381613ed7565b9150612e829050600a83613e26565b9150612e63565b60008167ffffffffffffffff811115612ea457612ea4613f74565b6040519080825280601f01601f191660200182016040528015612ece576020820181803683370190505b5090505b8415611a9657612ee3600183613e59565b9150612ef0600a86613ef2565b612efb906030613e0e565b60f81b818381518110612f1057612f10613f5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f4a600a86613e26565b9450612ed2565b60408051600f8082526102008201909252600091829190602082016101e0803683370190505090506000805b600f811015612ff857601160188760058110612f9b57612f9b613f5e565b600502016000016000838152602001908152602001600020541015612fe65780838381518110612fcd57612fcd613f5e565b6020908102919091010152612fe3826001613e0e565b91505b612ff1816001613e0e565b9050612f7d565b50806130465760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d6f7265206d6f6e737465727320617661696c61626c650000000000006044820152606401610907565b6000826130538387613ef2565b8151811061306357613063613f5e565b602002602001015190506130a6876000888460188b6005811061308857613088613f5e565b60050201600001600087815260200190815260200160002054612954565b979650505050505050565b604080516008808252610120820190925260009182919060208201610100803683370190505090506000805b6008811015613158576011601887600581106130fb576130fb613f5e565b600502016002016000838152602001908152602001600020541015613146578083838151811061312d5761312d613f5e565b6020908102919091010152613143826001613e0e565b91505b613151816001613e0e565b90506130dd565b50806131a65760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520626f7373657320617661696c61626c6500000000000000006044820152606401610907565b6000826131b38387613ef2565b815181106131c3576131c3613f5e565b602002602001015190506130a6876001888460188b600581106131e8576131e8613f5e565b60050201600201600087815260200190815260200160002054612954565b600060016018836005811061321d5761321d613f5e565b6005020160040154106132725760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f7265206865726f657320617661696c61626c6500000000000000006044820152606401610907565b6030546127a5908490600290600490600090612954565b6000604051806080016040528060438152602001613fb660439139805160209182012083518483015160408087015180519086012090516132e9950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000613311600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016132e9565b6000808086600281111561334c5761334c613f32565b141561335a5750600061339e565b600186600281111561336e5761336e613f32565b141561337e5750620186a061339e565b600286600281111561339257613392613f32565b141561339e575062030d405b826133aa606486613e3a565b6133b687612710613e3a565b6133c09084613e0e565b6133ca9190613e0e565b6125d39190613e0e565b6001600160a01b03821661342a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610907565b6000818152600260205260409020546001600160a01b03161561348f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610907565b61349b60008383613522565b6001600160a01b03821660009081526003602052604081208054600192906134c4908490613e0e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03831661357d5761357881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6135a0565b816001600160a01b0316836001600160a01b0316146135a0576135a08382613736565b6001600160a01b0382166135b757610d46816137d3565b826001600160a01b0316826001600160a01b031614610d4657610d468282613882565b60006001600160a01b0384163b1561372e57836001600160a01b031663150b7a026136036123c3565b8786866040518563ffffffff1660e01b81526004016136259493929190613d5d565b602060405180830381600087803b15801561363f57600080fd5b505af192505050801561366f575060408051601f3d908101601f1916820190925261366c91810190613c0b565b60015b613714573d80801561369d576040519150601f19603f3d011682016040523d82523d6000602084013e6136a2565b606091505b50805161370c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610907565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a96565b506001611a96565b60006001613743846117f9565b61374d9190613e59565b6000838152600760205260409020549091508082146137a0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906137e590600190613e59565b6000838152600960205260408120546008805493945090928490811061380d5761380d613f5e565b90600052602060002001549050806008838154811061382e5761382e613f5e565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061386657613866613f48565b6001900381819060005260206000200160009055905550505050565b600061388d836117f9565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60008083601f8401126138d857600080fd5b50813567ffffffffffffffff8111156138f057600080fd5b6020830191508360208260051b850101111561390b57600080fd5b9250929050565b8035801515811461146457600080fd5b600082601f83011261393357600080fd5b813567ffffffffffffffff8082111561394e5761394e613f74565b604051601f8301601f19908116603f0116810190828211818310171561397657613976613f74565b8160405283815286602085880101111561398f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156139c157600080fd5b81356127a581613f8a565b600080604083850312156139df57600080fd5b82356139ea81613f8a565b915060208301356139fa81613f8a565b809150509250929050565b600080600060608486031215613a1a57600080fd5b8335613a2581613f8a565b92506020840135613a3581613f8a565b929592945050506040919091013590565b60008060008060808587031215613a5c57600080fd5b8435613a6781613f8a565b93506020850135613a7781613f8a565b925060408501359150606085013567ffffffffffffffff811115613a9a57600080fd5b613aa687828801613922565b91505092959194509250565b60008060408385031215613ac557600080fd5b8235613ad081613f8a565b9150613ade60208401613912565b90509250929050565b600080600080600060a08688031215613aff57600080fd5b8535613b0a81613f8a565b9450602086013567ffffffffffffffff811115613b2657600080fd5b613b3288828901613922565b9450506040860135925060608601359150608086013560ff81168114613b5757600080fd5b809150509295509295909350565b60008060408385031215613b7857600080fd5b8235613b8381613f8a565b946020939093013593505050565b60008060208385031215613ba457600080fd5b823567ffffffffffffffff811115613bbb57600080fd5b613bc7858286016138c6565b90969095509350505050565b600060208284031215613be557600080fd5b6127a582613912565b600060208284031215613c0057600080fd5b81356127a581613f9f565b600060208284031215613c1d57600080fd5b81516127a581613f9f565b600060208284031215613c3a57600080fd5b81516127a581613f8a565b600060208284031215613c5757600080fd5b5035919050565b60008060408385031215613c7157600080fd5b8235915060208301356139fa81613f8a565b60008151808452613c9b816020860160208601613e70565b601f01601f19169290920160200192915050565b60008251613cc1818460208701613e70565b9190910192915050565b60008351613cdd818460208801613e70565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b60008351613d14818460208801613e70565b835190830190613d28818360208801613e70565b01949350505050565b60006001600160a01b03808616835280851660208401525060606040830152611dd36060830184613c83565b60006001600160a01b038087168352808616602084015250836040830152608060608301526125d36080830184613c83565b6020808252825182820181905260009190848201906040850190845b81811015613dc757835183529284019291840191600101613dab565b50909695505050505050565b6020815260006127a56020830184613c83565b6020810160038310613e0857634e487b7160e01b600052602160045260246000fd5b91905290565b60008219821115613e2157613e21613f06565b500190565b600082613e3557613e35613f1c565b500490565b6000816000190483118215151615613e5457613e54613f06565b500290565b600082821015613e6b57613e6b613f06565b500390565b60005b83811015613e8b578181015183820152602001613e73565b83811115611cc55750506000910152565b600181811c90821680613eb057607f821691505b60208210811415613ed157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613eeb57613eeb613f06565b5060010190565b600082613f0157613f01613f1c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611b2e57600080fd5b6001600160e01b031981168114611b2e57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652961723a2f2f7872427451565433382d2d46517130496a766b683562354e3450716c7946685a70436b7450665f574742382f61723a2f2f41654e38347867613645525568394867754d585548456b665964726c4769385775536747743758346b364d4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212206b0735602e08f419467cd1ae7f7b63a28d04d29886a016ceb4943789762c5f5b64736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000a78771332a7d1b9d5e647d6be34ac1dac7481aae00000000000000000000000000000000000000000000000002c68af0bb1400000000000000000000000000000000000000000000000000000000000000000003

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80636817c76c11610164578063c5f956af116100c6578063e8a3d4851161008a578063f4a0a52811610064578063f4a0a5281461079e578063f9e23799146107be578063fcef3e71146107dd57600080fd5b8063e8a3d48514610749578063e985e9c51461075e578063f2fde38b1461077e57600080fd5b8063c5f956af146106b4578063c87b56dd146106d4578063d547cfb7146106f4578063dabb053114610709578063e43870511461072957600080fd5b80638da5cb5b11610128578063a22cb46511610102578063a22cb4651461065a578063b88d4fde1461067a578063bee6348a1461069a57600080fd5b80638da5cb5b146106075780639293a5c71461062557806395d89b411461064557600080fd5b80636817c76c1461057c57806370a0823114610592578063715018a6146105b25780637f649783146105c757806386481d40146105e757600080fd5b80631bd2a4771161020d5780633408e470116101d15780634f6ccce7116101ab5780634f6ccce71461051c578063548db1741461053c5780636352211e1461055c57600080fd5b80633408e470146104c95780633ca6fb8c146104dc57806342842e0e146104fc57600080fd5b80631bd2a4771461041157806320379ee51461043e57806323b872dd146104535780632d0335ab146104735780632f745c59146104a957600080fd5b80630c53c51c116102545780630c53c51c146103635780630f7e5970146103765780630f800356146103a357806313f44d10146103c357806318160ddd146103fc57600080fd5b806301ffc9a71461029157806306fdde03146102c65780630779834a146102e8578063081812fc14610309578063095ea7b314610341575b600080fd5b34801561029d57600080fd5b506102b16102ac366004613bee565b6107f3565b60405190151581526020015b60405180910390f35b3480156102d257600080fd5b506102db61081e565b6040516102bd9190613dd3565b6102fb6102f63660046139af565b6108b0565b6040519081526020016102bd565b34801561031557600080fd5b50610329610324366004613c45565b610b8e565b6040516001600160a01b0390911681526020016102bd565b34801561034d57600080fd5b5061036161035c366004613b65565b610c23565b005b6102db610371366004613ae7565b610d4b565b34801561038257600080fd5b506102db604051806040016040528060018152602001603160f81b81525081565b3480156103af57600080fd5b506103616103be366004613b91565b610f35565b3480156103cf57600080fd5b506102b16103de3660046139af565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561040857600080fd5b506008546102fb565b34801561041d57600080fd5b5061043161042c366004613c45565b611434565b6040516102bd9190613de6565b34801561044a57600080fd5b50600b546102fb565b34801561045f57600080fd5b5061036161046e366004613a05565b611469565b34801561047f57600080fd5b506102fb61048e3660046139af565b6001600160a01b03166000908152600c602052604090205490565b3480156104b557600080fd5b506102fb6104c4366004613b65565b6114eb565b3480156104d557600080fd5b50466102fb565b3480156104e857600080fd5b506103616104f7366004613bd3565b611581565b34801561050857600080fd5b50610361610517366004613a05565b6115fb565b34801561052857600080fd5b506102fb610537366004613c45565b611616565b34801561054857600080fd5b50610361610557366004613b91565b6116a9565b34801561056857600080fd5b50610329610577366004613c45565b611782565b34801561058857600080fd5b506102fb60155481565b34801561059e57600080fd5b506102fb6105ad3660046139af565b6117f9565b3480156105be57600080fd5b50610361611880565b3480156105d357600080fd5b506103616105e2366004613b91565b611931565b3480156105f357600080fd5b506102fb610602366004613c45565b611a0a565b34801561061357600080fd5b50600d546001600160a01b0316610329565b34801561063157600080fd5b50610361610640366004613bd3565b611a9e565b34801561065157600080fd5b506102db611b31565b34801561066657600080fd5b50610361610675366004613ab2565b611b40565b34801561068657600080fd5b50610361610695366004613a46565b611c42565b3480156106a657600080fd5b506016546102b19060ff1681565b3480156106c057600080fd5b50601054610329906001600160a01b031681565b3480156106e057600080fd5b506102db6106ef366004613c45565b611ccb565b34801561070057600080fd5b506102db611d05565b34801561071557600080fd5b506102fb610724366004613c45565b611d25565b61073c610737366004613c5e565b611ddc565b6040516102bd9190613d8f565b34801561075557600080fd5b506102db612096565b34801561076a57600080fd5b506102b16107793660046139cc565b6120b6565b34801561078a57600080fd5b506103616107993660046139af565b612182565b3480156107aa57600080fd5b506103616107b9366004613c45565b6122aa565b3480156107ca57600080fd5b506016546102b190610100900460ff1681565b3480156107e957600080fd5b506102fb60145481565b60006001600160e01b0319821663780e9d6360e01b1480610818575061081882612373565b92915050565b60606000805461082d90613e9c565b80601f016020809104026020016040519081016040528092919081815260200182805461085990613e9c565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b5050505050905090565b601654600090610100900460ff16156109105760405162461bcd60e51b815260206004820152601160248201527f50726573616c652068617320656e64656400000000000000000000000000000060448201526064015b60405180910390fd5b60165460ff166109625760405162461bcd60e51b815260206004820152601360248201527f50726573616c65206973206e6f74206f70656e000000000000000000000000006044820152606401610907565b6011600061096e6123c3565b6001600160a01b0316815260208101919091526040016000205460ff166109d75760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c697374656400000000000000000000000000000000006044820152606401610907565b601260006109e36123c3565b6001600160a01b0316815260208101919091526040016000205460ff1615610a4d5760405162461bcd60e51b815260206004820152601b60248201527f416c726561647920757365642077686974656c697374207061737300000000006044820152606401610907565b6015543414610a9e5760405162461bcd60e51b815260206004820152601960248201527f416d6f756e74206973206e6f7420657175616c207072696365000000000000006044820152606401610907565b6000610aa9836123d2565b9050600160126000610ab96123c3565b6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160136000610afe6123c3565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610b2d9190613e0e565b90915550506010546040516001600160a01b03909116903490600081818185875af1925050503d8060008114610b7f576040519150601f19603f3d011682016040523d82523d6000602084013e610b84565b606091505b5091949350505050565b6000818152600260205260408120546001600160a01b0316610c075760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610907565b506000908152600460205260409020546001600160a01b031690565b6000610c2e82611782565b9050806001600160a01b0316836001600160a01b03161415610c9c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610907565b806001600160a01b0316610cae6123c3565b6001600160a01b03161480610cca5750610cca816107796123c3565b610d3c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610907565b610d46838361263b565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610d8987828787876126a9565b610ddf5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610907565b6001600160a01b0387166000908152600c6020526040902054610e03906001612799565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610e5390899033908a90613d31565b60405180910390a1600080306001600160a01b0316888a604051602001610e7b929190613ccb565b60408051601f1981840301815290829052610e9591613caf565b6000604051808303816000865af19150503d8060008114610ed2576040519150601f19603f3d011682016040523d82523d6000602084013e610ed7565b606091505b509150915081610f295760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610907565b98975050505050505050565b60038114610f905760405162461bcd60e51b815260206004820152602260248201527f57726f6e67206e756d626572206f66206361726473207761732070726f766964604482015261195960f21b6064820152608401610907565b81816001818110610fa357610fa3613f5e565b9050602002013582826000818110610fbd57610fbd613f5e565b9050602002013514158015611004575081816002818110610fe057610fe0613f5e565b9050602002013582826000818110610ffa57610ffa613f5e565b9050602002013514155b801561104257508181600281811061101e5761101e613f5e565b905060200201358282600181811061103857611038613f5e565b9050602002013514155b61108e5760405162461bcd60e51b815260206004820152601d60248201527f4475706c6963617465206361726473207765726520737570706c6965640000006044820152606401610907565b60005b8181101561113f576110bb338484848181106110af576110af613f5e565b905060200201356127ac565b61112d5760405162461bcd60e51b815260206004820152603460248201527f4f6e6c79206f776e6564206f7220617070726f766564206361726473206d617960448201527f206265207573656420666f7220757067726164650000000000000000000000006064820152608401610907565b8061113781613ed7565b915050611091565b5060006111648383600081811061115857611158613f5e565b90506020020135611434565b9050600061118a8484600081811061117e5761117e613f5e565b90506020020135611d25565b905060006111b0858560008181106111a4576111a4613f5e565b90506020020135611a0a565b905060015b84811015611360576111d286868381811061115857611158613f5e565b60028111156111e3576111e3613f32565b8460028111156111f5576111f5613f32565b146112685760405162461bcd60e51b815260206004820152602e60248201527f416c6c2063617264732073686f756c64206265206f66207468652073616d652060448201527f63686172616374657220747970650000000000000000000000000000000000006064820152608401610907565b61127d86868381811061117e5761117e613f5e565b83146112dd5760405162461bcd60e51b815260206004820152602960248201527f416c6c2063617264732073686f756c64206265206f66207468652073616d652060448201526831b430b930b1ba32b960b91b6064820152608401610907565b6112f28686838181106111a4576111a4613f5e565b821461134e5760405162461bcd60e51b815260206004820152602560248201527f416c6c2063617264732073686f756c64206265206f66207468652073616d65206044820152641b195d995b60da1b6064820152608401610907565b8061135881613ed7565b9150506111b5565b50600561136e826001613e0e565b106113bb5760405162461bcd60e51b815260206004820152600e60248201527f4d617878656420616c72656164790000000000000000000000000000000000006044820152606401610907565b6113ed6113c66123c3565b846113d2846001613e0e565b856113e8886113e2886001613e0e565b8961287b565b612954565b5060005b8481101561142c5761141a86868381811061140e5761140e613f5e565b90506020020135612b6b565b8061142481613ed7565b9150506113f1565b505050505050565b6000620186a082101561144957506000919050565b62030d4082101561145c57506001919050565b506002919050565b919050565b61147a6114746123c3565b826127ac565b6114e05760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610907565b610d46838383612c12565b60006114f6836117f9565b82106115585760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610907565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6115896123c3565b6001600160a01b03166115a4600d546001600160a01b031690565b6001600160a01b0316146115e85760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b6016805460ff1916911515919091179055565b610d4683838360405180602001604052806000815250611c42565b600061162160085490565b82106116845760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610907565b6008828154811061169757611697613f5e565b90600052602060002001549050919050565b6116b16123c3565b6001600160a01b03166116cc600d546001600160a01b031690565b6001600160a01b0316146117105760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b60005b81811015610d465760006011600085858581811061173357611733613f5e565b905060200201602081019061174891906139af565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061177a81613ed7565b915050611713565b6000818152600260205260408120546001600160a01b0316806108185760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610907565b60006001600160a01b0382166118645760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610907565b506001600160a01b031660009081526003602052604090205490565b6118886123c3565b6001600160a01b03166118a3600d546001600160a01b031690565b6001600160a01b0316146118e75760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b6119396123c3565b6001600160a01b0316611954600d546001600160a01b031690565b6001600160a01b0316146119985760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b60005b81811015610d46576001601160008585858181106119bb576119bb613f5e565b90506020020160208101906119d091906139af565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a0281613ed7565b91505061199b565b600080611a1683611434565b9050600080826002811115611a2d57611a2d613f32565b1415611a3b57506000611a7f565b6001826002811115611a4f57611a4f613f32565b1415611a5f5750620186a0611a7f565b6002826002811115611a7357611a73613f32565b1415611a7f575062030d405b612710611a8c8286613e59565b611a969190613e26565b949350505050565b611aa66123c3565b6001600160a01b0316611ac1600d546001600160a01b031690565b6001600160a01b031614611b055760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b60168054821580156101000261ff001990921691909117909155611b2e576016805460ff191690555b50565b60606001805461082d90613e9c565b611b486123c3565b6001600160a01b0316826001600160a01b03161415611ba95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610907565b8060056000611bb66123c3565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611bfa6123c3565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c36911515815260200190565b60405180910390a35050565b611c53611c4d6123c3565b836127ac565b611cb95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610907565b611cc584848484612dbd565b50505050565b6060611cd5611d05565b611cde83612e3b565b604051602001611cef929190613d02565b6040516020818303038152906040529050919050565b6060604051806060016040528060318152602001613ff960319139905090565b600080611d3183611434565b9050600080826002811115611d4857611d48613f32565b1415611d5657506000611d9a565b6001826002811115611d6a57611d6a613f32565b1415611d7a5750620186a0611d9a565b6002826002811115611d8e57611d8e613f32565b1415611d9a575062030d405b6000611da585611a0a565b90506064611db582612710613e3a565b611dbf8488613e59565b611dc99190613e59565b611dd39190613e26565b95945050505050565b606060008311611e2e5760405162461bcd60e51b815260206004820152601060248201527f496e76616c6964207175616e74697479000000000000000000000000000000006044820152606401610907565b601654610100900460ff16611e855760405162461bcd60e51b815260206004820152601060248201527f53616c65206973206e6f74206f70656e000000000000000000000000000000006044820152606401610907565b6014548360136000611e956123c3565b6001600160a01b03166001600160a01b0316815260200190815260200160002054611ec09190613e0e565b1115611f0e5760405162461bcd60e51b815260206004820181905260248201527f4d696e742077696c6c20657863656564206d6178206d696e7420616d6f756e746044820152606401610907565b82601554611f1c9190613e3a565b3414611f6a5760405162461bcd60e51b815260206004820152601260248201527f57726f6e6720657468657220616d6f756e7400000000000000000000000000006044820152606401610907565b60008367ffffffffffffffff811115611f8557611f85613f74565b604051908082528060200260200182016040528015611fae578160200160208202803683370190505b50905060005b8481101561203857611fc5846123d2565b828281518110611fd757611fd7613f5e565b602002602001018181525050600160136000611ff16123c3565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546120209190613e0e565b9091555081905061203081613ed7565b915050611fb4565b506010546040516001600160a01b03909116903490600081818185875af1925050503d8060008114612086576040519150601f19603f3d011682016040523d82523d6000602084013e61208b565b606091505b509195945050505050565b606060405180606001604052806030815260200161402a60309139905090565b600e5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561210357600080fd5b505afa158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190613c28565b6001600160a01b03161415612154576001915050610818565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff16611a96565b61218a6123c3565b6001600160a01b03166121a5600d546001600160a01b031690565b6001600160a01b0316146121e95760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b6001600160a01b03811661224e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610907565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6122b26123c3565b6001600160a01b03166122cd600d546001600160a01b031690565b6001600160a01b0316146123115760405162461bcd60e51b8152602060048201819052602482015260008051602061405a8339815191526044820152606401610907565b601555565b60003330141561236d57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506123709050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b14806123a457506001600160e01b03198216635b5e139f60e01b145b8061081857506301ffc9a760e01b6001600160e01b0319831614610818565b60006123cd612316565b905090565b604080516003808252608082019092526000918291906020820160608036833701905050601954909150612408600f6011613e3a565b6124129190613e59565b8160008151811061242557612425613f5e565b602090810291909101015260255461243f60086011613e3a565b6124499190613e59565b8160018151811061245c5761245c613f5e565b6020908102919091010152603054612475600180613e3a565b61247f9190613e59565b8160028151811061249257612492613f5e565b6020026020010181815250506000816002815181106124b3576124b3613f5e565b6020026020010151826001815181106124ce576124ce613f5e565b6020026020010151836000815181106124e9576124e9613f5e565b60200260200101516124fb9190613e0e565b6125059190613e0e565b9050600081116125575760405162461bcd60e51b815260206004820152601560248201527f4e6f206361726473206c65667420746f206d696e7400000000000000000000006044820152606401610907565b6000612564600143613e59565b601754604080519240602084015282015260600160408051601f1981840301815291905280516020909101206017819055905060006125a38383613ef2565b9050836000815181106125b8576125b8613f5e565b60200260200101518110156125dd576125d386600084612f51565b9695505050505050565b836001815181106125f0576125f0613f5e565b60200260200101518460008151811061260b5761260b613f5e565b602002602001015161261d9190613e0e565b811015612630576125d3866002846130b1565b6125d3866004613206565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061267082611782565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b03861661270f5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610907565b600161272261271d87613289565b613306565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612770573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006127a58284613e0e565b9392505050565b6000818152600260205260408120546001600160a01b03166128255760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610907565b600061283083611782565b9050806001600160a01b0316846001600160a01b0316148061286b5750836001600160a01b031661286084610b8e565b6001600160a01b0316145b80611a965750611a9681856120b6565b60008084600281111561289057612890613f32565b14156128c957601883600581106128a9576128a9613f5e565b6005020160000160008381526020019081526020016000205490506127a5565b60018460028111156128dd576128dd613f32565b141561291657601883600581106128f6576128f6613f5e565b6005020160020160008381526020019081526020016000205490506127a5565b600284600281111561292a5761292a613f32565b141561028c576018836005811061294357612943613f5e565b600502016004015490509392505050565b60008061296386868686613336565b905061296f87826133d4565b600086600281111561298357612983613f32565b1415612a37576018856005811061299c5761299c613f5e565b60008681526005919091029190910160205260409020546129be906001613e0e565b601886600581106129d1576129d1613f5e565b6005020160000160008681526020019081526020016000208190555060188560058110612a0057612a00613f5e565b60050201600101546001612a149190613e0e565b60188660058110612a2757612a27613f5e565b60050201600101819055506125d3565b6001866002811115612a4b57612a4b613f32565b1415612b025760188560058110612a6457612a64613f5e565b600502016002016000858152602001908152602001600020546001612a899190613e0e565b60188660058110612a9c57612a9c613f5e565b6005020160020160008681526020019081526020016000208190555060188560058110612acb57612acb613f5e565b60050201600301546001612adf9190613e0e565b60188660058110612af257612af2613f5e565b60050201600301819055506125d3565b6002866002811115612b1657612b16613f32565b14156125d35760188560058110612b2f57612b2f613f5e565b60050201600401546001612b439190613e0e565b60188660058110612b5657612b56613f5e565b60050201600401819055509695505050505050565b6000612b7682611782565b9050612b8481600084613522565b612b8f60008361263b565b6001600160a01b0381166000908152600360205260408120805460019290612bb8908490613e59565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b826001600160a01b0316612c2582611782565b6001600160a01b031614612c8d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610907565b6001600160a01b038216612cef5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610907565b612cfa838383613522565b612d0560008261263b565b6001600160a01b0383166000908152600360205260408120805460019290612d2e908490613e59565b90915550506001600160a01b0382166000908152600360205260408120805460019290612d5c908490613e0e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612dc8848484612c12565b612dd4848484846135da565b611cc55760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610907565b606081612e5f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e895780612e7381613ed7565b9150612e829050600a83613e26565b9150612e63565b60008167ffffffffffffffff811115612ea457612ea4613f74565b6040519080825280601f01601f191660200182016040528015612ece576020820181803683370190505b5090505b8415611a9657612ee3600183613e59565b9150612ef0600a86613ef2565b612efb906030613e0e565b60f81b818381518110612f1057612f10613f5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f4a600a86613e26565b9450612ed2565b60408051600f8082526102008201909252600091829190602082016101e0803683370190505090506000805b600f811015612ff857601160188760058110612f9b57612f9b613f5e565b600502016000016000838152602001908152602001600020541015612fe65780838381518110612fcd57612fcd613f5e565b6020908102919091010152612fe3826001613e0e565b91505b612ff1816001613e0e565b9050612f7d565b50806130465760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d6f7265206d6f6e737465727320617661696c61626c650000000000006044820152606401610907565b6000826130538387613ef2565b8151811061306357613063613f5e565b602002602001015190506130a6876000888460188b6005811061308857613088613f5e565b60050201600001600087815260200190815260200160002054612954565b979650505050505050565b604080516008808252610120820190925260009182919060208201610100803683370190505090506000805b6008811015613158576011601887600581106130fb576130fb613f5e565b600502016002016000838152602001908152602001600020541015613146578083838151811061312d5761312d613f5e565b6020908102919091010152613143826001613e0e565b91505b613151816001613e0e565b90506130dd565b50806131a65760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520626f7373657320617661696c61626c6500000000000000006044820152606401610907565b6000826131b38387613ef2565b815181106131c3576131c3613f5e565b602002602001015190506130a6876001888460188b600581106131e8576131e8613f5e565b60050201600201600087815260200190815260200160002054612954565b600060016018836005811061321d5761321d613f5e565b6005020160040154106132725760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f7265206865726f657320617661696c61626c6500000000000000006044820152606401610907565b6030546127a5908490600290600490600090612954565b6000604051806080016040528060438152602001613fb660439139805160209182012083518483015160408087015180519086012090516132e9950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000613311600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016132e9565b6000808086600281111561334c5761334c613f32565b141561335a5750600061339e565b600186600281111561336e5761336e613f32565b141561337e5750620186a061339e565b600286600281111561339257613392613f32565b141561339e575062030d405b826133aa606486613e3a565b6133b687612710613e3a565b6133c09084613e0e565b6133ca9190613e0e565b6125d39190613e0e565b6001600160a01b03821661342a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610907565b6000818152600260205260409020546001600160a01b03161561348f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610907565b61349b60008383613522565b6001600160a01b03821660009081526003602052604081208054600192906134c4908490613e0e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03831661357d5761357881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6135a0565b816001600160a01b0316836001600160a01b0316146135a0576135a08382613736565b6001600160a01b0382166135b757610d46816137d3565b826001600160a01b0316826001600160a01b031614610d4657610d468282613882565b60006001600160a01b0384163b1561372e57836001600160a01b031663150b7a026136036123c3565b8786866040518563ffffffff1660e01b81526004016136259493929190613d5d565b602060405180830381600087803b15801561363f57600080fd5b505af192505050801561366f575060408051601f3d908101601f1916820190925261366c91810190613c0b565b60015b613714573d80801561369d576040519150601f19603f3d011682016040523d82523d6000602084013e6136a2565b606091505b50805161370c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610907565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a96565b506001611a96565b60006001613743846117f9565b61374d9190613e59565b6000838152600760205260409020549091508082146137a0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906137e590600190613e59565b6000838152600960205260408120546008805493945090928490811061380d5761380d613f5e565b90600052602060002001549050806008838154811061382e5761382e613f5e565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061386657613866613f48565b6001900381819060005260206000200160009055905550505050565b600061388d836117f9565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60008083601f8401126138d857600080fd5b50813567ffffffffffffffff8111156138f057600080fd5b6020830191508360208260051b850101111561390b57600080fd5b9250929050565b8035801515811461146457600080fd5b600082601f83011261393357600080fd5b813567ffffffffffffffff8082111561394e5761394e613f74565b604051601f8301601f19908116603f0116810190828211818310171561397657613976613f74565b8160405283815286602085880101111561398f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156139c157600080fd5b81356127a581613f8a565b600080604083850312156139df57600080fd5b82356139ea81613f8a565b915060208301356139fa81613f8a565b809150509250929050565b600080600060608486031215613a1a57600080fd5b8335613a2581613f8a565b92506020840135613a3581613f8a565b929592945050506040919091013590565b60008060008060808587031215613a5c57600080fd5b8435613a6781613f8a565b93506020850135613a7781613f8a565b925060408501359150606085013567ffffffffffffffff811115613a9a57600080fd5b613aa687828801613922565b91505092959194509250565b60008060408385031215613ac557600080fd5b8235613ad081613f8a565b9150613ade60208401613912565b90509250929050565b600080600080600060a08688031215613aff57600080fd5b8535613b0a81613f8a565b9450602086013567ffffffffffffffff811115613b2657600080fd5b613b3288828901613922565b9450506040860135925060608601359150608086013560ff81168114613b5757600080fd5b809150509295509295909350565b60008060408385031215613b7857600080fd5b8235613b8381613f8a565b946020939093013593505050565b60008060208385031215613ba457600080fd5b823567ffffffffffffffff811115613bbb57600080fd5b613bc7858286016138c6565b90969095509350505050565b600060208284031215613be557600080fd5b6127a582613912565b600060208284031215613c0057600080fd5b81356127a581613f9f565b600060208284031215613c1d57600080fd5b81516127a581613f9f565b600060208284031215613c3a57600080fd5b81516127a581613f8a565b600060208284031215613c5757600080fd5b5035919050565b60008060408385031215613c7157600080fd5b8235915060208301356139fa81613f8a565b60008151808452613c9b816020860160208601613e70565b601f01601f19169290920160200192915050565b60008251613cc1818460208701613e70565b9190910192915050565b60008351613cdd818460208801613e70565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b60008351613d14818460208801613e70565b835190830190613d28818360208801613e70565b01949350505050565b60006001600160a01b03808616835280851660208401525060606040830152611dd36060830184613c83565b60006001600160a01b038087168352808616602084015250836040830152608060608301526125d36080830184613c83565b6020808252825182820181905260009190848201906040850190845b81811015613dc757835183529284019291840191600101613dab565b50909695505050505050565b6020815260006127a56020830184613c83565b6020810160038310613e0857634e487b7160e01b600052602160045260246000fd5b91905290565b60008219821115613e2157613e21613f06565b500190565b600082613e3557613e35613f1c565b500490565b6000816000190483118215151615613e5457613e54613f06565b500290565b600082821015613e6b57613e6b613f06565b500390565b60005b83811015613e8b578181015183820152602001613e73565b83811115611cc55750506000910152565b600181811c90821680613eb057607f821691505b60208210811415613ed157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613eeb57613eeb613f06565b5060010190565b600082613f0157613f01613f1c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611b2e57600080fd5b6001600160e01b031981168114611b2e57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652961723a2f2f7872427451565433382d2d46517130496a766b683562354e3450716c7946685a70436b7450665f574742382f61723a2f2f41654e38347867613645525568394867754d585548456b665964726c4769385775536747743758346b364d4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212206b0735602e08f419467cd1ae7f7b63a28d04d29886a016ceb4943789762c5f5b64736f6c63430008070033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000d431000000000000000000000000a78771332a7d1b9d5e647d6be34ac1dac7481aae00000000000000000000000000000000000000000000000002c68af0bb1400000000000000000000000000000000000000000000000000000000000000000003

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [1] : _randomSeed (uint256): 54321
Arg [2] : _treasuryAddress (address): 0xA78771332A7d1B9D5E647D6Be34Ac1dac7481AaE
Arg [3] : _mintPrice (uint256): 200000000000000000
Arg [4] : _maximumMintPerWallet (uint256): 3

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [1] : 000000000000000000000000000000000000000000000000000000000000d431
Arg [2] : 000000000000000000000000a78771332a7d1b9d5e647d6be34ac1dac7481aae
Arg [3] : 00000000000000000000000000000000000000000000000002c68af0bb140000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003


Deployed Bytecode Sourcemap

64851:12995:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55571:237;;;;;;;;;;-1:-1:-1;55571:237:0;;;;;:::i;:::-;;:::i;:::-;;;11366:14:1;;11359:22;11341:41;;11329:2;11314:18;55571:237:0;;;;;;;;43761:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;75482:644::-;;;;;;:::i;:::-;;:::i;:::-;;;11539:25:1;;;11527:2;11512:18;75482:644:0;11393:177:1;45221:221:0;;;;;;;;;;-1:-1:-1;45221:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9275:55:1;;;9257:74;;9245:2;9230:18;45221:221:0;9111:226:1;44758:397:0;;;;;;;;;;-1:-1:-1;44758:397:0;;;;;:::i;:::-;;:::i;:::-;;16698:1151;;;;;;:::i;:::-;;:::i;5977:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5977:43:0;;;;;73381:1633;;;;;;;;;;-1:-1:-1;73381:1633:0;;;;;:::i;:::-;;:::i;76881:124::-;;;;;;;;;;-1:-1:-1;76881:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;76974:23:0;76950:4;76974:23;;;:13;:23;;;;;;;;;76881:124;56224:113;;;;;;;;;;-1:-1:-1;56312:10:0;:17;56224:113;;71997:336;;;;;;;;;;-1:-1:-1;71997:336:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6986:101::-;;;;;;;;;;-1:-1:-1;7064:15:0;;6986:101;;46111:305;;;;;;;;;;-1:-1:-1;46111:305:0;;;;;:::i;:::-;;:::i;18275:107::-;;;;;;;;;;-1:-1:-1;18275:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;18362:12:0;18328:13;18362:12;;;:6;:12;;;;;;;18275:107;55892:256;;;;;;;;;;-1:-1:-1;55892:256:0;;;;;:::i;:::-;;:::i;7095:161::-;;;;;;;;;;-1:-1:-1;7209:9:0;7095:161;;77433:96;;;;;;;;;;-1:-1:-1;77433:96:0;;;;;:::i;:::-;;:::i;46487:151::-;;;;;;;;;;-1:-1:-1;46487:151:0;;;;;:::i;:::-;;:::i;56414:233::-;;;;;;;;;;-1:-1:-1;56414:233:0;;;;;:::i;:::-;;:::i;77220:205::-;;;;;;;;;;-1:-1:-1;77220:205:0;;;;;:::i;:::-;;:::i;43455:239::-;;;;;;;;;;-1:-1:-1;43455:239:0;;;;;:::i;:::-;;:::i;65894:21::-;;;;;;;;;;;;;;;;43185:208;;;;;;;;;;-1:-1:-1;43185:208:0;;;;;:::i;:::-;;:::i;23688:148::-;;;;;;;;;;;;;:::i;77013:199::-;;;;;;;;;;-1:-1:-1;77013:199:0;;;;;:::i;:::-;;:::i;72341:471::-;;;;;;;;;;-1:-1:-1;72341:471:0;;;;;:::i;:::-;;:::i;23037:87::-;;;;;;;;;;-1:-1:-1;23110:6:0;;-1:-1:-1;;;;;23110:6:0;23037:87;;77537:207;;;;;;;;;;-1:-1:-1;77537:207:0;;;;;:::i;:::-;;:::i;43930:104::-;;;;;;;;;;;;;:::i;45514:295::-;;;;;;;;;;-1:-1:-1;45514:295:0;;;;;:::i;:::-;;:::i;46709:285::-;;;;;;;;;;-1:-1:-1;46709:285:0;;;;;:::i;:::-;;:::i;65924:31::-;;;;;;;;;;-1:-1:-1;65924:31:0;;;;;;;;65661:38;;;;;;;;;;-1:-1:-1;65661:38:0;;;;-1:-1:-1;;;;;65661:38:0;;;63395:175;;;;;;;;;;-1:-1:-1;63395:175:0;;;;;:::i;:::-;;:::i;66697:146::-;;;;;;;;;;;;;:::i;72820:549::-;;;;;;;;;;-1:-1:-1;72820:549:0;;;;;:::i;:::-;;:::i;76134:739::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66851:135::-;;;;;;;;;;;;;:::i;63702:580::-;;;;;;;;;;-1:-1:-1;63702:580:0;;;;;:::i;:::-;;:::i;23991:244::-;;;;;;;;;;-1:-1:-1;23991:244:0;;;;;:::i;:::-;;:::i;77752:91::-;;;;;;;;;;-1:-1:-1;77752:91:0;;;;;:::i;:::-;;:::i;65962:34::-;;;;;;;;;;-1:-1:-1;65962:34:0;;;;;;;;;;;65855:32;;;;;;;;;;;;;;;;55571:237;55673:4;-1:-1:-1;;;;;;55697:50:0;;-1:-1:-1;;;55697:50:0;;:103;;;55764:36;55788:11;55764:23;:36::i;:::-;55690:110;55571:237;-1:-1:-1;;55571:237:0:o;43761:100::-;43815:13;43848:5;43841:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43761:100;:::o;75482:644::-;75585:14;;75549:4;;75585:14;;;;;75584:15;75576:45;;;;-1:-1:-1;;;75576:45:0;;13422:2:1;75576:45:0;;;13404:21:1;13461:2;13441:18;;;13434:30;13500:19;13480:18;;;13473:47;13537:18;;75576:45:0;;;;;;;;;75640:11;;;;75632:43;;;;-1:-1:-1;;;75632:43:0;;25357:2:1;75632:43:0;;;25339:21:1;25396:2;25376:18;;;25369:30;25435:21;25415:18;;;25408:49;25474:18;;75632:43:0;25155:343:1;75632:43:0;75694:13;:27;75708:12;:10;:12::i;:::-;-1:-1:-1;;;;;75694:27:0;;;;;;;;;;;;-1:-1:-1;75694:27:0;;;;75686:55;;;;-1:-1:-1;;;75686:55:0;;21110:2:1;75686:55:0;;;21092:21:1;21149:2;21129:18;;;21122:30;21188:17;21168:18;;;21161:45;21223:18;;75686:55:0;20908:339:1;75686:55:0;75761:13;:27;75775:12;:10;:12::i;:::-;-1:-1:-1;;;;;75761:27:0;;;;;;;;;;;;-1:-1:-1;75761:27:0;;;;75760:28;75752:68;;;;-1:-1:-1;;;75752:68:0;;14171:2:1;75752:68:0;;;14153:21:1;14210:2;14190:18;;;14183:30;14249:29;14229:18;;;14222:57;14296:18;;75752:68:0;13969:351:1;75752:68:0;75854:9;;75841;:22;75833:60;;;;-1:-1:-1;;;75833:60:0;;14527:2:1;75833:60:0;;;14509:21:1;14566:2;14546:18;;;14539:30;14605:27;14585:18;;;14578:55;14650:18;;75833:60:0;14325:349:1;75833:60:0;75906:12;75921:24;75934:10;75921:12;:24::i;:::-;75906:39;;75988:4;75958:13;:27;75972:12;:10;:12::i;:::-;-1:-1:-1;;;;;75958:27:0;-1:-1:-1;;;;;75958:27:0;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;76035:1;76003:14;:28;76018:12;:10;:12::i;:::-;-1:-1:-1;;;;;76003:28:0;-1:-1:-1;;;;;76003:28:0;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;76049:15:0;;:42;;-1:-1:-1;;;;;76049:15:0;;;;76077:9;;76049:42;;;;76077:9;76049:15;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76111:7:0;;75482:644;-1:-1:-1;;;;75482:644:0:o;45221:221::-;45297:7;48550:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48550:16:0;45317:73;;;;-1:-1:-1;;;45317:73:0;;23418:2:1;45317:73:0;;;23400:21:1;23457:2;23437:18;;;23430:30;23496:34;23476:18;;;23469:62;-1:-1:-1;;;23547:18:1;;;23540:42;23599:19;;45317:73:0;23216:408:1;45317:73:0;-1:-1:-1;45410:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45410:24:0;;45221:221::o;44758:397::-;44839:13;44855:23;44870:7;44855:14;:23::i;:::-;44839:39;;44903:5;-1:-1:-1;;;;;44897:11:0;:2;-1:-1:-1;;;;;44897:11:0;;;44889:57;;;;-1:-1:-1;;;44889:57:0;;25705:2:1;44889:57:0;;;25687:21:1;25744:2;25724:18;;;25717:30;25783:34;25763:18;;;25756:62;-1:-1:-1;;;25834:18:1;;;25827:31;25875:19;;44889:57:0;25503:397:1;44889:57:0;44983:5;-1:-1:-1;;;;;44967:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;44967:21:0;;:62;;;;44992:37;45009:5;45016:12;:10;:12::i;44992:37::-;44959:154;;;;-1:-1:-1;;;44959:154:0;;20340:2:1;44959:154:0;;;20322:21:1;20379:2;20359:18;;;20352:30;20418:34;20398:18;;;20391:62;20489:26;20469:18;;;20462:54;20533:19;;44959:154:0;20138:420:1;44959:154:0;45126:21;45135:2;45139:7;45126:8;:21::i;:::-;44828:327;44758:397;;:::o;16698:1151::-;16956:152;;;16899:12;16956:152;;;;;-1:-1:-1;;;;;16994:19:0;;16924:29;16994:19;;;:6;:19;;;;;;;;;16956:152;;;;;;;;;;;17143:45;17001:11;16956:152;17171:4;17177;17183;17143:6;:45::i;:::-;17121:128;;;;-1:-1:-1;;;17121:128:0;;24955:2:1;17121:128:0;;;24937:21:1;24994:2;24974:18;;;24967:30;25033:34;25013:18;;;25006:62;-1:-1:-1;;;25084:18:1;;;25077:31;25125:19;;17121:128:0;24753:397:1;17121:128:0;-1:-1:-1;;;;;17338:19:0;;;;;;:6;:19;;;;;;:26;;17362:1;17338:23;:26::i;:::-;-1:-1:-1;;;;;17316:19:0;;;;;;:6;:19;;;;;;;:48;;;;17382:126;;;;;17323:11;;17454:10;;17480:17;;17382:126;:::i;:::-;;;;;;;;17619:12;17633:23;17668:4;-1:-1:-1;;;;;17660:18:0;17710:17;17729:11;17693:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;17693:48:0;;;;;;;;;;17660:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17618:134;;;;17771:7;17763:48;;;;-1:-1:-1;;;17763:48:0;;16119:2:1;17763:48:0;;;16101:21:1;16158:2;16138:18;;;16131:30;16197;16177:18;;;16170:58;16245:18;;17763:48:0;15917:352:1;17763:48:0;17831:10;16698:1151;-1:-1:-1;;;;;;;;16698:1151:0:o;73381:1633::-;73528:1;73511:18;;73503:65;;;;-1:-1:-1;;;73503:65:0;;13768:2:1;73503:65:0;;;13750:21:1;13807:2;13787:18;;;13780:30;13846:34;13826:18;;;13819:62;-1:-1:-1;;;13897:18:1;;;13890:32;13939:19;;73503:65:0;13566:398:1;73503:65:0;73654:6;;73661:1;73654:9;;;;;;;:::i;:::-;;;;;;;73641:6;;73648:1;73641:9;;;;;;;:::i;:::-;;;;;;;:22;;73640:50;;;;;73680:6;;73687:1;73680:9;;;;;;;:::i;:::-;;;;;;;73667:6;;73674:1;73667:9;;;;;;;:::i;:::-;;;;;;;:22;;73640:50;:76;;;;;73706:6;;73713:1;73706:9;;;;;;;:::i;:::-;;;;;;;73693:6;;73700:1;73693:9;;;;;;;:::i;:::-;;;;;;;:22;;73640:76;73632:117;;;;-1:-1:-1;;;73632:117:0;;26805:2:1;73632:117:0;;;26787:21:1;26844:2;26824:18;;;26817:30;26883:31;26863:18;;;26856:59;26932:18;;73632:117:0;26603:353:1;73632:117:0;73820:6;73815:172;73832:15;;;73815:172;;;73877:41;73896:10;73908:6;;73915:1;73908:9;;;;;;;:::i;:::-;;;;;;;73877:18;:41::i;:::-;73869:106;;;;-1:-1:-1;;;73869:106:0;;22275:2:1;73869:106:0;;;22257:21:1;22314:2;22294:18;;;22287:30;22353:34;22333:18;;;22326:62;22424:22;22404:18;;;22397:50;22464:19;;73869:106:0;22073:416:1;73869:106:0;73849:3;;;;:::i;:::-;;;;73815:172;;;;74079:22;74104:27;74121:6;;74128:1;74121:9;;;;;;;:::i;:::-;;;;;;;74104:16;:27::i;:::-;74079:52;;74142:12;74157:23;74170:6;;74177:1;74170:9;;;;;;;:::i;:::-;;;;;;;74157:12;:23::i;:::-;74142:38;;74191:10;74204:19;74213:6;;74220:1;74213:9;;;;;;;:::i;:::-;;;;;;;74204:8;:19::i;:::-;74191:32;-1:-1:-1;74252:1:0;74238:357;74255:15;;;74238:357;;;74312:27;74329:6;;74336:1;74329:9;;;;;;;:::i;74312:27::-;74300:39;;;;;;;;:::i;:::-;:8;:39;;;;;;;;:::i;:::-;;74292:98;;;;-1:-1:-1;;;74292:98:0;;16833:2:1;74292:98:0;;;16815:21:1;16872:2;16852:18;;;16845:30;16911:34;16891:18;;;16884:62;16982:16;16962:18;;;16955:44;17016:19;;74292:98:0;16631:410:1;74292:98:0;74421:23;74434:6;;74441:1;74434:9;;;;;;;:::i;74421:23::-;74413:4;:31;74405:85;;;;-1:-1:-1;;;74405:85:0;;17248:2:1;74405:85:0;;;17230:21:1;17287:2;17267:18;;;17260:30;17326:34;17306:18;;;17299:62;-1:-1:-1;;;17377:18:1;;;17370:39;17426:19;;74405:85:0;17046:405:1;74405:85:0;74522:19;74531:6;;74538:1;74531:9;;;;;;;:::i;74522:19::-;74513:5;:28;74505:78;;;;-1:-1:-1;;;74505:78:0;;19934:2:1;74505:78:0;;;19916:21:1;19973:2;19953:18;;;19946:30;20012:34;19992:18;;;19985:62;-1:-1:-1;;;20063:18:1;;;20056:35;20108:19;;74505:78:0;19732:401:1;74505:78:0;74272:3;;;;:::i;:::-;;;;74238:357;;;-1:-1:-1;64966:1:0;74664:9;:5;74672:1;74664:9;:::i;:::-;:22;74656:49;;;;-1:-1:-1;;;74656:49:0;;18830:2:1;74656:49:0;;;18812:21:1;18869:2;18849:18;;;18842:30;18908:16;18888:18;;;18881:44;18942:18;;74656:49:0;18628:338:1;74656:49:0;74759:106;74779:12;:10;:12::i;:::-;74793:8;74803:7;:5;74809:1;74803:7;:::i;:::-;74812:4;74818:46;74840:8;74850:7;:5;74856:1;74850:7;:::i;:::-;74859:4;74818:21;:46::i;:::-;74759:19;:106::i;:::-;;74930:6;74925:82;74942:15;;;74925:82;;;74979:16;74985:6;;74992:1;74985:9;;;;;;;:::i;:::-;;;;;;;74979:5;:16::i;:::-;74959:3;;;;:::i;:::-;;;;74925:82;;;;73434:1580;;;73381:1633;;:::o;71997:336::-;72061:13;65229:6;72091:7;:21;72087:239;;;-1:-1:-1;72136:17:0;;71997:336;-1:-1:-1;71997:336:0:o;72087:239::-;65273:6;72184:7;:21;72180:146;;;-1:-1:-1;72229:18:0;;71997:336;-1:-1:-1;71997:336:0:o;72180:146::-;-1:-1:-1;72296:18:0;;71997:336;-1:-1:-1;71997:336:0:o;72180:146::-;71997:336;;;:::o;46111:305::-;46272:41;46291:12;:10;:12::i;:::-;46305:7;46272:18;:41::i;:::-;46264:103;;;;-1:-1:-1;;;46264:103:0;;27163:2:1;46264:103:0;;;27145:21:1;27202:2;27182:18;;;27175:30;27241:34;27221:18;;;27214:62;-1:-1:-1;;;27292:18:1;;;27285:47;27349:19;;46264:103:0;26961:413:1;46264:103:0;46380:28;46390:4;46396:2;46400:7;46380:9;:28::i;55892:256::-;55989:7;56025:23;56042:5;56025:16;:23::i;:::-;56017:5;:31;56009:87;;;;-1:-1:-1;;;56009:87:0;;14881:2:1;56009:87:0;;;14863:21:1;14920:2;14900:18;;;14893:30;14959:34;14939:18;;;14932:62;-1:-1:-1;;;15010:18:1;;;15003:41;15061:19;;56009:87:0;14679:407:1;56009:87:0;-1:-1:-1;;;;;;56114:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;55892:256::o;77433:96::-;23268:12;:10;:12::i;:::-;-1:-1:-1;;;;;23257:23:0;:7;23110:6;;-1:-1:-1;;;;;23110:6:0;;23037:87;23257:7;-1:-1:-1;;;;;23257:23:0;;23249:68;;;;-1:-1:-1;;;23249:68:0;;24184:2:1;23249:68:0;;;24166:21:1;;;24203:18;;;24196:30;-1:-1:-1;;;;;;;;;;;24242:18:1;;;24235:62;24314:18;;23249:68:0;23982:356:1;23249:68:0;77501:11:::1;:20:::0;;-1:-1:-1;;77501:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;77433:96::o;46487:151::-;46591:39;46608:4;46614:2;46618:7;46591:39;;;;;;;;;;;;:16;:39::i;56414:233::-;56489:7;56525:30;56312:10;:17;;56224:113;56525:30;56517:5;:38;56509:95;;;;-1:-1:-1;;;56509:95:0;;27581:2:1;56509:95:0;;;27563:21:1;27620:2;27600:18;;;27593:30;27659:34;27639:18;;;27632:62;-1:-1:-1;;;27710:18:1;;;27703:42;27762:19;;56509:95:0;27379:408:1;56509:95:0;56622:10;56633:5;56622:17;;;;;;;;:::i;:::-;;;;;;;;;56615:24;;56414:233;;;:::o;77220:205::-;23268:12;:10;:12::i;:::-;-1:-1:-1;;;;;23257:23:0;:7;23110:6;;-1:-1:-1;;;;;23110:6:0;;23037:87;23257:7;-1:-1:-1;;;;;23257:23:0;;23249:68;;;;-1:-1:-1;;;23249:68:0;;24184:2:1;23249:68:0;;;24166:21:1;;;24203:18;;;24196:30;-1:-1:-1;;;;;;;;;;;24242:18:1;;;24235:62;24314:18;;23249:68:0;23982:356:1;23249:68:0;77314:6:::1;77310:107;77326:21:::0;;::::1;77310:107;;;77400:5;77369:13;:28;77383:10;;77394:1;77383:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;77369:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;77369:28:0;:36;;-1:-1:-1;;77369:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;77349:3;::::1;::::0;::::1;:::i;:::-;;;;77310:107;;43455:239:::0;43527:7;43563:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43563:16:0;43598:19;43590:73;;;;-1:-1:-1;;;43590:73:0;;21865:2:1;43590:73:0;;;21847:21:1;21904:2;21884:18;;;21877:30;21943:34;21923:18;;;21916:62;-1:-1:-1;;;21994:18:1;;;21987:39;22043:19;;43590:73:0;21663:405:1;43185:208:0;43257:7;-1:-1:-1;;;;;43285:19:0;;43277:74;;;;-1:-1:-1;;;43277:74:0;;21454:2:1;43277:74:0;;;21436:21:1;21493:2;21473:18;;;21466:30;21532:34;21512:18;;;21505:62;-1:-1:-1;;;21583:18:1;;;21576:40;21633:19;;43277:74:0;21252:406:1;43277:74:0;-1:-1:-1;;;;;;43369:16:0;;;;;:9;:16;;;;;;;43185:208::o;23688:148::-;23268:12;:10;:12::i;:::-;-1:-1:-1;;;;;23257:23:0;:7;23110:6;;-1:-1:-1;;;;;23110:6:0;;23037:87;23257:7;-1:-1:-1;;;;;23257:23:0;;23249:68;;;;-1:-1:-1;;;23249:68:0;;24184:2:1;23249:68:0;;;24166:21:1;;;24203:18;;;24196:30;-1:-1:-1;;;;;;;;;;;24242:18:1;;;24235:62;24314:18;;23249:68:0;23982:356:1;23249:68:0;23779:6:::1;::::0;23758:40:::1;::::0;23795:1:::1;::::0;-1:-1:-1;;;;;23779:6:0::1;::::0;23758:40:::1;::::0;23795:1;;23758:40:::1;23809:6;:19:::0;;-1:-1:-1;;;;;;23809:19:0::1;::::0;;23688:148::o;77013:199::-;23268:12;:10;:12::i;:::-;-1:-1:-1;;;;;23257:23:0;:7;23110:6;;-1:-1:-1;;;;;23110:6:0;;23037:87;23257:7;-1:-1:-1;;;;;23257:23:0;;23249:68;;;;-1:-1:-1;;;23249:68:0;;24184:2:1;23249:68:0;;;24166:21:1;;;24203:18;;;24196:30;-1:-1:-1;;;;;;;;;;;24242:18:1;;;24235:62;24314:18;;23249:68:0;23982:356:1;23249:68:0;77102:6:::1;77098:106;77114:21:::0;;::::1;77098:106;;;77188:4;77157:13;:28;77171:10;;77182:1;77171:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;77157:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;77157:28:0;:35;;-1:-1:-1;;77157:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;77137:3;::::1;::::0;::::1;:::i;:::-;;;;77098:106;;72341:471:::0;72397:7;72417:22;72442:25;72459:7;72442:16;:25::i;:::-;72417:50;-1:-1:-1;72478:11:0;;72508:8;:29;;;;;;;;:::i;:::-;;72504:250;;;-1:-1:-1;72563:1:0;72504:250;;;72598:18;72586:8;:30;;;;;;;;:::i;:::-;;72582:172;;;-1:-1:-1;65229:6:0;72582:172;;;72687:18;72675:8;:30;;;;;;;;:::i;:::-;;72671:83;;;-1:-1:-1;65273:6:0;72671:83;65318:5;72772:16;72782:6;72772:7;:16;:::i;:::-;72771:33;;;;:::i;:::-;72764:40;72341:471;-1:-1:-1;;;;72341:471:0:o;77537:207::-;23268:12;:10;:12::i;:::-;-1:-1:-1;;;;;23257:23:0;:7;23110:6;;-1:-1:-1;;;;;23110:6:0;;23037:87;23257:7;-1:-1:-1;;;;;23257:23:0;;23249:68;;;;-1:-1:-1;;;23249:68:0;;24184:2:1;23249:68:0;;;24166:21:1;;;24203:18;;;24196:30;-1:-1:-1;;;;;;;;;;;24242:18:1;;;24235:62;24314:18;;23249:68:0;23982:356:1;23249:68:0;77608:14:::1;:23:::0;;;::::1;::::0;::::1;;;-1:-1:-1::0;;77608:23:0;;::::1;::::0;;;::::1;::::0;;;77679:58:::1;;77706:11;:19:::0;;-1:-1:-1;;77706:19:0::1;::::0;;77679:58:::1;77537:207:::0;:::o;43930:104::-;43986:13;44019:7;44012:14;;;;;:::i;45514:295::-;45629:12;:10;:12::i;:::-;-1:-1:-1;;;;;45617:24:0;:8;-1:-1:-1;;;;;45617:24:0;;;45609:62;;;;-1:-1:-1;;;45609:62:0;;18063:2:1;45609:62:0;;;18045:21:1;18102:2;18082:18;;;18075:30;18141:27;18121:18;;;18114:55;18186:18;;45609:62:0;17861:349:1;45609:62:0;45729:8;45684:18;:32;45703:12;:10;:12::i;:::-;-1:-1:-1;;;;;45684:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;45684:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;45684:53:0;;;;;;;;;;;45768:12;:10;:12::i;:::-;-1:-1:-1;;;;;45753:48:0;;45792:8;45753:48;;;;11366:14:1;11359:22;11341:41;;11329:2;11314:18;;11201:187;45753:48:0;;;;;;;;45514:295;;:::o;46709:285::-;46841:41;46860:12;:10;:12::i;:::-;46874:7;46841:18;:41::i;:::-;46833:103;;;;-1:-1:-1;;;46833:103:0;;27163:2:1;46833:103:0;;;27145:21:1;27202:2;27182:18;;;27175:30;27241:34;27221:18;;;27214:62;-1:-1:-1;;;27292:18:1;;;27285:47;27349:19;;46833:103:0;26961:413:1;46833:103:0;46947:39;46961:4;46967:2;46971:7;46980:5;46947:13;:39::i;:::-;46709:285;;;;:::o;63395:175::-;63461:13;63518:14;:12;:14::i;:::-;63534:26;63551:8;63534:16;:26::i;:::-;63501:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63487:75;;63395:175;;;:::o;66697:146::-;66751:13;66777:58;;;;;;;;;;;;;;;;;;;66697:146;:::o;72820:549::-;72880:7;72900:22;72925:25;72942:7;72925:16;:25::i;:::-;72900:50;-1:-1:-1;72961:11:0;;72991:8;:29;;;;;;;;:::i;:::-;;72987:250;;;-1:-1:-1;73046:1:0;72987:250;;;73081:18;73069:8;:30;;;;;;;;:::i;:::-;;73065:172;;;-1:-1:-1;65229:6:0;73065:172;;;73170:18;73158:8;:30;;;;;;;;:::i;:::-;;73154:83;;;-1:-1:-1;65273:6:0;73154:83;73247:13;73263:17;73272:7;73263:8;:17::i;:::-;73247:33;-1:-1:-1;65186:3:0;73318:20;73247:33;65318:5;73318:20;:::i;:::-;73299:16;73309:6;73299:7;:16;:::i;:::-;:39;;;;:::i;:::-;73298:63;;;;:::i;:::-;73291:70;72820:549;-1:-1:-1;;;;;72820:549:0:o;76134:739::-;76215:13;76256:1;76249:4;:8;76241:37;;;;-1:-1:-1;;;76241:37:0;;20765:2:1;76241:37:0;;;20747:21:1;20804:2;20784:18;;;20777:30;20843:18;20823;;;20816:46;20879:18;;76241:37:0;20563:340:1;76241:37:0;76297:14;;;;;;;76289:43;;;;-1:-1:-1;;;76289:43:0;;26460:2:1;76289:43:0;;;26442:21:1;26499:2;26479:18;;;26472:30;26538:18;26518;;;26511:46;26574:18;;76289:43:0;26258:340:1;76289:43:0;76390:20;;76382:4;76351:14;:28;76366:12;:10;:12::i;:::-;-1:-1:-1;;;;;76351:28:0;-1:-1:-1;;;;;76351:28:0;;;;;;;;;;;;;:35;;;;:::i;:::-;:59;;76343:104;;;;-1:-1:-1;;;76343:104:0;;23057:2:1;76343:104:0;;;23039:21:1;;;23076:18;;;23069:30;23135:34;23115:18;;;23108:62;23187:18;;76343:104:0;22855:356:1;76343:104:0;76491:4;76479:9;;:16;;;;:::i;:::-;76466:9;:29;76458:60;;;;-1:-1:-1;;;76458:60:0;;27994:2:1;76458:60:0;;;27976:21:1;28033:2;28013:18;;;28006:30;28072:20;28052:18;;;28045:48;28110:18;;76458:60:0;27792:342:1;76458:60:0;76531:22;76567:4;76556:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76556:16:0;;76531:41;;76604:9;76585:198;76636:4;76632:1;:8;76585:198;;;76699:24;76712:10;76699:12;:24::i;:::-;76685:8;76694:1;76685:11;;;;;;;;:::i;:::-;;;;;;:38;;;;;76770:1;76738:14;:28;76753:12;:10;:12::i;:::-;-1:-1:-1;;;;;76738:28:0;-1:-1:-1;;;;;76738:28:0;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;76655:3:0;;-1:-1:-1;76655:3:0;;;:::i;:::-;;;;76585:198;;;-1:-1:-1;76795:15:0;;:42;;-1:-1:-1;;;;;76795:15:0;;;;76823:9;;76795:42;;;;76823:9;76795:15;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76857:8:0;;76134:739;-1:-1:-1;;;;;76134:739:0:o;66851:135::-;66895:13;66921:57;;;;;;;;;;;;;;;;;;;66851:135;:::o;63702:580::-;64091:20;;64135:28;;-1:-1:-1;;;64135:28:0;;-1:-1:-1;;;;;9275:55:1;;;64135:28:0;;;9257:74:1;63827:4:0;;64091:20;;;64127:49;;;;64091:20;;64135:21;;9230:18:1;;64135:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;64127:49:0;;64123:93;;;64200:4;64193:11;;;;;64123:93;-1:-1:-1;;;;;46001:25:0;;;45977:4;46001:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;64235:39;45880:164;23991:244;23268:12;:10;:12::i;:::-;-1:-1:-1;;;;;23257:23:0;:7;23110:6;;-1:-1:-1;;;;;23110:6:0;;23037:87;23257:7;-1:-1:-1;;;;;23257:23:0;;23249:68;;;;-1:-1:-1;;;23249:68:0;;24184:2:1;23249:68:0;;;24166:21:1;;;24203:18;;;24196:30;-1:-1:-1;;;;;;;;;;;24242:18:1;;;24235:62;24314:18;;23249:68:0;23982:356:1;23249:68:0;-1:-1:-1;;;;;24080:22:0;::::1;24072:73;;;::::0;-1:-1:-1;;;24072:73:0;;15712:2:1;24072:73:0::1;::::0;::::1;15694:21:1::0;15751:2;15731:18;;;15724:30;15790:34;15770:18;;;15763:62;-1:-1:-1;;;15841:18:1;;;15834:36;15887:19;;24072:73:0::1;15510:402:1::0;24072:73:0::1;24182:6;::::0;24161:38:::1;::::0;-1:-1:-1;;;;;24161:38:0;;::::1;::::0;24182:6:::1;::::0;24161:38:::1;::::0;24182:6:::1;::::0;24161:38:::1;24210:6;:17:::0;;-1:-1:-1;;;;;;24210:17:0::1;-1:-1:-1::0;;;;;24210:17:0;;;::::1;::::0;;;::::1;::::0;;23991:244::o;77752:91::-;23268:12;:10;:12::i;:::-;-1:-1:-1;;;;;23257:23:0;:7;23110:6;;-1:-1:-1;;;;;23110:6:0;;23037:87;23257:7;-1:-1:-1;;;;;23257:23:0;;23249:68;;;;-1:-1:-1;;;23249:68:0;;24184:2:1;23249:68:0;;;24166:21:1;;;24203:18;;;24196:30;-1:-1:-1;;;;;;;;;;;24242:18:1;;;24235:62;24314:18;;23249:68:0;23982:356:1;23249:68:0;77817:9:::1;:18:::0;77752:91::o;8021:650::-;8092:22;8136:10;8158:4;8136:27;8132:508;;;8180:18;8201:8;;8180:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;8240:8:0;8451:17;8445:24;-1:-1:-1;;;;;8419:134:0;;-1:-1:-1;8132:508:0;;-1:-1:-1;8132:508:0;;-1:-1:-1;8617:10:0;8132:508;8021:650;:::o;42829:292::-;42931:4;-1:-1:-1;;;;;;42955:40:0;;-1:-1:-1;;;42955:40:0;;:105;;-1:-1:-1;;;;;;;43012:48:0;;-1:-1:-1;;;43012:48:0;42955:105;:158;;;-1:-1:-1;;;;;;;;;;34974:40:0;;;43077:36;34865:157;64426:161;64516:14;64555:24;:22;:24::i;:::-;64548:31;;64426:161;:::o;66998:1281::-;67103:16;;;67117:1;67103:16;;;;;;;;;67051:4;;;;67103:16;;;;;;;;;;;-1:-1:-1;;67198:32:0;;67068:51;;-1:-1:-1;67151:44:0;65366:2;65023;67151:44;:::i;:::-;:79;;;;:::i;:::-;67130:15;67146:1;67130:18;;;;;;;;:::i;:::-;;;;;;;;;;:100;67334:35;;67285:46;65410:1;65080:2;67285:46;:::i;:::-;:84;;;;:::i;:::-;67264:15;67280:1;67264:18;;;;;;;;:::i;:::-;;;;;;;;;;:105;67475:30;;67426:46;65453:1;;67426:46;:::i;:::-;:79;;;;:::i;:::-;67405:15;67421:1;67405:18;;;;;;;;:::i;:::-;;;;;;:100;;;;;67551:24;67620:15;67636:1;67620:18;;;;;;;;:::i;:::-;;;;;;;67599:15;67615:1;67599:18;;;;;;;;:::i;:::-;;;;;;;67578:15;67594:1;67578:18;;;;;;;;:::i;:::-;;;;;;;:39;;;;:::i;:::-;:60;;;;:::i;:::-;67551:87;;67686:1;67667:16;:20;67659:54;;;;-1:-1:-1;;;67659:54:0;;28341:2:1;67659:54:0;;;28323:21:1;28380:2;28360:18;;;28353:30;28419:23;28399:18;;;28392:51;28460:18;;67659:54:0;28139:345:1;67659:54:0;67726:14;67788:16;67803:1;67788:12;:16;:::i;:::-;67807:10;;67761:57;;;67778:27;;67761:57;;;7235:19:1;7270:12;;7263:28;7307:12;;67761:57:0;;;-1:-1:-1;;67761:57:0;;;;;;;;;67751:68;;67761:57;67751:68;;;;67831:10;:19;;;67751:68;-1:-1:-1;67743:77:0;67890:25;67899:16;67751:68;67890:25;:::i;:::-;67871:44;;67951:15;67967:1;67951:18;;;;;;;;:::i;:::-;;;;;;;67940:8;:29;67936:336;;;67993:45;68009:3;65563:1;68031:6;67993:15;:45::i;:::-;67986:52;66998:1281;-1:-1:-1;;;;;;66998:1281:0:o;67936:336::-;68092:15;68108:1;68092:18;;;;;;;;:::i;:::-;;;;;;;68071:15;68087:1;68071:18;;;;;;;;:::i;:::-;;;;;;;:39;;;;:::i;:::-;68060:8;:50;68056:216;;;68134:47;68151:3;65607:1;68174:6;68134:16;:47::i;68056:216::-;68221:39;68238:3;65651:1;68221:16;:39::i;52338:174::-;52413:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;52413:29:0;-1:-1:-1;;;;;52413:29:0;;;;;;;;:24;;52467:23;52413:24;52467:14;:23::i;:::-;-1:-1:-1;;;;;52458:46:0;;;;;;;;;;;52338:174;;:::o;18390:486::-;18568:4;-1:-1:-1;;;;;18593:20:0;;18585:70;;;;-1:-1:-1;;;18585:70:0;;19528:2:1;18585:70:0;;;19510:21:1;19567:2;19547:18;;;19540:30;19606:34;19586:18;;;19579:62;-1:-1:-1;;;19657:18:1;;;19650:35;19702:19;;18585:70:0;19326:401:1;18585:70:0;18709:159;18737:47;18756:27;18776:6;18756:19;:27::i;:::-;18737:18;:47::i;:::-;18709:159;;;;;;;;;;;;12247:25:1;;;;12320:4;12308:17;;12288:18;;;12281:45;12342:18;;;12335:34;;;12385:18;;;12378:34;;;12219:19;;18709:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18686:182:0;:6;-1:-1:-1;;;;;18686:182:0;;18666:202;;18390:486;;;;;;;:::o;11478:98::-;11536:7;11563:5;11567:1;11563;:5;:::i;:::-;11556:12;11478:98;-1:-1:-1;;;11478:98:0:o;48755:348::-;48848:4;48550:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48550:16:0;48865:73;;;;-1:-1:-1;;;48865:73:0;;18417:2:1;48865:73:0;;;18399:21:1;18456:2;18436:18;;;18429:30;18495:34;18475:18;;;18468:62;-1:-1:-1;;;18546:18:1;;;18539:42;18598:19;;48865:73:0;18215:408:1;48865:73:0;48949:13;48965:23;48980:7;48965:14;:23::i;:::-;48949:39;;49018:5;-1:-1:-1;;;;;49007:16:0;:7;-1:-1:-1;;;;;49007:16:0;;:51;;;;49051:7;-1:-1:-1;;;;;49027:31:0;:20;49039:7;49027:11;:20::i;:::-;-1:-1:-1;;;;;49027:31:0;;49007:51;:87;;;;49062:32;49079:5;49086:7;49062:16;:32::i;75022:452::-;75132:7;;75156:9;:30;;;;;;;;:::i;:::-;;75152:296;;;75210:5;75216:6;75210:13;;;;;;;:::i;:::-;;;;:18;;:25;75229:5;75210:25;;;;;;;;;;;;75203:32;;;;75152:296;75270:18;75257:9;:31;;;;;;;;:::i;:::-;;75253:195;;;75312:5;75318:6;75312:13;;;;;;;:::i;:::-;;;;:20;;:27;75333:5;75312:27;;;;;;;;;;;;75305:34;;;;75253:195;75374:18;75361:9;:31;;;;;;;;:::i;:::-;;75357:91;;;75416:5;75422:6;75416:13;;;;;;;:::i;:::-;;;;:20;;;75409:27;;75022:452;;;;;:::o;68820:864::-;68956:4;68973:18;68994:54;69011:9;69022:6;69030:10;69042:5;68994:16;:54::i;:::-;68973:75;;69069:22;69075:3;69080:10;69069:5;:22::i;:::-;69134:17;69121:9;:30;;;;;;;;:::i;:::-;;69117:530;;;69201:5;69207:6;69201:13;;;;;;;:::i;:::-;:18;:30;;;:13;;;;;;;;;:30;;;;;;:34;;69234:1;69201:34;:::i;:::-;69168:5;69174:6;69168:13;;;;;;;:::i;:::-;;;;:18;;:30;69187:10;69168:30;;;;;;;;;;;:67;;;;69276:5;69282:6;69276:13;;;;;;;:::i;:::-;;;;:23;;;69302:1;69276:27;;;;:::i;:::-;69250:5;69256:6;69250:13;;;;;;;:::i;:::-;;;;:23;;:53;;;;69117:530;;;69338:18;69325:9;:31;;;;;;;;:::i;:::-;;69321:326;;;69408:5;69414:6;69408:13;;;;;;;:::i;:::-;;;;:20;;:32;69429:10;69408:32;;;;;;;;;;;;69443:1;69408:36;;;;:::i;:::-;69373:5;69379:6;69373:13;;;;;;;:::i;:::-;;;;:20;;:32;69394:10;69373:32;;;;;;;;;;;:71;;;;69487:5;69493:6;69487:13;;;;;;;:::i;:::-;;;;:25;;;69515:1;69487:29;;;;:::i;:::-;69459:5;69465:6;69459:13;;;;;;;:::i;:::-;;;;:25;;:57;;;;69321:326;;;69551:18;69538:9;:31;;;;;;;;:::i;:::-;;69534:113;;;69609:5;69615:6;69609:13;;;;;;;:::i;:::-;;;;:20;;;69632:1;69609:24;;;;:::i;:::-;69586:5;69592:6;69586:13;;;;;;;:::i;:::-;;;;:20;;:47;;;;69666:10;68820:864;-1:-1:-1;;;;;;68820:864:0:o;50979:360::-;51039:13;51055:23;51070:7;51055:14;:23::i;:::-;51039:39;;51091:48;51112:5;51127:1;51131:7;51091:20;:48::i;:::-;51180:29;51197:1;51201:7;51180:8;:29::i;:::-;-1:-1:-1;;;;;51222:16:0;;;;;;:9;:16;;;;;:21;;51242:1;;51222:16;:21;;51242:1;;51222:21;:::i;:::-;;;;-1:-1:-1;;51261:16:0;;;;:7;:16;;;;;;51254:23;;-1:-1:-1;;;;;;51254:23:0;;;51295:36;51269:7;;51261:16;-1:-1:-1;;;;;51295:36:0;;;;;51261:16;;51295:36;51028:311;50979:360;:::o;51676:544::-;51801:4;-1:-1:-1;;;;;51774:31:0;:23;51789:7;51774:14;:23::i;:::-;-1:-1:-1;;;;;51774:31:0;;51766:85;;;;-1:-1:-1;;;51766:85:0;;24545:2:1;51766:85:0;;;24527:21:1;24584:2;24564:18;;;24557:30;24623:34;24603:18;;;24596:62;-1:-1:-1;;;24674:18:1;;;24667:39;24723:19;;51766:85:0;24343:405:1;51766:85:0;-1:-1:-1;;;;;51870:16:0;;51862:65;;;;-1:-1:-1;;;51862:65:0;;17658:2:1;51862:65:0;;;17640:21:1;17697:2;17677:18;;;17670:30;17736:34;17716:18;;;17709:62;-1:-1:-1;;;17787:18:1;;;17780:34;17831:19;;51862:65:0;17456:400:1;51862:65:0;51940:39;51961:4;51967:2;51971:7;51940:20;:39::i;:::-;52044:29;52061:1;52065:7;52044:8;:29::i;:::-;-1:-1:-1;;;;;52086:15:0;;;;;;:9;:15;;;;;:20;;52105:1;;52086:15;:20;;52105:1;;52086:20;:::i;:::-;;;;-1:-1:-1;;;;;;;52117:13:0;;;;;;:9;:13;;;;;:18;;52134:1;;52117:13;:18;;52134:1;;52117:18;:::i;:::-;;;;-1:-1:-1;;52146:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;52146:21:0;-1:-1:-1;;;;;52146:21:0;;;;;;;;;52185:27;;52146:16;;52185:27;;;;;;;51676:544;;;:::o;47876:272::-;47990:28;48000:4;48006:2;48010:7;47990:9;:28::i;:::-;48037:48;48060:4;48066:2;48070:7;48079:5;48037:22;:48::i;:::-;48029:111;;;;-1:-1:-1;;;48029:111:0;;15293:2:1;48029:111:0;;;15275:21:1;15332:2;15312:18;;;15305:30;15371:34;15351:18;;;15344:62;-1:-1:-1;;;15422:18:1;;;15415:48;15480:19;;48029:111:0;15091:414:1;19198:723:0;19254:13;19475:10;19471:53;;-1:-1:-1;;19502:10:0;;;;;;;;;;;;-1:-1:-1;;;19502:10:0;;;;;19198:723::o;19471:53::-;19549:5;19534:12;19590:78;19597:9;;19590:78;;19623:8;;;;:::i;:::-;;-1:-1:-1;19646:10:0;;-1:-1:-1;19654:2:0;19646:10;;:::i;:::-;;;19590:78;;;19678:19;19710:6;19700:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19700:17:0;;19678:39;;19728:154;19735:10;;19728:154;;19762:11;19772:1;19762:11;;:::i;:::-;;-1:-1:-1;19831:10:0;19839:2;19831:5;:10;:::i;:::-;19818:24;;:2;:24;:::i;:::-;19805:39;;19788:6;19795;19788:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;19859:11:0;19868:2;19859:11;;:::i;:::-;;;19728:154;;69696:964;69896:29;;;65366:2;69896:29;;;;;;;;;69784:4;;;;69896:29;;;;;;;;;;;-1:-1:-1;69896:29:0;69857:68;;69936:30;69986:6;69981:283;65366:2;69998:1;:18;69981:283;;;65023:2;70048:5;70054:6;70048:13;;;;;;;:::i;:::-;;;;:18;;:21;70067:1;70048:21;;;;;;;;;;;;:51;70044:209;;;70166:1;70120:19;70140:22;70120:43;;;;;;;;:::i;:::-;;;;;;;;;;:47;70211:26;:22;70236:1;70211:26;:::i;:::-;70186:51;;70044:209;70022:5;:1;70026;70022:5;:::i;:::-;70018:9;;69981:283;;;-1:-1:-1;70288:27:0;70284:96;;70332:36;;-1:-1:-1;;;70332:36:0;;19173:2:1;70332:36:0;;;19155:21:1;19212:2;19192:18;;;19185:30;19251:28;19231:18;;;19224:56;19297:18;;70332:36:0;18971:350:1;70284:96:0;70459:17;70479:19;70499:31;70508:22;70499:6;:31;:::i;:::-;70479:52;;;;;;;;:::i;:::-;;;;;;;70459:72;;70559:93;70579:3;70584:17;70603:6;70611:9;70622:5;70628:6;70622:13;;;;;;;:::i;:::-;;;;:18;;:29;70641:9;70622:29;;;;;;;;;;;;70559:19;:93::i;:::-;70552:100;69696:964;-1:-1:-1;;;;;;;69696:964:0:o;70672:971::-;70873:30;;;65410:1;70873:30;;;;;;;;;70761:4;;;;70873:30;;;;;;;;;;;-1:-1:-1;70873:30:0;70834:69;;70914:30;70964:6;70959:287;65410:1;70976;:19;70959:287;;;65080:2;71027:5;71033:6;71027:13;;;;;;;:::i;:::-;;;;:20;;:23;71048:1;71027:23;;;;;;;;;;;;:54;71023:212;;;71148:1;71102:19;71122:22;71102:43;;;;;;;;:::i;:::-;;;;;;;;;;:47;71193:26;:22;71218:1;71193:26;:::i;:::-;71168:51;;71023:212;71001:5;:1;71005;71001:5;:::i;:::-;70997:9;;70959:287;;;-1:-1:-1;71270:27:0;71266:94;;71314:34;;-1:-1:-1;;;71314:34:0;;26107:2:1;71314:34:0;;;26089:21:1;26146:2;26126:18;;;26119:30;26185:26;26165:18;;;26158:54;26229:18;;71314:34:0;25905:348:1;71266:94:0;71439:17;71459:19;71479:31;71488:22;71479:6;:31;:::i;:::-;71459:52;;;;;;;;:::i;:::-;;;;;;;71439:72;;71539:96;71559:3;71564:18;71584:6;71592:9;71603:5;71609:6;71603:13;;;;;;;:::i;:::-;;;;:20;;:31;71624:9;71603:31;;;;;;;;;;;;71539:19;:96::i;71659:330::-;71732:4;65453:1;71755:5;71761:6;71755:13;;;;;;;:::i;:::-;;;;:20;;;:39;71751:106;;71811:34;;-1:-1:-1;;;71811:34:0;;23831:2:1;71811:34:0;;;23813:21:1;23870:2;23850:18;;;23843:30;23909:26;23889:18;;;23882:54;23953:18;;71811:34:0;23629:348:1;71751:106:0;71950:30;;71884:97;;71904:3;;71909:18;;65651:1;;71947;;71884:19;:97::i;17857:410::-;17967:7;16034:100;;;;;;;;;;;;;;;;;16014:127;;;;;;;18121:12;;18156:11;;;;18200:24;;;;;18190:35;;;;;;18040:204;;;;;11806:25:1;;;11862:2;11847:18;;11840:34;;;;-1:-1:-1;;;;;11910:55:1;11905:2;11890:18;;11883:83;11997:2;11982:18;;11975:34;11793:3;11778:19;;11575:440;18040:204:0;;;;;;;;;;;;;18012:247;;;;;;17992:267;;17857:410;;;:::o;7625:258::-;7724:7;7826:20;7064:15;;;6986:101;7826:20;7797:63;;-1:-1:-1;;;7797:63:0;;;8762:27:1;8805:11;;;8798:27;;;;8841:12;;;8834:28;;;8878:12;;7797:63:0;8504:392:1;68287:525:0;68412:7;;;68465:9;:30;;;;;;;;:::i;:::-;;68461:253;;;-1:-1:-1;68521:1:0;68461:253;;;68557:18;68544:9;:31;;;;;;;;:::i;:::-;;68540:174;;;-1:-1:-1;65229:6:0;68540:174;;;68647:18;68634:9;:31;;;;;;;;:::i;:::-;;68630:84;;;-1:-1:-1;65273:6:0;68630:84;68799:5;68764:32;65186:3;68764:10;:32;:::i;:::-;68740:21;68755:6;65318:5;68740:21;:::i;:::-;68731:30;;:6;:30;:::i;:::-;:65;;;;:::i;:::-;:73;;;;:::i;50368:382::-;-1:-1:-1;;;;;50448:16:0;;50440:61;;;;-1:-1:-1;;;50440:61:0;;22696:2:1;50440:61:0;;;22678:21:1;;;22715:18;;;22708:30;22774:34;22754:18;;;22747:62;22826:18;;50440:61:0;22494:356:1;50440:61:0;48526:4;48550:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48550:16:0;:30;50512:58;;;;-1:-1:-1;;;50512:58:0;;16476:2:1;50512:58:0;;;16458:21:1;16515:2;16495:18;;;16488:30;16554;16534:18;;;16527:58;16602:18;;50512:58:0;16274:352:1;50512:58:0;50583:45;50612:1;50616:2;50620:7;50583:20;:45::i;:::-;-1:-1:-1;;;;;50641:13:0;;;;;;:9;:13;;;;;:18;;50658:1;;50641:13;:18;;50658:1;;50641:18;:::i;:::-;;;;-1:-1:-1;;50670:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;50670:21:0;-1:-1:-1;;;;;50670:21:0;;;;;;;;50709:33;;50670:16;;;50709:33;;50670:16;;50709:33;50368:382;;:::o;57260:555::-;-1:-1:-1;;;;;57432:18:0;;57428:187;;57467:40;57499:7;58642:10;:17;;58615:24;;;;:15;:24;;;;;:44;;;58670:24;;;;;;;;;;;;58538:164;57467:40;57428:187;;;57537:2;-1:-1:-1;;;;;57529:10:0;:4;-1:-1:-1;;;;;57529:10:0;;57525:90;;57556:47;57589:4;57595:7;57556:32;:47::i;:::-;-1:-1:-1;;;;;57629:16:0;;57625:183;;57662:45;57699:7;57662:36;:45::i;57625:183::-;57735:4;-1:-1:-1;;;;;57729:10:0;:2;-1:-1:-1;;;;;57729:10:0;;57725:83;;57756:40;57784:2;57788:7;57756:27;:40::i;53077:843::-;53198:4;-1:-1:-1;;;;;53224:13:0;;25383:20;25422:8;53220:693;;53276:2;-1:-1:-1;;;;;53260:36:0;;53297:12;:10;:12::i;:::-;53311:4;53317:7;53326:5;53260:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53260:72:0;;;;;;;;-1:-1:-1;;53260:72:0;;;;;;;;;;;;:::i;:::-;;;53256:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53506:13:0;;53502:341;;53549:60;;-1:-1:-1;;;53549:60:0;;15293:2:1;53549:60:0;;;15275:21:1;15332:2;15312:18;;;15305:30;15371:34;15351:18;;;15344:62;-1:-1:-1;;;15422:18:1;;;15415:48;15480:19;;53549:60:0;15091:414:1;53502:341:0;53793:6;53787:13;53778:6;53774:2;53770:15;53763:38;53256:602;-1:-1:-1;;;;;;53383:55:0;-1:-1:-1;;;53383:55:0;;-1:-1:-1;53376:62:0;;53220:693;-1:-1:-1;53897:4:0;53890:11;;59329:988;59595:22;59645:1;59620:22;59637:4;59620:16;:22::i;:::-;:26;;;;:::i;:::-;59657:18;59678:26;;;:17;:26;;;;;;59595:51;;-1:-1:-1;59811:28:0;;;59807:328;;-1:-1:-1;;;;;59878:18:0;;59856:19;59878:18;;;:12;:18;;;;;;;;:34;;;;;;;;;59929:30;;;;;;:44;;;60046:30;;:17;:30;;;;;:43;;;59807:328;-1:-1:-1;60231:26:0;;;;:17;:26;;;;;;;;60224:33;;;-1:-1:-1;;;;;60275:18:0;;;;;:12;:18;;;;;:34;;;;;;;60268:41;59329:988::o;60612:1079::-;60890:10;:17;60865:22;;60890:21;;60910:1;;60890:21;:::i;:::-;60922:18;60943:24;;;:15;:24;;;;;;61316:10;:26;;60865:46;;-1:-1:-1;60943:24:0;;60865:46;;61316:26;;;;;;:::i;:::-;;;;;;;;;61294:48;;61380:11;61355:10;61366;61355:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;61460:28;;;:15;:28;;;;;;;:41;;;61632:24;;;;;61625:31;61667:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;60683:1008;;;60612:1079;:::o;58116:221::-;58201:14;58218:20;58235:2;58218:16;:20::i;:::-;-1:-1:-1;;;;;58249:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;58294:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;58116:221:0:o;14:367:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:160::-;451:20;;507:13;;500:21;490:32;;480:60;;536:1;533;526:12;551:718;593:5;646:3;639:4;631:6;627:17;623:27;613:55;;664:1;661;654:12;613:55;700:6;687:20;726:18;763:2;759;756:10;753:36;;;769:18;;:::i;:::-;844:2;838:9;812:2;898:13;;-1:-1:-1;;894:22:1;;;918:2;890:31;886:40;874:53;;;942:18;;;962:22;;;939:46;936:72;;;988:18;;:::i;:::-;1028:10;1024:2;1017:22;1063:2;1055:6;1048:18;1109:3;1102:4;1097:2;1089:6;1085:15;1081:26;1078:35;1075:55;;;1126:1;1123;1116:12;1075:55;1190:2;1183:4;1175:6;1171:17;1164:4;1156:6;1152:17;1139:54;1237:1;1230:4;1225:2;1217:6;1213:15;1209:26;1202:37;1257:6;1248:15;;;;;;551:718;;;;:::o;1274:247::-;1333:6;1386:2;1374:9;1365:7;1361:23;1357:32;1354:52;;;1402:1;1399;1392:12;1354:52;1441:9;1428:23;1460:31;1485:5;1460:31;:::i;1526:388::-;1594:6;1602;1655:2;1643:9;1634:7;1630:23;1626:32;1623:52;;;1671:1;1668;1661:12;1623:52;1710:9;1697:23;1729:31;1754:5;1729:31;:::i;:::-;1779:5;-1:-1:-1;1836:2:1;1821:18;;1808:32;1849:33;1808:32;1849:33;:::i;:::-;1901:7;1891:17;;;1526:388;;;;;:::o;1919:456::-;1996:6;2004;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2120:9;2107:23;2139:31;2164:5;2139:31;:::i;:::-;2189:5;-1:-1:-1;2246:2:1;2231:18;;2218:32;2259:33;2218:32;2259:33;:::i;:::-;1919:456;;2311:7;;-1:-1:-1;;;2365:2:1;2350:18;;;;2337:32;;1919:456::o;2380:665::-;2475:6;2483;2491;2499;2552:3;2540:9;2531:7;2527:23;2523:33;2520:53;;;2569:1;2566;2559:12;2520:53;2608:9;2595:23;2627:31;2652:5;2627:31;:::i;:::-;2677:5;-1:-1:-1;2734:2:1;2719:18;;2706:32;2747:33;2706:32;2747:33;:::i;:::-;2799:7;-1:-1:-1;2853:2:1;2838:18;;2825:32;;-1:-1:-1;2908:2:1;2893:18;;2880:32;2935:18;2924:30;;2921:50;;;2967:1;2964;2957:12;2921:50;2990:49;3031:7;3022:6;3011:9;3007:22;2990:49;:::i;:::-;2980:59;;;2380:665;;;;;;;:::o;3050:315::-;3115:6;3123;3176:2;3164:9;3155:7;3151:23;3147:32;3144:52;;;3192:1;3189;3182:12;3144:52;3231:9;3218:23;3250:31;3275:5;3250:31;:::i;:::-;3300:5;-1:-1:-1;3324:35:1;3355:2;3340:18;;3324:35;:::i;:::-;3314:45;;3050:315;;;;;:::o;3370:758::-;3472:6;3480;3488;3496;3504;3557:3;3545:9;3536:7;3532:23;3528:33;3525:53;;;3574:1;3571;3564:12;3525:53;3613:9;3600:23;3632:31;3657:5;3632:31;:::i;:::-;3682:5;-1:-1:-1;3738:2:1;3723:18;;3710:32;3765:18;3754:30;;3751:50;;;3797:1;3794;3787:12;3751:50;3820:49;3861:7;3852:6;3841:9;3837:22;3820:49;:::i;:::-;3810:59;;;3916:2;3905:9;3901:18;3888:32;3878:42;;3967:2;3956:9;3952:18;3939:32;3929:42;;4023:3;4012:9;4008:19;3995:33;4072:4;4063:7;4059:18;4050:7;4047:31;4037:59;;4092:1;4089;4082:12;4037:59;4115:7;4105:17;;;3370:758;;;;;;;;:::o;4133:315::-;4201:6;4209;4262:2;4250:9;4241:7;4237:23;4233:32;4230:52;;;4278:1;4275;4268:12;4230:52;4317:9;4304:23;4336:31;4361:5;4336:31;:::i;:::-;4386:5;4438:2;4423:18;;;;4410:32;;-1:-1:-1;;;4133:315:1:o;4453:437::-;4539:6;4547;4600:2;4588:9;4579:7;4575:23;4571:32;4568:52;;;4616:1;4613;4606:12;4568:52;4656:9;4643:23;4689:18;4681:6;4678:30;4675:50;;;4721:1;4718;4711:12;4675:50;4760:70;4822:7;4813:6;4802:9;4798:22;4760:70;:::i;:::-;4849:8;;4734:96;;-1:-1:-1;4453:437:1;-1:-1:-1;;;;4453:437:1:o;5337:180::-;5393:6;5446:2;5434:9;5425:7;5421:23;5417:32;5414:52;;;5462:1;5459;5452:12;5414:52;5485:26;5501:9;5485:26;:::i;5522:245::-;5580:6;5633:2;5621:9;5612:7;5608:23;5604:32;5601:52;;;5649:1;5646;5639:12;5601:52;5688:9;5675:23;5707:30;5731:5;5707:30;:::i;5772:249::-;5841:6;5894:2;5882:9;5873:7;5869:23;5865:32;5862:52;;;5910:1;5907;5900:12;5862:52;5942:9;5936:16;5961:30;5985:5;5961:30;:::i;6026:280::-;6125:6;6178:2;6166:9;6157:7;6153:23;6149:32;6146:52;;;6194:1;6191;6184:12;6146:52;6226:9;6220:16;6245:31;6270:5;6245:31;:::i;6311:180::-;6370:6;6423:2;6411:9;6402:7;6398:23;6394:32;6391:52;;;6439:1;6436;6429:12;6391:52;-1:-1:-1;6462:23:1;;6311:180;-1:-1:-1;6311:180:1:o;6496:315::-;6564:6;6572;6625:2;6613:9;6604:7;6600:23;6596:32;6593:52;;;6641:1;6638;6631:12;6593:52;6677:9;6664:23;6654:33;;6737:2;6726:9;6722:18;6709:32;6750:31;6775:5;6750:31;:::i;6816:257::-;6857:3;6895:5;6889:12;6922:6;6917:3;6910:19;6938:63;6994:6;6987:4;6982:3;6978:14;6971:4;6964:5;6960:16;6938:63;:::i;:::-;7055:2;7034:15;-1:-1:-1;;7030:29:1;7021:39;;;;7062:4;7017:50;;6816:257;-1:-1:-1;;6816:257:1:o;7330:274::-;7459:3;7497:6;7491:13;7513:53;7559:6;7554:3;7547:4;7539:6;7535:17;7513:53;:::i;:::-;7582:16;;;;;7330:274;-1:-1:-1;;7330:274:1:o;7609:415::-;7766:3;7804:6;7798:13;7820:53;7866:6;7861:3;7854:4;7846:6;7842:17;7820:53;:::i;:::-;7942:2;7938:15;;;;-1:-1:-1;;7934:53:1;7895:16;;;;7920:68;;;8015:2;8004:14;;7609:415;-1:-1:-1;;7609:415:1:o;8029:470::-;8208:3;8246:6;8240:13;8262:53;8308:6;8303:3;8296:4;8288:6;8284:17;8262:53;:::i;:::-;8378:13;;8337:16;;;;8400:57;8378:13;8337:16;8434:4;8422:17;;8400:57;:::i;:::-;8473:20;;8029:470;-1:-1:-1;;;;8029:470:1:o;9589:454::-;9771:4;-1:-1:-1;;;;;9881:2:1;9873:6;9869:15;9858:9;9851:34;9933:2;9925:6;9921:15;9916:2;9905:9;9901:18;9894:43;;9973:2;9968;9957:9;9953:18;9946:30;9993:44;10033:2;10022:9;10018:18;10010:6;9993:44;:::i;10048:511::-;10242:4;-1:-1:-1;;;;;10352:2:1;10344:6;10340:15;10329:9;10322:34;10404:2;10396:6;10392:15;10387:2;10376:9;10372:18;10365:43;;10444:6;10439:2;10428:9;10424:18;10417:34;10487:3;10482:2;10471:9;10467:18;10460:31;10508:45;10548:3;10537:9;10533:19;10525:6;10508:45;:::i;10564:632::-;10735:2;10787:21;;;10857:13;;10760:18;;;10879:22;;;10706:4;;10735:2;10958:15;;;;10932:2;10917:18;;;10706:4;11001:169;11015:6;11012:1;11009:13;11001:169;;;11076:13;;11064:26;;11145:15;;;;11110:12;;;;11037:1;11030:9;11001:169;;;-1:-1:-1;11187:3:1;;10564:632;-1:-1:-1;;;;;;10564:632:1:o;12423:217::-;12570:2;12559:9;12552:21;12533:4;12590:44;12630:2;12619:9;12615:18;12607:6;12590:44;:::i;12645:346::-;12795:2;12780:18;;12828:1;12817:13;;12807:144;;12873:10;12868:3;12864:20;12861:1;12854:31;12908:4;12905:1;12898:15;12936:4;12933:1;12926:15;12807:144;12960:25;;;12645:346;:::o;28671:128::-;28711:3;28742:1;28738:6;28735:1;28732:13;28729:39;;;28748:18;;:::i;:::-;-1:-1:-1;28784:9:1;;28671:128::o;28804:120::-;28844:1;28870;28860:35;;28875:18;;:::i;:::-;-1:-1:-1;28909:9:1;;28804:120::o;28929:168::-;28969:7;29035:1;29031;29027:6;29023:14;29020:1;29017:21;29012:1;29005:9;28998:17;28994:45;28991:71;;;29042:18;;:::i;:::-;-1:-1:-1;29082:9:1;;28929:168::o;29102:125::-;29142:4;29170:1;29167;29164:8;29161:34;;;29175:18;;:::i;:::-;-1:-1:-1;29212:9:1;;29102:125::o;29232:258::-;29304:1;29314:113;29328:6;29325:1;29322:13;29314:113;;;29404:11;;;29398:18;29385:11;;;29378:39;29350:2;29343:10;29314:113;;;29445:6;29442:1;29439:13;29436:48;;;-1:-1:-1;;29480:1:1;29462:16;;29455:27;29232:258::o;29495:380::-;29574:1;29570:12;;;;29617;;;29638:61;;29692:4;29684:6;29680:17;29670:27;;29638:61;29745:2;29737:6;29734:14;29714:18;29711:38;29708:161;;;29791:10;29786:3;29782:20;29779:1;29772:31;29826:4;29823:1;29816:15;29854:4;29851:1;29844:15;29708:161;;29495:380;;;:::o;29880:135::-;29919:3;-1:-1:-1;;29940:17:1;;29937:43;;;29960:18;;:::i;:::-;-1:-1:-1;30007:1:1;29996:13;;29880:135::o;30020:112::-;30052:1;30078;30068:35;;30083:18;;:::i;:::-;-1:-1:-1;30117:9:1;;30020:112::o;30137:127::-;30198:10;30193:3;30189:20;30186:1;30179:31;30229:4;30226:1;30219:15;30253:4;30250:1;30243:15;30269:127;30330:10;30325:3;30321:20;30318:1;30311:31;30361:4;30358:1;30351:15;30385:4;30382:1;30375:15;30401:127;30462:10;30457:3;30453:20;30450:1;30443:31;30493:4;30490:1;30483:15;30517:4;30514:1;30507:15;30533:127;30594:10;30589:3;30585:20;30582:1;30575:31;30625:4;30622:1;30615:15;30649:4;30646:1;30639:15;30665:127;30726:10;30721:3;30717:20;30714:1;30707:31;30757:4;30754:1;30747:15;30781:4;30778:1;30771:15;30797:127;30858:10;30853:3;30849:20;30846:1;30839:31;30889:4;30886:1;30879:15;30913:4;30910:1;30903:15;30929:154;-1:-1:-1;;;;;31008:5:1;31004:54;30997:5;30994:65;30984:93;;31073:1;31070;31063:12;31088:131;-1:-1:-1;;;;;;31162:32:1;;31152:43;;31142:71;;31209:1;31206;31199:12

Swarm Source

ipfs://6b0735602e08f419467cd1ae7f7b63a28d04d29886a016ceb4943789762c5f5b
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.