ETH Price: $3,403.97 (+6.29%)
Gas: 12.4 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...205757502024-08-21 8:17:47156 days ago1724228267IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0000722.96908939
Set Approval For...205757492024-08-21 8:17:35156 days ago1724228255IN
0x6505Bc0D...168ffB6Bc
0 ETH0.000069942.88427022
Set Approval For...205755222024-08-21 7:31:59156 days ago1724225519IN
0x6505Bc0D...168ffB6Bc
0 ETH0.000021320.88147164
Set Approval For...205755202024-08-21 7:31:35156 days ago1724225495IN
0x6505Bc0D...168ffB6Bc
0 ETH0.000022220.91950889
Set Approval For...191349462024-02-01 17:04:11357 days ago1706807051IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0009822940.64444168
Approve188937632023-12-29 21:00:35391 days ago1703883635IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0009372718.53232604
Transfer From175935122023-06-30 17:15:35573 days ago1688145335IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0009073341.2427117
Transfer From170139272023-04-09 23:20:59655 days ago1681082459IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0011259618.98159852
Set Approval For...170139132023-04-09 23:18:11655 days ago1681082291IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0008785719.03162741
Set Approval For...170047992023-04-08 16:16:47656 days ago1680970607IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0008935119.39046998
Set Approval For...167130972023-02-26 14:47:35697 days ago1677422855IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0010701223.22326377
Set Approval For...165211712023-01-30 17:35:47724 days ago1675100147IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0007977317.31203706
Set Approval For...164103762023-01-15 6:20:35740 days ago1673763635IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0006672114.47948837
Transfer From164071302023-01-14 19:27:11740 days ago1673724431IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0004037516.1502128
Transfer From164071262023-01-14 19:26:23740 days ago1673724383IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0005097317.57719121
Approve161856892022-12-14 21:41:35771 days ago1671054095IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0011572422.88185071
Set Approval For...160991662022-12-02 19:18:59783 days ago1670008739IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0005071411
Set Approval For...160750552022-11-29 10:29:11786 days ago1669717751IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0005532412
Set Approval For...160474742022-11-25 14:03:11790 days ago1669384991IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0009229520.0190639
Set Approval For...160269562022-11-22 17:12:47793 days ago1669137167IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0008008217.37901651
Set Approval For...159788432022-11-15 23:54:47800 days ago1668556487IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0007887917.11792301
Set Approval For...159788432022-11-15 23:54:47800 days ago1668556487IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0007902317.11792301
Set Approval For...159788422022-11-15 23:54:35800 days ago1668556475IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0008558818.56420387
Set Approval For...159666992022-11-14 7:11:35802 days ago1668409895IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0008143417.66325881
Set Approval For...159125382022-11-06 17:41:59809 days ago1667756519IN
0x6505Bc0D...168ffB6Bc
0 ETH0.0006648414.4280302
View all transactions

Latest 13 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
154993702022-09-08 23:12:41868 days ago1662678761
0x6505Bc0D...168ffB6Bc
4.85 ETH
154991362022-09-08 22:17:49868 days ago1662675469
0x6505Bc0D...168ffB6Bc
4.85 ETH
154988642022-09-08 21:13:26868 days ago1662671606
0x6505Bc0D...168ffB6Bc
4.85 ETH
154811952022-09-06 1:31:43871 days ago1662427903
0x6505Bc0D...168ffB6Bc
4.85 ETH
154795702022-09-05 19:11:09871 days ago1662405069
0x6505Bc0D...168ffB6Bc
4.85 ETH
154601552022-09-02 16:17:09874 days ago1662135429
0x6505Bc0D...168ffB6Bc
4.85 ETH
154601512022-09-02 16:16:20874 days ago1662135380
0x6505Bc0D...168ffB6Bc
4.85 ETH
154598702022-09-02 15:11:35874 days ago1662131495
0x6505Bc0D...168ffB6Bc
4.85 ETH
154590692022-09-02 12:07:00874 days ago1662120420
0x6505Bc0D...168ffB6Bc
4.85 ETH
154590472022-09-02 12:01:04874 days ago1662120064
0x6505Bc0D...168ffB6Bc
4.85 ETH
154590372022-09-02 11:57:42874 days ago1662119862
0x6505Bc0D...168ffB6Bc
4.85 ETH
154590302022-09-02 11:55:47874 days ago1662119747
0x6505Bc0D...168ffB6Bc
4.85 ETH
154478542022-08-31 17:11:06876 days ago1661965866
0x6505Bc0D...168ffB6Bc
4.85 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FACES_OF_REKT_CONTRACT

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

//By interacting with this contract, you agree to our terms and conditions. Please check our website for the latest version.

// SPDX-License-Identifier: UNLICENSED
/*  ______    ___    ______    ______   _____          ____     ______           ____     ______    __ __  ______
   / ____/   /   |  / ____/   / ____/  / ___/         / __ \   / ____/          / __ \   / ____/   / //_/ /_  __/
  / /_      / /| | / /       / __/     \__ \         / / / /  / /_             / /_/ /  / __/     / ,<     / /
 / __/     / ___ |/ /___    / /___    ___/ /        / /_/ /  / __/            / _, _/  / /___    / /| |   / /
/_/       /_/  |_|\____/   /_____/   /____/         \____/  /_/              /_/ |_|  /_____/   /_/ |_|  /_/
                                                                                                                 */


/*
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOO,,,,,,,,,,,,O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOO,,,,,,,,,,,,OOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,°OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOIFOOOOROOOOOOOOOOELSEOOOOOOOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOOOOOOOOOOOE###OOOOOOWHILEOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOOOO#####OOOOOOOOOOOOOO##OOOOOOOOOOOOOOOOO°],,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOFOROOOOOOOOOOOOOOOOOOOOOEE#OOOOO]°°]OOOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOOOO]°.....°(OOOOOOOOO.°...........,O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O]°O.........°OOOOOOO].............]OOOOO°..O,,,,,,,,,,,,,°°°,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O...........OO°........°..........°.....°OO.O,,,,,,,,°°°°°°°°°°°,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O..............OOO}}°..............OO°}},...O,,,,,,,,,}}°°}}]°}}],,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O....E........OOOOOO}}............COODE}}]..O,,,,,,,,,}}}}]°°°°°°°°,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.............,COOODE]............,COODE}}.°O,,,,,,,,,,}}°}}°°°°°°°°,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O....°,........COOODE].............COODE}}.O,,,,,,,,,,,,,}}]°°°°°°°°,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.....O........COOODE].............COODE]°.O,,,,,,,,,,,,]°]°°°°°°°°,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°,,,,O,...........COOODE].............COODE}}.O,,,,,,,,,,,}}°°°°}}],,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O,..}}].............COOODE].............COODE}}.O,,,,,,,,,,,,]°],,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O..°°}}.............COOODE].............COODE}}.O,,,,,,,,,,,]°°,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O..°°°°°............COOODE].............COODE]°..O,,,,,,,,,,}}°°°°°°°°,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O....°°°...........COOOODE]............COODE}}..O,,,,,,,,,,,}}]°°°°°°°,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OO...O...........COOODE}}.°.°......O.COODE}}].°O,,,,,,,,,,,,°]°°°°°°°,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.................°°....°OOOOO°......°°°..O,,,,,,°]°°°°]°°°°°°,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.......................................°O,,,,,],,}}}}°,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.................    OOO.  .OOOOOO°....O,,O°°°°°°°°°O,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°...........,   ,° ,°,,,°°OOOOOE}}}}COOODE#COOOOODE##O,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°.......°..OOOOE...................COOODE°°°°°°°°###O,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°°.....°O°....................°O,,,,,,O#°°°°°°°###O,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°°°°°°°°°°°°O,,,,,,,,,,,,,,,,,COOOODE,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°°°°°°°°°°°°O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OO#O]°°..°...]..°OO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OE###OOOO.......°...OO#EO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOO##O####O    °OO.....OO.O###E°,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOO############O######O        O.    O####O######OOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,OE###############OO########O    #OO###EOO O###OOO###########EE°,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,O###################O#########OOO.  O####O  O#####O##############O,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,O#####################O#########O    O####O   O####O###############O,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,O###############################O#E.#######O OO#####################O,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,O################################O##########OO#O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,O#################################O#####OOOO####O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,O#################################O#######O#####O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,O##################################O#(#####O#####O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,O################O#################O((##,##O#####O#############O########O,,,,,,,,,,,,,,,,,,,,,,,,
 */
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
// -------------------------------------------- ERC 721A n Stuff, just removed the comments, didn't edit anything this time ------------------

pragma solidity ^0.8.0;

library MerkleProof {

    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }
    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;
    }
    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;
    }
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {

        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;

        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 processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {

        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;


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

        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;

        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) {

        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

pragma solidity ^0.8.0;
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

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

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

pragma solidity ^0.8.0;

library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {

        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.1;

library Address {

    function isContract(address account) internal view returns (bool) {

        return account.code.length > 0;
    }


    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");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    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");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

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

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {

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

pragma solidity ^0.8.4;

interface IERC721A {

    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error ApproveToCaller();
    error BalanceQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerQueryForNonexistentToken();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error URIQueryForNonexistentToken();
    error MintERC2309QuantityExceedsLimit();
    error OwnershipNotInitializedForExtraData();


    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
        bool burned;
        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

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

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

    function tokenURI(uint256 tokenId) external view returns (string memory);

    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

pragma solidity ^0.8.4;

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {
    struct TokenApprovalRef {
        address value;
    }


    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    uint256 private constant _BITPOS_AUX = 192;

    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    uint256 private constant _BITMASK_BURNED = 1 << 224;

    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
    0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;


    uint256 private _currentIndex;

    uint256 private _burnCounter;

    string private _name;

    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;


    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }


    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function totalSupply() public view virtual override returns (uint256) {
    unchecked {
        return _currentIndex - _burnCounter - _startTokenId();
    }
    }

    function __burn_non_minted_token(uint16 amount) internal virtual {
        _currentIndex += amount;
    }

    function _totalMinted() internal view virtual returns (uint256) {
    unchecked {
        return _currentIndex - _startTokenId();
    }
    }

    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }


    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }


    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
        interfaceId == 0x01ffc9a7 ||
        interfaceId == 0x80ac58cd ||
        interfaceId == 0x5b5e139f;
    }


    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }


    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

    unchecked {
        if (_startTokenId() <= curr)
            if (curr < _currentIndex) {
                uint256 packed = _packedOwnerships[curr];
                if (packed & _BITMASK_BURNED == 0) {
                    while (packed == 0) {
                        packed = _packedOwnerships[--curr];
                    }
                    return packed;
                }
            }
    }
        revert OwnerQueryForNonexistentToken();
    }

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        assembly {
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }


    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
        _startTokenId() <= tokenId &&
        tokenId < _currentIndex &&
        _packedOwnerships[tokenId] & _BITMASK_BURNED == 0;
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(uint256 tokenId)
    private
    view
    returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }


    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

    unchecked {
        --_packedAddressData[from];
        ++_packedAddressData[to];

        _packedOwnerships[tokenId] = _packOwnershipData(
            to,
            _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
        );

        if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
            uint256 nextTokenId = tokenId + 1;
            if (_packedOwnerships[nextTokenId] == 0) {
                if (nextTokenId != _currentIndex) {
                    _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                }
            }
        }
    }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }


    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    unchecked {
        _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

        _packedOwnerships[startTokenId] = _packOwnershipData(
            to,
            _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
        );

        uint256 toMasked;
        uint256 end = startTokenId + quantity;

        assembly {
            toMasked := and(to, _BITMASK_ADDRESS)
            log4(
            0,
            0,
            _TRANSFER_EVENT_SIGNATURE,
            0,
            toMasked,
            startTokenId
            )

            for {
                let tokenId := add(startTokenId, 1)
            } iszero(eq(tokenId, end)) {
                tokenId := add(tokenId, 1)
            } {
                log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
            }
        }
        if (toMasked == 0) revert MintToZeroAddress();

        _currentIndex = end;
    }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    unchecked {
        _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

        _packedOwnerships[startTokenId] = _packOwnershipData(
            to,
            _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
        );

        emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

        _currentIndex = startTokenId + quantity;
    }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

    unchecked {
        if (to.code.length != 0) {
            uint256 end = _currentIndex;
            uint256 index = end - quantity;
            do {
                if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
            } while (index < end);
            if (_currentIndex != end) revert();
        }
    }
    }

    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }


    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

    unchecked {
        _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

        _packedOwnerships[tokenId] = _packOwnershipData(
            from,
            (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
        );

        if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
            uint256 nextTokenId = tokenId + 1;
            if (_packedOwnerships[nextTokenId] == 0) {
                if (nextTokenId != _currentIndex) {
                    _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                }
            }
        }
    }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

    unchecked {
        _burnCounter++;
    }
    }


    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }


    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            str := add(mload(0x40), 0x80)
            mstore(0x40, str)

            let end := str

            for { let temp := value } 1 {} {
                str := sub(str, 1)
                mstore8(str, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            str := sub(str, 0x20)
            mstore(str, length)
        }
    }
}


// -------------------------------------------- ERC 721A n Stuff, just removed the comments, didn't edit anything this time ------------------
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//

pragma solidity ^0.8.14;

contract FACES_OF_REKT_CONTRACT is ERC721A, Ownable {

    using ECDSA for bytes32;

    string public _baseURIextended = "ipfs://QmPNh2m595pWnxRbSUSXxnTL91KHLQv1TQEgG8H4HUdDfR/"; // This one is used on OpenSea to define the metadata IPFS address

    bool public mint_paused = true; // in case someone tries to rekt our mint we can pause at will

    bool public whitelist_mint = true;

    struct token  {
        uint256 experience;
        bool is_staked;
        uint256 stake_date;
    }

    mapping(uint256 => token) public token_struct;

    mapping(uint8 => bytes32) public whiteListMapping;

    uint256 capMultiplier = 1;

    address public interacter_address;

    address public can_contract_address = 0x01E690c5D3cc89cea84F2a3C2CcB38410Ce2992D;

    address public multi_sig_wallet = 0x1eD3486C2Abe166cC10a57F54fA9E4D41F87dea4;

    uint public wl_mint_price = 0.05 ether;

    uint public public_mint_price = 0.08  ether;

    mapping(address => uint8) private free_mint_already_minted ;

    constructor() ERC721A("Faces of Rekt", "FoR") {
        whiteListMapping[0] = 0xa6ed8e5f435cf2dee09434b2fc9bd6cf7bba099d9af57bfdb60803d8d8818294;
        whiteListMapping[1] = 0x32a9ce9fccbe0bf6a0e0b5fd4147e3690c7be43f9b95d848a2d6c15b34015c1a;
    }

    function set_Base_URI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    function set_Can_Address(address canContract) external onlyOwner() {
        can_contract_address = canContract;
    }

    function switch_Mint_State() external onlyOwner() {

        mint_paused = !mint_paused;

    }

    function switch_Whitelist_Mint_State() external onlyOwner() {

        whitelist_mint = !whitelist_mint;

    }

    function burn(uint16 amount) external onlyOwner() {

        __burn_non_minted_token(amount);

    }

    function _baseURI() internal view virtual override returns (string memory) {

        return _baseURIextended;

    }

    function set_Whitelist_MerkleRoot(bytes32 newMerkleRoot_, uint8 _id) external onlyOwner {

        whiteListMapping[_id] = newMerkleRoot_;

    }


    function bulk_give_Exp (uint256 xp_amount, uint16[]memory id_array) external {

        require(msg.sender == interacter_address || msg.sender == owner(), "Not an interacter");

        for (uint index = 0; index < id_array.length; index++) {

            token_struct[id_array[index]].experience += xp_amount;

        }

    }

    function giveExp (uint16 tokenId, uint256 xp_amount) external {

        require(msg.sender == interacter_address || msg.sender == owner(), "Not an interacter");
        token_struct[tokenId].experience += xp_amount;

    }

    function setMarketCapMultiplier (bytes32[] memory proof, uint256 _capMultiplier) external {

        require(MerkleProof.verify(
            proof,
            whiteListMapping[2],
            keccak256(abi.encodePacked(msg.sender))) || msg.sender == owner(), "Not whitelisted");

        capMultiplier = _capMultiplier;
    }

    function M_I_N_T(bytes32[] memory proof, uint16 quantity) public payable {


        require((totalSupply() + quantity) < 10000, "Sold out");

        if (whitelist_mint) {

            require(msg.value == (wl_mint_price * quantity));

            require(MerkleProof.verify(
                    proof,
                    whiteListMapping[0],
                    keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");

            Can_contract spray_can = Can_contract(can_contract_address);

            if(quantity + _numberMinted(msg.sender) > 2) {
                require(
                    spray_can.balanceOf(msg.sender)
                    >= quantity + _numberMinted(msg.sender),
                    "Can't mint more faces than canz");
            }

        } else {
            require(msg.value == (public_mint_price * quantity));
        }

        require(!mint_paused, ">MINT PAUSED< If you're getting this message, shit went down. >MINT PAUSED<");



        _safeMint(msg.sender, quantity);

    }

    function getExpBonus(uint16 tokenId) external { // this is used in order to "save" the bonus exp you got from any of ours events

        require(ownerOf(tokenId) == msg.sender, "You're not the owner of this token"); // ofc you can only grab that for your tokens

        token_struct[tokenId].experience += (block.timestamp - token_struct[tokenId].stake_date) * capMultiplier; // today minus stake date times multiplier
        token_struct[tokenId].stake_date = block.timestamp; // and today is your new stake date
        // so basically what we did was multiplying the amount of time you've already staked by our event multiplier, and then set today as the new stake date.

    }

    function switch_stake(uint16 tokenId) external { // switchs between staked and not staked.

        require(ownerOf(tokenId) == msg.sender, "You're not the owner of this token"); // of course you can't unstake or stake someone else's token right?

        token_struct[tokenId].is_staked ? // the token is staked?

        token_struct[tokenId].experience += (block.timestamp - token_struct[tokenId].stake_date) : // yes? then give exp

        token_struct[tokenId].stake_date = block.timestamp; // no? then start staking date

        token_struct[tokenId].is_staked = !token_struct[tokenId].is_staked; // either way its now the oposite.

    }

    function check_Xp_Owned(uint16 tokenId)public view returns (uint256) { // at any time, us or any of you, can check how much xp a token has

        return token_struct[tokenId].is_staked ? // is staked

        (block.timestamp - token_struct[tokenId].stake_date + token_struct[tokenId].experience) : // if it is, calcs the time staked, plus the experience saved.

        token_struct[tokenId].experience; // else just return the experience saved.

    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override {

        require(!token_struct[startTokenId].is_staked, "Staked transfer"); // this is to prevent sale while staking
        // the problem with this is that people can still list their token on open sea or rarible etc... but only who buys gets the error.
        // you also get the error trying to do a free transfer.
    }

    function withdraw() external onlyOwner {            // only the owner can withdraw
        address payable to = payable(multi_sig_wallet); // goes direct to the multi_sig_wallet
        to.transfer(address(this).balance);             // to is the gnosis wallet, address(this) is the contract.


    }

    function dev_mint(uint16 quantity) external onlyOwner { // dev mint for airdrops and free mints
        require((totalSupply() + quantity) < 10000, "Sold out");
        _safeMint(msg.sender, quantity);
    }

    function free_M_I_N_T(bytes32[] memory proof) public {


        require(totalSupply() + 1 < 10000, "sold out");
        require(MerkleProof.verify(
                proof,
                whiteListMapping[1],
                keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");
        require(free_mint_already_minted[msg.sender] < 1, "Only one free mint please");
        require(!mint_paused, ">MINT PAUSED< If you're getting this message, shit went down. >MINT PAUSED<");

        _safeMint(msg.sender, 1);
        free_mint_already_minted[msg.sender] += 1;

    }

}

pragma solidity 0.8.14;

interface Can_contract {

    function balanceOf(address owner) external view returns (uint256 balance);

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"M_I_N_T","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"xp_amount","type":"uint256"},{"internalType":"uint16[]","name":"id_array","type":"uint16[]"}],"name":"bulk_give_Exp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"can_contract_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"check_Xp_Owned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"dev_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"free_M_I_N_T","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"getExpBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"uint256","name":"xp_amount","type":"uint256"}],"name":"giveExp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interacter_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multi_sig_wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"_capMultiplier","type":"uint256"}],"name":"setMarketCapMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"set_Base_URI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canContract","type":"address"}],"name":"set_Can_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot_","type":"bytes32"},{"internalType":"uint8","name":"_id","type":"uint8"}],"name":"set_Whitelist_MerkleRoot","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":"switch_Mint_State","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switch_Whitelist_Mint_State","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"switch_stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"","type":"uint256"}],"name":"token_struct","outputs":[{"internalType":"uint256","name":"experience","type":"uint256"},{"internalType":"bool","name":"is_staked","type":"bool"},{"internalType":"uint256","name":"stake_date","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"whiteListMapping","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelist_mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wl_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60e06040526036608081815290620029f360a039805162000029916009916020909101906200020d565b50600a805461010161ffff199091161790556001600d55600f80546001600160a01b03199081167301e690c5d3cc89cea84f2a3c2ccb38410ce2992d1790915560108054909116731ed3486c2abe166cc10a57f54fa9e4d41f87dea417905566b1a2bc2ec5000060115567011c37937e080000601255348015620000ac57600080fd5b50604080518082018252600d81526c119858d95cc81bd98814995add609a1b6020808301918252835180850190945260038452622337a960e91b908401528151919291620000fd916002916200020d565b508051620001139060039060208401906200020d565b505060008055506200012533620001bb565b600c6020527fa6ed8e5f435cf2dee09434b2fc9bd6cf7bba099d9af57bfdb60803d8d88182947f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e85560016000527f32a9ce9fccbe0bf6a0e0b5fd4147e3690c7be43f9b95d848a2d6c15b34015c1a7fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c55620002ef565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200021b90620002b3565b90600052602060002090601f0160209004810192826200023f57600085556200028a565b82601f106200025a57805160ff19168380011785556200028a565b828001600101855582156200028a579182015b828111156200028a5782518255916020019190600101906200026d565b50620002989291506200029c565b5090565b5b808211156200029857600081556001016200029d565b600181811c90821680620002c857607f821691505b602082108103620002e957634e487b7160e01b600052602260045260246000fd5b50919050565b6126f480620002ff6000396000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063c87b56dd116100b6578063eee9a0951161007a578063eee9a0951461070c578063ef1f0ac01461071f578063ef25581e1461073f578063f1afc7731461075f578063f2fde38b146107b9578063ff8f1357146107d957600080fd5b8063c87b56dd1461064d578063cbf94a3d1461066d578063dd9acb491461068d578063e985e9c5146106a3578063ed133f8c146106ec57600080fd5b806395d89b411161010857806395d89b41146105a9578063a22cb465146105be578063aa59a2b2146105de578063b88d4fde146105f3578063c52e712114610613578063c7d272281461063357600080fd5b8063715018a61461052157806377714257146105365780637c5f39c11461055657806381ca52ad146105765780638da5cb5b1461058b57600080fd5b806323b872dd116101dd57806346f0d131116101a157806346f0d131146104555780634b89e00414610475578063536f502e146104a257806356ab561c146104c25780636352211e146104e157806370a082311461050157600080fd5b806323b872dd146103c0578063251a95c3146103e05780633b8b8a0b146104005780633ccfd60b1461042057806342842e0e1461043557600080fd5b8063095ea7b311610224578063095ea7b31461032557806318160ddd1461034757806319ac6f691461036a5780631c4df70e1461038a57806322096008146103a057600080fd5b806301ffc9a71461026157806305c888ff1461029657806306fdde03146102ce578063081812fc146102f05780630928fc2214610310575b600080fd5b34801561026d57600080fd5b5061028161027c366004611e7e565b6107f9565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b50600e546102b6906001600160a01b031681565b6040516001600160a01b03909116815260200161028d565b3480156102da57600080fd5b506102e361084b565b60405161028d9190611ef3565b3480156102fc57600080fd5b506102b661030b366004611f06565b6108dd565b34801561031c57600080fd5b506102e3610921565b34801561033157600080fd5b50610345610340366004611f3b565b6109af565b005b34801561035357600080fd5b50600154600054035b60405190815260200161028d565b34801561037657600080fd5b50610345610385366004611f77565b610a4f565b34801561039657600080fd5b5061035c60115481565b3480156103ac57600080fd5b506010546102b6906001600160a01b031681565b3480156103cc57600080fd5b506103456103db366004611f92565b610a8e565b3480156103ec57600080fd5b506103456103fb366004612039565b610c33565b34801561040c57600080fd5b5061034561041b36600461213a565b610d02565b34801561042c57600080fd5b50610345610d43565b34801561044157600080fd5b50610345610450366004611f92565b610da8565b34801561046157600080fd5b50610345610470366004612183565b610dc3565b34801561048157600080fd5b5061035c6104903660046121af565b600c6020526000908152604090205481565b3480156104ae57600080fd5b5061035c6104bd366004611f77565b610e0f565b3480156104ce57600080fd5b50600a5461028190610100900460ff1681565b3480156104ed57600080fd5b506102b66104fc366004611f06565b610e75565b34801561050d57600080fd5b5061035c61051c366004612183565b610e80565b34801561052d57600080fd5b50610345610ecf565b34801561054257600080fd5b50610345610551366004612230565b610f05565b34801561056257600080fd5b50610345610571366004611f77565b6110b0565b34801561058257600080fd5b5061034561113f565b34801561059757600080fd5b506008546001600160a01b03166102b6565b3480156105b557600080fd5b506102e361117d565b3480156105ca57600080fd5b506103456105d9366004612265565b61118c565b3480156105ea57600080fd5b50610345611221565b3480156105ff57600080fd5b5061034561060e3660046122a1565b611268565b34801561061f57600080fd5b5061034561062e36600461231d565b6112b2565b34801561063f57600080fd5b50600a546102819060ff1681565b34801561065957600080fd5b506102e3610668366004611f06565b6112f0565b34801561067957600080fd5b50610345610688366004611f77565b611374565b34801561069957600080fd5b5061035c60125481565b3480156106af57600080fd5b506102816106be366004612349565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106f857600080fd5b50610345610707366004612373565b611419565b61034561071a36600461238f565b6114a8565b34801561072b57600080fd5b5061034561073a3660046123d4565b611720565b34801561074b57600080fd5b50600f546102b6906001600160a01b031681565b34801561076b57600080fd5b5061079e61077a366004611f06565b600b60205260009081526040902080546001820154600290920154909160ff169083565b6040805193845291151560208401529082015260600161028d565b3480156107c557600080fd5b506103456107d4366004612183565b6117ac565b3480156107e557600080fd5b506103456107f4366004611f77565b611844565b60006301ffc9a760e01b6001600160e01b03198316148061082a57506380ac58cd60e01b6001600160e01b03198316145b806108455750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461085a90612419565b80601f016020809104026020016040519081016040528092919081815260200182805461088690612419565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e88261192a565b610905576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6009805461092e90612419565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90612419565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b505050505081565b60006109ba82610e75565b9050336001600160a01b038216146109f3576109d681336106be565b6109f3576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990612453565b60405180910390fd5b610a8b81611951565b50565b6000610a998261196e565b9050836001600160a01b0316816001600160a01b031614610acc5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610b1957610afc86336106be565b610b1957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b4057604051633a954ecd60e21b815260040160405180910390fd5b610b4d86868660016119d5565b8015610b5857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610bea57600184016000818152600460205260408120549003610be8576000548114610be85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600e546001600160a01b0316331480610c5657506008546001600160a01b031633145b610c965760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba32b960791b6044820152606401610a79565b60005b8151811015610cfd5782600b6000848481518110610cb957610cb9612488565b602002602001015161ffff1681526020019081526020016000206000016000828254610ce591906124b4565b90915550819050610cf5816124cc565b915050610c99565b505050565b6008546001600160a01b03163314610d2c5760405162461bcd60e51b8152600401610a7990612453565b8051610d3f906009906020840190611dcf565b5050565b6008546001600160a01b03163314610d6d5760405162461bcd60e51b8152600401610a7990612453565b6010546040516001600160a01b039091169081904780156108fc02916000818181858888f19350505050158015610d3f573d6000803e3d6000fd5b610cfd83838360405180602001604052806000815250611268565b6008546001600160a01b03163314610ded5760405162461bcd60e51b8152600401610a7990612453565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61ffff81166000908152600b602052604081206001015460ff16610e465761ffff82166000908152600b6020526040902054610845565b61ffff82166000908152600b602052604090208054600290910154610e6b90426124e5565b61084591906124b4565b60006108458261196e565b60006001600160a01b038216610ea9576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610a7990612453565b610f036000611a29565b565b612710610f156001546000540390565b610f209060016124b4565b10610f585760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610a79565b6001600052600c60209081527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c546040516001600160601b03193360601b1692810192909252610fc4918391906034015b60405160208183030381529060405280519060200120611a7b565b610fe05760405162461bcd60e51b8152600401610a79906124fc565b33600090815260136020526040902054600160ff909116106110445760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f6e652066726565206d696e7420706c65617365000000000000006044820152606401610a79565b600a5460ff16156110675760405162461bcd60e51b8152600401610a7990612525565b611072336001611a91565b33600090815260136020526040812080546001929061109590849060ff16612596565b92506101000a81548160ff021916908360ff16021790555050565b6008546001600160a01b031633146110da5760405162461bcd60e51b8152600401610a7990612453565b6127108161ffff166110ef6001546000540390565b6110f991906124b4565b106111315760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610a79565b610a8b338261ffff16611a91565b6008546001600160a01b031633146111695760405162461bcd60e51b8152600401610a7990612453565b600a805460ff19811660ff90911615179055565b60606003805461085a90612419565b336001600160a01b038316036111b55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610a7990612453565b600a805461ff001981166101009182900460ff1615909102179055565b611273848484610a8e565b6001600160a01b0383163b156112ac5761128f84848484611aab565b6112ac576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146112dc5760405162461bcd60e51b8152600401610a7990612453565b60ff166000908152600c6020526040902055565b60606112fb8261192a565b61131857604051630a14c4b560e41b815260040160405180910390fd5b6000611322611b97565b90508051600003611342576040518060200160405280600081525061136d565b8061134c84611ba6565b60405160200161135d9291906125bb565b6040516020818303038152906040525b9392505050565b3361138261ffff8316610e75565b6001600160a01b0316146113a85760405162461bcd60e51b8152600401610a79906125ea565b600d5461ffff82166000908152600b60205260409020600201546113cc90426124e5565b6113d6919061262c565b61ffff82166000908152600b6020526040812080549091906113f99084906124b4565b909155505061ffff166000908152600b6020526040902042600290910155565b600e546001600160a01b031633148061143c57506008546001600160a01b031633145b61147c5760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba32b960791b6044820152606401610a79565b61ffff82166000908152600b60205260408120805483929061149f9084906124b4565b90915550505050565b6127108161ffff166114bd6001546000540390565b6114c791906124b4565b106114ff5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610a79565b600a54610100900460ff16156116d2578061ffff16601154611521919061262c565b341461152c57600080fd5b60008052600c60209081527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e8546040516001600160601b03193360601b169281019290925261158091849190603401610fa9565b61159c5760405162461bcd60e51b8152600401610a79906124fc565b600f546001600160a01b031660026115d7336001600160a01b03166000908152600560205260409081902054901c67ffffffffffffffff1690565b6115e59061ffff85166124b4565b11156116cc57336000908152600560205260409081902054611616911c67ffffffffffffffff1661ffff84166124b4565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561165a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167e919061264b565b10156116cc5760405162461bcd60e51b815260206004820152601f60248201527f43616e2774206d696e74206d6f7265206661636573207468616e2063616e7a006044820152606401610a79565b506116ef565b8061ffff166012546116e4919061262c565b34146116ef57600080fd5b600a5460ff16156117125760405162461bcd60e51b8152600401610a7990612525565b610d3f338261ffff16611a91565b6002600052600c60209081527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720546040516001600160601b03193360601b169281019290925261177591849190603401610fa9565b8061178a57506008546001600160a01b031633145b6117a65760405162461bcd60e51b8152600401610a79906124fc565b600d5550565b6008546001600160a01b031633146117d65760405162461bcd60e51b8152600401610a7990612453565b6001600160a01b03811661183b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a79565b610a8b81611a29565b3361185261ffff8316610e75565b6001600160a01b0316146118785760405162461bcd60e51b8152600401610a79906125ea565b61ffff81166000908152600b602052604090206001015460ff166118b75761ffff81166000908152600b60205260409020426002909101819055611902565b61ffff81166000908152600b60205260409020600201546118d890426124e5565b61ffff82166000908152600b6020526040812080549091906118fb9084906124b4565b9250508190555b5061ffff166000908152600b60205260409020600101805460ff19811660ff90911615179055565b6000805482108015610845575050600090815260046020526040902054600160e01b161590565b8061ffff1660008082825461196691906124b4565b909155505050565b6000816000548110156119bc5760008181526004602052604081205490600160e01b821690036119ba575b8060000361136d575060001901600081815260046020526040902054611999565b505b604051636f96cda160e11b815260040160405180910390fd5b6000828152600b602052604090206001015460ff16156112ac5760405162461bcd60e51b815260206004820152600f60248201526e29ba30b5b2b2103a3930b739b332b960891b6044820152606401610a79565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611a888584611bde565b14949350505050565b610d3f828260405180602001604052806000815250611c2b565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611ae0903390899088908890600401612664565b6020604051808303816000875af1925050508015611b1b575060408051601f3d908101601f19168201909252611b18918101906126a1565b60015b611b79573d808015611b49576040519150601f19603f3d011682016040523d82523d6000602084013e611b4e565b606091505b508051600003611b71576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461085a90612419565b604080516080019081905280825b600183039250600a81066030018353600a900480611bb45750819003601f19909101908152919050565b600081815b8451811015611c2357611c0f82868381518110611c0257611c02612488565b6020026020010151611c98565b915080611c1b816124cc565b915050611be3565b509392505050565b611c358383611cc4565b6001600160a01b0383163b15610cfd576000548281035b611c5f6000868380600101945086611aab565b611c7c576040516368d2bf6b60e11b815260040160405180910390fd5b818110611c4c578160005414611c9157600080fd5b5050505050565b6000818310611cb457600082815260208490526040902061136d565b5060009182526020526040902090565b6000805490829003611ce95760405163b562e8dd60e01b815260040160405180910390fd5b611cf660008483856119d5565b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611da557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611d6d565b5081600003611dc657604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054611ddb90612419565b90600052602060002090601f016020900481019282611dfd5760008555611e43565b82601f10611e1657805160ff1916838001178555611e43565b82800160010185558215611e43579182015b82811115611e43578251825591602001919060010190611e28565b50611e4f929150611e53565b5090565b5b80821115611e4f5760008155600101611e54565b6001600160e01b031981168114610a8b57600080fd5b600060208284031215611e9057600080fd5b813561136d81611e68565b60005b83811015611eb6578181015183820152602001611e9e565b838111156112ac5750506000910152565b60008151808452611edf816020860160208601611e9b565b601f01601f19169290920160200192915050565b60208152600061136d6020830184611ec7565b600060208284031215611f1857600080fd5b5035919050565b80356001600160a01b0381168114611f3657600080fd5b919050565b60008060408385031215611f4e57600080fd5b611f5783611f1f565b946020939093013593505050565b803561ffff81168114611f3657600080fd5b600060208284031215611f8957600080fd5b61136d82611f65565b600080600060608486031215611fa757600080fd5b611fb084611f1f565b9250611fbe60208501611f1f565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561200d5761200d611fce565b604052919050565b600067ffffffffffffffff82111561202f5761202f611fce565b5060051b60200190565b6000806040838503121561204c57600080fd5b8235915060208084013567ffffffffffffffff81111561206b57600080fd5b8401601f8101861361207c57600080fd5b803561208f61208a82612015565b611fe4565b81815260059190911b820183019083810190888311156120ae57600080fd5b928401925b828410156120d3576120c484611f65565b825292840192908401906120b3565b80955050505050509250929050565b600067ffffffffffffffff8311156120fc576120fc611fce565b61210f601f8401601f1916602001611fe4565b905082815283838301111561212357600080fd5b828260208301376000602084830101529392505050565b60006020828403121561214c57600080fd5b813567ffffffffffffffff81111561216357600080fd5b8201601f8101841361217457600080fd5b611b8f848235602084016120e2565b60006020828403121561219557600080fd5b61136d82611f1f565b803560ff81168114611f3657600080fd5b6000602082840312156121c157600080fd5b61136d8261219e565b600082601f8301126121db57600080fd5b813560206121eb61208a83612015565b82815260059290921b8401810191818101908684111561220a57600080fd5b8286015b84811015612225578035835291830191830161220e565b509695505050505050565b60006020828403121561224257600080fd5b813567ffffffffffffffff81111561225957600080fd5b611b8f848285016121ca565b6000806040838503121561227857600080fd5b61228183611f1f565b91506020830135801515811461229657600080fd5b809150509250929050565b600080600080608085870312156122b757600080fd5b6122c085611f1f565b93506122ce60208601611f1f565b925060408501359150606085013567ffffffffffffffff8111156122f157600080fd5b8501601f8101871361230257600080fd5b612311878235602084016120e2565b91505092959194509250565b6000806040838503121561233057600080fd5b823591506123406020840161219e565b90509250929050565b6000806040838503121561235c57600080fd5b61236583611f1f565b915061234060208401611f1f565b6000806040838503121561238657600080fd5b611f5783611f65565b600080604083850312156123a257600080fd5b823567ffffffffffffffff8111156123b957600080fd5b6123c5858286016121ca565b92505061234060208401611f65565b600080604083850312156123e757600080fd5b823567ffffffffffffffff8111156123fe57600080fd5b61240a858286016121ca565b95602094909401359450505050565b600181811c9082168061242d57607f821691505b60208210810361244d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156124c7576124c761249e565b500190565b6000600182016124de576124de61249e565b5060010190565b6000828210156124f7576124f761249e565b500390565b6020808252600f908201526e139bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252604b908201527f3e4d494e54205041555345443c20496620796f752772652067657474696e672060408201527f74686973206d6573736167652c20736869742077656e7420646f776e2e203e4d60608201526a1253950814105554d1510f60aa1b608082015260a00190565b600060ff821660ff84168060ff038211156125b3576125b361249e565b019392505050565b600083516125cd818460208801611e9b565b8351908301906125e1818360208801611e9b565b01949350505050565b60208082526022908201527f596f75277265206e6f7420746865206f776e6572206f66207468697320746f6b60408201526132b760f11b606082015260800190565b60008160001904831182151516156126465761264661249e565b500290565b60006020828403121561265d57600080fd5b5051919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061269790830184611ec7565b9695505050505050565b6000602082840312156126b357600080fd5b815161136d81611e6856fea264697066735822122082f72e2d4858567ef0eb04f220552aa493c3b3369020674b03527266baca0d3b64736f6c634300080e0033697066733a2f2f516d504e68326d35393570576e78526253555358786e544c39314b484c51763154514567473848344855644466522f

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063c87b56dd116100b6578063eee9a0951161007a578063eee9a0951461070c578063ef1f0ac01461071f578063ef25581e1461073f578063f1afc7731461075f578063f2fde38b146107b9578063ff8f1357146107d957600080fd5b8063c87b56dd1461064d578063cbf94a3d1461066d578063dd9acb491461068d578063e985e9c5146106a3578063ed133f8c146106ec57600080fd5b806395d89b411161010857806395d89b41146105a9578063a22cb465146105be578063aa59a2b2146105de578063b88d4fde146105f3578063c52e712114610613578063c7d272281461063357600080fd5b8063715018a61461052157806377714257146105365780637c5f39c11461055657806381ca52ad146105765780638da5cb5b1461058b57600080fd5b806323b872dd116101dd57806346f0d131116101a157806346f0d131146104555780634b89e00414610475578063536f502e146104a257806356ab561c146104c25780636352211e146104e157806370a082311461050157600080fd5b806323b872dd146103c0578063251a95c3146103e05780633b8b8a0b146104005780633ccfd60b1461042057806342842e0e1461043557600080fd5b8063095ea7b311610224578063095ea7b31461032557806318160ddd1461034757806319ac6f691461036a5780631c4df70e1461038a57806322096008146103a057600080fd5b806301ffc9a71461026157806305c888ff1461029657806306fdde03146102ce578063081812fc146102f05780630928fc2214610310575b600080fd5b34801561026d57600080fd5b5061028161027c366004611e7e565b6107f9565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b50600e546102b6906001600160a01b031681565b6040516001600160a01b03909116815260200161028d565b3480156102da57600080fd5b506102e361084b565b60405161028d9190611ef3565b3480156102fc57600080fd5b506102b661030b366004611f06565b6108dd565b34801561031c57600080fd5b506102e3610921565b34801561033157600080fd5b50610345610340366004611f3b565b6109af565b005b34801561035357600080fd5b50600154600054035b60405190815260200161028d565b34801561037657600080fd5b50610345610385366004611f77565b610a4f565b34801561039657600080fd5b5061035c60115481565b3480156103ac57600080fd5b506010546102b6906001600160a01b031681565b3480156103cc57600080fd5b506103456103db366004611f92565b610a8e565b3480156103ec57600080fd5b506103456103fb366004612039565b610c33565b34801561040c57600080fd5b5061034561041b36600461213a565b610d02565b34801561042c57600080fd5b50610345610d43565b34801561044157600080fd5b50610345610450366004611f92565b610da8565b34801561046157600080fd5b50610345610470366004612183565b610dc3565b34801561048157600080fd5b5061035c6104903660046121af565b600c6020526000908152604090205481565b3480156104ae57600080fd5b5061035c6104bd366004611f77565b610e0f565b3480156104ce57600080fd5b50600a5461028190610100900460ff1681565b3480156104ed57600080fd5b506102b66104fc366004611f06565b610e75565b34801561050d57600080fd5b5061035c61051c366004612183565b610e80565b34801561052d57600080fd5b50610345610ecf565b34801561054257600080fd5b50610345610551366004612230565b610f05565b34801561056257600080fd5b50610345610571366004611f77565b6110b0565b34801561058257600080fd5b5061034561113f565b34801561059757600080fd5b506008546001600160a01b03166102b6565b3480156105b557600080fd5b506102e361117d565b3480156105ca57600080fd5b506103456105d9366004612265565b61118c565b3480156105ea57600080fd5b50610345611221565b3480156105ff57600080fd5b5061034561060e3660046122a1565b611268565b34801561061f57600080fd5b5061034561062e36600461231d565b6112b2565b34801561063f57600080fd5b50600a546102819060ff1681565b34801561065957600080fd5b506102e3610668366004611f06565b6112f0565b34801561067957600080fd5b50610345610688366004611f77565b611374565b34801561069957600080fd5b5061035c60125481565b3480156106af57600080fd5b506102816106be366004612349565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106f857600080fd5b50610345610707366004612373565b611419565b61034561071a36600461238f565b6114a8565b34801561072b57600080fd5b5061034561073a3660046123d4565b611720565b34801561074b57600080fd5b50600f546102b6906001600160a01b031681565b34801561076b57600080fd5b5061079e61077a366004611f06565b600b60205260009081526040902080546001820154600290920154909160ff169083565b6040805193845291151560208401529082015260600161028d565b3480156107c557600080fd5b506103456107d4366004612183565b6117ac565b3480156107e557600080fd5b506103456107f4366004611f77565b611844565b60006301ffc9a760e01b6001600160e01b03198316148061082a57506380ac58cd60e01b6001600160e01b03198316145b806108455750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461085a90612419565b80601f016020809104026020016040519081016040528092919081815260200182805461088690612419565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e88261192a565b610905576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6009805461092e90612419565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90612419565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b505050505081565b60006109ba82610e75565b9050336001600160a01b038216146109f3576109d681336106be565b6109f3576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990612453565b60405180910390fd5b610a8b81611951565b50565b6000610a998261196e565b9050836001600160a01b0316816001600160a01b031614610acc5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610b1957610afc86336106be565b610b1957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b4057604051633a954ecd60e21b815260040160405180910390fd5b610b4d86868660016119d5565b8015610b5857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610bea57600184016000818152600460205260408120549003610be8576000548114610be85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600e546001600160a01b0316331480610c5657506008546001600160a01b031633145b610c965760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba32b960791b6044820152606401610a79565b60005b8151811015610cfd5782600b6000848481518110610cb957610cb9612488565b602002602001015161ffff1681526020019081526020016000206000016000828254610ce591906124b4565b90915550819050610cf5816124cc565b915050610c99565b505050565b6008546001600160a01b03163314610d2c5760405162461bcd60e51b8152600401610a7990612453565b8051610d3f906009906020840190611dcf565b5050565b6008546001600160a01b03163314610d6d5760405162461bcd60e51b8152600401610a7990612453565b6010546040516001600160a01b039091169081904780156108fc02916000818181858888f19350505050158015610d3f573d6000803e3d6000fd5b610cfd83838360405180602001604052806000815250611268565b6008546001600160a01b03163314610ded5760405162461bcd60e51b8152600401610a7990612453565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61ffff81166000908152600b602052604081206001015460ff16610e465761ffff82166000908152600b6020526040902054610845565b61ffff82166000908152600b602052604090208054600290910154610e6b90426124e5565b61084591906124b4565b60006108458261196e565b60006001600160a01b038216610ea9576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610a7990612453565b610f036000611a29565b565b612710610f156001546000540390565b610f209060016124b4565b10610f585760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610a79565b6001600052600c60209081527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c546040516001600160601b03193360601b1692810192909252610fc4918391906034015b60405160208183030381529060405280519060200120611a7b565b610fe05760405162461bcd60e51b8152600401610a79906124fc565b33600090815260136020526040902054600160ff909116106110445760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f6e652066726565206d696e7420706c65617365000000000000006044820152606401610a79565b600a5460ff16156110675760405162461bcd60e51b8152600401610a7990612525565b611072336001611a91565b33600090815260136020526040812080546001929061109590849060ff16612596565b92506101000a81548160ff021916908360ff16021790555050565b6008546001600160a01b031633146110da5760405162461bcd60e51b8152600401610a7990612453565b6127108161ffff166110ef6001546000540390565b6110f991906124b4565b106111315760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610a79565b610a8b338261ffff16611a91565b6008546001600160a01b031633146111695760405162461bcd60e51b8152600401610a7990612453565b600a805460ff19811660ff90911615179055565b60606003805461085a90612419565b336001600160a01b038316036111b55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610a7990612453565b600a805461ff001981166101009182900460ff1615909102179055565b611273848484610a8e565b6001600160a01b0383163b156112ac5761128f84848484611aab565b6112ac576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146112dc5760405162461bcd60e51b8152600401610a7990612453565b60ff166000908152600c6020526040902055565b60606112fb8261192a565b61131857604051630a14c4b560e41b815260040160405180910390fd5b6000611322611b97565b90508051600003611342576040518060200160405280600081525061136d565b8061134c84611ba6565b60405160200161135d9291906125bb565b6040516020818303038152906040525b9392505050565b3361138261ffff8316610e75565b6001600160a01b0316146113a85760405162461bcd60e51b8152600401610a79906125ea565b600d5461ffff82166000908152600b60205260409020600201546113cc90426124e5565b6113d6919061262c565b61ffff82166000908152600b6020526040812080549091906113f99084906124b4565b909155505061ffff166000908152600b6020526040902042600290910155565b600e546001600160a01b031633148061143c57506008546001600160a01b031633145b61147c5760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba32b960791b6044820152606401610a79565b61ffff82166000908152600b60205260408120805483929061149f9084906124b4565b90915550505050565b6127108161ffff166114bd6001546000540390565b6114c791906124b4565b106114ff5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610a79565b600a54610100900460ff16156116d2578061ffff16601154611521919061262c565b341461152c57600080fd5b60008052600c60209081527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e8546040516001600160601b03193360601b169281019290925261158091849190603401610fa9565b61159c5760405162461bcd60e51b8152600401610a79906124fc565b600f546001600160a01b031660026115d7336001600160a01b03166000908152600560205260409081902054901c67ffffffffffffffff1690565b6115e59061ffff85166124b4565b11156116cc57336000908152600560205260409081902054611616911c67ffffffffffffffff1661ffff84166124b4565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561165a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167e919061264b565b10156116cc5760405162461bcd60e51b815260206004820152601f60248201527f43616e2774206d696e74206d6f7265206661636573207468616e2063616e7a006044820152606401610a79565b506116ef565b8061ffff166012546116e4919061262c565b34146116ef57600080fd5b600a5460ff16156117125760405162461bcd60e51b8152600401610a7990612525565b610d3f338261ffff16611a91565b6002600052600c60209081527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720546040516001600160601b03193360601b169281019290925261177591849190603401610fa9565b8061178a57506008546001600160a01b031633145b6117a65760405162461bcd60e51b8152600401610a79906124fc565b600d5550565b6008546001600160a01b031633146117d65760405162461bcd60e51b8152600401610a7990612453565b6001600160a01b03811661183b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a79565b610a8b81611a29565b3361185261ffff8316610e75565b6001600160a01b0316146118785760405162461bcd60e51b8152600401610a79906125ea565b61ffff81166000908152600b602052604090206001015460ff166118b75761ffff81166000908152600b60205260409020426002909101819055611902565b61ffff81166000908152600b60205260409020600201546118d890426124e5565b61ffff82166000908152600b6020526040812080549091906118fb9084906124b4565b9250508190555b5061ffff166000908152600b60205260409020600101805460ff19811660ff90911615179055565b6000805482108015610845575050600090815260046020526040902054600160e01b161590565b8061ffff1660008082825461196691906124b4565b909155505050565b6000816000548110156119bc5760008181526004602052604081205490600160e01b821690036119ba575b8060000361136d575060001901600081815260046020526040902054611999565b505b604051636f96cda160e11b815260040160405180910390fd5b6000828152600b602052604090206001015460ff16156112ac5760405162461bcd60e51b815260206004820152600f60248201526e29ba30b5b2b2103a3930b739b332b960891b6044820152606401610a79565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611a888584611bde565b14949350505050565b610d3f828260405180602001604052806000815250611c2b565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611ae0903390899088908890600401612664565b6020604051808303816000875af1925050508015611b1b575060408051601f3d908101601f19168201909252611b18918101906126a1565b60015b611b79573d808015611b49576040519150601f19603f3d011682016040523d82523d6000602084013e611b4e565b606091505b508051600003611b71576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461085a90612419565b604080516080019081905280825b600183039250600a81066030018353600a900480611bb45750819003601f19909101908152919050565b600081815b8451811015611c2357611c0f82868381518110611c0257611c02612488565b6020026020010151611c98565b915080611c1b816124cc565b915050611be3565b509392505050565b611c358383611cc4565b6001600160a01b0383163b15610cfd576000548281035b611c5f6000868380600101945086611aab565b611c7c576040516368d2bf6b60e11b815260040160405180910390fd5b818110611c4c578160005414611c9157600080fd5b5050505050565b6000818310611cb457600082815260208490526040902061136d565b5060009182526020526040902090565b6000805490829003611ce95760405163b562e8dd60e01b815260040160405180910390fd5b611cf660008483856119d5565b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611da557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611d6d565b5081600003611dc657604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054611ddb90612419565b90600052602060002090601f016020900481019282611dfd5760008555611e43565b82601f10611e1657805160ff1916838001178555611e43565b82800160010185558215611e43579182015b82811115611e43578251825591602001919060010190611e28565b50611e4f929150611e53565b5090565b5b80821115611e4f5760008155600101611e54565b6001600160e01b031981168114610a8b57600080fd5b600060208284031215611e9057600080fd5b813561136d81611e68565b60005b83811015611eb6578181015183820152602001611e9e565b838111156112ac5750506000910152565b60008151808452611edf816020860160208601611e9b565b601f01601f19169290920160200192915050565b60208152600061136d6020830184611ec7565b600060208284031215611f1857600080fd5b5035919050565b80356001600160a01b0381168114611f3657600080fd5b919050565b60008060408385031215611f4e57600080fd5b611f5783611f1f565b946020939093013593505050565b803561ffff81168114611f3657600080fd5b600060208284031215611f8957600080fd5b61136d82611f65565b600080600060608486031215611fa757600080fd5b611fb084611f1f565b9250611fbe60208501611f1f565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561200d5761200d611fce565b604052919050565b600067ffffffffffffffff82111561202f5761202f611fce565b5060051b60200190565b6000806040838503121561204c57600080fd5b8235915060208084013567ffffffffffffffff81111561206b57600080fd5b8401601f8101861361207c57600080fd5b803561208f61208a82612015565b611fe4565b81815260059190911b820183019083810190888311156120ae57600080fd5b928401925b828410156120d3576120c484611f65565b825292840192908401906120b3565b80955050505050509250929050565b600067ffffffffffffffff8311156120fc576120fc611fce565b61210f601f8401601f1916602001611fe4565b905082815283838301111561212357600080fd5b828260208301376000602084830101529392505050565b60006020828403121561214c57600080fd5b813567ffffffffffffffff81111561216357600080fd5b8201601f8101841361217457600080fd5b611b8f848235602084016120e2565b60006020828403121561219557600080fd5b61136d82611f1f565b803560ff81168114611f3657600080fd5b6000602082840312156121c157600080fd5b61136d8261219e565b600082601f8301126121db57600080fd5b813560206121eb61208a83612015565b82815260059290921b8401810191818101908684111561220a57600080fd5b8286015b84811015612225578035835291830191830161220e565b509695505050505050565b60006020828403121561224257600080fd5b813567ffffffffffffffff81111561225957600080fd5b611b8f848285016121ca565b6000806040838503121561227857600080fd5b61228183611f1f565b91506020830135801515811461229657600080fd5b809150509250929050565b600080600080608085870312156122b757600080fd5b6122c085611f1f565b93506122ce60208601611f1f565b925060408501359150606085013567ffffffffffffffff8111156122f157600080fd5b8501601f8101871361230257600080fd5b612311878235602084016120e2565b91505092959194509250565b6000806040838503121561233057600080fd5b823591506123406020840161219e565b90509250929050565b6000806040838503121561235c57600080fd5b61236583611f1f565b915061234060208401611f1f565b6000806040838503121561238657600080fd5b611f5783611f65565b600080604083850312156123a257600080fd5b823567ffffffffffffffff8111156123b957600080fd5b6123c5858286016121ca565b92505061234060208401611f65565b600080604083850312156123e757600080fd5b823567ffffffffffffffff8111156123fe57600080fd5b61240a858286016121ca565b95602094909401359450505050565b600181811c9082168061242d57607f821691505b60208210810361244d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156124c7576124c761249e565b500190565b6000600182016124de576124de61249e565b5060010190565b6000828210156124f7576124f761249e565b500390565b6020808252600f908201526e139bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252604b908201527f3e4d494e54205041555345443c20496620796f752772652067657474696e672060408201527f74686973206d6573736167652c20736869742077656e7420646f776e2e203e4d60608201526a1253950814105554d1510f60aa1b608082015260a00190565b600060ff821660ff84168060ff038211156125b3576125b361249e565b019392505050565b600083516125cd818460208801611e9b565b8351908301906125e1818360208801611e9b565b01949350505050565b60208082526022908201527f596f75277265206e6f7420746865206f776e6572206f66207468697320746f6b60408201526132b760f11b606082015260800190565b60008160001904831182151516156126465761264661249e565b500290565b60006020828403121561265d57600080fd5b5051919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061269790830184611ec7565b9695505050505050565b6000602082840312156126b357600080fd5b815161136d81611e6856fea264697066735822122082f72e2d4858567ef0eb04f220552aa493c3b3369020674b03527266baca0d3b64736f6c634300080e0033

Deployed Bytecode Sourcemap

42867:7641:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27919:227;;;;;;;;;;-1:-1:-1;27919:227:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27919:227:0;;;;;;;;43528:33;;;;;;;;;;-1:-1:-1;43528:33:0;;;;-1:-1:-1;;;;;43528:33:0;;;;;;-1:-1:-1;;;;;756:32:1;;;738:51;;726:2;711:18;43528:33:0;592:203:1;28156:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31370:209::-;;;;;;;;;;-1:-1:-1;31370:209:0;;;;;:::i;:::-;;:::i;42960:89::-;;;;;;;;;;;;;:::i;30962:400::-;;;;;;;;;;-1:-1:-1;30962:400:0;;;;;:::i;:::-;;:::i;:::-;;26258:166;;;;;;;;;;-1:-1:-1;26379:12:0;;26319:7;26363:13;:28;26258:166;;;2319:25:1;;;2307:2;2292:18;26258:166:0;2173:177:1;44650:104:0;;;;;;;;;;-1:-1:-1;44650:104:0;;;;;:::i;:::-;;:::i;43744:38::-;;;;;;;;;;;;;;;;43659:76;;;;;;;;;;-1:-1:-1;43659:76:0;;;;-1:-1:-1;;;;;43659:76:0;;;33100:1567;;;;;;;;;;-1:-1:-1;33100:1567:0;;;;;:::i;:::-;;:::i;45050:338::-;;;;;;;;;;-1:-1:-1;45050:338:0;;;;;:::i;:::-;;:::i;44171:113::-;;;;;;;;;;-1:-1:-1;44171:113:0;;;;;:::i;:::-;;:::i;49381:305::-;;;;;;;;;;;;;:::i;34675:185::-;;;;;;;;;;-1:-1:-1;34675:185:0;;;;;:::i;:::-;;:::i;44292:120::-;;;;;;;;;;-1:-1:-1;44292:120:0;;;;;:::i;:::-;;:::i;43436:49::-;;;;;;;;;;-1:-1:-1;43436:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;48404:463;;;;;;;;;;-1:-1:-1;48404:463:0;;;;;:::i;:::-;;:::i;43227:33::-;;;;;;;;;;-1:-1:-1;43227:33:0;;;;;;;;;;;28806:152;;;;;;;;;;-1:-1:-1;28806:152:0;;;;;:::i;:::-;;:::i;26812:233::-;;;;;;;;;;-1:-1:-1;26812:233:0;;;;;:::i;:::-;;:::i;17790:103::-;;;;;;;;;;;;;:::i;49912:591::-;;;;;;;;;;-1:-1:-1;49912:591:0;;;;;:::i;:::-;;:::i;49694:210::-;;;;;;;;;;-1:-1:-1;49694:210:0;;;;;:::i;:::-;;:::i;44420:99::-;;;;;;;;;;;;;:::i;17567:87::-;;;;;;;;;;-1:-1:-1;17640:6:0;;-1:-1:-1;;;;;17640:6:0;17567:87;;28264:104;;;;;;;;;;;;;:::i;31587:308::-;;;;;;;;;;-1:-1:-1;31587:308:0;;;;;:::i;:::-;;:::i;44527:115::-;;;;;;;;;;;;;:::i;34868:399::-;;;;;;;;;;-1:-1:-1;34868:399:0;;;;;:::i;:::-;;:::i;44891:149::-;;;;;;;;;;-1:-1:-1;44891:149:0;;;;;:::i;:::-;;:::i;43125:30::-;;;;;;;;;;-1:-1:-1;43125:30:0;;;;;;;;28376:318;;;;;;;;;;-1:-1:-1;28376:318:0;;;;;:::i;:::-;;:::i;47039:691::-;;;;;;;;;;-1:-1:-1;47039:691:0;;;;;:::i;:::-;;:::i;43791:43::-;;;;;;;;;;;;;;;;31903:164;;;;;;;;;;-1:-1:-1;31903:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32024:25:0;;;32000:4;32024:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31903:164;45396:228;;;;;;;;;;-1:-1:-1;45396:228:0;;;;;:::i;:::-;;:::i;45974:1057::-;;;;;;:::i;:::-;;:::i;45632:334::-;;;;;;;;;;-1:-1:-1;45632:334:0;;;;;:::i;:::-;;:::i;43570:80::-;;;;;;;;;;-1:-1:-1;43570:80:0;;;;-1:-1:-1;;;;;43570:80:0;;;43382:45;;;;;;;;;;-1:-1:-1;43382:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10058:25:1;;;10126:14;;10119:22;10114:2;10099:18;;10092:50;10158:18;;;10151:34;10046:2;10031:18;43382:45:0;9862:329:1;17901:201:0;;;;;;;;;;-1:-1:-1;17901:201:0;;;;;:::i;:::-;;:::i;47738:658::-;;;;;;;;;;-1:-1:-1;47738:658:0;;;;;:::i;:::-;;:::i;27919:227::-;28004:4;-1:-1:-1;;;;;;;;;28037:25:0;;;;:63;;-1:-1:-1;;;;;;;;;;28075:25:0;;;28037:63;:101;;;-1:-1:-1;;;;;;;;;;28113:25:0;;;28037:101;28021:117;27919:227;-1:-1:-1;;27919:227:0:o;28156:100::-;28210:13;28243:5;28236:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28156:100;:::o;31370:209::-;31437:7;31462:16;31470:7;31462;:16::i;:::-;31457:64;;31487:34;;-1:-1:-1;;;31487:34:0;;;;;;;;;;;31457:64;-1:-1:-1;31541:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;31541:30:0;;31370:209::o;42960:89::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30962:400::-;31043:13;31059:16;31067:7;31059;:16::i;:::-;31043:32;-1:-1:-1;41985:10:0;-1:-1:-1;;;;;31092:28:0;;;31088:175;;31140:44;31157:5;41985:10;31903:164;:::i;31140:44::-;31135:128;;31212:35;;-1:-1:-1;;;31212:35:0;;;;;;;;;;;31135:128;31275:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;31275:35:0;-1:-1:-1;;;;;31275:35:0;;;;;;;;;31326:28;;31275:24;;31326:28;;;;;;;31032:330;30962:400;;:::o;44650:104::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;;;;;;;;;44713:31:::1;44737:6;44713:23;:31::i;:::-;44650:104:::0;:::o;33100:1567::-;33234:27;33264;33283:7;33264:18;:27::i;:::-;33234:57;;33349:4;-1:-1:-1;;;;;33308:45:0;33324:19;-1:-1:-1;;;;;33308:45:0;;33304:86;;33362:28;;-1:-1:-1;;;33362:28:0;;;;;;;;;;;33304:86;33404:27;32913:24;;;:15;:24;;;;;33046:26;;41985:10;32655:30;;;-1:-1:-1;;;;;32519:28:0;;32633:20;;;32630:56;33508:180;;33601:43;33618:4;41985:10;31903:164;:::i;33601:43::-;33596:92;;33653:35;;-1:-1:-1;;;33653:35:0;;;;;;;;;;;33596:92;-1:-1:-1;;;;;33705:16:0;;33701:52;;33730:23;;-1:-1:-1;;;33730:23:0;;;;;;;;;;;33701:52;33766:43;33788:4;33794:2;33798:7;33807:1;33766:21;:43::i;:::-;33849:15;33846:83;;;33912:1;33891:19;33884:30;33846:83;-1:-1:-1;;;;;33971:24:0;;;;;;;:18;:24;;;;;;33969:26;;-1:-1:-1;;33969:26:0;;;34008:22;;;;;;;;;34006:24;;-1:-1:-1;34006:24:0;;;30710:11;30685:23;30681:41;30668:63;-1:-1:-1;;;30668:63:0;34043:26;;;;:17;:26;;;;;:163;;;;-1:-1:-1;;;34223:47:0;;:52;;34219:336;;34324:1;34314:11;;34292:19;34344:30;;;:17;:30;;;;;;:35;;34340:204;;34419:13;;34404:11;:28;34400:129;;34457:30;;;;:17;:30;;;;;:52;;;34400:129;34277:278;34219:336;34598:7;34594:2;-1:-1:-1;;;;;34579:27:0;34588:4;-1:-1:-1;;;;;34579:27:0;;;;;;;;;;;33223:1444;;;33100:1567;;;:::o;45050:338::-;45162:18;;-1:-1:-1;;;;;45162:18:0;45148:10;:32;;:57;;-1:-1:-1;17640:6:0;;-1:-1:-1;;;;;17640:6:0;45184:10;:21;45148:57;45140:87;;;;-1:-1:-1;;;45140:87:0;;11144:2:1;45140:87:0;;;11126:21:1;11183:2;11163:18;;;11156:30;-1:-1:-1;;;11202:18:1;;;11195:47;11259:18;;45140:87:0;10942:341:1;45140:87:0;45245:10;45240:139;45269:8;:15;45261:5;:23;45240:139;;;45356:9;45312:12;:29;45325:8;45334:5;45325:15;;;;;;;;:::i;:::-;;;;;;;45312:29;;;;;;;;;;;;;:40;;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;45286:7:0;;-1:-1:-1;45286:7:0;;;:::i;:::-;;;;45240:139;;;;45050:338;;:::o;44171:113::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44249:27;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;44171:113:::0;:::o;49381:305::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;49502:16:::1;::::0;49569:34:::1;::::0;-1:-1:-1;;;;;49502:16:0;;::::1;::::0;;;49581:21:::1;49569:34:::0;::::1;;;::::0;49473:18:::1;49569:34:::0;49473:18;49569:34;49581:21;49502:16;49569:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;34675:185:::0;34813:39;34830:4;34836:2;34840:7;34813:39;;;;;;;;;;;;:16;:39::i;44292:120::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44370:20:::1;:34:::0;;-1:-1:-1;;;;;;44370:34:0::1;-1:-1:-1::0;;;;;44370:34:0;;;::::1;::::0;;;::::1;::::0;;44292:120::o;48404:463::-;48561:21;;;48464:7;48561:21;;;:12;:21;;;;;:31;;;;;:254;;48783:21;;;;;;;:12;:21;;;;;:32;48561:254;;;48673:21;;;;;;;:12;:21;;;;;:32;;48638;;;;;48620:50;;:15;:50;:::i;:::-;:85;;;;:::i;28806:152::-;28878:7;28921:27;28940:7;28921:18;:27::i;26812:233::-;26884:7;-1:-1:-1;;;;;26908:19:0;;26904:60;;26936:28;;-1:-1:-1;;;26936:28:0;;;;;;;;;;;26904:60;-1:-1:-1;;;;;;26982:25:0;;;;;:18;:25;;;;;;24529:13;26982:55;;26812:233::o;17790:103::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;17855:30:::1;17882:1;17855:18;:30::i;:::-;17790:103::o:0;49912:591::-;50008:5;49988:13;26379:12;;26319:7;26363:13;:28;;26258:166;49988:13;:17;;50004:1;49988:17;:::i;:::-;:25;49980:46;;;;-1:-1:-1;;;49980:46:0;;12157:2:1;49980:46:0;;;12139:21:1;12196:1;12176:18;;;12169:29;-1:-1:-1;;;12214:18:1;;;12207:38;12262:18;;49980:46:0;11955:331:1;49980:46:0;50123:1;50106:19;;:16;:19;;;;;;;50154:28;-1:-1:-1;;;;;;50171:10:0;12440:2:1;12436:15;12432:53;50154:28:0;;;12420:66:1;;;;50045:139:0;;50082:5;;50106:19;12502:12:1;;50154:28:0;;;;;;;;;;;;;50144:39;;;;;;50045:18;:139::i;:::-;50037:167;;;;-1:-1:-1;;;50037:167:0;;;;;;;:::i;:::-;50248:10;50223:36;;;;:24;:36;;;;;;50262:1;50223:36;;;;:40;50215:78;;;;-1:-1:-1;;;50215:78:0;;13071:2:1;50215:78:0;;;13053:21:1;13110:2;13090:18;;;13083:30;13149:27;13129:18;;;13122:55;13194:18;;50215:78:0;12869:349:1;50215:78:0;50313:11;;;;50312:12;50304:100;;;;-1:-1:-1;;;50304:100:0;;;;;;;:::i;:::-;50417:24;50427:10;50439:1;50417:9;:24::i;:::-;50477:10;50452:36;;;;:24;:36;;;;;:41;;50492:1;;50452:36;:41;;50492:1;;50452:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49912:591;:::o;49694:210::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;49836:5:::1;49824:8;49808:24;;:13;26379:12:::0;;26319:7;26363:13;:28;;26258:166;49808:13:::1;:24;;;;:::i;:::-;49807:34;49799:55;;;::::0;-1:-1:-1;;;49799:55:0;;14118:2:1;49799:55:0::1;::::0;::::1;14100:21:1::0;14157:1;14137:18;;;14130:29;-1:-1:-1;;;14175:18:1;;;14168:38;14223:18;;49799:55:0::1;13916:331:1::0;49799:55:0::1;49865:31;49875:10;49887:8;49865:31;;:9;:31::i;44420:99::-:0;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44498:11:::1;::::0;;-1:-1:-1;;44483:26:0;::::1;44498:11;::::0;;::::1;44497:12;44483:26;::::0;;44420:99::o;28264:104::-;28320:13;28353:7;28346:14;;;;;:::i;31587:308::-;41985:10;-1:-1:-1;;;;;31686:31:0;;;31682:61;;31726:17;;-1:-1:-1;;;31726:17:0;;;;;;;;;;;31682:61;41985:10;31756:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;31756:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;31756:60:0;;;;;;;;;;31832:55;;540:41:1;;;31756:49:0;;41985:10;31832:55;;513:18:1;31832:55:0;;;;;;;31587:308;;:::o;44527:115::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44618:14:::1;::::0;;-1:-1:-1;;44600:32:0;::::1;44618:14;::::0;;;::::1;;;44617:15;44600:32:::0;;::::1;;::::0;;44527:115::o;34868:399::-;35035:31;35048:4;35054:2;35058:7;35035:12;:31::i;:::-;-1:-1:-1;;;;;35081:14:0;;;:19;35077:183;;35120:56;35151:4;35157:2;35161:7;35170:5;35120:30;:56::i;:::-;35115:145;;35204:40;;-1:-1:-1;;;35204:40:0;;;;;;;;;;;35115:145;34868:399;;;;:::o;44891:149::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44992:21:::1;;;::::0;;;:16:::1;:21;::::0;;;;:38;44891:149::o;28376:318::-;28449:13;28480:16;28488:7;28480;:16::i;:::-;28475:59;;28505:29;;-1:-1:-1;;;28505:29:0;;;;;;;;;;;28475:59;28547:21;28571:10;:8;:10::i;:::-;28547:34;;28605:7;28599:21;28624:1;28599:26;:87;;;;;;;;;;;;;;;;;28652:7;28661:18;28671:7;28661:9;:18::i;:::-;28635:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28599:87;28592:94;28376:318;-1:-1:-1;;;28376:318:0:o;47039:691::-;47207:10;47187:16;;;;:7;:16::i;:::-;-1:-1:-1;;;;;47187:30:0;;47179:77;;;;-1:-1:-1;;;47179:77:0;;;;;;;:::i;:::-;47406:13;;47370:21;;;;;;;:12;:21;;;;;:32;;;47352:50;;:15;:50;:::i;:::-;47351:68;;;;:::i;:::-;47315:21;;;;;;;:12;:21;;;;;:104;;:21;;;:104;;;;;:::i;:::-;;;;-1:-1:-1;;47473:21:0;;;;;;:12;:21;;;;;47508:15;47473:32;;;;:50;47039:691::o;45396:228::-;45493:18;;-1:-1:-1;;;;;45493:18:0;45479:10;:32;;:57;;-1:-1:-1;17640:6:0;;-1:-1:-1;;;;;17640:6:0;45515:10;:21;45479:57;45471:87;;;;-1:-1:-1;;;45471:87:0;;11144:2:1;45471:87:0;;;11126:21:1;11183:2;11163:18;;;11156:30;-1:-1:-1;;;11202:18:1;;;11195:47;11259:18;;45471:87:0;10942:341:1;45471:87:0;45569:21;;;;;;;:12;:21;;;;;:45;;45605:9;;45569:21;:45;;45605:9;;45569:45;:::i;:::-;;;;-1:-1:-1;;;;45396:228:0:o;45974:1057::-;46099:5;46087:8;46071:24;;:13;26379:12;;26319:7;26363:13;:28;;26258:166;46071:13;:24;;;;:::i;:::-;46070:34;46062:55;;;;-1:-1:-1;;;46062:55:0;;14118:2:1;46062:55:0;;;14100:21:1;14157:1;14137:18;;;14130:29;-1:-1:-1;;;14175:18:1;;;14168:38;14223:18;;46062:55:0;13916:331:1;46062:55:0;46134:14;;;;;;;46130:731;;;46205:8;46189:24;;:13;;:24;;;;:::i;:::-;46175:9;:39;46167:48;;;;;;46309:19;;;:16;:19;;;;;;;46361:28;-1:-1:-1;;;;;;46378:10:0;12440:2:1;12436:15;12432:53;46361:28:0;;;12420:66:1;;;;46240:151:0;;46281:5;;46309:19;12502:12:1;;46361:28:0;12291:229:1;46240:151:0;46232:179;;;;-1:-1:-1;;;46232:179:0;;;;;;;:::i;:::-;46466:20;;-1:-1:-1;;;;;46466:20:0;46546:1;46518:25;46532:10;-1:-1:-1;;;;;27142:25:0;27114:7;27142:25;;;:18;:25;;24600:2;27142:25;;;;;:50;;24529:13;27141:82;;27053:178;46518:25;46507:36;;;;;;:::i;:::-;:40;46504:259;;;46679:10;27114:7;27142:25;;;:18;:25;;24600:2;27142:25;;;;;46654:36;;27142:50;24529:13;27141:82;46654:36;;;;:::i;:::-;46598:31;;-1:-1:-1;;;46598:31:0;;46618:10;46598:31;;;738:51:1;-1:-1:-1;;;;;46598:19:0;;;;;711:18:1;;46598:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:92;;46568:179;;;;-1:-1:-1;;;46568:179:0;;15694:2:1;46568:179:0;;;15676:21:1;15733:2;15713:18;;;15706:30;15772:33;15752:18;;;15745:61;15823:18;;46568:179:0;15492:355:1;46568:179:0;46150:626;46130:731;;;46839:8;46819:28;;:17;;:28;;;;:::i;:::-;46805:9;:43;46797:52;;;;;;46882:11;;;;46881:12;46873:100;;;;-1:-1:-1;;;46873:100:0;;;;;;;:::i;:::-;46990:31;47000:10;47012:8;46990:31;;:9;:31::i;45632:334::-;45813:1;45796:19;;:16;:19;;;;;;;45840:28;-1:-1:-1;;;;;;45857:10:0;12440:2:1;12436:15;12432:53;45840:28:0;;;12420:66:1;;;;45743:127:0;;45776:5;;45796:19;12502:12:1;;45840:28:0;12291:229:1;45743:127:0;:152;;;-1:-1:-1;17640:6:0;;-1:-1:-1;;;;;17640:6:0;45874:10;:21;45743:152;45735:180;;;;-1:-1:-1;;;45735:180:0;;;;;;;:::i;:::-;45928:13;:30;-1:-1:-1;45632:334:0:o;17901:201::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17990:22:0;::::1;17982:73;;;::::0;-1:-1:-1;;;17982:73:0;;16054:2:1;17982:73:0::1;::::0;::::1;16036:21:1::0;16093:2;16073:18;;;16066:30;16132:34;16112:18;;;16105:62;-1:-1:-1;;;16183:18:1;;;16176:36;16229:19;;17982:73:0::1;15852:402:1::0;17982:73:0::1;18066:28;18085:8;18066:18;:28::i;47738:658::-:0;47868:10;47848:16;;;;:7;:16::i;:::-;-1:-1:-1;;;;;47848:30:0;;47840:77;;;;-1:-1:-1;;;47840:77:0;;;;;;;:::i;:::-;47998:21;;;;;;;:12;:21;;;;;:31;;;;;:243;;48191:21;;;;;;;:12;:21;;;;;48226:15;48191:32;;;;:50;;;47998:243;;;48122:21;;;;;;;:12;:21;;;;;:32;;;48104:50;;:15;:50;:::i;:::-;48067:21;;;;;;;:12;:21;;;;;:88;;:21;;;:88;;;;;:::i;:::-;;;;;;;47998:243;-1:-1:-1;48320:21:0;;;;;;:12;:21;;;;;:31;;;;-1:-1:-1;;48285:66:0;;48320:31;;;;48319:32;48285:66;;;47738:658::o;32075:230::-;32140:4;32222:13;;32212:7;:23;32173:124;;;;-1:-1:-1;;32248:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;32248:44:0;:49;;32075:230::o;26432:107::-;26525:6;26508:23;;:13;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;;26432:107:0:o;29513:581::-;29580:7;29615;29705:13;;29698:4;:20;29694:337;;;29739:14;29756:23;;;:17;:23;;;;;;;-1:-1:-1;;;29802:24:0;;:29;;29798:218;;29856:105;29863:6;29873:1;29863:11;29856:105;;-1:-1:-1;;;29930:6:0;29912:25;;;;:17;:25;;;;;;29856:105;;29798:218;29720:311;29694:337;30055:31;;-1:-1:-1;;;30055:31:0;;;;;;;;;;;48875:498;49063:26;;;;:12;:26;;;;;:36;;;;;49062:37;49054:65;;;;-1:-1:-1;;;49054:65:0;;16461:2:1;49054:65:0;;;16443:21:1;16500:2;16480:18;;;16473:30;-1:-1:-1;;;16519:18:1;;;16512:45;16574:18;;49054:65:0;16259:339:1;18110:191:0;18203:6;;;-1:-1:-1;;;;;18220:17:0;;;-1:-1:-1;;;;;;18220:17:0;;;;;;;18253:40;;18203:6;;;18220:17;18203:6;;18253:40;;18184:16;;18253:40;18173:128;18110:191;:::o;7222:190::-;7347:4;7400;7371:25;7384:5;7391:4;7371:12;:25::i;:::-;:33;;7222:190;-1:-1:-1;;;;7222:190:0:o;39157:112::-;39234:27;39244:2;39248:8;39234:27;;;;;;;;;;;;:9;:27::i;35608:716::-;35792:88;;-1:-1:-1;;;35792:88:0;;35771:4;;-1:-1:-1;;;;;35792:45:0;;;;;:88;;41985:10;;35859:4;;35865:7;;35874:5;;35792:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35792:88:0;;;;;;;;-1:-1:-1;;35792:88:0;;;;;;;;;;;;:::i;:::-;;;35788:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36075:6;:13;36092:1;36075:18;36071:235;;36121:40;;-1:-1:-1;;;36121:40:0;;;;;;;;;;;36071:235;36264:6;36258:13;36249:6;36245:2;36241:15;36234:38;35788:529;-1:-1:-1;;;;;;35951:64:0;-1:-1:-1;;;35951:64:0;;-1:-1:-1;35788:529:0;35608:716;;;;;;:::o;44762:121::-;44822:13;44857:16;44850:23;;;;;:::i;42011:573::-;42147:4;42141:11;;42154:4;42137:22;42173:17;;;;42137:22;42254:5;42236:219;42302:1;42297:3;42293:11;42286:18;;42353:2;42347:4;42343:13;42339:2;42335:22;42330:3;42322:36;42394:2;42384:13;;42415:25;42236:219;42415:25;-1:-1:-1;42485:13:0;;;-1:-1:-1;;42519:14:0;;;42547:19;;;42519:14;42011:573;-1:-1:-1;42011:573:0:o;7632:296::-;7715:7;7758:4;7715:7;7773:118;7797:5;:12;7793:1;:16;7773:118;;;7846:33;7856:12;7870:5;7876:1;7870:8;;;;;;;;:::i;:::-;;;;;;;7846:9;:33::i;:::-;7831:48;-1:-1:-1;7811:3:0;;;;:::i;:::-;;;;7773:118;;;-1:-1:-1;7908:12:0;7632:296;-1:-1:-1;;;7632:296:0:o;38551:598::-;38682:19;38688:2;38692:8;38682:5;:19::i;:::-;-1:-1:-1;;;;;38735:14:0;;;:19;38731:404;;38771:11;38785:13;38829:14;;;38858:217;38885:62;38924:1;38928:2;38932:7;;;;;;38941:5;38885:30;:62::i;:::-;38880:159;;38979:40;;-1:-1:-1;;;38979:40:0;;;;;;;;;;;38880:159;39070:3;39062:5;:11;38858:217;;39110:3;39093:13;;:20;39089:34;;39115:8;;;39089:34;38756:379;;38551:598;;;:::o;10960:149::-;11023:7;11054:1;11050;:5;:51;;11185:13;11237:15;;;11273:4;11266:15;;;11320:4;11304:21;;11050:51;;;-1:-1:-1;11185:13:0;11237:15;;;11273:4;11266:15;11320:4;11304:21;;;10960:149::o;36334:1288::-;36407:20;36430:13;;;36458;;;36454:44;;36480:18;;-1:-1:-1;;;36480:18:0;;;;;;;;;;;36454:44;36511:61;36541:1;36545:2;36549:12;36563:8;36511:21;:61::i;:::-;-1:-1:-1;;;;;36602:22:0;;;;;;:18;:22;;;;24600:2;36602:22;;;:71;;36640:32;36628:45;;36602:71;;;36686:31;;;:17;:31;;;;;-1:-1:-1;30918:15:0;;30892:24;30888:46;30710:11;30685:23;30681:41;30678:52;30668:63;;36686:161;;36901:23;;;;36686:31;;36602:22;;37063:25;36602:22;;37012:157;37241:1;37227:12;37223:20;37185:253;37278:3;37269:7;37266:16;37185:253;;37415:7;37405:8;37402:1;37375:25;37372:1;37369;37364:59;37327:1;37314:15;37185:253;;;37189:69;37463:8;37475:1;37463:13;37459:45;;37485:19;;-1:-1:-1;;;37485:19:0;;;;;;;;;;;37459:45;37517:13;:19;-1:-1:-1;45240:139:0;45050:338;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;800:258::-;872:1;882:113;896:6;893:1;890:13;882:113;;;972:11;;;966:18;953:11;;;946:39;918:2;911:10;882:113;;;1013:6;1010:1;1007:13;1004:48;;;-1:-1:-1;;1048:1:1;1030:16;;1023:27;800:258::o;1063:::-;1105:3;1143:5;1137:12;1170:6;1165:3;1158:19;1186:63;1242:6;1235:4;1230:3;1226:14;1219:4;1212:5;1208:16;1186:63;:::i;:::-;1303:2;1282:15;-1:-1:-1;;1278:29:1;1269:39;;;;1310:4;1265:50;;1063:258;-1:-1:-1;;1063:258:1:o;1326:220::-;1475:2;1464:9;1457:21;1438:4;1495:45;1536:2;1525:9;1521:18;1513:6;1495:45;:::i;1551:180::-;1610:6;1663:2;1651:9;1642:7;1638:23;1634:32;1631:52;;;1679:1;1676;1669:12;1631:52;-1:-1:-1;1702:23:1;;1551:180;-1:-1:-1;1551:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:159::-;2422:20;;2482:6;2471:18;;2461:29;;2451:57;;2504:1;2501;2494:12;2519:184;2577:6;2630:2;2618:9;2609:7;2605:23;2601:32;2598:52;;;2646:1;2643;2636:12;2598:52;2669:28;2687:9;2669:28;:::i;2708:328::-;2785:6;2793;2801;2854:2;2842:9;2833:7;2829:23;2825:32;2822:52;;;2870:1;2867;2860:12;2822:52;2893:29;2912:9;2893:29;:::i;:::-;2883:39;;2941:38;2975:2;2964:9;2960:18;2941:38;:::i;:::-;2931:48;;3026:2;3015:9;3011:18;2998:32;2988:42;;2708:328;;;;;:::o;3041:127::-;3102:10;3097:3;3093:20;3090:1;3083:31;3133:4;3130:1;3123:15;3157:4;3154:1;3147:15;3173:275;3244:2;3238:9;3309:2;3290:13;;-1:-1:-1;;3286:27:1;3274:40;;3344:18;3329:34;;3365:22;;;3326:62;3323:88;;;3391:18;;:::i;:::-;3427:2;3420:22;3173:275;;-1:-1:-1;3173:275:1:o;3453:182::-;3512:4;3545:18;3537:6;3534:30;3531:56;;;3567:18;;:::i;:::-;-1:-1:-1;3612:1:1;3608:14;3624:4;3604:25;;3453:182::o;3640:962::-;3732:6;3740;3793:2;3781:9;3772:7;3768:23;3764:32;3761:52;;;3809:1;3806;3799:12;3761:52;3845:9;3832:23;3822:33;;3874:2;3927;3916:9;3912:18;3899:32;3954:18;3946:6;3943:30;3940:50;;;3986:1;3983;3976:12;3940:50;4009:22;;4062:4;4054:13;;4050:27;-1:-1:-1;4040:55:1;;4091:1;4088;4081:12;4040:55;4127:2;4114:16;4150:59;4166:42;4205:2;4166:42;:::i;:::-;4150:59;:::i;:::-;4243:15;;;4325:1;4321:10;;;;4313:19;;4309:28;;;4274:12;;;;4349:19;;;4346:39;;;4381:1;4378;4371:12;4346:39;4405:11;;;;4425:147;4441:6;4436:3;4433:15;4425:147;;;4507:22;4525:3;4507:22;:::i;:::-;4495:35;;4458:12;;;;4550;;;;4425:147;;;4591:5;4581:15;;;;;;;3640:962;;;;;:::o;4607:407::-;4672:5;4706:18;4698:6;4695:30;4692:56;;;4728:18;;:::i;:::-;4766:57;4811:2;4790:15;;-1:-1:-1;;4786:29:1;4817:4;4782:40;4766:57;:::i;:::-;4757:66;;4846:6;4839:5;4832:21;4886:3;4877:6;4872:3;4868:16;4865:25;4862:45;;;4903:1;4900;4893:12;4862:45;4952:6;4947:3;4940:4;4933:5;4929:16;4916:43;5006:1;4999:4;4990:6;4983:5;4979:18;4975:29;4968:40;4607:407;;;;;:::o;5019:451::-;5088:6;5141:2;5129:9;5120:7;5116:23;5112:32;5109:52;;;5157:1;5154;5147:12;5109:52;5197:9;5184:23;5230:18;5222:6;5219:30;5216:50;;;5262:1;5259;5252:12;5216:50;5285:22;;5338:4;5330:13;;5326:27;-1:-1:-1;5316:55:1;;5367:1;5364;5357:12;5316:55;5390:74;5456:7;5451:2;5438:16;5433:2;5429;5425:11;5390:74;:::i;5475:186::-;5534:6;5587:2;5575:9;5566:7;5562:23;5558:32;5555:52;;;5603:1;5600;5593:12;5555:52;5626:29;5645:9;5626:29;:::i;5666:156::-;5732:20;;5792:4;5781:16;;5771:27;;5761:55;;5812:1;5809;5802:12;5827:182;5884:6;5937:2;5925:9;5916:7;5912:23;5908:32;5905:52;;;5953:1;5950;5943:12;5905:52;5976:27;5993:9;5976:27;:::i;6196:661::-;6250:5;6303:3;6296:4;6288:6;6284:17;6280:27;6270:55;;6321:1;6318;6311:12;6270:55;6357:6;6344:20;6383:4;6407:59;6423:42;6462:2;6423:42;:::i;6407:59::-;6500:15;;;6586:1;6582:10;;;;6570:23;;6566:32;;;6531:12;;;;6610:15;;;6607:35;;;6638:1;6635;6628:12;6607:35;6674:2;6666:6;6662:15;6686:142;6702:6;6697:3;6694:15;6686:142;;;6768:17;;6756:30;;6806:12;;;;6719;;6686:142;;;-1:-1:-1;6846:5:1;6196:661;-1:-1:-1;;;;;;6196:661:1:o;6862:348::-;6946:6;6999:2;6987:9;6978:7;6974:23;6970:32;6967:52;;;7015:1;7012;7005:12;6967:52;7055:9;7042:23;7088:18;7080:6;7077:30;7074:50;;;7120:1;7117;7110:12;7074:50;7143:61;7196:7;7187:6;7176:9;7172:22;7143:61;:::i;7215:347::-;7280:6;7288;7341:2;7329:9;7320:7;7316:23;7312:32;7309:52;;;7357:1;7354;7347:12;7309:52;7380:29;7399:9;7380:29;:::i;:::-;7370:39;;7459:2;7448:9;7444:18;7431:32;7506:5;7499:13;7492:21;7485:5;7482:32;7472:60;;7528:1;7525;7518:12;7472:60;7551:5;7541:15;;;7215:347;;;;;:::o;7567:667::-;7662:6;7670;7678;7686;7739:3;7727:9;7718:7;7714:23;7710:33;7707:53;;;7756:1;7753;7746:12;7707:53;7779:29;7798:9;7779:29;:::i;:::-;7769:39;;7827:38;7861:2;7850:9;7846:18;7827:38;:::i;:::-;7817:48;;7912:2;7901:9;7897:18;7884:32;7874:42;;7967:2;7956:9;7952:18;7939:32;7994:18;7986:6;7983:30;7980:50;;;8026:1;8023;8016:12;7980:50;8049:22;;8102:4;8094:13;;8090:27;-1:-1:-1;8080:55:1;;8131:1;8128;8121:12;8080:55;8154:74;8220:7;8215:2;8202:16;8197:2;8193;8189:11;8154:74;:::i;:::-;8144:84;;;7567:667;;;;;;;:::o;8239:250::-;8305:6;8313;8366:2;8354:9;8345:7;8341:23;8337:32;8334:52;;;8382:1;8379;8372:12;8334:52;8418:9;8405:23;8395:33;;8447:36;8479:2;8468:9;8464:18;8447:36;:::i;:::-;8437:46;;8239:250;;;;;:::o;8494:260::-;8562:6;8570;8623:2;8611:9;8602:7;8598:23;8594:32;8591:52;;;8639:1;8636;8629:12;8591:52;8662:29;8681:9;8662:29;:::i;:::-;8652:39;;8710:38;8744:2;8733:9;8729:18;8710:38;:::i;8759:252::-;8826:6;8834;8887:2;8875:9;8866:7;8862:23;8858:32;8855:52;;;8903:1;8900;8893:12;8855:52;8926:28;8944:9;8926:28;:::i;9016:420::-;9108:6;9116;9169:2;9157:9;9148:7;9144:23;9140:32;9137:52;;;9185:1;9182;9175:12;9137:52;9225:9;9212:23;9258:18;9250:6;9247:30;9244:50;;;9290:1;9287;9280:12;9244:50;9313:61;9366:7;9357:6;9346:9;9342:22;9313:61;:::i;:::-;9303:71;;;9393:37;9426:2;9415:9;9411:18;9393:37;:::i;9441:416::-;9534:6;9542;9595:2;9583:9;9574:7;9570:23;9566:32;9563:52;;;9611:1;9608;9601:12;9563:52;9651:9;9638:23;9684:18;9676:6;9673:30;9670:50;;;9716:1;9713;9706:12;9670:50;9739:61;9792:7;9783:6;9772:9;9768:22;9739:61;:::i;:::-;9729:71;9847:2;9832:18;;;;9819:32;;-1:-1:-1;;;;9441:416:1:o;10196:380::-;10275:1;10271:12;;;;10318;;;10339:61;;10393:4;10385:6;10381:17;10371:27;;10339:61;10446:2;10438:6;10435:14;10415:18;10412:38;10409:161;;10492:10;10487:3;10483:20;10480:1;10473:31;10527:4;10524:1;10517:15;10555:4;10552:1;10545:15;10409:161;;10196:380;;;:::o;10581:356::-;10783:2;10765:21;;;10802:18;;;10795:30;10861:34;10856:2;10841:18;;10834:62;10928:2;10913:18;;10581:356::o;11288:127::-;11349:10;11344:3;11340:20;11337:1;11330:31;11380:4;11377:1;11370:15;11404:4;11401:1;11394:15;11420:127;11481:10;11476:3;11472:20;11469:1;11462:31;11512:4;11509:1;11502:15;11536:4;11533:1;11526:15;11552:128;11592:3;11623:1;11619:6;11616:1;11613:13;11610:39;;;11629:18;;:::i;:::-;-1:-1:-1;11665:9:1;;11552:128::o;11685:135::-;11724:3;11745:17;;;11742:43;;11765:18;;:::i;:::-;-1:-1:-1;11812:1:1;11801:13;;11685:135::o;11825:125::-;11865:4;11893:1;11890;11887:8;11884:34;;;11898:18;;:::i;:::-;-1:-1:-1;11935:9:1;;11825:125::o;12525:339::-;12727:2;12709:21;;;12766:2;12746:18;;;12739:30;-1:-1:-1;;;12800:2:1;12785:18;;12778:45;12855:2;12840:18;;12525:339::o;13223:479::-;13425:2;13407:21;;;13464:2;13444:18;;;13437:30;13503:34;13498:2;13483:18;;13476:62;13574:34;13569:2;13554:18;;13547:62;-1:-1:-1;;;13640:3:1;13625:19;;13618:42;13692:3;13677:19;;13223:479::o;13707:204::-;13745:3;13781:4;13778:1;13774:12;13813:4;13810:1;13806:12;13848:3;13842:4;13838:14;13833:3;13830:23;13827:49;;;13856:18;;:::i;:::-;13892:13;;13707:204;-1:-1:-1;;;13707:204:1:o;14252:470::-;14431:3;14469:6;14463:13;14485:53;14531:6;14526:3;14519:4;14511:6;14507:17;14485:53;:::i;:::-;14601:13;;14560:16;;;;14623:57;14601:13;14560:16;14657:4;14645:17;;14623:57;:::i;:::-;14696:20;;14252:470;-1:-1:-1;;;;14252:470:1:o;14727:398::-;14929:2;14911:21;;;14968:2;14948:18;;;14941:30;15007:34;15002:2;14987:18;;14980:62;-1:-1:-1;;;15073:2:1;15058:18;;15051:32;15115:3;15100:19;;14727:398::o;15130:168::-;15170:7;15236:1;15232;15228:6;15224:14;15221:1;15218:21;15213:1;15206:9;15199:17;15195:45;15192:71;;;15243:18;;:::i;:::-;-1:-1:-1;15283:9:1;;15130:168::o;15303:184::-;15373:6;15426:2;15414:9;15405:7;15401:23;15397:32;15394:52;;;15442:1;15439;15432:12;15394:52;-1:-1:-1;15465:16:1;;15303:184;-1:-1:-1;15303:184:1:o;16603:489::-;-1:-1:-1;;;;;16872:15:1;;;16854:34;;16924:15;;16919:2;16904:18;;16897:43;16971:2;16956:18;;16949:34;;;17019:3;17014:2;16999:18;;16992:31;;;16797:4;;17040:46;;17066:19;;17058:6;17040:46;:::i;:::-;17032:54;16603:489;-1:-1:-1;;;;;;16603:489:1:o;17097:249::-;17166:6;17219:2;17207:9;17198:7;17194:23;17190:32;17187:52;;;17235:1;17232;17225:12;17187:52;17267:9;17261:16;17286:30;17310:5;17286:30;:::i

Swarm Source

ipfs://82f72e2d4858567ef0eb04f220552aa493c3b3369020674b03527266baca0d3b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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