ETH Price: $3,311.88 (+2.21%)
Gas: 5 Gwei

Token

409 AMIGOS (AMIGO)
 

Overview

Max Total Supply

0 AMIGO

Holders

49

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
jamex.eth
Balance
1 AMIGO
0xdA00A06Ab3BbD3544B79C1350C463CAb9f196880
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:
Mint409

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-27
*/

// File: contracts/@rarible/royalties/contracts/LibRoyaltiesV2.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library LibRoyaltiesV2 {
    /*
    * bytes4(keccak256('getRoyalties(LibAsset.AssetType)')) == 0x44c74bcc
    */
    bytes4 constant _INTERFACE_ID_ROYALTIES = 0x44c74bcc;
}
// File: contracts/@rarible/royalties/contracts/LibPart.sol



pragma solidity ^0.8.0;

library LibPart {
    bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)");

    struct Part {
        address payable account;
        uint96 value;
    }

    function hash(Part memory part) internal pure returns (bytes32) {
        return keccak256(abi.encode(TYPE_HASH, part.account, part.value));
    }
}
// File: contracts/@rarible/royalties/contracts/RoyaltiesV2.sol



pragma solidity ^0.8.0;


interface RoyaltiesV2 {
    event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties);

    function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory);
}
// File: contracts/@rarible/royalties/contracts/impl/AbstractRoyalties.sol



pragma solidity ^0.8.0;


abstract contract AbstractRoyalties {
    mapping (uint256 => LibPart.Part[]) public royalties;

    function _saveRoyalties(uint256 _id, LibPart.Part[] memory _royalties) internal {
        for (uint i = 0; i < _royalties.length; i++) {
            require(_royalties[i].account != address(0x0), "Recipient should be present");
            require(_royalties[i].value != 0, "Royalty value should be positive");
            royalties[_id].push(_royalties[i]);
        }
        _onRoyaltiesSet(_id, _royalties);
    }

    function _updateAccount(uint256 _id, address _from, address _to) internal {
        uint length = royalties[_id].length;
        for(uint i = 0; i < length; i++) {
            if (royalties[_id][i].account == _from) {
                royalties[_id][i].account = payable(address(uint160(_to)));
            }
        }
    }

    function _onRoyaltiesSet(uint256 _id, LibPart.Part[] memory _royalties) virtual internal;
}

// File: contracts/@rarible/royalties/contracts/impl/RoyaltiesV2Impl.sol



pragma solidity ^0.8.0;



contract RoyaltiesV2Impl is AbstractRoyalties, RoyaltiesV2 {
    function getRaribleV2Royalties(uint256 id) override external view returns (LibPart.Part[] memory) {
        return royalties[id];
    }

    function _onRoyaltiesSet(uint256 _id, LibPart.Part[] memory _royalties) override internal {
        emit RoyaltiesSet(_id, _royalties);
    }
}

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: contracts/royalties/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;


interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
// File: contracts/royalties/OperatorFilterer.sol


pragma solidity ^0.8.13;


contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
// File: contracts/royalties/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (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) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (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/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (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/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (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`.
     *
     * 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;

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (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/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden 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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-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. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

// File: contracts/mint409.sol

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                            //
//                                                                                                            //
//                            ┴┴┴┴┴┴┴┘        "┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴`        "┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴                   //
//                        ▐▒▒▓▓▓▓▓▓▓▓▌     ╠▒╠▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀╠╠░  ╠▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌╠╠                //
//                     ╠▄▄▄▄▓▓▓▓▓▓▓▓▓▌     ╠▄▓▓▓▓▓▓▀▀▀▀▀▀▀▀▀▓▓▓▓▄▓▓▌ ▐▄▓▓▓▓▓▓▓▀▀▀▀▀▀▀▀▓▓▓▓▓▄▄▓                //
//                 ,▄▄▄▓▓▓▓▓▓▓▓▓▓▓▓▓▓▌    ╙▓▓▓▓▓▓▓▓▀┴┴┴┴┴┴┴▀▓▓▓▓▓▓▓▄ ║▓▓▓▓▓▓▓▓┴┴┴┴┴┴┴┴▓▓▓▓▓▓▓▓▄               //
//              ╓▄▄▄▄▄▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄,,╓ ╙▓▓▓▓▓▓▓▓░"""""""▀▓▓▓▓▓▓▓▄ ▀▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓╕               //
//              ╟▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███ `▓▓▓▓▓▓▓▓        ╠▓▓▓▓▓▓▓█    `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓m               //
//              ╟▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ,▓▓▓▓▓▓▓▓        ║▓▓▓▓▓▓▓█    ,,,,,,,,,,,,,,▓▓▓▓▓▓▓▓∩               //
//             ╓▄▄▄▄▄▄▄▄▄▄▄▄▄▄▓▓▓▓▓▓▓▓▄▄  ▄▓▓▓▓▓▓▓▀        ▄▓▓▓▓▓▓▓▀    ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▓▓▓▓▓▓▓▓┘               //
//             .--╓╓╓╓╓╓╓╓╓-4▄▓▓▓▓▓▓▓▓╓,  ▄▓▓▓▓▓▓▓▓"¬¬¬¬¬¬╔▓▓▓▓▓▓▓▓▀      ¬  ¬    9▓▀▓▓▓▓▓▓▓▓▓┘               //
//                           ╣▓▓▓▓▓▓▓▌    #███▓▓▓▓▓▀▀▀▀▀▀▀▓▓▓▓▓▓▓██▀     ▀▀▀▀▀▀▀▀▀▓▓▓▓▓▓███+-                 //
//                           ██▀▀▀▀█▀     *~!^█▀▀▀▀▀▀▀▀▀▀▀▀█████▀0≈     ⁿ▀▀▀▀▀▀▀▀▀▀▀█▀▀▀ªªº=%                 //
//                           ┴"┴┴┴┴┴`     ╙┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴^     "┴┴┴┴┴┴┴┴┴""""┴┴┴┘                    //
//                           """""""         `"""""""""""""""""                `"""""""""                     //
//                                                                                                            //
//                                                                             cuatroceronueve                //
//                                                                                                            //
//                                                                                                            //
//                                                                                                            //
//                                                                                                            //
//                                                                                                            //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

pragma solidity ^0.8.13;










contract Mint409 is ERC721, Ownable, ReentrancyGuard, DefaultOperatorFilterer, RoyaltiesV2Impl {
    string public baseURI;       
    bytes32 private whitelistMerkleRoot;    
    uint256 [] private tokenMintedID;
    uint256 public tokenCount = 0;    
    uint256 immutable public maxSupply = 409;
    uint256 public salePrice = 0.00 ether;
    bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;

    struct token {
        uint tokenId;    
        address owner;
    }

    token [] public tokenMintedOwners;    
    mapping(address => bool) public claimed;
    mapping(address => uint256) public tokenAvatar;    

    event newTokenMinted(address indexed owner, uint256 id); 

    constructor(string memory initBaseURI) ERC721("409 AMIGOS", "AMIGO") {
        baseURI = initBaseURI;
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function setRoyalties(uint _tokenId, address payable _royaltiesReceipientAddress, uint96 _percentageBasisPoints) public onlyOwner {
        LibPart.Part[] memory _royalties = new LibPart.Part[](1);
        _royalties[0].value = _percentageBasisPoints;
        _royalties[0].account = _royaltiesReceipientAddress;
        _saveRoyalties(_tokenId, _royalties);
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) {
        LibPart.Part[] memory _royalties = royalties[_tokenId];
        if(_royalties.length > 0) {
            return (_royalties[0].account, (_salePrice * _royalties[0].value)/10000);
        }
        return (address(0), 0);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
        if(interfaceId == LibRoyaltiesV2._INTERFACE_ID_ROYALTIES) {
            return true;
        }
        if(interfaceId == _INTERFACE_ID_ERC2981) {
            return true;
        }
        return super.supportsInterface(interfaceId);
    }
 
    modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
        require(
            price * numberOfTokens == msg.value,
            "Incorrect ETH value sent"
        );
        _;
    }   
    
    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist in whitelist"
        );
        _;
    }

    function verifyMerkleTree(bytes32[] calldata merkleProof)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        return MerkleProof.verify(merkleProof, whitelistMerkleRoot, leaf);
    }

    function mint(bytes32[] calldata merkleProof, uint256 tokenId)
        public
        payable
        isValidMerkleProof(merkleProof, whitelistMerkleRoot)
        isCorrectPayment(salePrice, 1)
        nonReentrant
    {
        require(tokenCount <= maxSupply, "Maximum number of tokens allowed was reached (409)");
        require(!claimed[msg.sender], "Only one token is allowed per address");
        
        _mint(msg.sender, tokenId);
        
        tokenCount++;
        tokenMintedID.push(tokenId);
        tokenAvatar[msg.sender] = tokenId;

        token memory minting = token(tokenId, msg.sender);
        tokenMintedOwners.push(minting);

        if(owner() != msg.sender) 
            claimed[msg.sender] = true;
            
        emit newTokenMinted(msg.sender, tokenId); 
    }

    function transfer(address addressMint, uint256 tokenId)
        public        
        nonReentrant
    {
        require(tokenCount <= maxSupply, "Maximum number of tokens allowed was reached (409)"); 
        
        _mint(addressMint, tokenId);   

        tokenCount++;
        tokenMintedID.push(tokenId);
        tokenAvatar[addressMint] = tokenId;

        token memory minting = token(tokenId, addressMint);
        tokenMintedOwners.push(minting);

        emit newTokenMinted(addressMint, tokenId); 
    }
    
    function tokenURI(uint256 tokenId)
      public
      view
      virtual
      override
      returns (string memory)
    {
      require(_exists(tokenId), "Error: Query for nonexistent token");
      return string(abi.encodePacked(baseURI, Strings.toString(tokenId), ".json"));
    }
    
    function getListTokenID() public view returns (uint256 [] memory){
        return tokenMintedID;
    }

    function getListTokenOwners() public view returns (token [] memory){
        return tokenMintedOwners;
    }

    function setBaseURI(string memory updateBaseURI) public onlyOwner {
        baseURI = updateBaseURI;
    }

    function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        whitelistMerkleRoot = merkleRoot;
    } 

    function setSalePrice(uint256 updateSalePrice) external onlyOwner {
        salePrice = updateSalePrice;
    }

    function infoContract() public view returns(address, uint256) {
        address addressContract = address(this);
        uint256 balanceContract = address(this).balance / 10**18;      
        return (addressContract, balanceContract);
    }

    function withdraw() public onlyOwner {
        uint256 balanceContract = address(this).balance;
        payable(msg.sender).transfer(balanceContract);
    }   
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"indexed":false,"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"}],"name":"RoyaltiesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"newTokenMinted","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getListTokenID","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getListTokenOwners","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct Mint409.token[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRaribleV2Royalties","outputs":[{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"infoContract","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"royalties","outputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"updateBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_royaltiesReceipientAddress","type":"address"},{"internalType":"uint96","name":"_percentageBasisPoints","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"updateSalePrice","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","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":"address","name":"","type":"address"}],"name":"tokenAvatar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMintedOwners","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressMint","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transfer","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"verifyMerkleTree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526000600c556101996080908152506000600d553480156200002457600080fd5b5060405162005e6538038062005e6583398181016040528101906200004a91906200058c565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600a81526020017f34303920414d49474f53000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f414d49474f0000000000000000000000000000000000000000000000000000008152508160009081620000de919062000828565b508060019081620000f0919062000828565b50505062000113620001076200032b60201b60201c565b6200033360201b60201c565b600160078190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000310578015620001d6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200019c92919062000954565b600060405180830381600087803b158015620001b757600080fd5b505af1158015620001cc573d6000803e3d6000fd5b505050506200030f565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000290576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200025692919062000954565b600060405180830381600087803b1580156200027157600080fd5b505af115801562000286573d6000803e3d6000fd5b505050506200030e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002d9919062000981565b600060405180830381600087803b158015620002f457600080fd5b505af115801562000309573d6000803e3d6000fd5b505050505b5b5b5050806009908162000323919062000828565b50506200099e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004628262000417565b810181811067ffffffffffffffff8211171562000484576200048362000428565b5b80604052505050565b600062000499620003f9565b9050620004a7828262000457565b919050565b600067ffffffffffffffff821115620004ca57620004c962000428565b5b620004d58262000417565b9050602081019050919050565b60005b8381101562000502578082015181840152602081019050620004e5565b60008484015250505050565b6000620005256200051f84620004ac565b6200048d565b90508281526020810184848401111562000544576200054362000412565b5b62000551848285620004e2565b509392505050565b600082601f8301126200057157620005706200040d565b5b8151620005838482602086016200050e565b91505092915050565b600060208284031215620005a557620005a462000403565b5b600082015167ffffffffffffffff811115620005c657620005c562000408565b5b620005d48482850162000559565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200063057607f821691505b602082108103620006465762000645620005e8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006b07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000671565b620006bc868362000671565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200070962000703620006fd84620006d4565b620006de565b620006d4565b9050919050565b6000819050919050565b6200072583620006e8565b6200073d620007348262000710565b8484546200067e565b825550505050565b600090565b6200075462000745565b620007618184846200071a565b505050565b5b8181101562000789576200077d6000826200074a565b60018101905062000767565b5050565b601f821115620007d857620007a2816200064c565b620007ad8462000661565b81016020851015620007bd578190505b620007d5620007cc8562000661565b83018262000766565b50505b505050565b600082821c905092915050565b6000620007fd60001984600802620007dd565b1980831691505092915050565b6000620008188383620007ea565b9150826002028217905092915050565b6200083382620005dd565b67ffffffffffffffff8111156200084f576200084e62000428565b5b6200085b825462000617565b620008688282856200078d565b600060209050601f831160018114620008a057600084156200088b578287015190505b6200089785826200080a565b86555062000907565b601f198416620008b0866200064c565b60005b82811015620008da57848901518255600182019150602085019450602081019050620008b3565b86831015620008fa5784890151620008f6601f891682620007ea565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200093c826200090f565b9050919050565b6200094e816200092f565b82525050565b60006040820190506200096b600083018562000943565b6200097a602083018462000943565b9392505050565b600060208201905062000998600083018462000943565b92915050565b60805161549d620009c8600039600081816111df015281816119bf0152611ece015261549d6000f3fe60806040526004361061021a5760003560e01c8063715018a611610123578063bd32fb66116100ab578063d5abeb011161006f578063d5abeb0114610810578063e985e9c51461083b578063ec3ef69f14610878578063f2fde38b146108a3578063f51f96dd146108cc5761021a565b8063bd32fb66146106f2578063bdab381b1461071b578063c87b56dd14610759578063c884ef8314610796578063cad96cca146107d35761021a565b806395d89b41116100f257806395d89b41146106215780639f181b5e1461064c578063a22cb46514610677578063a9059cbb146106a0578063b88d4fde146106c95761021a565b8063715018a6146105755780638924af741461058c5780638da5cb5b146105ca5780638e027f91146105f55761021a565b80633ccfd60b116101a65780635de3c719116101755780635de3c719146104685780636352211e146104a55780636c0360eb146104e257806370a082311461050d5780637129b8251461054a5761021a565b80633ccfd60b146103e357806342842e0e146103fa57806345de0d9b1461042357806355f804b31461043f5761021a565b8063143094db116101ed578063143094db146102ed5780631919fed714610316578063201bebe31461033f57806323b872dd1461037c5780632a55205a146103a55761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906135b7565b6108f7565b60405161025391906135ff565b60405180910390f35b34801561026857600080fd5b506102716109b4565b60405161027e91906136aa565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613702565b610a46565b6040516102bb9190613770565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906137b7565b610a8c565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613879565b610ba3565b005b34801561032257600080fd5b5061033d60048036038101906103389190613702565b610caa565b005b34801561034b57600080fd5b50610366600480360381019061036191906138cc565b610cbc565b6040516103739190613908565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190613923565b610cd4565b005b3480156103b157600080fd5b506103cc60048036038101906103c79190613976565b610de0565b6040516103da9291906139b6565b60405180910390f35b3480156103ef57600080fd5b506103f8610f6a565b005b34801561040657600080fd5b50610421600480360381019061041c9190613923565b610fc1565b005b61043d60048036038101906104389190613a44565b6110cd565b005b34801561044b57600080fd5b5061046660048036038101906104619190613bd4565b611500565b005b34801561047457600080fd5b5061048f600480360381019061048a9190613c1d565b61151b565b60405161049c91906135ff565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190613702565b61159e565b6040516104d99190613770565b60405180910390f35b3480156104ee57600080fd5b506104f7611624565b60405161050491906136aa565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f91906138cc565b6116b2565b6040516105419190613908565b60405180910390f35b34801561055657600080fd5b5061055f611769565b60405161056c9190613d66565b60405180910390f35b34801561058157600080fd5b5061058a611828565b005b34801561059857600080fd5b506105b360048036038101906105ae9190613976565b61183c565b6040516105c1929190613da6565b60405180910390f35b3480156105d657600080fd5b506105df6118b1565b6040516105ec9190613770565b60405180910390f35b34801561060157600080fd5b5061060a6118db565b6040516106189291906139b6565b60405180910390f35b34801561062d57600080fd5b50610636611907565b60405161064391906136aa565b60405180910390f35b34801561065857600080fd5b50610661611999565b60405161066e9190613908565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190613dfb565b61199f565b005b3480156106ac57600080fd5b506106c760048036038101906106c291906137b7565b6119b5565b005b3480156106d557600080fd5b506106f060048036038101906106eb9190613edc565b611bba565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613f95565b611cc8565b005b34801561072757600080fd5b50610742600480360381019061073d9190613702565b611cda565b604051610750929190613fc2565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b9190613702565b611d2e565b60405161078d91906136aa565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b891906138cc565b611daa565b6040516107ca91906135ff565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f59190613702565b611dca565b60405161080791906140e7565b60405180910390f35b34801561081c57600080fd5b50610825611ecc565b6040516108329190613908565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d9190614109565b611ef0565b60405161086f91906135ff565b60405180910390f35b34801561088457600080fd5b5061088d611f84565b60405161089a91906141f8565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c591906138cc565b611fdc565b005b3480156108d857600080fd5b506108e161205f565b6040516108ee9190613908565b60405180910390f35b60006344c74bcc60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361094e57600190506109af565b632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109a357600190506109af565b6109ac82612065565b90505b919050565b6060600080546109c390614249565b80601f01602080910402602001604051908101604052809291908181526020018280546109ef90614249565b8015610a3c5780601f10610a1157610100808354040283529160200191610a3c565b820191906000526020600020905b815481529060010190602001808311610a1f57829003601f168201915b5050505050905090565b6000610a5182612147565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a978261159e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe906142ec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b26612192565b73ffffffffffffffffffffffffffffffffffffffff161480610b555750610b5481610b4f612192565b611ef0565b5b610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b9061437e565b60405180910390fd5b610b9e838361219a565b505050565b610bab612253565b6000600167ffffffffffffffff811115610bc857610bc7613aa9565b5b604051908082528060200260200182016040528015610c0157816020015b610bee61350d565b815260200190600190039081610be65790505b5090508181600081518110610c1957610c1861439e565b5b6020026020010151602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250508281600081518110610c5c57610c5b61439e565b5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610ca484826122d1565b50505050565b610cb2612253565b80600d8190555050565b60106020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610dd0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d4b9291906143cd565b6020604051808303816000875af1158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e919061440b565b610dcf57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610dc69190613770565b60405180910390fd5b5b610ddb8383836124ce565b505050565b600080600060086000868152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610eda578382906000526020600020016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505081526020019060010190610e18565b505050509050600081511115610f5a5780600081518110610efe57610efd61439e565b5b60200260200101516000015161271082600081518110610f2157610f2061439e565b5b6020026020010151602001516bffffffffffffffffffffffff1686610f469190614467565b610f5091906144d8565b9250925050610f63565b60008092509250505b9250929050565b610f72612253565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fbd573d6000803e3d6000fd5b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110bd576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110389291906143cd565b6020604051808303816000875af1158015611057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107b919061440b565b6110bc57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110b39190613770565b60405180910390fd5b5b6110c883838361252e565b505050565b8282600a54611144838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016111299190614551565b6040516020818303038152906040528051906020012061254e565b611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a906145de565b60405180910390fd5b600d5460013481836111959190614467565b146111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc9061464a565b60405180910390fd5b6111dd612565565b7f0000000000000000000000000000000000000000000000000000000000000000600c541115611242576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611239906146dc565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c69061476e565b60405180910390fd5b6112d933876125b4565b600c60008154809291906112ec9061478e565b9190505550600b86908060018154018082558091505060019003906000526020600020016000909190919091505585601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060405180604001604052808881526020013373ffffffffffffffffffffffffffffffffffffffff168152509050600e8190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050503373ffffffffffffffffffffffffffffffffffffffff1661142b6118b1565b73ffffffffffffffffffffffffffffffffffffffff161461149f576001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b3373ffffffffffffffffffffffffffffffffffffffff167fdee6961c63e1e04aaaf4f5d72d14927b189488763179688429797ee6a104cf38886040516114e59190613908565b60405180910390a2506114f66127d1565b5050505050505050565b611508612253565b80600990816115179190614982565b5050565b6000803360405160200161152f9190614551565b604051602081830303815290604052805190602001209050611595848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a548361254e565b91505092915050565b6000806115aa836127db565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290614aa0565b60405180910390fd5b80915050919050565b6009805461163190614249565b80601f016020809104026020016040519081016040528092919081815260200182805461165d90614249565b80156116aa5780601f1061167f576101008083540402835291602001916116aa565b820191906000526020600020905b81548152906001019060200180831161168d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990614b32565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600e805480602002602001604051908101604052809291908181526020016000905b8282101561181f5783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508152602001906001019061178d565b50505050905090565b611830612253565b61183a6000612818565b565b6008602052816000526040600020818154811061185857600080fd5b90600052602060002001600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a90046bffffffffffffffffffffffff16905082565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060003090506000670de0b6b3a7640000476118f991906144d8565b905081819350935050509091565b60606001805461191690614249565b80601f016020809104026020016040519081016040528092919081815260200182805461194290614249565b801561198f5780601f106119645761010080835404028352916020019161198f565b820191906000526020600020905b81548152906001019060200180831161197257829003601f168201915b5050505050905090565b600c5481565b6119b16119aa612192565b83836128de565b5050565b6119bd612565565b7f0000000000000000000000000000000000000000000000000000000000000000600c541115611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906146dc565b60405180910390fd5b611a2c82826125b4565b600c6000815480929190611a3f9061478e565b9190505550600b81908060018154018082558091505060019003906000526020600020016000909190919091505580601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060405180604001604052808381526020018473ffffffffffffffffffffffffffffffffffffffff168152509050600e8190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff167fdee6961c63e1e04aaaf4f5d72d14927b189488763179688429797ee6a104cf3883604051611ba59190613908565b60405180910390a250611bb66127d1565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611cb6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c319291906143cd565b6020604051808303816000875af1158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c74919061440b565b611cb557336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611cac9190613770565b60405180910390fd5b5b611cc284848484612a4a565b50505050565b611cd0612253565b80600a8190555050565b600e8181548110611cea57600080fd5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b6060611d3982612aac565b611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f90614bc4565b60405180910390fd5b6009611d8383612aed565b604051602001611d94929190614cef565b6040516020818303038152906040529050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b606060086000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611ec1578382906000526020600020016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505081526020019060010190611dff565b505050509050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600b805480602002602001604051908101604052809291908181526020018280548015611fd257602002820191906000526020600020905b815481526020019060010190808311611fbe575b5050505050905090565b611fe4612253565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a90614d90565b60405180910390fd5b61205c81612818565b50565b600d5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061213057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612140575061213f82612bbb565b5b9050919050565b61215081612aac565b61218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690614aa0565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661220d8361159e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61225b612192565b73ffffffffffffffffffffffffffffffffffffffff166122796118b1565b73ffffffffffffffffffffffffffffffffffffffff16146122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c690614dfc565b60405180910390fd5b565b60005b81518110156124bf57600073ffffffffffffffffffffffffffffffffffffffff168282815181106123085761230761439e565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236190614e68565b60405180910390fd5b600082828151811061237f5761237e61439e565b5b6020026020010151602001516bffffffffffffffffffffffff16036123d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d090614ed4565b60405180910390fd5b600860008481526020019081526020016000208282815181106123ff576123fe61439e565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505080806124b79061478e565b9150506122d4565b506124ca8282612c25565b5050565b6124df6124d9612192565b82612c62565b61251e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251590614f66565b60405180910390fd5b612529838383612cf7565b505050565b61254983838360405180602001604052806000815250611bba565b505050565b60008261255b8584612ff0565b1490509392505050565b6002600754036125aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a190614fd2565b60405180910390fd5b6002600781905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261a9061503e565b60405180910390fd5b61262c81612aac565b1561266c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612663906150aa565b60405180910390fd5b61267a600083836001613046565b61268381612aac565b156126c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ba906150aa565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127cd60008383600161316c565b5050565b6001600781905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361294c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294390615116565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a3d91906135ff565b60405180910390a3505050565b612a5b612a55612192565b83612c62565b612a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9190614f66565b60405180910390fd5b612aa684848484613172565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612ace836127db565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001612afc846131ce565b01905060008167ffffffffffffffff811115612b1b57612b1a613aa9565b5b6040519080825280601f01601f191660200182016040528015612b4d5781602001600182028036833780820191505090505b509050600082602001820190505b600115612bb0578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612ba457612ba36144a9565b5b04945060008503612b5b575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df8282604051612c56929190615136565b60405180910390a15050565b600080612c6e8361159e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612cb05750612caf8185611ef0565b5b80612cee57508373ffffffffffffffffffffffffffffffffffffffff16612cd684610a46565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d178261159e565b73ffffffffffffffffffffffffffffffffffffffff1614612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d64906151d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd39061526a565b60405180910390fd5b612de98383836001613046565b8273ffffffffffffffffffffffffffffffffffffffff16612e098261159e565b73ffffffffffffffffffffffffffffffffffffffff1614612e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e56906151d8565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612feb838383600161316c565b505050565b60008082905060005b845181101561303b57613026828683815181106130195761301861439e565b5b6020026020010151613321565b915080806130339061478e565b915050612ff9565b508091505092915050565b600181111561316657600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146130da5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130d2919061528a565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131655780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315d91906152be565b925050819055505b5b50505050565b50505050565b61317d848484612cf7565b6131898484848461334c565b6131c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bf90615364565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061322c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613222576132216144a9565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613269576d04ee2d6d415b85acef8100000000838161325f5761325e6144a9565b5b0492506020810190505b662386f26fc10000831061329857662386f26fc10000838161328e5761328d6144a9565b5b0492506010810190505b6305f5e10083106132c1576305f5e10083816132b7576132b66144a9565b5b0492506008810190505b61271083106132e65761271083816132dc576132db6144a9565b5b0492506004810190505b6064831061330957606483816132ff576132fe6144a9565b5b0492506002810190505b600a8310613318576001810190505b80915050919050565b60008183106133395761333482846134d3565b613344565b61334383836134d3565b5b905092915050565b600061336d8473ffffffffffffffffffffffffffffffffffffffff166134ea565b156134c6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613396612192565b8786866040518563ffffffff1660e01b81526004016133b894939291906153d9565b6020604051808303816000875af19250505080156133f457506040513d601f19601f820116820180604052508101906133f1919061543a565b60015b613476573d8060008114613424576040519150601f19603f3d011682016040523d82523d6000602084013e613429565b606091505b50600081510361346e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346590615364565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134cb565b600190505b949350505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135948161355f565b811461359f57600080fd5b50565b6000813590506135b18161358b565b92915050565b6000602082840312156135cd576135cc613555565b5b60006135db848285016135a2565b91505092915050565b60008115159050919050565b6135f9816135e4565b82525050565b600060208201905061361460008301846135f0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613654578082015181840152602081019050613639565b60008484015250505050565b6000601f19601f8301169050919050565b600061367c8261361a565b6136868185613625565b9350613696818560208601613636565b61369f81613660565b840191505092915050565b600060208201905081810360008301526136c48184613671565b905092915050565b6000819050919050565b6136df816136cc565b81146136ea57600080fd5b50565b6000813590506136fc816136d6565b92915050565b60006020828403121561371857613717613555565b5b6000613726848285016136ed565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061375a8261372f565b9050919050565b61376a8161374f565b82525050565b60006020820190506137856000830184613761565b92915050565b6137948161374f565b811461379f57600080fd5b50565b6000813590506137b18161378b565b92915050565b600080604083850312156137ce576137cd613555565b5b60006137dc858286016137a2565b92505060206137ed858286016136ed565b9150509250929050565b60006138028261372f565b9050919050565b613812816137f7565b811461381d57600080fd5b50565b60008135905061382f81613809565b92915050565b60006bffffffffffffffffffffffff82169050919050565b61385681613835565b811461386157600080fd5b50565b6000813590506138738161384d565b92915050565b60008060006060848603121561389257613891613555565b5b60006138a0868287016136ed565b93505060206138b186828701613820565b92505060406138c286828701613864565b9150509250925092565b6000602082840312156138e2576138e1613555565b5b60006138f0848285016137a2565b91505092915050565b613902816136cc565b82525050565b600060208201905061391d60008301846138f9565b92915050565b60008060006060848603121561393c5761393b613555565b5b600061394a868287016137a2565b935050602061395b868287016137a2565b925050604061396c868287016136ed565b9150509250925092565b6000806040838503121561398d5761398c613555565b5b600061399b858286016136ed565b92505060206139ac858286016136ed565b9150509250929050565b60006040820190506139cb6000830185613761565b6139d860208301846138f9565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f840112613a0457613a036139df565b5b8235905067ffffffffffffffff811115613a2157613a206139e4565b5b602083019150836020820283011115613a3d57613a3c6139e9565b5b9250929050565b600080600060408486031215613a5d57613a5c613555565b5b600084013567ffffffffffffffff811115613a7b57613a7a61355a565b5b613a87868287016139ee565b93509350506020613a9a868287016136ed565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ae182613660565b810181811067ffffffffffffffff82111715613b0057613aff613aa9565b5b80604052505050565b6000613b1361354b565b9050613b1f8282613ad8565b919050565b600067ffffffffffffffff821115613b3f57613b3e613aa9565b5b613b4882613660565b9050602081019050919050565b82818337600083830152505050565b6000613b77613b7284613b24565b613b09565b905082815260208101848484011115613b9357613b92613aa4565b5b613b9e848285613b55565b509392505050565b600082601f830112613bbb57613bba6139df565b5b8135613bcb848260208601613b64565b91505092915050565b600060208284031215613bea57613be9613555565b5b600082013567ffffffffffffffff811115613c0857613c0761355a565b5b613c1484828501613ba6565b91505092915050565b60008060208385031215613c3457613c33613555565b5b600083013567ffffffffffffffff811115613c5257613c5161355a565b5b613c5e858286016139ee565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c9f816136cc565b82525050565b613cae8161374f565b82525050565b604082016000820151613cca6000850182613c96565b506020820151613cdd6020850182613ca5565b50505050565b6000613cef8383613cb4565b60408301905092915050565b6000602082019050919050565b6000613d1382613c6a565b613d1d8185613c75565b9350613d2883613c86565b8060005b83811015613d59578151613d408882613ce3565b9750613d4b83613cfb565b925050600181019050613d2c565b5085935050505092915050565b60006020820190508181036000830152613d808184613d08565b905092915050565b613d91816137f7565b82525050565b613da081613835565b82525050565b6000604082019050613dbb6000830185613d88565b613dc86020830184613d97565b9392505050565b613dd8816135e4565b8114613de357600080fd5b50565b600081359050613df581613dcf565b92915050565b60008060408385031215613e1257613e11613555565b5b6000613e20858286016137a2565b9250506020613e3185828601613de6565b9150509250929050565b600067ffffffffffffffff821115613e5657613e55613aa9565b5b613e5f82613660565b9050602081019050919050565b6000613e7f613e7a84613e3b565b613b09565b905082815260208101848484011115613e9b57613e9a613aa4565b5b613ea6848285613b55565b509392505050565b600082601f830112613ec357613ec26139df565b5b8135613ed3848260208601613e6c565b91505092915050565b60008060008060808587031215613ef657613ef5613555565b5b6000613f04878288016137a2565b9450506020613f15878288016137a2565b9350506040613f26878288016136ed565b925050606085013567ffffffffffffffff811115613f4757613f4661355a565b5b613f5387828801613eae565b91505092959194509250565b6000819050919050565b613f7281613f5f565b8114613f7d57600080fd5b50565b600081359050613f8f81613f69565b92915050565b600060208284031215613fab57613faa613555565b5b6000613fb984828501613f80565b91505092915050565b6000604082019050613fd760008301856138f9565b613fe46020830184613761565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614020816137f7565b82525050565b61402f81613835565b82525050565b60408201600082015161404b6000850182614017565b50602082015161405e6020850182614026565b50505050565b60006140708383614035565b60408301905092915050565b6000602082019050919050565b600061409482613feb565b61409e8185613ff6565b93506140a983614007565b8060005b838110156140da5781516140c18882614064565b97506140cc8361407c565b9250506001810190506140ad565b5085935050505092915050565b600060208201905081810360008301526141018184614089565b905092915050565b600080604083850312156141205761411f613555565b5b600061412e858286016137a2565b925050602061413f858286016137a2565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006141818383613c96565b60208301905092915050565b6000602082019050919050565b60006141a582614149565b6141af8185614154565b93506141ba83614165565b8060005b838110156141eb5781516141d28882614175565b97506141dd8361418d565b9250506001810190506141be565b5085935050505092915050565b60006020820190508181036000830152614212818461419a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061426157607f821691505b6020821081036142745761427361421a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142d6602183613625565b91506142e18261427a565b604082019050919050565b60006020820190508181036000830152614305816142c9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614368603d83613625565b91506143738261430c565b604082019050919050565b600060208201905081810360008301526143978161435b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006040820190506143e26000830185613761565b6143ef6020830184613761565b9392505050565b60008151905061440581613dcf565b92915050565b60006020828403121561442157614420613555565b5b600061442f848285016143f6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614472826136cc565b915061447d836136cc565b925082820261448b816136cc565b915082820484148315176144a2576144a1614438565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144e3826136cc565b91506144ee836136cc565b9250826144fe576144fd6144a9565b5b828204905092915050565b60008160601b9050919050565b600061452182614509565b9050919050565b600061453382614516565b9050919050565b61454b6145468261374f565b614528565b82525050565b600061455d828461453a565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e2077686974656c60008201527f6973740000000000000000000000000000000000000000000000000000000000602082015250565b60006145c8602383613625565b91506145d38261456c565b604082019050919050565b600060208201905081810360008301526145f7816145bb565b9050919050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b6000614634601883613625565b915061463f826145fe565b602082019050919050565b6000602082019050818103600083015261466381614627565b9050919050565b7f4d6178696d756d206e756d626572206f6620746f6b656e7320616c6c6f77656460008201527f2077617320726561636865642028343039290000000000000000000000000000602082015250565b60006146c6603283613625565b91506146d18261466a565b604082019050919050565b600060208201905081810360008301526146f5816146b9565b9050919050565b7f4f6e6c79206f6e6520746f6b656e20697320616c6c6f7765642070657220616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614758602583613625565b9150614763826146fc565b604082019050919050565b600060208201905081810360008301526147878161474b565b9050919050565b6000614799826136cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147cb576147ca614438565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826147fb565b61484286836147fb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061487f61487a614875846136cc565b61485a565b6136cc565b9050919050565b6000819050919050565b61489983614864565b6148ad6148a582614886565b848454614808565b825550505050565b600090565b6148c26148b5565b6148cd818484614890565b505050565b5b818110156148f1576148e66000826148ba565b6001810190506148d3565b5050565b601f82111561493657614907816147d6565b614910846147eb565b8101602085101561491f578190505b61493361492b856147eb565b8301826148d2565b50505b505050565b600082821c905092915050565b60006149596000198460080261493b565b1980831691505092915050565b60006149728383614948565b9150826002028217905092915050565b61498b8261361a565b67ffffffffffffffff8111156149a4576149a3613aa9565b5b6149ae8254614249565b6149b98282856148f5565b600060209050601f8311600181146149ec57600084156149da578287015190505b6149e48582614966565b865550614a4c565b601f1984166149fa866147d6565b60005b82811015614a22578489015182556001820191506020850194506020810190506149fd565b86831015614a3f5784890151614a3b601f891682614948565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614a8a601883613625565b9150614a9582614a54565b602082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614b1c602983613625565b9150614b2782614ac0565b604082019050919050565b60006020820190508181036000830152614b4b81614b0f565b9050919050565b7f4572726f723a20517565727920666f72206e6f6e6578697374656e7420746f6b60008201527f656e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bae602283613625565b9150614bb982614b52565b604082019050919050565b60006020820190508181036000830152614bdd81614ba1565b9050919050565b600081905092915050565b60008154614bfc81614249565b614c068186614be4565b94506001821660008114614c215760018114614c3657614c69565b60ff1983168652811515820286019350614c69565b614c3f856147d6565b60005b83811015614c6157815481890152600182019150602081019050614c42565b838801955050505b50505092915050565b6000614c7d8261361a565b614c878185614be4565b9350614c97818560208601613636565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614cd9600583614be4565b9150614ce482614ca3565b600582019050919050565b6000614cfb8285614bef565b9150614d078284614c72565b9150614d1282614ccc565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d7a602683613625565b9150614d8582614d1e565b604082019050919050565b60006020820190508181036000830152614da981614d6d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614de6602083613625565b9150614df182614db0565b602082019050919050565b60006020820190508181036000830152614e1581614dd9565b9050919050565b7f526563697069656e742073686f756c642062652070726573656e740000000000600082015250565b6000614e52601b83613625565b9150614e5d82614e1c565b602082019050919050565b60006020820190508181036000830152614e8181614e45565b9050919050565b7f526f79616c74792076616c75652073686f756c6420626520706f736974697665600082015250565b6000614ebe602083613625565b9150614ec982614e88565b602082019050919050565b60006020820190508181036000830152614eed81614eb1565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614f50602d83613625565b9150614f5b82614ef4565b604082019050919050565b60006020820190508181036000830152614f7f81614f43565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614fbc601f83613625565b9150614fc782614f86565b602082019050919050565b60006020820190508181036000830152614feb81614faf565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615028602083613625565b915061503382614ff2565b602082019050919050565b600060208201905081810360008301526150578161501b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615094601c83613625565b915061509f8261505e565b602082019050919050565b600060208201905081810360008301526150c381615087565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615100601983613625565b915061510b826150ca565b602082019050919050565b6000602082019050818103600083015261512f816150f3565b9050919050565b600060408201905061514b60008301856138f9565b818103602083015261515d8184614089565b90509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006151c2602583613625565b91506151cd82615166565b604082019050919050565b600060208201905081810360008301526151f1816151b5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615254602483613625565b915061525f826151f8565b604082019050919050565b6000602082019050818103600083015261528381615247565b9050919050565b6000615295826136cc565b91506152a0836136cc565b92508282039050818111156152b8576152b7614438565b5b92915050565b60006152c9826136cc565b91506152d4836136cc565b92508282019050808211156152ec576152eb614438565b5b92915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061534e603283613625565b9150615359826152f2565b604082019050919050565b6000602082019050818103600083015261537d81615341565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153ab82615384565b6153b5818561538f565b93506153c5818560208601613636565b6153ce81613660565b840191505092915050565b60006080820190506153ee6000830187613761565b6153fb6020830186613761565b61540860408301856138f9565b818103606083015261541a81846153a0565b905095945050505050565b6000815190506154348161358b565b92915050565b6000602082840312156154505761544f613555565b5b600061545e84828501615425565b9150509291505056fea2646970667358221220ea524e0ad6c7317f27db53fc7a0e9b3e19a61037aff83248afe6bd49ccca6adb64736f6c634300081100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166796265696175636b73343635377768766736746c7973767772696169626d69367468356a697a7578336c34716464703776367677367736342f00000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c8063715018a611610123578063bd32fb66116100ab578063d5abeb011161006f578063d5abeb0114610810578063e985e9c51461083b578063ec3ef69f14610878578063f2fde38b146108a3578063f51f96dd146108cc5761021a565b8063bd32fb66146106f2578063bdab381b1461071b578063c87b56dd14610759578063c884ef8314610796578063cad96cca146107d35761021a565b806395d89b41116100f257806395d89b41146106215780639f181b5e1461064c578063a22cb46514610677578063a9059cbb146106a0578063b88d4fde146106c95761021a565b8063715018a6146105755780638924af741461058c5780638da5cb5b146105ca5780638e027f91146105f55761021a565b80633ccfd60b116101a65780635de3c719116101755780635de3c719146104685780636352211e146104a55780636c0360eb146104e257806370a082311461050d5780637129b8251461054a5761021a565b80633ccfd60b146103e357806342842e0e146103fa57806345de0d9b1461042357806355f804b31461043f5761021a565b8063143094db116101ed578063143094db146102ed5780631919fed714610316578063201bebe31461033f57806323b872dd1461037c5780632a55205a146103a55761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906135b7565b6108f7565b60405161025391906135ff565b60405180910390f35b34801561026857600080fd5b506102716109b4565b60405161027e91906136aa565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613702565b610a46565b6040516102bb9190613770565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906137b7565b610a8c565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613879565b610ba3565b005b34801561032257600080fd5b5061033d60048036038101906103389190613702565b610caa565b005b34801561034b57600080fd5b50610366600480360381019061036191906138cc565b610cbc565b6040516103739190613908565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e9190613923565b610cd4565b005b3480156103b157600080fd5b506103cc60048036038101906103c79190613976565b610de0565b6040516103da9291906139b6565b60405180910390f35b3480156103ef57600080fd5b506103f8610f6a565b005b34801561040657600080fd5b50610421600480360381019061041c9190613923565b610fc1565b005b61043d60048036038101906104389190613a44565b6110cd565b005b34801561044b57600080fd5b5061046660048036038101906104619190613bd4565b611500565b005b34801561047457600080fd5b5061048f600480360381019061048a9190613c1d565b61151b565b60405161049c91906135ff565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190613702565b61159e565b6040516104d99190613770565b60405180910390f35b3480156104ee57600080fd5b506104f7611624565b60405161050491906136aa565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f91906138cc565b6116b2565b6040516105419190613908565b60405180910390f35b34801561055657600080fd5b5061055f611769565b60405161056c9190613d66565b60405180910390f35b34801561058157600080fd5b5061058a611828565b005b34801561059857600080fd5b506105b360048036038101906105ae9190613976565b61183c565b6040516105c1929190613da6565b60405180910390f35b3480156105d657600080fd5b506105df6118b1565b6040516105ec9190613770565b60405180910390f35b34801561060157600080fd5b5061060a6118db565b6040516106189291906139b6565b60405180910390f35b34801561062d57600080fd5b50610636611907565b60405161064391906136aa565b60405180910390f35b34801561065857600080fd5b50610661611999565b60405161066e9190613908565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190613dfb565b61199f565b005b3480156106ac57600080fd5b506106c760048036038101906106c291906137b7565b6119b5565b005b3480156106d557600080fd5b506106f060048036038101906106eb9190613edc565b611bba565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613f95565b611cc8565b005b34801561072757600080fd5b50610742600480360381019061073d9190613702565b611cda565b604051610750929190613fc2565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b9190613702565b611d2e565b60405161078d91906136aa565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b891906138cc565b611daa565b6040516107ca91906135ff565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f59190613702565b611dca565b60405161080791906140e7565b60405180910390f35b34801561081c57600080fd5b50610825611ecc565b6040516108329190613908565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d9190614109565b611ef0565b60405161086f91906135ff565b60405180910390f35b34801561088457600080fd5b5061088d611f84565b60405161089a91906141f8565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c591906138cc565b611fdc565b005b3480156108d857600080fd5b506108e161205f565b6040516108ee9190613908565b60405180910390f35b60006344c74bcc60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361094e57600190506109af565b632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109a357600190506109af565b6109ac82612065565b90505b919050565b6060600080546109c390614249565b80601f01602080910402602001604051908101604052809291908181526020018280546109ef90614249565b8015610a3c5780601f10610a1157610100808354040283529160200191610a3c565b820191906000526020600020905b815481529060010190602001808311610a1f57829003601f168201915b5050505050905090565b6000610a5182612147565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a978261159e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe906142ec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b26612192565b73ffffffffffffffffffffffffffffffffffffffff161480610b555750610b5481610b4f612192565b611ef0565b5b610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b9061437e565b60405180910390fd5b610b9e838361219a565b505050565b610bab612253565b6000600167ffffffffffffffff811115610bc857610bc7613aa9565b5b604051908082528060200260200182016040528015610c0157816020015b610bee61350d565b815260200190600190039081610be65790505b5090508181600081518110610c1957610c1861439e565b5b6020026020010151602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250508281600081518110610c5c57610c5b61439e565b5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610ca484826122d1565b50505050565b610cb2612253565b80600d8190555050565b60106020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610dd0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d4b9291906143cd565b6020604051808303816000875af1158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e919061440b565b610dcf57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610dc69190613770565b60405180910390fd5b5b610ddb8383836124ce565b505050565b600080600060086000868152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610eda578382906000526020600020016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505081526020019060010190610e18565b505050509050600081511115610f5a5780600081518110610efe57610efd61439e565b5b60200260200101516000015161271082600081518110610f2157610f2061439e565b5b6020026020010151602001516bffffffffffffffffffffffff1686610f469190614467565b610f5091906144d8565b9250925050610f63565b60008092509250505b9250929050565b610f72612253565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fbd573d6000803e3d6000fd5b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110bd576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110389291906143cd565b6020604051808303816000875af1158015611057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107b919061440b565b6110bc57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110b39190613770565b60405180910390fd5b5b6110c883838361252e565b505050565b8282600a54611144838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016111299190614551565b6040516020818303038152906040528051906020012061254e565b611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a906145de565b60405180910390fd5b600d5460013481836111959190614467565b146111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc9061464a565b60405180910390fd5b6111dd612565565b7f0000000000000000000000000000000000000000000000000000000000000199600c541115611242576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611239906146dc565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c69061476e565b60405180910390fd5b6112d933876125b4565b600c60008154809291906112ec9061478e565b9190505550600b86908060018154018082558091505060019003906000526020600020016000909190919091505585601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060405180604001604052808881526020013373ffffffffffffffffffffffffffffffffffffffff168152509050600e8190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050503373ffffffffffffffffffffffffffffffffffffffff1661142b6118b1565b73ffffffffffffffffffffffffffffffffffffffff161461149f576001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b3373ffffffffffffffffffffffffffffffffffffffff167fdee6961c63e1e04aaaf4f5d72d14927b189488763179688429797ee6a104cf38886040516114e59190613908565b60405180910390a2506114f66127d1565b5050505050505050565b611508612253565b80600990816115179190614982565b5050565b6000803360405160200161152f9190614551565b604051602081830303815290604052805190602001209050611595848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a548361254e565b91505092915050565b6000806115aa836127db565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290614aa0565b60405180910390fd5b80915050919050565b6009805461163190614249565b80601f016020809104026020016040519081016040528092919081815260200182805461165d90614249565b80156116aa5780601f1061167f576101008083540402835291602001916116aa565b820191906000526020600020905b81548152906001019060200180831161168d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990614b32565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600e805480602002602001604051908101604052809291908181526020016000905b8282101561181f5783829060005260206000209060020201604051806040016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508152602001906001019061178d565b50505050905090565b611830612253565b61183a6000612818565b565b6008602052816000526040600020818154811061185857600080fd5b90600052602060002001600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a90046bffffffffffffffffffffffff16905082565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060003090506000670de0b6b3a7640000476118f991906144d8565b905081819350935050509091565b60606001805461191690614249565b80601f016020809104026020016040519081016040528092919081815260200182805461194290614249565b801561198f5780601f106119645761010080835404028352916020019161198f565b820191906000526020600020905b81548152906001019060200180831161197257829003601f168201915b5050505050905090565b600c5481565b6119b16119aa612192565b83836128de565b5050565b6119bd612565565b7f0000000000000000000000000000000000000000000000000000000000000199600c541115611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906146dc565b60405180910390fd5b611a2c82826125b4565b600c6000815480929190611a3f9061478e565b9190505550600b81908060018154018082558091505060019003906000526020600020016000909190919091505580601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060405180604001604052808381526020018473ffffffffffffffffffffffffffffffffffffffff168152509050600e8190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff167fdee6961c63e1e04aaaf4f5d72d14927b189488763179688429797ee6a104cf3883604051611ba59190613908565b60405180910390a250611bb66127d1565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611cb6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c319291906143cd565b6020604051808303816000875af1158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c74919061440b565b611cb557336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611cac9190613770565b60405180910390fd5b5b611cc284848484612a4a565b50505050565b611cd0612253565b80600a8190555050565b600e8181548110611cea57600080fd5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b6060611d3982612aac565b611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f90614bc4565b60405180910390fd5b6009611d8383612aed565b604051602001611d94929190614cef565b6040516020818303038152906040529050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b606060086000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611ec1578382906000526020600020016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505081526020019060010190611dff565b505050509050919050565b7f000000000000000000000000000000000000000000000000000000000000019981565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600b805480602002602001604051908101604052809291908181526020018280548015611fd257602002820191906000526020600020905b815481526020019060010190808311611fbe575b5050505050905090565b611fe4612253565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a90614d90565b60405180910390fd5b61205c81612818565b50565b600d5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061213057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612140575061213f82612bbb565b5b9050919050565b61215081612aac565b61218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690614aa0565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661220d8361159e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61225b612192565b73ffffffffffffffffffffffffffffffffffffffff166122796118b1565b73ffffffffffffffffffffffffffffffffffffffff16146122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c690614dfc565b60405180910390fd5b565b60005b81518110156124bf57600073ffffffffffffffffffffffffffffffffffffffff168282815181106123085761230761439e565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236190614e68565b60405180910390fd5b600082828151811061237f5761237e61439e565b5b6020026020010151602001516bffffffffffffffffffffffff16036123d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d090614ed4565b60405180910390fd5b600860008481526020019081526020016000208282815181106123ff576123fe61439e565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505080806124b79061478e565b9150506122d4565b506124ca8282612c25565b5050565b6124df6124d9612192565b82612c62565b61251e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251590614f66565b60405180910390fd5b612529838383612cf7565b505050565b61254983838360405180602001604052806000815250611bba565b505050565b60008261255b8584612ff0565b1490509392505050565b6002600754036125aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a190614fd2565b60405180910390fd5b6002600781905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261a9061503e565b60405180910390fd5b61262c81612aac565b1561266c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612663906150aa565b60405180910390fd5b61267a600083836001613046565b61268381612aac565b156126c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ba906150aa565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127cd60008383600161316c565b5050565b6001600781905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361294c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294390615116565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a3d91906135ff565b60405180910390a3505050565b612a5b612a55612192565b83612c62565b612a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9190614f66565b60405180910390fd5b612aa684848484613172565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612ace836127db565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001612afc846131ce565b01905060008167ffffffffffffffff811115612b1b57612b1a613aa9565b5b6040519080825280601f01601f191660200182016040528015612b4d5781602001600182028036833780820191505090505b509050600082602001820190505b600115612bb0578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612ba457612ba36144a9565b5b04945060008503612b5b575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df8282604051612c56929190615136565b60405180910390a15050565b600080612c6e8361159e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612cb05750612caf8185611ef0565b5b80612cee57508373ffffffffffffffffffffffffffffffffffffffff16612cd684610a46565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d178261159e565b73ffffffffffffffffffffffffffffffffffffffff1614612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d64906151d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd39061526a565b60405180910390fd5b612de98383836001613046565b8273ffffffffffffffffffffffffffffffffffffffff16612e098261159e565b73ffffffffffffffffffffffffffffffffffffffff1614612e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e56906151d8565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612feb838383600161316c565b505050565b60008082905060005b845181101561303b57613026828683815181106130195761301861439e565b5b6020026020010151613321565b915080806130339061478e565b915050612ff9565b508091505092915050565b600181111561316657600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146130da5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130d2919061528a565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131655780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315d91906152be565b925050819055505b5b50505050565b50505050565b61317d848484612cf7565b6131898484848461334c565b6131c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bf90615364565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061322c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613222576132216144a9565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613269576d04ee2d6d415b85acef8100000000838161325f5761325e6144a9565b5b0492506020810190505b662386f26fc10000831061329857662386f26fc10000838161328e5761328d6144a9565b5b0492506010810190505b6305f5e10083106132c1576305f5e10083816132b7576132b66144a9565b5b0492506008810190505b61271083106132e65761271083816132dc576132db6144a9565b5b0492506004810190505b6064831061330957606483816132ff576132fe6144a9565b5b0492506002810190505b600a8310613318576001810190505b80915050919050565b60008183106133395761333482846134d3565b613344565b61334383836134d3565b5b905092915050565b600061336d8473ffffffffffffffffffffffffffffffffffffffff166134ea565b156134c6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613396612192565b8786866040518563ffffffff1660e01b81526004016133b894939291906153d9565b6020604051808303816000875af19250505080156133f457506040513d601f19601f820116820180604052508101906133f1919061543a565b60015b613476573d8060008114613424576040519150601f19603f3d011682016040523d82523d6000602084013e613429565b606091505b50600081510361346e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346590615364565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134cb565b600190505b949350505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135948161355f565b811461359f57600080fd5b50565b6000813590506135b18161358b565b92915050565b6000602082840312156135cd576135cc613555565b5b60006135db848285016135a2565b91505092915050565b60008115159050919050565b6135f9816135e4565b82525050565b600060208201905061361460008301846135f0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613654578082015181840152602081019050613639565b60008484015250505050565b6000601f19601f8301169050919050565b600061367c8261361a565b6136868185613625565b9350613696818560208601613636565b61369f81613660565b840191505092915050565b600060208201905081810360008301526136c48184613671565b905092915050565b6000819050919050565b6136df816136cc565b81146136ea57600080fd5b50565b6000813590506136fc816136d6565b92915050565b60006020828403121561371857613717613555565b5b6000613726848285016136ed565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061375a8261372f565b9050919050565b61376a8161374f565b82525050565b60006020820190506137856000830184613761565b92915050565b6137948161374f565b811461379f57600080fd5b50565b6000813590506137b18161378b565b92915050565b600080604083850312156137ce576137cd613555565b5b60006137dc858286016137a2565b92505060206137ed858286016136ed565b9150509250929050565b60006138028261372f565b9050919050565b613812816137f7565b811461381d57600080fd5b50565b60008135905061382f81613809565b92915050565b60006bffffffffffffffffffffffff82169050919050565b61385681613835565b811461386157600080fd5b50565b6000813590506138738161384d565b92915050565b60008060006060848603121561389257613891613555565b5b60006138a0868287016136ed565b93505060206138b186828701613820565b92505060406138c286828701613864565b9150509250925092565b6000602082840312156138e2576138e1613555565b5b60006138f0848285016137a2565b91505092915050565b613902816136cc565b82525050565b600060208201905061391d60008301846138f9565b92915050565b60008060006060848603121561393c5761393b613555565b5b600061394a868287016137a2565b935050602061395b868287016137a2565b925050604061396c868287016136ed565b9150509250925092565b6000806040838503121561398d5761398c613555565b5b600061399b858286016136ed565b92505060206139ac858286016136ed565b9150509250929050565b60006040820190506139cb6000830185613761565b6139d860208301846138f9565b9392505050565b600080fd5b600080fd5b600080fd5b60008083601f840112613a0457613a036139df565b5b8235905067ffffffffffffffff811115613a2157613a206139e4565b5b602083019150836020820283011115613a3d57613a3c6139e9565b5b9250929050565b600080600060408486031215613a5d57613a5c613555565b5b600084013567ffffffffffffffff811115613a7b57613a7a61355a565b5b613a87868287016139ee565b93509350506020613a9a868287016136ed565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ae182613660565b810181811067ffffffffffffffff82111715613b0057613aff613aa9565b5b80604052505050565b6000613b1361354b565b9050613b1f8282613ad8565b919050565b600067ffffffffffffffff821115613b3f57613b3e613aa9565b5b613b4882613660565b9050602081019050919050565b82818337600083830152505050565b6000613b77613b7284613b24565b613b09565b905082815260208101848484011115613b9357613b92613aa4565b5b613b9e848285613b55565b509392505050565b600082601f830112613bbb57613bba6139df565b5b8135613bcb848260208601613b64565b91505092915050565b600060208284031215613bea57613be9613555565b5b600082013567ffffffffffffffff811115613c0857613c0761355a565b5b613c1484828501613ba6565b91505092915050565b60008060208385031215613c3457613c33613555565b5b600083013567ffffffffffffffff811115613c5257613c5161355a565b5b613c5e858286016139ee565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c9f816136cc565b82525050565b613cae8161374f565b82525050565b604082016000820151613cca6000850182613c96565b506020820151613cdd6020850182613ca5565b50505050565b6000613cef8383613cb4565b60408301905092915050565b6000602082019050919050565b6000613d1382613c6a565b613d1d8185613c75565b9350613d2883613c86565b8060005b83811015613d59578151613d408882613ce3565b9750613d4b83613cfb565b925050600181019050613d2c565b5085935050505092915050565b60006020820190508181036000830152613d808184613d08565b905092915050565b613d91816137f7565b82525050565b613da081613835565b82525050565b6000604082019050613dbb6000830185613d88565b613dc86020830184613d97565b9392505050565b613dd8816135e4565b8114613de357600080fd5b50565b600081359050613df581613dcf565b92915050565b60008060408385031215613e1257613e11613555565b5b6000613e20858286016137a2565b9250506020613e3185828601613de6565b9150509250929050565b600067ffffffffffffffff821115613e5657613e55613aa9565b5b613e5f82613660565b9050602081019050919050565b6000613e7f613e7a84613e3b565b613b09565b905082815260208101848484011115613e9b57613e9a613aa4565b5b613ea6848285613b55565b509392505050565b600082601f830112613ec357613ec26139df565b5b8135613ed3848260208601613e6c565b91505092915050565b60008060008060808587031215613ef657613ef5613555565b5b6000613f04878288016137a2565b9450506020613f15878288016137a2565b9350506040613f26878288016136ed565b925050606085013567ffffffffffffffff811115613f4757613f4661355a565b5b613f5387828801613eae565b91505092959194509250565b6000819050919050565b613f7281613f5f565b8114613f7d57600080fd5b50565b600081359050613f8f81613f69565b92915050565b600060208284031215613fab57613faa613555565b5b6000613fb984828501613f80565b91505092915050565b6000604082019050613fd760008301856138f9565b613fe46020830184613761565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614020816137f7565b82525050565b61402f81613835565b82525050565b60408201600082015161404b6000850182614017565b50602082015161405e6020850182614026565b50505050565b60006140708383614035565b60408301905092915050565b6000602082019050919050565b600061409482613feb565b61409e8185613ff6565b93506140a983614007565b8060005b838110156140da5781516140c18882614064565b97506140cc8361407c565b9250506001810190506140ad565b5085935050505092915050565b600060208201905081810360008301526141018184614089565b905092915050565b600080604083850312156141205761411f613555565b5b600061412e858286016137a2565b925050602061413f858286016137a2565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006141818383613c96565b60208301905092915050565b6000602082019050919050565b60006141a582614149565b6141af8185614154565b93506141ba83614165565b8060005b838110156141eb5781516141d28882614175565b97506141dd8361418d565b9250506001810190506141be565b5085935050505092915050565b60006020820190508181036000830152614212818461419a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061426157607f821691505b6020821081036142745761427361421a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006142d6602183613625565b91506142e18261427a565b604082019050919050565b60006020820190508181036000830152614305816142c9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614368603d83613625565b91506143738261430c565b604082019050919050565b600060208201905081810360008301526143978161435b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006040820190506143e26000830185613761565b6143ef6020830184613761565b9392505050565b60008151905061440581613dcf565b92915050565b60006020828403121561442157614420613555565b5b600061442f848285016143f6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614472826136cc565b915061447d836136cc565b925082820261448b816136cc565b915082820484148315176144a2576144a1614438565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144e3826136cc565b91506144ee836136cc565b9250826144fe576144fd6144a9565b5b828204905092915050565b60008160601b9050919050565b600061452182614509565b9050919050565b600061453382614516565b9050919050565b61454b6145468261374f565b614528565b82525050565b600061455d828461453a565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e2077686974656c60008201527f6973740000000000000000000000000000000000000000000000000000000000602082015250565b60006145c8602383613625565b91506145d38261456c565b604082019050919050565b600060208201905081810360008301526145f7816145bb565b9050919050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b6000614634601883613625565b915061463f826145fe565b602082019050919050565b6000602082019050818103600083015261466381614627565b9050919050565b7f4d6178696d756d206e756d626572206f6620746f6b656e7320616c6c6f77656460008201527f2077617320726561636865642028343039290000000000000000000000000000602082015250565b60006146c6603283613625565b91506146d18261466a565b604082019050919050565b600060208201905081810360008301526146f5816146b9565b9050919050565b7f4f6e6c79206f6e6520746f6b656e20697320616c6c6f7765642070657220616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614758602583613625565b9150614763826146fc565b604082019050919050565b600060208201905081810360008301526147878161474b565b9050919050565b6000614799826136cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147cb576147ca614438565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826147fb565b61484286836147fb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061487f61487a614875846136cc565b61485a565b6136cc565b9050919050565b6000819050919050565b61489983614864565b6148ad6148a582614886565b848454614808565b825550505050565b600090565b6148c26148b5565b6148cd818484614890565b505050565b5b818110156148f1576148e66000826148ba565b6001810190506148d3565b5050565b601f82111561493657614907816147d6565b614910846147eb565b8101602085101561491f578190505b61493361492b856147eb565b8301826148d2565b50505b505050565b600082821c905092915050565b60006149596000198460080261493b565b1980831691505092915050565b60006149728383614948565b9150826002028217905092915050565b61498b8261361a565b67ffffffffffffffff8111156149a4576149a3613aa9565b5b6149ae8254614249565b6149b98282856148f5565b600060209050601f8311600181146149ec57600084156149da578287015190505b6149e48582614966565b865550614a4c565b601f1984166149fa866147d6565b60005b82811015614a22578489015182556001820191506020850194506020810190506149fd565b86831015614a3f5784890151614a3b601f891682614948565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614a8a601883613625565b9150614a9582614a54565b602082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614b1c602983613625565b9150614b2782614ac0565b604082019050919050565b60006020820190508181036000830152614b4b81614b0f565b9050919050565b7f4572726f723a20517565727920666f72206e6f6e6578697374656e7420746f6b60008201527f656e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bae602283613625565b9150614bb982614b52565b604082019050919050565b60006020820190508181036000830152614bdd81614ba1565b9050919050565b600081905092915050565b60008154614bfc81614249565b614c068186614be4565b94506001821660008114614c215760018114614c3657614c69565b60ff1983168652811515820286019350614c69565b614c3f856147d6565b60005b83811015614c6157815481890152600182019150602081019050614c42565b838801955050505b50505092915050565b6000614c7d8261361a565b614c878185614be4565b9350614c97818560208601613636565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614cd9600583614be4565b9150614ce482614ca3565b600582019050919050565b6000614cfb8285614bef565b9150614d078284614c72565b9150614d1282614ccc565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d7a602683613625565b9150614d8582614d1e565b604082019050919050565b60006020820190508181036000830152614da981614d6d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614de6602083613625565b9150614df182614db0565b602082019050919050565b60006020820190508181036000830152614e1581614dd9565b9050919050565b7f526563697069656e742073686f756c642062652070726573656e740000000000600082015250565b6000614e52601b83613625565b9150614e5d82614e1c565b602082019050919050565b60006020820190508181036000830152614e8181614e45565b9050919050565b7f526f79616c74792076616c75652073686f756c6420626520706f736974697665600082015250565b6000614ebe602083613625565b9150614ec982614e88565b602082019050919050565b60006020820190508181036000830152614eed81614eb1565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614f50602d83613625565b9150614f5b82614ef4565b604082019050919050565b60006020820190508181036000830152614f7f81614f43565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614fbc601f83613625565b9150614fc782614f86565b602082019050919050565b60006020820190508181036000830152614feb81614faf565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615028602083613625565b915061503382614ff2565b602082019050919050565b600060208201905081810360008301526150578161501b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615094601c83613625565b915061509f8261505e565b602082019050919050565b600060208201905081810360008301526150c381615087565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615100601983613625565b915061510b826150ca565b602082019050919050565b6000602082019050818103600083015261512f816150f3565b9050919050565b600060408201905061514b60008301856138f9565b818103602083015261515d8184614089565b90509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006151c2602583613625565b91506151cd82615166565b604082019050919050565b600060208201905081810360008301526151f1816151b5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615254602483613625565b915061525f826151f8565b604082019050919050565b6000602082019050818103600083015261528381615247565b9050919050565b6000615295826136cc565b91506152a0836136cc565b92508282039050818111156152b8576152b7614438565b5b92915050565b60006152c9826136cc565b91506152d4836136cc565b92508282019050808211156152ec576152eb614438565b5b92915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061534e603283613625565b9150615359826152f2565b604082019050919050565b6000602082019050818103600083015261537d81615341565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153ab82615384565b6153b5818561538f565b93506153c5818560208601613636565b6153ce81613660565b840191505092915050565b60006080820190506153ee6000830187613761565b6153fb6020830186613761565b61540860408301856138f9565b818103606083015261541a81846153a0565b905095945050505050565b6000815190506154348161358b565b92915050565b6000602082840312156154505761544f613555565b5b600061545e84828501615425565b9150509291505056fea2646970667358221220ea524e0ad6c7317f27db53fc7a0e9b3e19a61037aff83248afe6bd49ccca6adb64736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166796265696175636b73343635377768766736746c7973767772696169626d69367468356a697a7578336c34716464703776367677367736342f00000000000000

-----Decoded View---------------
Arg [0] : initBaseURI (string): https://nftstorage.link/ipfs/bafybeiaucks4657whvg6tlysvwriaibmi6th5jizux3l4qddp7v6vw6w64/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [2] : 68747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166
Arg [3] : 796265696175636b73343635377768766736746c7973767772696169626d6936
Arg [4] : 7468356a697a7578336c34716464703776367677367736342f00000000000000


Deployed Bytecode Sourcemap

91649:6045:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93797:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72054:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73566:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73084:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93048:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97156:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92239:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92480:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93425:364;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;97529:159;;;;;;;;;;;;;:::i;:::-;;92645:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95000:822;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96909:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94724:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71764:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91751:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71495:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96791:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50557:103;;;;;;;;;;;;;:::i;:::-;;1205:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;49909:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97276:245;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;72223:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91871:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73809:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95830:532;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92818:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97025:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92149:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;96374:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92193:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2308:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91911:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74035:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96679:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50815:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91958:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93797:356;93890:4;295:10;93925:38;;93910:53;;;:11;:53;;;;93907:96;;93987:4;93980:11;;;;93907:96;92050:10;94031:21;;94016:36;;;:11;:36;;;;94013:79;;94076:4;94069:11;;;;94013:79;94109:36;94133:11;94109:23;:36::i;:::-;94102:43;;93797:356;;;;:::o;72054:100::-;72108:13;72141:5;72134:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72054:100;:::o;73566:171::-;73642:7;73662:23;73677:7;73662:14;:23::i;:::-;73705:15;:24;73721:7;73705:24;;;;;;;;;;;;;;;;;;;;;73698:31;;73566:171;;;:::o;73084:416::-;73165:13;73181:23;73196:7;73181:14;:23::i;:::-;73165:39;;73229:5;73223:11;;:2;:11;;;73215:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;73323:5;73307:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;73332:37;73349:5;73356:12;:10;:12::i;:::-;73332:16;:37::i;:::-;73307:62;73285:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;73471:21;73480:2;73484:7;73471:8;:21::i;:::-;73154:346;73084:416;;:::o;93048:369::-;49795:13;:11;:13::i;:::-;93189:32:::1;93243:1;93224:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;93189:56;;93278:22;93256:10;93267:1;93256:13;;;;;;;;:::i;:::-;;;;;;;;:19;;:44;;;;;;;;;::::0;::::1;93335:27;93311:10;93322:1;93311:13;;;;;;;;:::i;:::-;;;;;;;;:21;;:51;;;;;;;;;::::0;::::1;93373:36;93388:8;93398:10;93373:14;:36::i;:::-;93178:239;93048:369:::0;;;:::o;97156:112::-;49795:13;:11;:13::i;:::-;97245:15:::1;97233:9;:27;;;;97156:112:::0;:::o;92239:46::-;;;;;;;;;;;;;;;;;:::o;92480:157::-;19558:1;18384:42;19512:43;;;:47;19508:225;;;18384:42;19581:40;;;19630:4;19637:10;19581:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19576:146;;19695:10;19676:30;;;;;;;;;;;:::i;:::-;;;;;;;;19576:146;19508:225;92592:37:::1;92611:4;92617:2;92621:7;92592:18;:37::i;:::-;92480:157:::0;;;:::o;93425:364::-;93507:16;93525:21;93559:32;93594:9;:19;93604:8;93594:19;;;;;;;;;;;93559:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93647:1;93627:10;:17;:21;93624:125;;;93673:10;93684:1;93673:13;;;;;;;;:::i;:::-;;;;;;;;:21;;;93731:5;93710:10;93721:1;93710:13;;;;;;;;:::i;:::-;;;;;;;;:19;;;93697:32;;:10;:32;;;;:::i;:::-;93696:40;;;;:::i;:::-;93665:72;;;;;;;93624:125;93775:1;93779;93759:22;;;;;93425:364;;;;;;:::o;97529:159::-;49795:13;:11;:13::i;:::-;97577:23:::1;97603:21;97577:47;;97643:10;97635:28;;:45;97664:15;97635:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;97566:122;97529:159::o:0;92645:165::-;19558:1;18384:42;19512:43;;;:47;19508:225;;;18384:42;19581:40;;;19630:4;19637:10;19581:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19576:146;;19695:10;19676:30;;;;;;;;;;;:::i;:::-;;;;;;;;19576:146;19508:225;92761:41:::1;92784:4;92790:2;92794:7;92761:22;:41::i;:::-;92645:165:::0;;;:::o;95000:822::-;95124:11;;95137:19;;94489:144;94526:11;;94489:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94556:4;94606:10;94589:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;94579:39;;;;;;94489:18;:144::i;:::-;94467:229;;;;;;;;;;;;:::i;:::-;;;;;;;;;95184:9:::1;;95195:1;94286:9;94268:14;94260:5;:22;;;;:::i;:::-;:35;94238:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;31981:21:::2;:19;:21::i;:::-;95258:9:::3;95244:10;;:23;;95236:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;95342:7;:19;95350:10;95342:19;;;;;;;;;;;;;;;;;;;;;;;;;95341:20;95333:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;95424:26;95430:10;95442:7;95424:5;:26::i;:::-;95471:10;;:12;;;;;;;;;:::i;:::-;;;;;;95494:13;95513:7;95494:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95558:7;95532:11;:23;95544:10;95532:23;;;;;;;;;;;;;;;:33;;;;95578:20;95601:26;;;;;;;;95607:7;95601:26;;;;95616:10;95601:26;;;;::::0;95578:49:::3;;95638:17;95661:7;95638:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95696:10;95685:21;;:7;:5;:7::i;:::-;:21;;;95682:66;;95744:4;95722:7;:19;95730:10;95722:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;95682:66;95793:10;95778:35;;;95805:7;95778:35;;;;;;:::i;:::-;;;;;;;;95225:597;32025:20:::2;:18;:20::i;:::-;94707:1:::1;;95000:822:::0;;;;;;:::o;96909:108::-;49795:13;:11;:13::i;:::-;96996::::1;96986:7;:23;;;;;;:::i;:::-;;96909:108:::0;:::o;94724:268::-;94830:4;94852:12;94894:10;94877:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;94867:39;;;;;;94852:54;;94926:58;94945:11;;94926:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94958:19;;94979:4;94926:18;:58::i;:::-;94919:65;;;94724:268;;;;:::o;71764:223::-;71836:7;71856:13;71872:17;71881:7;71872:8;:17::i;:::-;71856:33;;71925:1;71908:19;;:5;:19;;;71900:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;71974:5;71967:12;;;71764:223;;;:::o;91751:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71495:207::-;71567:7;71612:1;71595:19;;:5;:19;;;71587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;71678:9;:16;71688:5;71678:16;;;;;;;;;;;;;;;;71671:23;;71495:207;;;:::o;96791:110::-;96842:15;96876:17;96869:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96791:110;:::o;50557:103::-;49795:13;:11;:13::i;:::-;50622:30:::1;50649:1;50622:18;:30::i;:::-;50557:103::o:0;1205:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49909:87::-;49955:7;49982:6;;;;;;;;;;;49975:13;;49909:87;:::o;97276:245::-;97320:7;97329;97349:23;97383:4;97349:39;;97399:23;97449:6;97425:21;:30;;;;:::i;:::-;97399:56;;97480:15;97497;97472:41;;;;;;97276:245;;:::o;72223:104::-;72279:13;72312:7;72305:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72223:104;:::o;91871:29::-;;;;:::o;73809:155::-;73904:52;73923:12;:10;:12::i;:::-;73937:8;73947;73904:18;:52::i;:::-;73809:155;;:::o;95830:532::-;31981:21;:19;:21::i;:::-;95970:9:::1;95956:10;;:23;;95948:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;96056:27;96062:11;96075:7;96056:5;:27::i;:::-;96099:10;;:12;;;;;;;;;:::i;:::-;;;;;;96122:13;96141:7;96122:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96187:7;96160:11;:24;96172:11;96160:24;;;;;;;;;;;;;;;:34;;;;96207:20;96230:27;;;;;;;;96236:7;96230:27;;;;96245:11;96230:27;;;;::::0;96207:50:::1;;96268:17;96291:7;96268:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96332:11;96317:36;;;96345:7;96317:36;;;;;;:::i;:::-;;;;;;;;95937:425;32025:20:::0;:18;:20::i;:::-;95830:532;;:::o;92818:222::-;19558:1;18384:42;19512:43;;;:47;19508:225;;;18384:42;19581:40;;;19630:4;19637:10;19581:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19576:146;;19695:10;19676:30;;;;;;;;;;;:::i;:::-;;;;;;;;19576:146;19508:225;92985:47:::1;93008:4;93014:2;93018:7;93027:4;92985:22;:47::i;:::-;92818:222:::0;;;;:::o;97025:122::-;49795:13;:11;:13::i;:::-;97129:10:::1;97107:19;:32;;;;97025:122:::0;:::o;92149:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;96374:293::-;96482:13;96519:16;96527:7;96519;:16::i;:::-;96511:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;96614:7;96623:25;96640:7;96623:16;:25::i;:::-;96597:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96583:76;;96374:293;;;:::o;92193:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;2308:137::-;2383:21;2424:9;:13;2434:2;2424:13;;;;;;;;;;;2417:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2308:137;;;:::o;91911:40::-;;;:::o;74035:164::-;74132:4;74156:18;:25;74175:5;74156:25;;;;;;;;;;;;;;;:35;74182:8;74156:35;;;;;;;;;;;;;;;;;;;;;;;;;74149:42;;74035:164;;;;:::o;96679:104::-;96726:17;96762:13;96755:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96679:104;:::o;50815:201::-;49795:13;:11;:13::i;:::-;50924:1:::1;50904:22;;:8;:22;;::::0;50896:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;50980:28;50999:8;50980:18;:28::i;:::-;50815:201:::0;:::o;91958:37::-;;;;:::o;71126:305::-;71228:4;71280:25;71265:40;;;:11;:40;;;;:105;;;;71337:33;71322:48;;;:11;:48;;;;71265:105;:158;;;;71387:36;71411:11;71387:23;:36::i;:::-;71265:158;71245:178;;71126:305;;;:::o;83385:135::-;83467:16;83475:7;83467;:16::i;:::-;83459:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;83385:135;:::o;48460:98::-;48513:7;48540:10;48533:17;;48460:98;:::o;82664:174::-;82766:2;82739:15;:24;82755:7;82739:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;82822:7;82818:2;82784:46;;82793:23;82808:7;82793:14;:23::i;:::-;82784:46;;;;;;;;;;;;82664:174;;:::o;50074:132::-;50149:12;:10;:12::i;:::-;50138:23;;:7;:5;:7::i;:::-;:23;;;50130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50074:132::o;1266:423::-;1362:6;1357:282;1378:10;:17;1374:1;:21;1357:282;;;1458:3;1425:37;;:10;1436:1;1425:13;;;;;;;;:::i;:::-;;;;;;;;:21;;;:37;;;1417:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1540:1;1517:10;1528:1;1517:13;;;;;;;;:::i;:::-;;;;;;;;:19;;;:24;;;1509:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1593:9;:14;1603:3;1593:14;;;;;;;;;;;1613:10;1624:1;1613:13;;;;;;;;:::i;:::-;;;;;;;;1593:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1397:3;;;;;:::i;:::-;;;;1357:282;;;;1649:32;1665:3;1670:10;1649:15;:32::i;:::-;1266:423;;:::o;74266:335::-;74461:41;74480:12;:10;:12::i;:::-;74494:7;74461:18;:41::i;:::-;74453:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;74565:28;74575:4;74581:2;74585:7;74565:9;:28::i;:::-;74266:335;;;:::o;74672:185::-;74810:39;74827:4;74833:2;74837:7;74810:39;;;;;;;;;;;;:16;:39::i;:::-;74672:185;;;:::o;21297:190::-;21422:4;21475;21446:25;21459:5;21466:4;21446:12;:25::i;:::-;:33;21439:40;;21297:190;;;;;:::o;32061:293::-;31463:1;32195:7;;:19;32187:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31463:1;32328:7;:18;;;;32061:293::o;78881:942::-;78975:1;78961:16;;:2;:16;;;78953:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;79034:16;79042:7;79034;:16::i;:::-;79033:17;79025:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;79096:48;79125:1;79129:2;79133:7;79142:1;79096:20;:48::i;:::-;79243:16;79251:7;79243;:16::i;:::-;79242:17;79234:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;79658:1;79641:9;:13;79651:2;79641:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;79702:2;79683:7;:16;79691:7;79683:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;79747:7;79743:2;79722:33;;79739:1;79722:33;;;;;;;;;;;;79768:47;79796:1;79800:2;79804:7;79813:1;79768:19;:47::i;:::-;78881:942;;:::o;32362:213::-;31419:1;32545:7;:22;;;;32362:213::o;76558:117::-;76624:7;76651;:16;76659:7;76651:16;;;;;;;;;;;;;;;;;;;;;76644:23;;76558:117;;;:::o;51176:191::-;51250:16;51269:6;;;;;;;;;;;51250:25;;51295:8;51286:6;;:17;;;;;;;;;;;;;;;;;;51350:8;51319:40;;51340:8;51319:40;;;;;;;;;;;;51239:128;51176:191;:::o;82981:315::-;83136:8;83127:17;;:5;:17;;;83119:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;83223:8;83185:18;:25;83204:5;83185:25;;;;;;;;;;;;;;;:35;83211:8;83185:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;83269:8;83247:41;;83262:5;83247:41;;;83279:8;83247:41;;;;;;:::i;:::-;;;;;;;;82981:315;;;:::o;74928:322::-;75102:41;75121:12;:10;:12::i;:::-;75135:7;75102:18;:41::i;:::-;75094:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;75204:38;75218:4;75224:2;75228:7;75237:4;75204:13;:38::i;:::-;74928:322;;;;:::o;76988:128::-;77053:4;77106:1;77077:31;;:17;77086:7;77077:8;:17::i;:::-;:31;;;;77070:38;;76988:128;;;:::o;45887:716::-;45943:13;45994:14;46031:1;46011:17;46022:5;46011:10;:17::i;:::-;:21;45994:38;;46047:20;46081:6;46070:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46047:41;;46103:11;46232:6;46228:2;46224:15;46216:6;46212:28;46205:35;;46269:288;46276:4;46269:288;;;46301:5;;;;;;;;46443:8;46438:2;46431:5;46427:14;46422:30;46417:3;46409:44;46499:2;46490:11;;;;;;:::i;:::-;;;;;46533:1;46524:5;:10;46269:288;46520:21;46269:288;46578:6;46571:13;;;;;45887:716;;;:::o;63638:157::-;63723:4;63762:25;63747:40;;;:11;:40;;;;63740:47;;63638:157;;;:::o;2453:143::-;2559:29;2572:3;2577:10;2559:29;;;;;;;:::i;:::-;;;;;;;;2453:143;;:::o;77283:264::-;77376:4;77393:13;77409:23;77424:7;77409:14;:23::i;:::-;77393:39;;77462:5;77451:16;;:7;:16;;;:52;;;;77471:32;77488:5;77495:7;77471:16;:32::i;:::-;77451:52;:87;;;;77531:7;77507:31;;:20;77519:7;77507:11;:20::i;:::-;:31;;;77451:87;77443:96;;;77283:264;;;;:::o;81282:1263::-;81441:4;81414:31;;:23;81429:7;81414:14;:23::i;:::-;:31;;;81406:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;81520:1;81506:16;;:2;:16;;;81498:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;81576:42;81597:4;81603:2;81607:7;81616:1;81576:20;:42::i;:::-;81748:4;81721:31;;:23;81736:7;81721:14;:23::i;:::-;:31;;;81713:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;81866:15;:24;81882:7;81866:24;;;;;;;;;;;;81859:31;;;;;;;;;;;82361:1;82342:9;:15;82352:4;82342:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;82394:1;82377:9;:13;82387:2;82377:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;82436:2;82417:7;:16;82425:7;82417:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;82475:7;82471:2;82456:27;;82465:4;82456:27;;;;;;;;;;;;82496:41;82516:4;82522:2;82526:7;82535:1;82496:19;:41::i;:::-;81282:1263;;;:::o;22164:296::-;22247:7;22267:20;22290:4;22267:27;;22310:9;22305:118;22329:5;:12;22325:1;:16;22305:118;;;22378:33;22388:12;22402:5;22408:1;22402:8;;;;;;;;:::i;:::-;;;;;;;;22378:9;:33::i;:::-;22363:48;;22343:3;;;;;:::i;:::-;;;;22305:118;;;;22440:12;22433:19;;;22164:296;;;;:::o;85669:410::-;85859:1;85847:9;:13;85843:229;;;85897:1;85881:18;;:4;:18;;;85877:87;;85939:9;85920;:15;85930:4;85920:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;85877:87;85996:1;85982:16;;:2;:16;;;85978:83;;86036:9;86019;:13;86029:2;86019:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;85978:83;85843:229;85669:410;;;;:::o;86801:158::-;;;;;:::o;76131:313::-;76287:28;76297:4;76303:2;76307:7;76287:9;:28::i;:::-;76334:47;76357:4;76363:2;76367:7;76376:4;76334:22;:47::i;:::-;76326:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;76131:313;;;;:::o;42753:922::-;42806:7;42826:14;42843:1;42826:18;;42893:6;42884:5;:15;42880:102;;42929:6;42920:15;;;;;;:::i;:::-;;;;;42964:2;42954:12;;;;42880:102;43009:6;43000:5;:15;42996:102;;43045:6;43036:15;;;;;;:::i;:::-;;;;;43080:2;43070:12;;;;42996:102;43125:6;43116:5;:15;43112:102;;43161:6;43152:15;;;;;;:::i;:::-;;;;;43196:2;43186:12;;;;43112:102;43241:5;43232;:14;43228:99;;43276:5;43267:14;;;;;;:::i;:::-;;;;;43310:1;43300:11;;;;43228:99;43354:5;43345;:14;43341:99;;43389:5;43380:14;;;;;;:::i;:::-;;;;;43423:1;43413:11;;;;43341:99;43467:5;43458;:14;43454:99;;43502:5;43493:14;;;;;;:::i;:::-;;;;;43536:1;43526:11;;;;43454:99;43580:5;43571;:14;43567:66;;43616:1;43606:11;;;;43567:66;43661:6;43654:13;;;42753:922;;;:::o;29204:149::-;29267:7;29298:1;29294;:5;:51;;29325:20;29340:1;29343;29325:14;:20::i;:::-;29294:51;;;29302:20;29317:1;29320;29302:14;:20::i;:::-;29294:51;29287:58;;29204:149;;;;:::o;84084:853::-;84238:4;84259:15;:2;:13;;;:15::i;:::-;84255:675;;;84311:2;84295:36;;;84332:12;:10;:12::i;:::-;84346:4;84352:7;84361:4;84295:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;84291:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84553:1;84536:6;:13;:18;84532:328;;84579:60;;;;;;;;;;:::i;:::-;;;;;;;;84532:328;84810:6;84804:13;84795:6;84791:2;84787:15;84780:38;84291:584;84427:41;;;84417:51;;;:6;:51;;;;84410:58;;;;;84255:675;84914:4;84907:11;;84084:853;;;;;;;:::o;29361:268::-;29429:13;29536:1;29530:4;29523:15;29565:1;29559:4;29552:15;29606:4;29600;29590:21;29581:30;;29361:268;;;;:::o;52607:326::-;52667:4;52924:1;52902:7;:19;;;:23;52895:30;;52607:326;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:104::-;4935:7;4964:24;4982:5;4964:24;:::i;:::-;4953:35;;4890:104;;;:::o;5000:138::-;5081:32;5107:5;5081:32;:::i;:::-;5074:5;5071:43;5061:71;;5128:1;5125;5118:12;5061:71;5000:138;:::o;5144:155::-;5198:5;5236:6;5223:20;5214:29;;5252:41;5287:5;5252:41;:::i;:::-;5144:155;;;;:::o;5305:109::-;5341:7;5381:26;5374:5;5370:38;5359:49;;5305:109;;;:::o;5420:120::-;5492:23;5509:5;5492:23;:::i;:::-;5485:5;5482:34;5472:62;;5530:1;5527;5520:12;5472:62;5420:120;:::o;5546:137::-;5591:5;5629:6;5616:20;5607:29;;5645:32;5671:5;5645:32;:::i;:::-;5546:137;;;;:::o;5689:633::-;5773:6;5781;5789;5838:2;5826:9;5817:7;5813:23;5809:32;5806:119;;;5844:79;;:::i;:::-;5806:119;5964:1;5989:53;6034:7;6025:6;6014:9;6010:22;5989:53;:::i;:::-;5979:63;;5935:117;6091:2;6117:61;6170:7;6161:6;6150:9;6146:22;6117:61;:::i;:::-;6107:71;;6062:126;6227:2;6253:52;6297:7;6288:6;6277:9;6273:22;6253:52;:::i;:::-;6243:62;;6198:117;5689:633;;;;;:::o;6328:329::-;6387:6;6436:2;6424:9;6415:7;6411:23;6407:32;6404:119;;;6442:79;;:::i;:::-;6404:119;6562:1;6587:53;6632:7;6623:6;6612:9;6608:22;6587:53;:::i;:::-;6577:63;;6533:117;6328:329;;;;:::o;6663:118::-;6750:24;6768:5;6750:24;:::i;:::-;6745:3;6738:37;6663:118;;:::o;6787:222::-;6880:4;6918:2;6907:9;6903:18;6895:26;;6931:71;6999:1;6988:9;6984:17;6975:6;6931:71;:::i;:::-;6787:222;;;;:::o;7015:619::-;7092:6;7100;7108;7157:2;7145:9;7136:7;7132:23;7128:32;7125:119;;;7163:79;;:::i;:::-;7125:119;7283:1;7308:53;7353:7;7344:6;7333:9;7329:22;7308:53;:::i;:::-;7298:63;;7254:117;7410:2;7436:53;7481:7;7472:6;7461:9;7457:22;7436:53;:::i;:::-;7426:63;;7381:118;7538:2;7564:53;7609:7;7600:6;7589:9;7585:22;7564:53;:::i;:::-;7554:63;;7509:118;7015:619;;;;;:::o;7640:474::-;7708:6;7716;7765:2;7753:9;7744:7;7740:23;7736:32;7733:119;;;7771:79;;:::i;:::-;7733:119;7891:1;7916:53;7961:7;7952:6;7941:9;7937:22;7916:53;:::i;:::-;7906:63;;7862:117;8018:2;8044:53;8089:7;8080:6;8069:9;8065:22;8044:53;:::i;:::-;8034:63;;7989:118;7640:474;;;;;:::o;8120:332::-;8241:4;8279:2;8268:9;8264:18;8256:26;;8292:71;8360:1;8349:9;8345:17;8336:6;8292:71;:::i;:::-;8373:72;8441:2;8430:9;8426:18;8417:6;8373:72;:::i;:::-;8120:332;;;;;:::o;8458:117::-;8567:1;8564;8557:12;8581:117;8690:1;8687;8680:12;8704:117;8813:1;8810;8803:12;8844:568;8917:8;8927:6;8977:3;8970:4;8962:6;8958:17;8954:27;8944:122;;8985:79;;:::i;:::-;8944:122;9098:6;9085:20;9075:30;;9128:18;9120:6;9117:30;9114:117;;;9150:79;;:::i;:::-;9114:117;9264:4;9256:6;9252:17;9240:29;;9318:3;9310:4;9302:6;9298:17;9288:8;9284:32;9281:41;9278:128;;;9325:79;;:::i;:::-;9278:128;8844:568;;;;;:::o;9418:704::-;9513:6;9521;9529;9578:2;9566:9;9557:7;9553:23;9549:32;9546:119;;;9584:79;;:::i;:::-;9546:119;9732:1;9721:9;9717:17;9704:31;9762:18;9754:6;9751:30;9748:117;;;9784:79;;:::i;:::-;9748:117;9897:80;9969:7;9960:6;9949:9;9945:22;9897:80;:::i;:::-;9879:98;;;;9675:312;10026:2;10052:53;10097:7;10088:6;10077:9;10073:22;10052:53;:::i;:::-;10042:63;;9997:118;9418:704;;;;;:::o;10128:117::-;10237:1;10234;10227:12;10251:180;10299:77;10296:1;10289:88;10396:4;10393:1;10386:15;10420:4;10417:1;10410:15;10437:281;10520:27;10542:4;10520:27;:::i;:::-;10512:6;10508:40;10650:6;10638:10;10635:22;10614:18;10602:10;10599:34;10596:62;10593:88;;;10661:18;;:::i;:::-;10593:88;10701:10;10697:2;10690:22;10480:238;10437:281;;:::o;10724:129::-;10758:6;10785:20;;:::i;:::-;10775:30;;10814:33;10842:4;10834:6;10814:33;:::i;:::-;10724:129;;;:::o;10859:308::-;10921:4;11011:18;11003:6;11000:30;10997:56;;;11033:18;;:::i;:::-;10997:56;11071:29;11093:6;11071:29;:::i;:::-;11063:37;;11155:4;11149;11145:15;11137:23;;10859:308;;;:::o;11173:146::-;11270:6;11265:3;11260;11247:30;11311:1;11302:6;11297:3;11293:16;11286:27;11173:146;;;:::o;11325:425::-;11403:5;11428:66;11444:49;11486:6;11444:49;:::i;:::-;11428:66;:::i;:::-;11419:75;;11517:6;11510:5;11503:21;11555:4;11548:5;11544:16;11593:3;11584:6;11579:3;11575:16;11572:25;11569:112;;;11600:79;;:::i;:::-;11569:112;11690:54;11737:6;11732:3;11727;11690:54;:::i;:::-;11409:341;11325:425;;;;;:::o;11770:340::-;11826:5;11875:3;11868:4;11860:6;11856:17;11852:27;11842:122;;11883:79;;:::i;:::-;11842:122;12000:6;11987:20;12025:79;12100:3;12092:6;12085:4;12077:6;12073:17;12025:79;:::i;:::-;12016:88;;11832:278;11770:340;;;;:::o;12116:509::-;12185:6;12234:2;12222:9;12213:7;12209:23;12205:32;12202:119;;;12240:79;;:::i;:::-;12202:119;12388:1;12377:9;12373:17;12360:31;12418:18;12410:6;12407:30;12404:117;;;12440:79;;:::i;:::-;12404:117;12545:63;12600:7;12591:6;12580:9;12576:22;12545:63;:::i;:::-;12535:73;;12331:287;12116:509;;;;:::o;12631:559::-;12717:6;12725;12774:2;12762:9;12753:7;12749:23;12745:32;12742:119;;;12780:79;;:::i;:::-;12742:119;12928:1;12917:9;12913:17;12900:31;12958:18;12950:6;12947:30;12944:117;;;12980:79;;:::i;:::-;12944:117;13093:80;13165:7;13156:6;13145:9;13141:22;13093:80;:::i;:::-;13075:98;;;;12871:312;12631:559;;;;;:::o;13196:137::-;13286:6;13320:5;13314:12;13304:22;;13196:137;;;:::o;13339:207::-;13461:11;13495:6;13490:3;13483:19;13535:4;13530:3;13526:14;13511:29;;13339:207;;;;:::o;13552:155::-;13642:4;13665:3;13657:11;;13695:4;13690:3;13686:14;13678:22;;13552:155;;;:::o;13713:108::-;13790:24;13808:5;13790:24;:::i;:::-;13785:3;13778:37;13713:108;;:::o;13827:::-;13904:24;13922:5;13904:24;:::i;:::-;13899:3;13892:37;13827:108;;:::o;13993:497::-;14126:4;14121:3;14117:14;14216:4;14209:5;14205:16;14199:23;14235:63;14292:4;14287:3;14283:14;14269:12;14235:63;:::i;:::-;14141:167;14391:4;14384:5;14380:16;14374:23;14410:63;14467:4;14462:3;14458:14;14444:12;14410:63;:::i;:::-;14318:165;14095:395;13993:497;;:::o;14496:271::-;14611:10;14632:92;14720:3;14712:6;14632:92;:::i;:::-;14756:4;14751:3;14747:14;14733:28;;14496:271;;;;:::o;14773:136::-;14866:4;14898;14893:3;14889:14;14881:22;;14773:136;;;:::o;14971:916::-;15136:3;15165:77;15236:5;15165:77;:::i;:::-;15258:109;15360:6;15355:3;15258:109;:::i;:::-;15251:116;;15391:79;15464:5;15391:79;:::i;:::-;15493:7;15524:1;15509:353;15534:6;15531:1;15528:13;15509:353;;;15610:6;15604:13;15637:109;15742:3;15727:13;15637:109;:::i;:::-;15630:116;;15769:83;15845:6;15769:83;:::i;:::-;15759:93;;15569:293;15556:1;15553;15549:9;15544:14;;15509:353;;;15513:14;15878:3;15871:10;;15141:746;;;14971:916;;;;:::o;15893:465::-;16082:4;16120:2;16109:9;16105:18;16097:26;;16169:9;16163:4;16159:20;16155:1;16144:9;16140:17;16133:47;16197:154;16346:4;16337:6;16197:154;:::i;:::-;16189:162;;15893:465;;;;:::o;16364:142::-;16467:32;16493:5;16467:32;:::i;:::-;16462:3;16455:45;16364:142;;:::o;16512:115::-;16597:23;16614:5;16597:23;:::i;:::-;16592:3;16585:36;16512:115;;:::o;16633:360::-;16768:4;16806:2;16795:9;16791:18;16783:26;;16819:87;16903:1;16892:9;16888:17;16879:6;16819:87;:::i;:::-;16916:70;16982:2;16971:9;16967:18;16958:6;16916:70;:::i;:::-;16633:360;;;;;:::o;16999:116::-;17069:21;17084:5;17069:21;:::i;:::-;17062:5;17059:32;17049:60;;17105:1;17102;17095:12;17049:60;16999:116;:::o;17121:133::-;17164:5;17202:6;17189:20;17180:29;;17218:30;17242:5;17218:30;:::i;:::-;17121:133;;;;:::o;17260:468::-;17325:6;17333;17382:2;17370:9;17361:7;17357:23;17353:32;17350:119;;;17388:79;;:::i;:::-;17350:119;17508:1;17533:53;17578:7;17569:6;17558:9;17554:22;17533:53;:::i;:::-;17523:63;;17479:117;17635:2;17661:50;17703:7;17694:6;17683:9;17679:22;17661:50;:::i;:::-;17651:60;;17606:115;17260:468;;;;;:::o;17734:307::-;17795:4;17885:18;17877:6;17874:30;17871:56;;;17907:18;;:::i;:::-;17871:56;17945:29;17967:6;17945:29;:::i;:::-;17937:37;;18029:4;18023;18019:15;18011:23;;17734:307;;;:::o;18047:423::-;18124:5;18149:65;18165:48;18206:6;18165:48;:::i;:::-;18149:65;:::i;:::-;18140:74;;18237:6;18230:5;18223:21;18275:4;18268:5;18264:16;18313:3;18304:6;18299:3;18295:16;18292:25;18289:112;;;18320:79;;:::i;:::-;18289:112;18410:54;18457:6;18452:3;18447;18410:54;:::i;:::-;18130:340;18047:423;;;;;:::o;18489:338::-;18544:5;18593:3;18586:4;18578:6;18574:17;18570:27;18560:122;;18601:79;;:::i;:::-;18560:122;18718:6;18705:20;18743:78;18817:3;18809:6;18802:4;18794:6;18790:17;18743:78;:::i;:::-;18734:87;;18550:277;18489:338;;;;:::o;18833:943::-;18928:6;18936;18944;18952;19001:3;18989:9;18980:7;18976:23;18972:33;18969:120;;;19008:79;;:::i;:::-;18969:120;19128:1;19153:53;19198:7;19189:6;19178:9;19174:22;19153:53;:::i;:::-;19143:63;;19099:117;19255:2;19281:53;19326:7;19317:6;19306:9;19302:22;19281:53;:::i;:::-;19271:63;;19226:118;19383:2;19409:53;19454:7;19445:6;19434:9;19430:22;19409:53;:::i;:::-;19399:63;;19354:118;19539:2;19528:9;19524:18;19511:32;19570:18;19562:6;19559:30;19556:117;;;19592:79;;:::i;:::-;19556:117;19697:62;19751:7;19742:6;19731:9;19727:22;19697:62;:::i;:::-;19687:72;;19482:287;18833:943;;;;;;;:::o;19782:77::-;19819:7;19848:5;19837:16;;19782:77;;;:::o;19865:122::-;19938:24;19956:5;19938:24;:::i;:::-;19931:5;19928:35;19918:63;;19977:1;19974;19967:12;19918:63;19865:122;:::o;19993:139::-;20039:5;20077:6;20064:20;20055:29;;20093:33;20120:5;20093:33;:::i;:::-;19993:139;;;;:::o;20138:329::-;20197:6;20246:2;20234:9;20225:7;20221:23;20217:32;20214:119;;;20252:79;;:::i;:::-;20214:119;20372:1;20397:53;20442:7;20433:6;20422:9;20418:22;20397:53;:::i;:::-;20387:63;;20343:117;20138:329;;;;:::o;20473:332::-;20594:4;20632:2;20621:9;20617:18;20609:26;;20645:71;20713:1;20702:9;20698:17;20689:6;20645:71;:::i;:::-;20726:72;20794:2;20783:9;20779:18;20770:6;20726:72;:::i;:::-;20473:332;;;;;:::o;20811:134::-;20898:6;20932:5;20926:12;20916:22;;20811:134;;;:::o;20951:204::-;21070:11;21104:6;21099:3;21092:19;21144:4;21139:3;21135:14;21120:29;;20951:204;;;;:::o;21161:152::-;21248:4;21271:3;21263:11;;21301:4;21296:3;21292:14;21284:22;;21161:152;;;:::o;21319:132::-;21412:32;21438:5;21412:32;:::i;:::-;21407:3;21400:45;21319:132;;:::o;21457:105::-;21532:23;21549:5;21532:23;:::i;:::-;21527:3;21520:36;21457:105;;:::o;21618:505::-;21745:4;21740:3;21736:14;21835:4;21828:5;21824:16;21818:23;21854:79;21927:4;21922:3;21918:14;21904:12;21854:79;:::i;:::-;21760:183;22026:4;22019:5;22015:16;22009:23;22045:61;22100:4;22095:3;22091:14;22077:12;22045:61;:::i;:::-;21953:163;21714:409;21618:505;;:::o;22129:259::-;22238:10;22259:86;22341:3;22333:6;22259:86;:::i;:::-;22377:4;22372:3;22368:14;22354:28;;22129:259;;;;:::o;22394:133::-;22484:4;22516;22511:3;22507:14;22499:22;;22394:133;;;:::o;22587:892::-;22746:3;22775:74;22843:5;22775:74;:::i;:::-;22865:106;22964:6;22959:3;22865:106;:::i;:::-;22858:113;;22995:76;23065:5;22995:76;:::i;:::-;23094:7;23125:1;23110:344;23135:6;23132:1;23129:13;23110:344;;;23211:6;23205:13;23238:103;23337:3;23322:13;23238:103;:::i;:::-;23231:110;;23364:80;23437:6;23364:80;:::i;:::-;23354:90;;23170:284;23157:1;23154;23150:9;23145:14;;23110:344;;;23114:14;23470:3;23463:10;;22751:728;;;22587:892;;;;:::o;23485:453::-;23668:4;23706:2;23695:9;23691:18;23683:26;;23755:9;23749:4;23745:20;23741:1;23730:9;23726:17;23719:47;23783:148;23926:4;23917:6;23783:148;:::i;:::-;23775:156;;23485:453;;;;:::o;23944:474::-;24012:6;24020;24069:2;24057:9;24048:7;24044:23;24040:32;24037:119;;;24075:79;;:::i;:::-;24037:119;24195:1;24220:53;24265:7;24256:6;24245:9;24241:22;24220:53;:::i;:::-;24210:63;;24166:117;24322:2;24348:53;24393:7;24384:6;24373:9;24369:22;24348:53;:::i;:::-;24338:63;;24293:118;23944:474;;;;;:::o;24424:114::-;24491:6;24525:5;24519:12;24509:22;;24424:114;;;:::o;24544:184::-;24643:11;24677:6;24672:3;24665:19;24717:4;24712:3;24708:14;24693:29;;24544:184;;;;:::o;24734:132::-;24801:4;24824:3;24816:11;;24854:4;24849:3;24845:14;24837:22;;24734:132;;;:::o;24872:179::-;24941:10;24962:46;25004:3;24996:6;24962:46;:::i;:::-;25040:4;25035:3;25031:14;25017:28;;24872:179;;;;:::o;25057:113::-;25127:4;25159;25154:3;25150:14;25142:22;;25057:113;;;:::o;25206:732::-;25325:3;25354:54;25402:5;25354:54;:::i;:::-;25424:86;25503:6;25498:3;25424:86;:::i;:::-;25417:93;;25534:56;25584:5;25534:56;:::i;:::-;25613:7;25644:1;25629:284;25654:6;25651:1;25648:13;25629:284;;;25730:6;25724:13;25757:63;25816:3;25801:13;25757:63;:::i;:::-;25750:70;;25843:60;25896:6;25843:60;:::i;:::-;25833:70;;25689:224;25676:1;25673;25669:9;25664:14;;25629:284;;;25633:14;25929:3;25922:10;;25330:608;;;25206:732;;;;:::o;25944:373::-;26087:4;26125:2;26114:9;26110:18;26102:26;;26174:9;26168:4;26164:20;26160:1;26149:9;26145:17;26138:47;26202:108;26305:4;26296:6;26202:108;:::i;:::-;26194:116;;25944:373;;;;:::o;26323:180::-;26371:77;26368:1;26361:88;26468:4;26465:1;26458:15;26492:4;26489:1;26482:15;26509:320;26553:6;26590:1;26584:4;26580:12;26570:22;;26637:1;26631:4;26627:12;26658:18;26648:81;;26714:4;26706:6;26702:17;26692:27;;26648:81;26776:2;26768:6;26765:14;26745:18;26742:38;26739:84;;26795:18;;:::i;:::-;26739:84;26560:269;26509:320;;;:::o;26835:220::-;26975:34;26971:1;26963:6;26959:14;26952:58;27044:3;27039:2;27031:6;27027:15;27020:28;26835:220;:::o;27061:366::-;27203:3;27224:67;27288:2;27283:3;27224:67;:::i;:::-;27217:74;;27300:93;27389:3;27300:93;:::i;:::-;27418:2;27413:3;27409:12;27402:19;;27061:366;;;:::o;27433:419::-;27599:4;27637:2;27626:9;27622:18;27614:26;;27686:9;27680:4;27676:20;27672:1;27661:9;27657:17;27650:47;27714:131;27840:4;27714:131;:::i;:::-;27706:139;;27433:419;;;:::o;27858:248::-;27998:34;27994:1;27986:6;27982:14;27975:58;28067:31;28062:2;28054:6;28050:15;28043:56;27858:248;:::o;28112:366::-;28254:3;28275:67;28339:2;28334:3;28275:67;:::i;:::-;28268:74;;28351:93;28440:3;28351:93;:::i;:::-;28469:2;28464:3;28460:12;28453:19;;28112:366;;;:::o;28484:419::-;28650:4;28688:2;28677:9;28673:18;28665:26;;28737:9;28731:4;28727:20;28723:1;28712:9;28708:17;28701:47;28765:131;28891:4;28765:131;:::i;:::-;28757:139;;28484:419;;;:::o;28909:180::-;28957:77;28954:1;28947:88;29054:4;29051:1;29044:15;29078:4;29075:1;29068:15;29095:332;29216:4;29254:2;29243:9;29239:18;29231:26;;29267:71;29335:1;29324:9;29320:17;29311:6;29267:71;:::i;:::-;29348:72;29416:2;29405:9;29401:18;29392:6;29348:72;:::i;:::-;29095:332;;;;;:::o;29433:137::-;29487:5;29518:6;29512:13;29503:22;;29534:30;29558:5;29534:30;:::i;:::-;29433:137;;;;:::o;29576:345::-;29643:6;29692:2;29680:9;29671:7;29667:23;29663:32;29660:119;;;29698:79;;:::i;:::-;29660:119;29818:1;29843:61;29896:7;29887:6;29876:9;29872:22;29843:61;:::i;:::-;29833:71;;29789:125;29576:345;;;;:::o;29927:180::-;29975:77;29972:1;29965:88;30072:4;30069:1;30062:15;30096:4;30093:1;30086:15;30113:410;30153:7;30176:20;30194:1;30176:20;:::i;:::-;30171:25;;30210:20;30228:1;30210:20;:::i;:::-;30205:25;;30265:1;30262;30258:9;30287:30;30305:11;30287:30;:::i;:::-;30276:41;;30466:1;30457:7;30453:15;30450:1;30447:22;30427:1;30420:9;30400:83;30377:139;;30496:18;;:::i;:::-;30377:139;30161:362;30113:410;;;;:::o;30529:180::-;30577:77;30574:1;30567:88;30674:4;30671:1;30664:15;30698:4;30695:1;30688:15;30715:185;30755:1;30772:20;30790:1;30772:20;:::i;:::-;30767:25;;30806:20;30824:1;30806:20;:::i;:::-;30801:25;;30845:1;30835:35;;30850:18;;:::i;:::-;30835:35;30892:1;30889;30885:9;30880:14;;30715:185;;;;:::o;30906:94::-;30939:8;30987:5;30983:2;30979:14;30958:35;;30906:94;;;:::o;31006:::-;31045:7;31074:20;31088:5;31074:20;:::i;:::-;31063:31;;31006:94;;;:::o;31106:100::-;31145:7;31174:26;31194:5;31174:26;:::i;:::-;31163:37;;31106:100;;;:::o;31212:157::-;31317:45;31337:24;31355:5;31337:24;:::i;:::-;31317:45;:::i;:::-;31312:3;31305:58;31212:157;;:::o;31375:256::-;31487:3;31502:75;31573:3;31564:6;31502:75;:::i;:::-;31602:2;31597:3;31593:12;31586:19;;31622:3;31615:10;;31375:256;;;;:::o;31637:222::-;31777:34;31773:1;31765:6;31761:14;31754:58;31846:5;31841:2;31833:6;31829:15;31822:30;31637:222;:::o;31865:366::-;32007:3;32028:67;32092:2;32087:3;32028:67;:::i;:::-;32021:74;;32104:93;32193:3;32104:93;:::i;:::-;32222:2;32217:3;32213:12;32206:19;;31865:366;;;:::o;32237:419::-;32403:4;32441:2;32430:9;32426:18;32418:26;;32490:9;32484:4;32480:20;32476:1;32465:9;32461:17;32454:47;32518:131;32644:4;32518:131;:::i;:::-;32510:139;;32237:419;;;:::o;32662:174::-;32802:26;32798:1;32790:6;32786:14;32779:50;32662:174;:::o;32842:366::-;32984:3;33005:67;33069:2;33064:3;33005:67;:::i;:::-;32998:74;;33081:93;33170:3;33081:93;:::i;:::-;33199:2;33194:3;33190:12;33183:19;;32842:366;;;:::o;33214:419::-;33380:4;33418:2;33407:9;33403:18;33395:26;;33467:9;33461:4;33457:20;33453:1;33442:9;33438:17;33431:47;33495:131;33621:4;33495:131;:::i;:::-;33487:139;;33214:419;;;:::o;33639:237::-;33779:34;33775:1;33767:6;33763:14;33756:58;33848:20;33843:2;33835:6;33831:15;33824:45;33639:237;:::o;33882:366::-;34024:3;34045:67;34109:2;34104:3;34045:67;:::i;:::-;34038:74;;34121:93;34210:3;34121:93;:::i;:::-;34239:2;34234:3;34230:12;34223:19;;33882:366;;;:::o;34254:419::-;34420:4;34458:2;34447:9;34443:18;34435:26;;34507:9;34501:4;34497:20;34493:1;34482:9;34478:17;34471:47;34535:131;34661:4;34535:131;:::i;:::-;34527:139;;34254:419;;;:::o;34679:224::-;34819:34;34815:1;34807:6;34803:14;34796:58;34888:7;34883:2;34875:6;34871:15;34864:32;34679:224;:::o;34909:366::-;35051:3;35072:67;35136:2;35131:3;35072:67;:::i;:::-;35065:74;;35148:93;35237:3;35148:93;:::i;:::-;35266:2;35261:3;35257:12;35250:19;;34909:366;;;:::o;35281:419::-;35447:4;35485:2;35474:9;35470:18;35462:26;;35534:9;35528:4;35524:20;35520:1;35509:9;35505:17;35498:47;35562:131;35688:4;35562:131;:::i;:::-;35554:139;;35281:419;;;:::o;35706:233::-;35745:3;35768:24;35786:5;35768:24;:::i;:::-;35759:33;;35814:66;35807:5;35804:77;35801:103;;35884:18;;:::i;:::-;35801:103;35931:1;35924:5;35920:13;35913:20;;35706:233;;;:::o;35945:141::-;35994:4;36017:3;36009:11;;36040:3;36037:1;36030:14;36074:4;36071:1;36061:18;36053:26;;35945:141;;;:::o;36092:93::-;36129:6;36176:2;36171;36164:5;36160:14;36156:23;36146:33;;36092:93;;;:::o;36191:107::-;36235:8;36285:5;36279:4;36275:16;36254:37;;36191:107;;;;:::o;36304:393::-;36373:6;36423:1;36411:10;36407:18;36446:97;36476:66;36465:9;36446:97;:::i;:::-;36564:39;36594:8;36583:9;36564:39;:::i;:::-;36552:51;;36636:4;36632:9;36625:5;36621:21;36612:30;;36685:4;36675:8;36671:19;36664:5;36661:30;36651:40;;36380:317;;36304:393;;;;;:::o;36703:60::-;36731:3;36752:5;36745:12;;36703:60;;;:::o;36769:142::-;36819:9;36852:53;36870:34;36879:24;36897:5;36879:24;:::i;:::-;36870:34;:::i;:::-;36852:53;:::i;:::-;36839:66;;36769:142;;;:::o;36917:75::-;36960:3;36981:5;36974:12;;36917:75;;;:::o;36998:269::-;37108:39;37139:7;37108:39;:::i;:::-;37169:91;37218:41;37242:16;37218:41;:::i;:::-;37210:6;37203:4;37197:11;37169:91;:::i;:::-;37163:4;37156:105;37074:193;36998:269;;;:::o;37273:73::-;37318:3;37273:73;:::o;37352:189::-;37429:32;;:::i;:::-;37470:65;37528:6;37520;37514:4;37470:65;:::i;:::-;37405:136;37352:189;;:::o;37547:186::-;37607:120;37624:3;37617:5;37614:14;37607:120;;;37678:39;37715:1;37708:5;37678:39;:::i;:::-;37651:1;37644:5;37640:13;37631:22;;37607:120;;;37547:186;;:::o;37739:543::-;37840:2;37835:3;37832:11;37829:446;;;37874:38;37906:5;37874:38;:::i;:::-;37958:29;37976:10;37958:29;:::i;:::-;37948:8;37944:44;38141:2;38129:10;38126:18;38123:49;;;38162:8;38147:23;;38123:49;38185:80;38241:22;38259:3;38241:22;:::i;:::-;38231:8;38227:37;38214:11;38185:80;:::i;:::-;37844:431;;37829:446;37739:543;;;:::o;38288:117::-;38342:8;38392:5;38386:4;38382:16;38361:37;;38288:117;;;;:::o;38411:169::-;38455:6;38488:51;38536:1;38532:6;38524:5;38521:1;38517:13;38488:51;:::i;:::-;38484:56;38569:4;38563;38559:15;38549:25;;38462:118;38411:169;;;;:::o;38585:295::-;38661:4;38807:29;38832:3;38826:4;38807:29;:::i;:::-;38799:37;;38869:3;38866:1;38862:11;38856:4;38853:21;38845:29;;38585:295;;;;:::o;38885:1395::-;39002:37;39035:3;39002:37;:::i;:::-;39104:18;39096:6;39093:30;39090:56;;;39126:18;;:::i;:::-;39090:56;39170:38;39202:4;39196:11;39170:38;:::i;:::-;39255:67;39315:6;39307;39301:4;39255:67;:::i;:::-;39349:1;39373:4;39360:17;;39405:2;39397:6;39394:14;39422:1;39417:618;;;;40079:1;40096:6;40093:77;;;40145:9;40140:3;40136:19;40130:26;40121:35;;40093:77;40196:67;40256:6;40249:5;40196:67;:::i;:::-;40190:4;40183:81;40052:222;39387:887;;39417:618;39469:4;39465:9;39457:6;39453:22;39503:37;39535:4;39503:37;:::i;:::-;39562:1;39576:208;39590:7;39587:1;39584:14;39576:208;;;39669:9;39664:3;39660:19;39654:26;39646:6;39639:42;39720:1;39712:6;39708:14;39698:24;;39767:2;39756:9;39752:18;39739:31;;39613:4;39610:1;39606:12;39601:17;;39576:208;;;39812:6;39803:7;39800:19;39797:179;;;39870:9;39865:3;39861:19;39855:26;39913:48;39955:4;39947:6;39943:17;39932:9;39913:48;:::i;:::-;39905:6;39898:64;39820:156;39797:179;40022:1;40018;40010:6;40006:14;40002:22;39996:4;39989:36;39424:611;;;39387:887;;38977:1303;;;38885:1395;;:::o;40286:174::-;40426:26;40422:1;40414:6;40410:14;40403:50;40286:174;:::o;40466:366::-;40608:3;40629:67;40693:2;40688:3;40629:67;:::i;:::-;40622:74;;40705:93;40794:3;40705:93;:::i;:::-;40823:2;40818:3;40814:12;40807:19;;40466:366;;;:::o;40838:419::-;41004:4;41042:2;41031:9;41027:18;41019:26;;41091:9;41085:4;41081:20;41077:1;41066:9;41062:17;41055:47;41119:131;41245:4;41119:131;:::i;:::-;41111:139;;40838:419;;;:::o;41263:228::-;41403:34;41399:1;41391:6;41387:14;41380:58;41472:11;41467:2;41459:6;41455:15;41448:36;41263:228;:::o;41497:366::-;41639:3;41660:67;41724:2;41719:3;41660:67;:::i;:::-;41653:74;;41736:93;41825:3;41736:93;:::i;:::-;41854:2;41849:3;41845:12;41838:19;;41497:366;;;:::o;41869:419::-;42035:4;42073:2;42062:9;42058:18;42050:26;;42122:9;42116:4;42112:20;42108:1;42097:9;42093:17;42086:47;42150:131;42276:4;42150:131;:::i;:::-;42142:139;;41869:419;;;:::o;42294:221::-;42434:34;42430:1;42422:6;42418:14;42411:58;42503:4;42498:2;42490:6;42486:15;42479:29;42294:221;:::o;42521:366::-;42663:3;42684:67;42748:2;42743:3;42684:67;:::i;:::-;42677:74;;42760:93;42849:3;42760:93;:::i;:::-;42878:2;42873:3;42869:12;42862:19;;42521:366;;;:::o;42893:419::-;43059:4;43097:2;43086:9;43082:18;43074:26;;43146:9;43140:4;43136:20;43132:1;43121:9;43117:17;43110:47;43174:131;43300:4;43174:131;:::i;:::-;43166:139;;42893:419;;;:::o;43318:148::-;43420:11;43457:3;43442:18;;43318:148;;;;:::o;43496:874::-;43599:3;43636:5;43630:12;43665:36;43691:9;43665:36;:::i;:::-;43717:89;43799:6;43794:3;43717:89;:::i;:::-;43710:96;;43837:1;43826:9;43822:17;43853:1;43848:166;;;;44028:1;44023:341;;;;43815:549;;43848:166;43932:4;43928:9;43917;43913:25;43908:3;43901:38;43994:6;43987:14;43980:22;43972:6;43968:35;43963:3;43959:45;43952:52;;43848:166;;44023:341;44090:38;44122:5;44090:38;:::i;:::-;44150:1;44164:154;44178:6;44175:1;44172:13;44164:154;;;44252:7;44246:14;44242:1;44237:3;44233:11;44226:35;44302:1;44293:7;44289:15;44278:26;;44200:4;44197:1;44193:12;44188:17;;44164:154;;;44347:6;44342:3;44338:16;44331:23;;44030:334;;43815:549;;43603:767;;43496:874;;;;:::o;44376:390::-;44482:3;44510:39;44543:5;44510:39;:::i;:::-;44565:89;44647:6;44642:3;44565:89;:::i;:::-;44558:96;;44663:65;44721:6;44716:3;44709:4;44702:5;44698:16;44663:65;:::i;:::-;44753:6;44748:3;44744:16;44737:23;;44486:280;44376:390;;;;:::o;44772:155::-;44912:7;44908:1;44900:6;44896:14;44889:31;44772:155;:::o;44933:400::-;45093:3;45114:84;45196:1;45191:3;45114:84;:::i;:::-;45107:91;;45207:93;45296:3;45207:93;:::i;:::-;45325:1;45320:3;45316:11;45309:18;;44933:400;;;:::o;45339:695::-;45617:3;45639:92;45727:3;45718:6;45639:92;:::i;:::-;45632:99;;45748:95;45839:3;45830:6;45748:95;:::i;:::-;45741:102;;45860:148;46004:3;45860:148;:::i;:::-;45853:155;;46025:3;46018:10;;45339:695;;;;;:::o;46040:225::-;46180:34;46176:1;46168:6;46164:14;46157:58;46249:8;46244:2;46236:6;46232:15;46225:33;46040:225;:::o;46271:366::-;46413:3;46434:67;46498:2;46493:3;46434:67;:::i;:::-;46427:74;;46510:93;46599:3;46510:93;:::i;:::-;46628:2;46623:3;46619:12;46612:19;;46271:366;;;:::o;46643:419::-;46809:4;46847:2;46836:9;46832:18;46824:26;;46896:9;46890:4;46886:20;46882:1;46871:9;46867:17;46860:47;46924:131;47050:4;46924:131;:::i;:::-;46916:139;;46643:419;;;:::o;47068:182::-;47208:34;47204:1;47196:6;47192:14;47185:58;47068:182;:::o;47256:366::-;47398:3;47419:67;47483:2;47478:3;47419:67;:::i;:::-;47412:74;;47495:93;47584:3;47495:93;:::i;:::-;47613:2;47608:3;47604:12;47597:19;;47256:366;;;:::o;47628:419::-;47794:4;47832:2;47821:9;47817:18;47809:26;;47881:9;47875:4;47871:20;47867:1;47856:9;47852:17;47845:47;47909:131;48035:4;47909:131;:::i;:::-;47901:139;;47628:419;;;:::o;48053:177::-;48193:29;48189:1;48181:6;48177:14;48170:53;48053:177;:::o;48236:366::-;48378:3;48399:67;48463:2;48458:3;48399:67;:::i;:::-;48392:74;;48475:93;48564:3;48475:93;:::i;:::-;48593:2;48588:3;48584:12;48577:19;;48236:366;;;:::o;48608:419::-;48774:4;48812:2;48801:9;48797:18;48789:26;;48861:9;48855:4;48851:20;48847:1;48836:9;48832:17;48825:47;48889:131;49015:4;48889:131;:::i;:::-;48881:139;;48608:419;;;:::o;49033:182::-;49173:34;49169:1;49161:6;49157:14;49150:58;49033:182;:::o;49221:366::-;49363:3;49384:67;49448:2;49443:3;49384:67;:::i;:::-;49377:74;;49460:93;49549:3;49460:93;:::i;:::-;49578:2;49573:3;49569:12;49562:19;;49221:366;;;:::o;49593:419::-;49759:4;49797:2;49786:9;49782:18;49774:26;;49846:9;49840:4;49836:20;49832:1;49821:9;49817:17;49810:47;49874:131;50000:4;49874:131;:::i;:::-;49866:139;;49593:419;;;:::o;50018:232::-;50158:34;50154:1;50146:6;50142:14;50135:58;50227:15;50222:2;50214:6;50210:15;50203:40;50018:232;:::o;50256:366::-;50398:3;50419:67;50483:2;50478:3;50419:67;:::i;:::-;50412:74;;50495:93;50584:3;50495:93;:::i;:::-;50613:2;50608:3;50604:12;50597:19;;50256:366;;;:::o;50628:419::-;50794:4;50832:2;50821:9;50817:18;50809:26;;50881:9;50875:4;50871:20;50867:1;50856:9;50852:17;50845:47;50909:131;51035:4;50909:131;:::i;:::-;50901:139;;50628:419;;;:::o;51053:181::-;51193:33;51189:1;51181:6;51177:14;51170:57;51053:181;:::o;51240:366::-;51382:3;51403:67;51467:2;51462:3;51403:67;:::i;:::-;51396:74;;51479:93;51568:3;51479:93;:::i;:::-;51597:2;51592:3;51588:12;51581:19;;51240:366;;;:::o;51612:419::-;51778:4;51816:2;51805:9;51801:18;51793:26;;51865:9;51859:4;51855:20;51851:1;51840:9;51836:17;51829:47;51893:131;52019:4;51893:131;:::i;:::-;51885:139;;51612:419;;;:::o;52037:182::-;52177:34;52173:1;52165:6;52161:14;52154:58;52037:182;:::o;52225:366::-;52367:3;52388:67;52452:2;52447:3;52388:67;:::i;:::-;52381:74;;52464:93;52553:3;52464:93;:::i;:::-;52582:2;52577:3;52573:12;52566:19;;52225:366;;;:::o;52597:419::-;52763:4;52801:2;52790:9;52786:18;52778:26;;52850:9;52844:4;52840:20;52836:1;52825:9;52821:17;52814:47;52878:131;53004:4;52878:131;:::i;:::-;52870:139;;52597:419;;;:::o;53022:178::-;53162:30;53158:1;53150:6;53146:14;53139:54;53022:178;:::o;53206:366::-;53348:3;53369:67;53433:2;53428:3;53369:67;:::i;:::-;53362:74;;53445:93;53534:3;53445:93;:::i;:::-;53563:2;53558:3;53554:12;53547:19;;53206:366;;;:::o;53578:419::-;53744:4;53782:2;53771:9;53767:18;53759:26;;53831:9;53825:4;53821:20;53817:1;53806:9;53802:17;53795:47;53859:131;53985:4;53859:131;:::i;:::-;53851:139;;53578:419;;;:::o;54003:175::-;54143:27;54139:1;54131:6;54127:14;54120:51;54003:175;:::o;54184:366::-;54326:3;54347:67;54411:2;54406:3;54347:67;:::i;:::-;54340:74;;54423:93;54512:3;54423:93;:::i;:::-;54541:2;54536:3;54532:12;54525:19;;54184:366;;;:::o;54556:419::-;54722:4;54760:2;54749:9;54745:18;54737:26;;54809:9;54803:4;54799:20;54795:1;54784:9;54780:17;54773:47;54837:131;54963:4;54837:131;:::i;:::-;54829:139;;54556:419;;;:::o;54981:563::-;55192:4;55230:2;55219:9;55215:18;55207:26;;55243:71;55311:1;55300:9;55296:17;55287:6;55243:71;:::i;:::-;55361:9;55355:4;55351:20;55346:2;55335:9;55331:18;55324:48;55389:148;55532:4;55523:6;55389:148;:::i;:::-;55381:156;;54981:563;;;;;:::o;55550:224::-;55690:34;55686:1;55678:6;55674:14;55667:58;55759:7;55754:2;55746:6;55742:15;55735:32;55550:224;:::o;55780:366::-;55922:3;55943:67;56007:2;56002:3;55943:67;:::i;:::-;55936:74;;56019:93;56108:3;56019:93;:::i;:::-;56137:2;56132:3;56128:12;56121:19;;55780:366;;;:::o;56152:419::-;56318:4;56356:2;56345:9;56341:18;56333:26;;56405:9;56399:4;56395:20;56391:1;56380:9;56376:17;56369:47;56433:131;56559:4;56433:131;:::i;:::-;56425:139;;56152:419;;;:::o;56577:223::-;56717:34;56713:1;56705:6;56701:14;56694:58;56786:6;56781:2;56773:6;56769:15;56762:31;56577:223;:::o;56806:366::-;56948:3;56969:67;57033:2;57028:3;56969:67;:::i;:::-;56962:74;;57045:93;57134:3;57045:93;:::i;:::-;57163:2;57158:3;57154:12;57147:19;;56806:366;;;:::o;57178:419::-;57344:4;57382:2;57371:9;57367:18;57359:26;;57431:9;57425:4;57421:20;57417:1;57406:9;57402:17;57395:47;57459:131;57585:4;57459:131;:::i;:::-;57451:139;;57178:419;;;:::o;57603:194::-;57643:4;57663:20;57681:1;57663:20;:::i;:::-;57658:25;;57697:20;57715:1;57697:20;:::i;:::-;57692:25;;57741:1;57738;57734:9;57726:17;;57765:1;57759:4;57756:11;57753:37;;;57770:18;;:::i;:::-;57753:37;57603:194;;;;:::o;57803:191::-;57843:3;57862:20;57880:1;57862:20;:::i;:::-;57857:25;;57896:20;57914:1;57896:20;:::i;:::-;57891:25;;57939:1;57936;57932:9;57925:16;;57960:3;57957:1;57954:10;57951:36;;;57967:18;;:::i;:::-;57951:36;57803:191;;;;:::o;58000:237::-;58140:34;58136:1;58128:6;58124:14;58117:58;58209:20;58204:2;58196:6;58192:15;58185:45;58000:237;:::o;58243:366::-;58385:3;58406:67;58470:2;58465:3;58406:67;:::i;:::-;58399:74;;58482:93;58571:3;58482:93;:::i;:::-;58600:2;58595:3;58591:12;58584:19;;58243:366;;;:::o;58615:419::-;58781:4;58819:2;58808:9;58804:18;58796:26;;58868:9;58862:4;58858:20;58854:1;58843:9;58839:17;58832:47;58896:131;59022:4;58896:131;:::i;:::-;58888:139;;58615:419;;;:::o;59040:98::-;59091:6;59125:5;59119:12;59109:22;;59040:98;;;:::o;59144:168::-;59227:11;59261:6;59256:3;59249:19;59301:4;59296:3;59292:14;59277:29;;59144:168;;;;:::o;59318:373::-;59404:3;59432:38;59464:5;59432:38;:::i;:::-;59486:70;59549:6;59544:3;59486:70;:::i;:::-;59479:77;;59565:65;59623:6;59618:3;59611:4;59604:5;59600:16;59565:65;:::i;:::-;59655:29;59677:6;59655:29;:::i;:::-;59650:3;59646:39;59639:46;;59408:283;59318:373;;;;:::o;59697:640::-;59892:4;59930:3;59919:9;59915:19;59907:27;;59944:71;60012:1;60001:9;59997:17;59988:6;59944:71;:::i;:::-;60025:72;60093:2;60082:9;60078:18;60069:6;60025:72;:::i;:::-;60107;60175:2;60164:9;60160:18;60151:6;60107:72;:::i;:::-;60226:9;60220:4;60216:20;60211:2;60200:9;60196:18;60189:48;60254:76;60325:4;60316:6;60254:76;:::i;:::-;60246:84;;59697:640;;;;;;;:::o;60343:141::-;60399:5;60430:6;60424:13;60415:22;;60446:32;60472:5;60446:32;:::i;:::-;60343:141;;;;:::o;60490:349::-;60559:6;60608:2;60596:9;60587:7;60583:23;60579:32;60576:119;;;60614:79;;:::i;:::-;60576:119;60734:1;60759:63;60814:7;60805:6;60794:9;60790:22;60759:63;:::i;:::-;60749:73;;60705:127;60490:349;;;;:::o

Swarm Source

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