MATIC Price: $0.568472 (-0.84%)
Gas: 31 GWei
 

Overview

Max Total Supply

0 NY2023

Holders

1,149

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0x21ddaefd5fd975acf25eec0fabdab03098187335
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
NewYear2023

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-12-31
*/

// SPDX-License-Identifier: MIT
//                 ....                                   .
//                (MY7Hm,                              .gMWMm.
//               .#<~~~?Me                            (M=~~_db.
//              .M$~~~~~?Mp                          j#<~~~~(M[
//              .N:~~~~~~?Mp                        j@<~~~~~~d#
//              j#~~~~~~~~?N;                      (#:~~~~~~~JN.
//              d@~~~~~~~~~dN.                    .M3~~~~~~~~(M}
//              db~~~~~~~~~(Mb                   .dD~~~~~~~~~(M[
//              db~~~(dNx~~~(M;                  (#<~~_(g+~~~(M[
//              db~~~(MvNx~~~db.                .M$~~_j#W@~~~(M\
//              d#~~~(M>dN/~~(M;                j#~~~(M{d@~~~(M}
//              J#_~~(Mr(MR_~_db               .M$~~(MD_d@~~~(N~
//              ,N<~~(Mb~?Ml~~(M;              (#<~_d#:(MD~~.j#
//             `.Ml~~~d#__dN_~_Mb             .MD~~(M$~(M>~~~d@
//               MP~~~JN:~(Nl~~dN.            -M>~~j#<~j#:~~(M]
//               dN_~~(Mr~(WR_~(M;            j#~~(WD~_d@~~~(M\
//               ,N<~~~d#_~dN<~(Mb            MD~~(#>~(Ml~~~(#`
//               .Mr~~~?Ml~(Mr~~dN           .Ml~_d@_~d#<~~_dF
//                db_~~(Mb~_dN(JjNa+&gggggg&JdN+J(M$~(MD~~~(M\
//                ,M;_(JdNNMMMHBYT77<<<<<<<?77TTWMMMNNNe-_~j#
//                .MNMMMB=<~~~~~~~~~~~~~~~~~~~~~~~~_<?THMMNMb.
//             .jMM#Y!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~7TMMNJ.
//          .JMMB=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~?TMMN,
//        .gMMY~~~~~~~~~~~~~~~(gMMNm-~~~~~~(gNNmx~~~~~~~~~~~~~~~?TMN,.
//      .jM#=~~~~~~~~~~~~~~~~~?MMMMB<~~~~~~?MMMM8~~~~~~~~~~~~~~~~~(TMN,
//     .MM3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~_~~~~~~~~~~~~~~~~~~~~~~?HMp.
//    (M#:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.~~~~~~~~~~~.~~.~~.~~~~~~~~~~_7MR.
//   .M@~~~~~~~~~~~~~~~.~~.~~.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~?MR.
//  .M@<~~~~~~~~~~~.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.~~~~~~~~~~vM[`
//  (Mt~~~~~~~~~.~~~~~~~~~~~~~~~~(J._~~~~.~(J.~~~~.~~~~~~~~~~~~~.~~~~~~~_M#.
//  d#~~~~~~~.~~~~~~~~.~~~~~~~~.jMHdb~~~~~j@XHR_~~~~~.~~.~~~~~~~~~~.~~~~~JM_
//  d@~~~~~~~~~~~~~~~~~~~.~~.~~~?Hgd$_(J--?Had9~~~~~~~~~~~~.~~~~~~~~~~~~~(N{
//  d#_~~~~~~~~~~~.~~~~~~~~~~~~~~~~~(MMMMMr_~~~~~~~~~~~~~~~~~~.~~~~~~~.~~(M:
//  JNc~~~~.~~~.~~~~~.~~~~~~~~~~(H>~~?WM#Y~~_dp~~~~.~~~~.~~~~~~~~.~~~~~~(d#`
//  .MN-~~~~~~~~~~~~~~~~.~~~~~~.jN+~~~(MR_~~-d#~~~~~~~~~~~~~~~~~~~~~.~~~+M%
//   (MN-~~~~~~~~~~~~~~~~~~.~~~~_?MNmN#WTNNNME<~~~~~~.~~~~~.~~~~~~~~~~~(M@
//    ?MN/~~~.~~~.~~.~~~~~~~~~~~~~~~_J}J~H~~~~~~~~.~~~~~.~~~~~.~~~~~~-jM@`
//     (MNe_~~~~~~~~~~~.~~~~~~~~~~~~_?ojJK~~~~~~~~~~~~~~~~~~~~~~~.~~(dMD
//       TMN&_~~~~~~~~~~~~.~~.~~~~~~~~_<<~~~~~~~~~~~~~~~~~~~~~~~~~(gM#^
//        .TMNe-~~~~.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.~~.~~~.~~~_(gMM=
//          .TMMNJ-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.~~~~~~~~~~~_(&MMB^
//             _TMMNa._~~.~~~~.~~.~~~~~~~~~~~~~~~~~~~~~~_(JgMMB=`
//                 ?TMMNaJ--_~~~~~~~.~~~~~.~~.~~~~~((J&gMM#"!
//                     ?7MMMMNNag+JJ--(((((JJJ+ggNMMMM@?`
//                      -M>~~~<?7TTYYYYYBBYYYT7=<<~~~d#.
//                      J#<~_-_~~~~~~~~~~~~~~~~~~--~~JN_
//                      d@~~(Ml~~~~~~~~~~~~~~~~~~d#_~(M[
//                      MD~~d#<~~~~~~~~~~~~~~~~~~dN:~(M]                      .       .
//                      Mh(-d#~~~~~~~~~~~~~~~~~~~(Mo-(MD                      rI    .zI
//                      ?""WM@_~~~~~~~~~~~~~~~~~~(M#""9!                      t?{   (<I
//                          dD~~~~~.~_-(--_~.~~~~(M}                   .w7-   z.1  .>.>    ...    ...
//                         .M$~~~~~(gMB"WMNe_~~~~_Wr                .JuuA-x. .zoJ+(J&J>  .====((((===1.
//                         .M$~~~~(MD`    (MR_~~~_db             .JuuuuuuuuV zttrrtrttro.(==?====??==z!
//                         .M>~~~(MF       .MR~~~~d@            .uuuV!   ?7` zrt>   -Otr> (==v!  ?=?=_
//                         ,N<~~_d@`        (Nc~~~d#            JuuC         ztrtzzzOrtZ` +==:    +==: .+====:
//                         (N<~~(M:          db_~~d@            zuul         zttttttttrI. +?=<....1==: +=z::<_
//                         (N+JgdF            MagJd#            .Xuuo.   ... zrr{   .ztr> +=?======?=: _<=====<
//                           """"              """"              .Tuuuuuuuun zttttttttrI` +?=>```_1==: (((((==>
//                                                                  .CVVVT7` ?7777777<!   ?<<`    ?<<! <<<<<<!
//
// File: contracts/Base64.sol



pragma solidity >=0.7.0 <0.9.0;


/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides a function for encoding some bytes in base64
library Base64 {
    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)

               // read 3 bytes
               let input := mload(dataPtr)

               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

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

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

        address operator = _msgSender();

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

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

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

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

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

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

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

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

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

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: contracts/NewYear2023.sol


//                 ....                                   .
//                (MY7Hm,                              .gMWMm.
//               .#<~~~?Me                            (M=~~_db.
//              .M$~~~~~?Mp                          j#<~~~~(M[
//              .N:~~~~~~?Mp                        j@<~~~~~~d#
//              j#~~~~~~~~?N;                      (#:~~~~~~~JN.
//              d@~~~~~~~~~dN.                    .M3~~~~~~~~(M}
//              db~~~~~~~~~(Mb                   .dD~~~~~~~~~(M[
//              db~~~(dNx~~~(M;                  (#<~~_(g+~~~(M[
//              db~~~(MvNx~~~db.                .M$~~_j#W@~~~(M\
//              d#~~~(M>dN/~~(M;                j#~~~(M{d@~~~(M}
//              J#_~~(Mr(MR_~_db               .M$~~(MD_d@~~~(N~
//              ,N<~~(Mb~?Ml~~(M;              (#<~_d#:(MD~~.j#
//             `.Ml~~~d#__dN_~_Mb             .MD~~(M$~(M>~~~d@
//               MP~~~JN:~(Nl~~dN.            -M>~~j#<~j#:~~(M]
//               dN_~~(Mr~(WR_~(M;            j#~~(WD~_d@~~~(M\
//               ,N<~~~d#_~dN<~(Mb            MD~~(#>~(Ml~~~(#`
//               .Mr~~~?Ml~(Mr~~dN           .Ml~_d@_~d#<~~_dF
//                db_~~(Mb~_dN(JjNa+&gggggg&JdN+J(M$~(MD~~~(M\
//                ,M;_(JdNNMMMHBYT77<<<<<<<?77TTWMMMNNNe-_~j#
//                .MNMMMB=<~~~~~~~~~~~~~~~~~~~~~~~~_<?THMMNMb.
//             .jMM#Y!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~7TMMNJ.
//          .JMMB=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~?TMMN,
//        .gMMY~~~~~~~~~~~~~~~(gMMNm-~~~~~~(gNNmx~~~~~~~~~~~~~~~?TMN,.
//      .jM#=~~~~~~~~~~~~~~~~~?MMMMB<~~~~~~?MMMM8~~~~~~~~~~~~~~~~~(TMN,
//     .MM3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~_~~~~~~~~~~~~~~~~~~~~~~?HMp.
//    (M#:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.~~~~~~~~~~~.~~.~~.~~~~~~~~~~_7MR.
//   .M@~~~~~~~~~~~~~~~.~~.~~.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~?MR.
//  .M@<~~~~~~~~~~~.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.~~~~~~~~~~vM[`
//  (Mt~~~~~~~~~.~~~~~~~~~~~~~~~~(J._~~~~.~(J.~~~~.~~~~~~~~~~~~~.~~~~~~~_M#.
//  d#~~~~~~~.~~~~~~~~.~~~~~~~~.jMHdb~~~~~j@XHR_~~~~~.~~.~~~~~~~~~~.~~~~~JM_
//  d@~~~~~~~~~~~~~~~~~~~.~~.~~~?Hgd$_(J--?Had9~~~~~~~~~~~~.~~~~~~~~~~~~~(N{
//  d#_~~~~~~~~~~~.~~~~~~~~~~~~~~~~~(MMMMMr_~~~~~~~~~~~~~~~~~~.~~~~~~~.~~(M:
//  JNc~~~~.~~~.~~~~~.~~~~~~~~~~(H>~~?WM#Y~~_dp~~~~.~~~~.~~~~~~~~.~~~~~~(d#`
//  .MN-~~~~~~~~~~~~~~~~.~~~~~~.jN+~~~(MR_~~-d#~~~~~~~~~~~~~~~~~~~~~.~~~+M%
//   (MN-~~~~~~~~~~~~~~~~~~.~~~~_?MNmN#WTNNNME<~~~~~~.~~~~~.~~~~~~~~~~~(M@
//    ?MN/~~~.~~~.~~.~~~~~~~~~~~~~~~_J}J~H~~~~~~~~.~~~~~.~~~~~.~~~~~~-jM@`
//     (MNe_~~~~~~~~~~~.~~~~~~~~~~~~_?ojJK~~~~~~~~~~~~~~~~~~~~~~~.~~(dMD
//       TMN&_~~~~~~~~~~~~.~~.~~~~~~~~_<<~~~~~~~~~~~~~~~~~~~~~~~~~(gM#^
//        .TMNe-~~~~.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.~~.~~~.~~~_(gMM=
//          .TMMNJ-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.~~~~~~~~~~~_(&MMB^
//             _TMMNa._~~.~~~~.~~.~~~~~~~~~~~~~~~~~~~~~~_(JgMMB=`
//                 ?TMMNaJ--_~~~~~~~.~~~~~.~~.~~~~~((J&gMM#"!
//                     ?7MMMMNNag+JJ--(((((JJJ+ggNMMMM@?`
//                      -M>~~~<?7TTYYYYYBBYYYT7=<<~~~d#.
//                      J#<~_-_~~~~~~~~~~~~~~~~~~--~~JN_
//                      d@~~(Ml~~~~~~~~~~~~~~~~~~d#_~(M[
//                      MD~~d#<~~~~~~~~~~~~~~~~~~dN:~(M]                      .       .
//                      Mh(-d#~~~~~~~~~~~~~~~~~~~(Mo-(MD                      rI    .zI
//                      ?""WM@_~~~~~~~~~~~~~~~~~~(M#""9!                      t?{   (<I
//                          dD~~~~~.~_-(--_~.~~~~(M}                   .w7-   z.1  .>.>    ...    ...
//                         .M$~~~~~(gMB"WMNe_~~~~_Wr                .JuuA-x. .zoJ+(J&J>  .====((((===1.
//                         .M$~~~~(MD`    (MR_~~~_db             .JuuuuuuuuV zttrrtrttro.(==?====??==z!
//                         .M>~~~(MF       .MR~~~~d@            .uuuV!   ?7` zrt>   -Otr> (==v!  ?=?=_
//                         ,N<~~_d@`        (Nc~~~d#            JuuC         ztrtzzzOrtZ` +==:    +==: .+====:
//                         (N<~~(M:          db_~~d@            zuul         zttttttttrI. +?=<....1==: +=z::<_
//                         (N+JgdF            MagJd#            .Xuuo.   ... zrr{   .ztr> +=?======?=: _<=====<
//                           """"              """"              .Tuuuuuuuun zttttttttrI` +?=>```_1==: (((((==>
//                                                                  .CVVVT7` ?7777777<!   ?<<`    ?<<! <<<<<<!
//
pragma solidity ^0.8.7;







contract NewYear2023 is
    ERC1155Supply,
    Ownable,
    AccessControl {

    function supportsInterface(bytes4 interfaceId) public view virtual
        override(ERC1155,AccessControl) returns (bool) {
        return
        interfaceId == type(IAccessControl).interfaceId ||
        super.supportsInterface(interfaceId);
    }
    
    bytes32 public constant ADMIN = keccak256("ADMIN");
    // Contract name
    string public name;
    // Contract symbol
    string public symbol;

    // Mapping from account to message

//    strust NftInfo {
//        string nfttag;
//        string nftcomment;
//        string nftimage;
//    }

//    mapping (uint256 => NftInfo) nftInfos;

    mapping (uint256 => string) nfttag;
    mapping (uint256 => string) nftcomment;
    mapping (uint256 => string) nftimage;
    mapping (address => string) nftowner;
    mapping (address => string) mintedtime;
    mapping (address => uint256) nftmintcount;
    mapping (address => uint256) nfttransfercount;


    string constant rl1='data:application/json;base64,';
    string constant rl2='{"name": "Character Dao New Year 2023 greeting Soulbound NFT - ';
    string constant rl3='", "description": "';
    string constant rl4='", "image": "';
    string constant tr1='", "attributes": [{"trait_type": "Happy","value": "MAX"},{"trait_type": "Rabbit","value": "4th';
    string constant tr2='"},{"trait_type": "Greeting Time","value": "';
    string constant tr3='"}]}';
    string constant date="2022/1/";


    constructor(string memory _name, string memory _symbol, string memory uri_)
     ERC1155(uri_) {
        name = _name;
        symbol = _symbol;
//        _grantRole(ADMIN,0x1b632c9a883DF07A18d4b2813840E029bEceFf6D);
//        _grantRole(ADMIN,0x480d565527086DC3dc2262648194E1e9cCAB70EF);
//        _grantRole(ADMIN,0x3FFcb00bE71F4a0Aa2d8624fBA4e97203FA3EA3B);
//        _grantRole(ADMIN,0xf3CfAD477A0f8443b0b6E81BF7A4a1fF7B69D46f);
//        _grantRole(ADMIN,0x0dAE5FcaD0DF8E5C029D76927582DFBdFd7eeC79);

    }

    ////////// modifiers //////////
    modifier onlyAdminOrOwner() {
        require(
            owner() == _msgSender() || hasRole(ADMIN, msg.sender),
            "caller is not the admin"
        );
        _;
    }

    // public mintable timer
    // 2023/1/1 00:00:00 (JST) = 1672498800
    // 2023/1/4 00:00:00 (JST) = 1672758000
    function mintableTimer() public view returns (bool){
        if (block.timestamp >= 1672498800 && block.timestamp < 1672758000) {
            bool mintable = true;
            return mintable;
        } else {
            bool mintable = false;
            return mintable;
        }
    }

    // public mint by anyone
    function mint(address _to, uint256 _id, uint256 _amount) external {
        require(mintableTimer() == true, "mint closed");
        require(tx.origin == msg.sender, "Cannot mint from contracts");
//        require(greeting == Greeting.UnLocked, "Currently cannot mint");
        require(balanceOf(msg.sender, _id) == 0, "Cannot mint more than 1 NFT");
        require(nftmintcount[msg.sender] == 0, "already mint");
        require(_amount == 1, "mintAmount is not 1");
//        require(
//            _amount + totalSupply(_id) <= maxSupply,
//            "claim is over the max supply"
//        );
        string memory minttime = getCurrentTime();
        nftowner[_to] = string(abi.encodePacked("minter address is",Strings.toHexString(uint256(uint160(msg.sender)), 20),"  and minted time is ",minttime));
        mintedtime[_to] = minttime;
        _mint(_to, _id, _amount,"");
        nftmintcount[msg.sender] += 1; 
    }

    // mint by owner or admin
    function adminMint(address _to, uint256 _id, uint256 _amount) external onlyAdminOrOwner{
        // check msg.sender is not contract address
        require(tx.origin == msg.sender, "Cannot mint from contracts");
        // check receiver do not have SBT
        require(balanceOf(_to, _id) < 1, "Cannot mint more than 1 NFT");
        // check mint amount is 1
        require(_amount == 1, "mintAmount is not 1");
        // engrave nft owner info
        string memory minttime = getCurrentTime();
        nftowner[_to] = string(abi.encodePacked("minter address is",Strings.toHexString(uint256(uint160(msg.sender)), 20),"  and minted time is ",minttime));
        mintedtime[_to] = minttime;
        // mint
        _mint(_to, _id, _amount,"");
    }


    // get current time (JST)
    function getCurrentTime() public view returns (string memory){
        // base time is 2022/12/24 00:00:00 (JST) = 1671807600
        uint256 day = ((block.timestamp - 1671807600) / 86400 ) % 365;
        uint256 hour = ((block.timestamp - 1671807600) / 3600 ) % 24;
        uint256 min = ((block.timestamp - 1671807600)  / 60 ) % 60;
        uint256 sec = (block.timestamp - 1671807600)  % 60;
        return string(abi.encodePacked(date, Strings.toString(day), " - ", Strings.toString(hour),":",Strings.toString(min),":",Strings.toString(sec)));
    }

    // get current UNIX time
    function getCurrentUnixTime() public view returns (uint256){
        return block.timestamp;
    }

    // transfer function by onlyAdminOrOwner
    function transfer(address from, address to, uint256 id, uint256 amount) external onlyAdminOrOwner{
        require(tx.origin == msg.sender, "Cannot transfer from contracts");
        _safeTransferFrom(from, to, id, amount,"");
    }


    // transfer limitation
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155Supply) {
        // cannot transfer to address who has already 1 NFT
        require(balanceOf(to, 0) == 0, "receiver has already 1 NFT");
        // nft owner can transfer only 1 time
        require(nfttransfercount[from] == 0, "already transfered 1 time");
        if (nfttransfercount[to] == 0 ) {
            super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
        } else {
            require(from == address(0) || to == address(0), "NonTransferrableERC1155Token: non transferrable");
            super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
        }
        if (nftmintcount[from] == 1 ) {
            nfttransfercount[from] += 1; 
            nfttransfercount[to] += 1; 
        } 
    }

    // burn by token owner
    function burn(address _from, uint256 _id, uint256 _amount) external {
        require(tx.origin == msg.sender, "Cannot burn from contracts");
        require(balanceOf(msg.sender, _id) == 1, "Caller should be NFT owner by id and have 1 NFT");
        require(msg.sender == _from, "Caller should burn own NFT, not other one's");
        require(_amount == 1, "burn amount should be 1");
        _burn(_from, _id, _amount);
    }

    // call nftowner address and other info by id
    function nftOwnerOf() public view returns (string memory) {
        return nftowner[msg.sender];
    }

    // call nftowner minted time by id
    function mintedTimeOf() public view returns (string memory) {
        return mintedtime[msg.sender];
    }

    // call nft name tag by id
    function nftTagOf(uint256 id) public view returns (string memory) {
        return nfttag[id];
    }

    // call nft description by id
    function nftCommentOf(uint256 id) public view returns (string memory) {
        return nftcomment[id];
    }

    // set nft name tag by id
    function setNfttag(uint256 _nftid, string memory _tag) public onlyOwner {
        nfttag[_nftid] = _tag;
    }

    // set nft description by id
    function setNftcomment(uint256 _nftids, string memory _comment) public onlyOwner {
        nftcomment[_nftids] = _comment;
    }

    // set nft image CID by id
    function setNftimage(uint256 _nftids, string memory _image) public onlyOwner {
        nftimage[_nftids] = _image;
    }

    // call nft image CID by id
    function nftImageOf(uint256 id) public view returns (string memory) {
        return nftimage[id];
    }

    // call nft transfer count number
    function nftTransferCountOf() public view returns (uint256) {
        return nfttransfercount[msg.sender];
    }

    // call nft mint count number
    function nftMintCountOf() public view returns (uint256) {
        return nftmintcount[msg.sender];
    }

//    string constant rl1='data:application/json;base64,';
//    string constant rl2='{"name": "Character Dao New Year 2023 greeting Soulbound NFT - ';
//    string constant rl3='", "description": "';
//    string constant rl4='", "image": "';
//    string constant tr1='", "attributes": [{"trait_type": "Happy","value": "MAX"},{"trait_type": "Rabbit","value": "4th';
//    string constant tr2='"},{"trait_type": "Greeting Time","value": "';
//    string constant tr3='"}]}';
//    string constant date="2022/1/";

    // get nft metadata by id
    function getAttributes(uint256 id) public virtual view returns(string memory) {
        string memory holder = nftowner[msg.sender];
        return string(abi.encodePacked(rl2,nfttag[id],rl3,nftcomment[id],holder,rl4,nftimage[id]));
    }

    // refer the latest uri for token id
    function uri(uint256 id) public view override returns (string memory) {
        return string(abi.encodePacked(rl1,Base64.encode(bytes(string(abi.encodePacked(getAttributes(id),tr1,tr2,mintedtime[msg.sender],tr3))))));
    }

    // set new name and symbol by only owner
    function setnameandsymbol(string memory newname, string memory newsymbol) public onlyOwner {
        name = newname;
        symbol = newsymbol;
    }

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

    // avoid renounce owner to 0x000... by only owner
    function renounceOwnership() public override onlyOwner {
        _transferOwnership(address(msg.sender));
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getAttributes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentUnixTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintableTimer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedTimeOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"nftCommentOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"nftImageOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftMintCountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftOwnerOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"nftTagOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftTransferCountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftids","type":"uint256"},{"internalType":"string","name":"_comment","type":"string"}],"name":"setNftcomment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftids","type":"uint256"},{"internalType":"string","name":"_image","type":"string"}],"name":"setNftimage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftid","type":"uint256"},{"internalType":"string","name":"_tag","type":"string"}],"name":"setNfttag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newname","type":"string"},{"internalType":"string","name":"newsymbol","type":"string"}],"name":"setnameandsymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"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":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162003ce738038062003ce7833981016040819052620000349162000249565b80620000408162000081565b506200004c336200009a565b825162000061906006906020860190620000ec565b50815162000077906007906020850190620000ec565b505050506200032d565b805162000096906002906020840190620000ec565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000fa90620002da565b90600052602060002090601f0160209004810192826200011e576000855562000169565b82601f106200013957805160ff191683800117855562000169565b8280016001018555821562000169579182015b82811115620001695782518255916020019190600101906200014c565b50620001779291506200017b565b5090565b5b808211156200017757600081556001016200017c565b600082601f830112620001a457600080fd5b81516001600160401b0380821115620001c157620001c162000317565b604051601f8301601f19908116603f01168101908282118183101715620001ec57620001ec62000317565b816040528381526020925086838588010111156200020957600080fd5b600091505b838210156200022d57858201830151818301840152908201906200020e565b838211156200023f5760008385830101525b9695505050505050565b6000806000606084860312156200025f57600080fd5b83516001600160401b03808211156200027757600080fd5b620002858783880162000192565b945060208601519150808211156200029c57600080fd5b620002aa8783880162000192565b93506040860151915080821115620002c157600080fd5b50620002d08682870162000192565b9150509250925092565b600181811c90821680620002ef57607f821691505b602082108114156200031157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6139aa806200033d6000396000f3fe608060405234801561001057600080fd5b50600436106102515760003560e01c80634f558e7911610146578063bd85b039116100c3578063e5ae639311610087578063e5ae639314610520578063e985e9c514610533578063f0930a941461056f578063f242432a14610577578063f2fde38b1461058a578063f5298aca1461059d57600080fd5b8063bd85b039146104b2578063bdc144e1146104d2578063c33e72e1146104e5578063d547741f146104fa578063e2e1bf8d1461050d57600080fd5b80638da5cb5b1161010a5780638da5cb5b1461046157806391d148541461047c57806395d89b411461048f578063a217fddf14610497578063a22cb4651461049f57600080fd5b80634f558e791461040b5780634f7ef2421461042d578063582a3be9146104405780636380188414610446578063715018a61461045957600080fd5b8063248a9ca3116101d45780632f2ff15d116101985780632f2ff15d1461039f57806336568abe146103b25780633eec734e146103c55780634378a6e3146103d85780634e1273f4146103eb57600080fd5b8063248a9ca31461032757806325f86d601461034a57806329cb924d1461035d5780632a0acc6a146103655780632eb2c2d61461038c57600080fd5b806306fdde031161021b57806306fdde03146102dc5780630e89341c146102e45780630ecae155146102f7578063156e29f61461030c578063195f142f1461031f57600080fd5b80624a84cb14610256578062fdd58e1461026b57806301ffc9a71461029157806303b591e3146102b45780630411b252146102c9575b600080fd5b610269610264366004612e4b565b6105b0565b005b61027e610279366004612e21565b6107d6565b6040519081526020015b60405180910390f35b6102a461029f366004612f8a565b610867565b6040519015158152602001610288565b6102bc610892565b60405161028891906134c3565b6102696102d7366004612d3f565b610933565b6102bc610a22565b6102bc6102f2366004612f4e565b610ab0565b336000908152600d602052604090205461027e565b61026961031a366004612e4b565b610b9c565b6102a4610def565b61027e610335366004612f4e565b60009081526005602052604090206001015490565b61026961035836600461301d565b610e1c565b6102bc610e48565b61027e7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b61026961039a366004612c96565b610f59565b6102696103ad366004612f67565b610fa5565b6102696103c0366004612f67565b610fca565b6102bc6103d3366004612f4e565b611048565b6102bc6103e6366004612f4e565b6110ea565b6103fe6103f9366004612e7e565b61123d565b6040516102889190613482565b6102a4610419366004612f4e565b600090815260036020526040902054151590565b61026961043b36600461301d565b611366565b4261027e565b610269610454366004612fc4565b61138d565b6102696113bc565b6004546040516001600160a01b039091168152602001610288565b6102a461048a366004612f67565b6113cf565b6102bc6113fa565b61027e600081565b6102696104ad366004612de5565b611407565b61027e6104c0366004612f4e565b60009081526003602052604090205490565b6102bc6104e0366004612f4e565b611412565b336000908152600e602052604090205461027e565b610269610508366004612f67565b61142f565b61026961051b36600461301d565b611454565b6102bc61052e366004612f4e565b61147b565b6102a4610541366004612c63565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102bc611498565b610269610585366004612d81565b6114b6565b610269610598366004612c48565b6114fb565b6102696105ab366004612e4b565b611574565b6004546001600160a01b03163314806105ee57506105ee7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42336113cf565b6106395760405162461bcd60e51b815260206004820152601760248201527631b0b63632b91034b9903737ba103a34329030b236b4b760491b60448201526064015b60405180910390fd5b3233146106885760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206d696e742066726f6d20636f6e7472616374730000000000006044820152606401610630565b600161069484846107d6565b106106e15760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206d696e74206d6f7265207468616e2031204e465400000000006044820152606401610630565b806001146107275760405162461bcd60e51b81526020600482015260136024820152726d696e74416d6f756e74206973206e6f74203160681b6044820152606401610630565b6000610731610e48565b905061073e3360146116fb565b816040516020016107509291906132fd565b60408051601f198184030181529181526001600160a01b0386166000908152600b6020908152919020825161078a93919290910190612aa9565b506001600160a01b0384166000908152600c6020908152604090912082516107b492840190612aa9565b506107d08484846040518060200160405280600081525061189d565b50505050565b60006001600160a01b0383166108415760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b6064820152608401610630565b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216637965db0b60e01b148061088c575061088c826119c0565b92915050565b336000908152600b602052604090208054606091906108b0906136c3565b80601f01602080910402602001604051908101604052809291908181526020018280546108dc906136c3565b80156109295780601f106108fe57610100808354040283529160200191610929565b820191906000526020600020905b81548152906001019060200180831161090c57829003601f168201915b5050505050905090565b6004546001600160a01b031633148061097157506109717fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42336113cf565b6109b75760405162461bcd60e51b815260206004820152601760248201527631b0b63632b91034b9903737ba103a34329030b236b4b760491b6044820152606401610630565b323314610a065760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74207472616e736665722066726f6d20636f6e74726163747300006044820152606401610630565b6107d084848484604051806020016040528060008152506119e5565b60068054610a2f906136c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5b906136c3565b8015610aa85780601f10610a7d57610100808354040283529160200191610aa8565b820191906000526020600020905b815481529060010190602001808311610a8b57829003601f168201915b505050505081565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250610b75610af4846110ea565b6040518060800160405280605e81526020016138eb605e91396040518060600160405280602c8152602001613949602c9139336000908152600c6020908152604091829020825180840184526004815263227d5d7d60e01b818401529251610b6196959493919201613189565b604051602081830303815290604052611b1d565b604051602001610b8692919061315a565b6040516020818303038152906040529050919050565b610ba4610def565b1515600114610be35760405162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0818db1bdcd95960aa1b6044820152606401610630565b323314610c325760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206d696e742066726f6d20636f6e7472616374730000000000006044820152606401610630565b610c3c33836107d6565b15610c895760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206d696e74206d6f7265207468616e2031204e465400000000006044820152606401610630565b336000908152600d602052604090205415610cd55760405162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481b5a5b9d60a21b6044820152606401610630565b80600114610d1b5760405162461bcd60e51b81526020600482015260136024820152726d696e74416d6f756e74206973206e6f74203160681b6044820152606401610630565b6000610d25610e48565b9050610d323360146116fb565b81604051602001610d449291906132fd565b60408051601f198184030181529181526001600160a01b0386166000908152600b60209081529190208251610d7e93919290910190612aa9565b506001600160a01b0384166000908152600c602090815260409091208251610da892840190612aa9565b50610dc48484846040518060200160405280600081525061189d565b336000908152600d60205260408120805460019290610de490849061361e565b909155505050505050565b60006363b04e704210158015610e0857506363b442f042105b15610e135750600190565b50600090565b90565b610e24611c84565b6000828152600a602090815260409091208251610e4392840190612aa9565b505050565b6060600061016d62015180610e616363a5c27042613669565b610e6b9190613636565b610e759190613745565b905060006018610e10610e8c6363a5c27042613669565b610e969190613636565b610ea09190613745565b90506000603c80610eb56363a5c27042613669565b610ebf9190613636565b610ec99190613745565b90506000603c610edd6363a5c27042613669565b610ee79190613745565b905060405180604001604052806007815260200166323032322f312f60c81b815250610f1285611cde565b610f1b85611cde565b610f2485611cde565b610f2d85611cde565b604051602001610f419594939291906131ed565b60405160208183030381529060405294505050505090565b6001600160a01b038516331480610f755750610f758533610541565b610f915760405162461bcd60e51b81526004016106309061351e565b610f9e8585858585611d72565b5050505050565b600082815260056020526040902060010154610fc081611f5d565b610e438383611f67565b6001600160a01b038116331461103a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610630565b6110448282611fed565b5050565b6000818152600860205260409020805460609190611065906136c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611091906136c3565b80156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b50505050509050919050565b336000908152600b6020526040812080546060929190611109906136c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611135906136c3565b80156111825780601f1061115757610100808354040283529160200191611182565b820191906000526020600020905b81548152906001019060200180831161116557829003601f168201915b505050505090506040518060600160405280603f815260200161386c603f91396000848152600860209081526040808320815180830183526013815272111610113232b9b1b934b83a34b7b7111d101160691b818501528885526009845282852083518085018552600d81526c1116101134b6b0b3b2911d101160991b818701528a8752600a86529584902093516112269796939592949193899390929101613280565b604051602081830303815290604052915050919050565b606081518351146112a25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610630565b600083516001600160401b038111156112bd576112bd61379b565b6040519080825280602002602001820160405280156112e6578160200160208202803683370190505b50905060005b845181101561135e5761133185828151811061130a5761130a613785565b602002602001015185838151811061132457611324613785565b60200260200101516107d6565b82828151811061134357611343613785565b60209081029190910101526113578161372a565b90506112ec565b509392505050565b61136e611c84565b60008281526009602090815260409091208251610e4392840190612aa9565b611395611c84565b81516113a8906006906020850190612aa9565b508051610e43906007906020840190612aa9565b6113c4611c84565b6113cd33612054565b565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60078054610a2f906136c3565b6110443383836120a6565b6000818152600a60205260409020805460609190611065906136c3565b60008281526005602052604090206001015461144a81611f5d565b610e438383611fed565b61145c611c84565b60008281526008602090815260409091208251610e4392840190612aa9565b6000818152600960205260409020805460609190611065906136c3565b336000908152600c602052604090208054606091906108b0906136c3565b6001600160a01b0385163314806114d257506114d28533610541565b6114ee5760405162461bcd60e51b81526004016106309061351e565b610f9e85858585856119e5565b611503611c84565b6001600160a01b0381166115685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610630565b61157181612054565b50565b3233146115c35760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206275726e2066726f6d20636f6e7472616374730000000000006044820152606401610630565b6115cd33836107d6565b6001146116345760405162461bcd60e51b815260206004820152602f60248201527f43616c6c65722073686f756c64206265204e4654206f776e657220627920696460448201526e08185b99081a185d99480c48139195608a1b6064820152608401610630565b336001600160a01b038416146116a05760405162461bcd60e51b815260206004820152602b60248201527f43616c6c65722073686f756c64206275726e206f776e204e46542c206e6f742060448201526a6f74686572206f6e65277360a81b6064820152608401610630565b806001146116f05760405162461bcd60e51b815260206004820152601760248201527f6275726e20616d6f756e742073686f756c6420626520310000000000000000006044820152606401610630565b610e43838383612187565b6060600061170a83600261364a565b61171590600261361e565b6001600160401b0381111561172c5761172c61379b565b6040519080825280601f01601f191660200182016040528015611756576020820181803683370190505b509050600360fc1b8160008151811061177157611771613785565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106117a0576117a0613785565b60200101906001600160f81b031916908160001a90535060006117c484600261364a565b6117cf90600161361e565b90505b6001811115611847576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061180357611803613785565b1a60f81b82828151811061181957611819613785565b60200101906001600160f81b031916908160001a90535060049490941c93611840816136ac565b90506117d2565b5083156118965760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610630565b9392505050565b6001600160a01b0384166118fd5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610630565b33600061190985612317565b9050600061191685612317565b905061192783600089858589612362565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061195790849061361e565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46119b783600089898989612564565b50505050505050565b60006001600160e01b03198216637965db0b60e01b148061088c575061088c826126cf565b6001600160a01b038416611a0b5760405162461bcd60e51b81526004016106309061356c565b336000611a1785612317565b90506000611a2485612317565b9050611a34838989858589612362565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015611a755760405162461bcd60e51b8152600401610630906135b1565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611ab290849061361e565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611b12848a8a8a8a8a612564565b505050505050505050565b6060815160001415611b3d57505060408051602081019091526000815290565b60006040518060600160405280604081526020016138ab6040913990506000600384516002611b6c919061361e565b611b769190613636565b611b8190600461364a565b90506000611b9082602061361e565b6001600160401b03811115611ba757611ba761379b565b6040519080825280601f01601f191660200182016040528015611bd1576020820181803683370190505b509050818152600183018586518101602084015b81831015611c3f5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401611be5565b600389510660018114611c595760028114611c6a57611c76565b613d3d60f01b600119830152611c76565b603d60f81b6000198301525b509398975050505050505050565b6004546001600160a01b031633146113cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610630565b60606000611ceb8361271f565b60010190506000816001600160401b03811115611d0a57611d0a61379b565b6040519080825280601f01601f191660200182016040528015611d34576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611d6d5761135e565b611d3e565b8151835114611dd45760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610630565b6001600160a01b038416611dfa5760405162461bcd60e51b81526004016106309061356c565b33611e09818787878787612362565b60005b8451811015611eef576000858281518110611e2957611e29613785565b602002602001015190506000858381518110611e4757611e47613785565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611e975760405162461bcd60e51b8152600401610630906135b1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611ed490849061361e565b9250508190555050505080611ee89061372a565b9050611e0c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611f3f929190613495565b60405180910390a4611f558187878787876127f7565b505050505050565b61157181336128c1565b611f7182826113cf565b6110445760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611fa93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611ff782826113cf565b156110445760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561211a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610630565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383166121e95760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610630565b3360006121f584612317565b9050600061220284612317565b905061222283876000858560405180602001604052806000815250612362565b6000858152602081815260408083206001600160a01b038a1684529091529020548481101561229f5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610630565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090526119b7565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061235157612351613785565b602090810291909101015292915050565b61236d8460006107d6565b156123ba5760405162461bcd60e51b815260206004820152601a60248201527f72656365697665722068617320616c72656164792031204e46540000000000006044820152606401610630565b6001600160a01b0385166000908152600e6020526040902054156124205760405162461bcd60e51b815260206004820152601960248201527f616c7265616479207472616e73666572656420312074696d65000000000000006044820152606401610630565b6001600160a01b0384166000908152600e60205260409020546124505761244b86868686868661291a565b6124df565b6001600160a01b038516158061246d57506001600160a01b038416155b6124d15760405162461bcd60e51b815260206004820152602f60248201527f4e6f6e5472616e736665727261626c6545524331313535546f6b656e3a206e6f60448201526e6e207472616e736665727261626c6560881b6064820152608401610630565b6124df86868686868661291a565b6001600160a01b0385166000908152600d602052604090205460011415611f55576001600160a01b0385166000908152600e6020526040812080546001929061252990849061361e565b90915550506001600160a01b0384166000908152600e6020526040812080546001929061255790849061361e565b9091555050505050505050565b6001600160a01b0384163b15611f555760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906125a8908990899088908890889060040161343d565b602060405180830381600087803b1580156125c257600080fd5b505af19250505080156125f2575060408051601f3d908101601f191682019092526125ef91810190612fa7565b60015b61269f576125fe6137b1565b806308c379a0141561263857506126136137cc565b8061261e575061263a565b8060405162461bcd60e51b815260040161063091906134c3565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610630565b6001600160e01b0319811663f23a6e6160e01b146119b75760405162461bcd60e51b8152600401610630906134d6565b60006001600160e01b03198216636cdb3d1360e11b148061270057506001600160e01b031982166303a24d0760e21b145b8061088c57506301ffc9a760e01b6001600160e01b031983161461088c565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061275e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061278a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106127a857662386f26fc10000830492506010015b6305f5e10083106127c0576305f5e100830492506008015b61271083106127d457612710830492506004015b606483106127e6576064830492506002015b600a831061088c5760010192915050565b6001600160a01b0384163b15611f555760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061283b90899089908890889088906004016133df565b602060405180830381600087803b15801561285557600080fd5b505af1925050508015612885575060408051601f3d908101601f1916820190925261288291810190612fa7565b60015b612891576125fe6137b1565b6001600160e01b0319811663bc197c8160e01b146119b75760405162461bcd60e51b8152600401610630906134d6565b6128cb82826113cf565b611044576128d881612a93565b6128e38360206116fb565b6040516020016128f492919061336a565b60408051601f198184030181529082905262461bcd60e51b8252610630916004016134c3565b6001600160a01b0385166129a15760005b835181101561299f5782818151811061294657612946613785565b60200260200101516003600086848151811061296457612964613785565b602002602001015181526020019081526020016000206000828254612989919061361e565b9091555061299890508161372a565b905061292b565b505b6001600160a01b038416611f555760005b83518110156119b75760008482815181106129cf576129cf613785565b6020026020010151905060008483815181106129ed576129ed613785565b6020026020010151905060006003600084815260200190815260200160002054905081811015612a705760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610630565b60009283526003602052604090922091039055612a8c8161372a565b90506129b2565b606061088c6001600160a01b03831660146116fb565b828054612ab5906136c3565b90600052602060002090601f016020900481019282612ad75760008555612b1d565b82601f10612af057805160ff1916838001178555612b1d565b82800160010185558215612b1d579182015b82811115612b1d578251825591602001919060010190612b02565b50612b29929150612b2d565b5090565b5b80821115612b295760008155600101612b2e565b80356001600160a01b0381168114612b5957600080fd5b919050565b600082601f830112612b6f57600080fd5b81356020612b7c826135fb565b604051612b8982826136fe565b8381528281019150858301600585901b87018401881015612ba957600080fd5b60005b85811015612bc857813584529284019290840190600101612bac565b5090979650505050505050565b600082601f830112612be657600080fd5b81356001600160401b03811115612bff57612bff61379b565b604051612c16601f8301601f1916602001826136fe565b818152846020838601011115612c2b57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612c5a57600080fd5b61189682612b42565b60008060408385031215612c7657600080fd5b612c7f83612b42565b9150612c8d60208401612b42565b90509250929050565b600080600080600060a08688031215612cae57600080fd5b612cb786612b42565b9450612cc560208701612b42565b935060408601356001600160401b0380821115612ce157600080fd5b612ced89838a01612b5e565b94506060880135915080821115612d0357600080fd5b612d0f89838a01612b5e565b93506080880135915080821115612d2557600080fd5b50612d3288828901612bd5565b9150509295509295909350565b60008060008060808587031215612d5557600080fd5b612d5e85612b42565b9350612d6c60208601612b42565b93969395505050506040820135916060013590565b600080600080600060a08688031215612d9957600080fd5b612da286612b42565b9450612db060208701612b42565b9350604086013592506060860135915060808601356001600160401b03811115612dd957600080fd5b612d3288828901612bd5565b60008060408385031215612df857600080fd5b612e0183612b42565b915060208301358015158114612e1657600080fd5b809150509250929050565b60008060408385031215612e3457600080fd5b612e3d83612b42565b946020939093013593505050565b600080600060608486031215612e6057600080fd5b612e6984612b42565b95602085013595506040909401359392505050565b60008060408385031215612e9157600080fd5b82356001600160401b0380821115612ea857600080fd5b818501915085601f830112612ebc57600080fd5b81356020612ec9826135fb565b604051612ed682826136fe565b8381528281019150858301600585901b870184018b1015612ef657600080fd5b600096505b84871015612f2057612f0c81612b42565b835260019690960195918301918301612efb565b5096505086013592505080821115612f3757600080fd5b50612f4485828601612b5e565b9150509250929050565b600060208284031215612f6057600080fd5b5035919050565b60008060408385031215612f7a57600080fd5b82359150612c8d60208401612b42565b600060208284031215612f9c57600080fd5b813561189681613855565b600060208284031215612fb957600080fd5b815161189681613855565b60008060408385031215612fd757600080fd5b82356001600160401b0380821115612fee57600080fd5b612ffa86838701612bd5565b9350602085013591508082111561301057600080fd5b50612f4485828601612bd5565b6000806040838503121561303057600080fd5b8235915060208301356001600160401b0381111561304d57600080fd5b612f4485828601612bd5565b600081518084526020808501945080840160005b838110156130895781518752958201959082019060010161306d565b509495945050505050565b600081518084526130ac816020860160208601613680565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806130da57607f831692505b60208084108214156130fc57634e487b7160e01b600052602260045260246000fd5b81801561311057600181146131215761314e565b60ff1986168952848901965061314e565b60008881526020902060005b868110156131465781548b82015290850190830161312d565b505084890196505b50505050505092915050565b6000835161316c818460208801613680565b835190830190613180818360208801613680565b01949350505050565b6000865161319b818460208b01613680565b8651908301906131af818360208b01613680565b86519101906131c2818360208a01613680565b6131ce818301876130c0565b91505083516131e1818360208801613680565b01979650505050505050565b600086516131ff818460208b01613680565b865190830190613213818360208b01613680565b6201016960ed1b91019081528551613232816003840160208a01613680565b808201915050601d60f91b8060038301528551613256816004850160208a01613680565b60049201918201528351613271816005840160208801613680565b01600501979650505050505050565b60008851613292818460208d01613680565b61329e8184018a6130c0565b905087516132b0818360208c01613680565b6132bc818301896130c0565b91505085516132cf818360208a01613680565b85519101906132e2818360208901613680565b6132ee818301866130c0565b9b9a5050505050505050505050565b706d696e746572206164647265737320697360781b815260008351613329816011850160208801613680565b740101030b7321036b4b73a32b2103a34b6b29034b99605d1b601191840191820152835161335e816026840160208801613680565b01602601949350505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516133a2816017850160208801613680565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516133d3816028840160208801613680565b01602801949350505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061340b90830186613059565b828103606084015261341d8186613059565b905082810360808401526134318185613094565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061347790830184613094565b979650505050505050565b6020815260006118966020830184613059565b6040815260006134a86040830185613059565b82810360208401526134ba8185613059565b95945050505050565b6020815260006118966020830184613094565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60006001600160401b038211156136145761361461379b565b5060051b60200190565b6000821982111561363157613631613759565b500190565b6000826136455761364561376f565b500490565b600081600019048311821515161561366457613664613759565b500290565b60008282101561367b5761367b613759565b500390565b60005b8381101561369b578181015183820152602001613683565b838111156107d05750506000910152565b6000816136bb576136bb613759565b506000190190565b600181811c908216806136d757607f821691505b602082108114156136f857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b03811182821017156137235761372361379b565b6040525050565b600060001982141561373e5761373e613759565b5060010190565b6000826137545761375461376f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115610e195760046000803e5060005160e01c90565b600060443d10156137da5790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561380957505050505090565b82850191508151818111156138215750505050505090565b843d870101602082850101111561383b5750505050505090565b61384a602082860101876136fe565b509095945050505050565b6001600160e01b03198116811461157157600080fdfe7b226e616d65223a20224368617261637465722044616f204e657720596561722032303233206772656574696e6720536f756c626f756e64204e4654202d204142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222c202261747472696275746573223a205b7b2274726169745f74797065223a20224861707079222c2276616c7565223a20224d4158227d2c7b2274726169745f74797065223a2022526162626974222c2276616c7565223a2022347468227d2c7b2274726169745f74797065223a20224772656574696e672054696d65222c2276616c7565223a2022a26469706673582212201881c4b10ee86e016464b786b2f40a6fa13c369e4d30545f2e6af280f17c1ee464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b4e6577596561723230323300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e5932303233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047878782f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102515760003560e01c80634f558e7911610146578063bd85b039116100c3578063e5ae639311610087578063e5ae639314610520578063e985e9c514610533578063f0930a941461056f578063f242432a14610577578063f2fde38b1461058a578063f5298aca1461059d57600080fd5b8063bd85b039146104b2578063bdc144e1146104d2578063c33e72e1146104e5578063d547741f146104fa578063e2e1bf8d1461050d57600080fd5b80638da5cb5b1161010a5780638da5cb5b1461046157806391d148541461047c57806395d89b411461048f578063a217fddf14610497578063a22cb4651461049f57600080fd5b80634f558e791461040b5780634f7ef2421461042d578063582a3be9146104405780636380188414610446578063715018a61461045957600080fd5b8063248a9ca3116101d45780632f2ff15d116101985780632f2ff15d1461039f57806336568abe146103b25780633eec734e146103c55780634378a6e3146103d85780634e1273f4146103eb57600080fd5b8063248a9ca31461032757806325f86d601461034a57806329cb924d1461035d5780632a0acc6a146103655780632eb2c2d61461038c57600080fd5b806306fdde031161021b57806306fdde03146102dc5780630e89341c146102e45780630ecae155146102f7578063156e29f61461030c578063195f142f1461031f57600080fd5b80624a84cb14610256578062fdd58e1461026b57806301ffc9a71461029157806303b591e3146102b45780630411b252146102c9575b600080fd5b610269610264366004612e4b565b6105b0565b005b61027e610279366004612e21565b6107d6565b6040519081526020015b60405180910390f35b6102a461029f366004612f8a565b610867565b6040519015158152602001610288565b6102bc610892565b60405161028891906134c3565b6102696102d7366004612d3f565b610933565b6102bc610a22565b6102bc6102f2366004612f4e565b610ab0565b336000908152600d602052604090205461027e565b61026961031a366004612e4b565b610b9c565b6102a4610def565b61027e610335366004612f4e565b60009081526005602052604090206001015490565b61026961035836600461301d565b610e1c565b6102bc610e48565b61027e7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b61026961039a366004612c96565b610f59565b6102696103ad366004612f67565b610fa5565b6102696103c0366004612f67565b610fca565b6102bc6103d3366004612f4e565b611048565b6102bc6103e6366004612f4e565b6110ea565b6103fe6103f9366004612e7e565b61123d565b6040516102889190613482565b6102a4610419366004612f4e565b600090815260036020526040902054151590565b61026961043b36600461301d565b611366565b4261027e565b610269610454366004612fc4565b61138d565b6102696113bc565b6004546040516001600160a01b039091168152602001610288565b6102a461048a366004612f67565b6113cf565b6102bc6113fa565b61027e600081565b6102696104ad366004612de5565b611407565b61027e6104c0366004612f4e565b60009081526003602052604090205490565b6102bc6104e0366004612f4e565b611412565b336000908152600e602052604090205461027e565b610269610508366004612f67565b61142f565b61026961051b36600461301d565b611454565b6102bc61052e366004612f4e565b61147b565b6102a4610541366004612c63565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102bc611498565b610269610585366004612d81565b6114b6565b610269610598366004612c48565b6114fb565b6102696105ab366004612e4b565b611574565b6004546001600160a01b03163314806105ee57506105ee7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42336113cf565b6106395760405162461bcd60e51b815260206004820152601760248201527631b0b63632b91034b9903737ba103a34329030b236b4b760491b60448201526064015b60405180910390fd5b3233146106885760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206d696e742066726f6d20636f6e7472616374730000000000006044820152606401610630565b600161069484846107d6565b106106e15760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206d696e74206d6f7265207468616e2031204e465400000000006044820152606401610630565b806001146107275760405162461bcd60e51b81526020600482015260136024820152726d696e74416d6f756e74206973206e6f74203160681b6044820152606401610630565b6000610731610e48565b905061073e3360146116fb565b816040516020016107509291906132fd565b60408051601f198184030181529181526001600160a01b0386166000908152600b6020908152919020825161078a93919290910190612aa9565b506001600160a01b0384166000908152600c6020908152604090912082516107b492840190612aa9565b506107d08484846040518060200160405280600081525061189d565b50505050565b60006001600160a01b0383166108415760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b6064820152608401610630565b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216637965db0b60e01b148061088c575061088c826119c0565b92915050565b336000908152600b602052604090208054606091906108b0906136c3565b80601f01602080910402602001604051908101604052809291908181526020018280546108dc906136c3565b80156109295780601f106108fe57610100808354040283529160200191610929565b820191906000526020600020905b81548152906001019060200180831161090c57829003601f168201915b5050505050905090565b6004546001600160a01b031633148061097157506109717fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42336113cf565b6109b75760405162461bcd60e51b815260206004820152601760248201527631b0b63632b91034b9903737ba103a34329030b236b4b760491b6044820152606401610630565b323314610a065760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74207472616e736665722066726f6d20636f6e74726163747300006044820152606401610630565b6107d084848484604051806020016040528060008152506119e5565b60068054610a2f906136c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5b906136c3565b8015610aa85780601f10610a7d57610100808354040283529160200191610aa8565b820191906000526020600020905b815481529060010190602001808311610a8b57829003601f168201915b505050505081565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250610b75610af4846110ea565b6040518060800160405280605e81526020016138eb605e91396040518060600160405280602c8152602001613949602c9139336000908152600c6020908152604091829020825180840184526004815263227d5d7d60e01b818401529251610b6196959493919201613189565b604051602081830303815290604052611b1d565b604051602001610b8692919061315a565b6040516020818303038152906040529050919050565b610ba4610def565b1515600114610be35760405162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0818db1bdcd95960aa1b6044820152606401610630565b323314610c325760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206d696e742066726f6d20636f6e7472616374730000000000006044820152606401610630565b610c3c33836107d6565b15610c895760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74206d696e74206d6f7265207468616e2031204e465400000000006044820152606401610630565b336000908152600d602052604090205415610cd55760405162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481b5a5b9d60a21b6044820152606401610630565b80600114610d1b5760405162461bcd60e51b81526020600482015260136024820152726d696e74416d6f756e74206973206e6f74203160681b6044820152606401610630565b6000610d25610e48565b9050610d323360146116fb565b81604051602001610d449291906132fd565b60408051601f198184030181529181526001600160a01b0386166000908152600b60209081529190208251610d7e93919290910190612aa9565b506001600160a01b0384166000908152600c602090815260409091208251610da892840190612aa9565b50610dc48484846040518060200160405280600081525061189d565b336000908152600d60205260408120805460019290610de490849061361e565b909155505050505050565b60006363b04e704210158015610e0857506363b442f042105b15610e135750600190565b50600090565b90565b610e24611c84565b6000828152600a602090815260409091208251610e4392840190612aa9565b505050565b6060600061016d62015180610e616363a5c27042613669565b610e6b9190613636565b610e759190613745565b905060006018610e10610e8c6363a5c27042613669565b610e969190613636565b610ea09190613745565b90506000603c80610eb56363a5c27042613669565b610ebf9190613636565b610ec99190613745565b90506000603c610edd6363a5c27042613669565b610ee79190613745565b905060405180604001604052806007815260200166323032322f312f60c81b815250610f1285611cde565b610f1b85611cde565b610f2485611cde565b610f2d85611cde565b604051602001610f419594939291906131ed565b60405160208183030381529060405294505050505090565b6001600160a01b038516331480610f755750610f758533610541565b610f915760405162461bcd60e51b81526004016106309061351e565b610f9e8585858585611d72565b5050505050565b600082815260056020526040902060010154610fc081611f5d565b610e438383611f67565b6001600160a01b038116331461103a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610630565b6110448282611fed565b5050565b6000818152600860205260409020805460609190611065906136c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611091906136c3565b80156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b50505050509050919050565b336000908152600b6020526040812080546060929190611109906136c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611135906136c3565b80156111825780601f1061115757610100808354040283529160200191611182565b820191906000526020600020905b81548152906001019060200180831161116557829003601f168201915b505050505090506040518060600160405280603f815260200161386c603f91396000848152600860209081526040808320815180830183526013815272111610113232b9b1b934b83a34b7b7111d101160691b818501528885526009845282852083518085018552600d81526c1116101134b6b0b3b2911d101160991b818701528a8752600a86529584902093516112269796939592949193899390929101613280565b604051602081830303815290604052915050919050565b606081518351146112a25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610630565b600083516001600160401b038111156112bd576112bd61379b565b6040519080825280602002602001820160405280156112e6578160200160208202803683370190505b50905060005b845181101561135e5761133185828151811061130a5761130a613785565b602002602001015185838151811061132457611324613785565b60200260200101516107d6565b82828151811061134357611343613785565b60209081029190910101526113578161372a565b90506112ec565b509392505050565b61136e611c84565b60008281526009602090815260409091208251610e4392840190612aa9565b611395611c84565b81516113a8906006906020850190612aa9565b508051610e43906007906020840190612aa9565b6113c4611c84565b6113cd33612054565b565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60078054610a2f906136c3565b6110443383836120a6565b6000818152600a60205260409020805460609190611065906136c3565b60008281526005602052604090206001015461144a81611f5d565b610e438383611fed565b61145c611c84565b60008281526008602090815260409091208251610e4392840190612aa9565b6000818152600960205260409020805460609190611065906136c3565b336000908152600c602052604090208054606091906108b0906136c3565b6001600160a01b0385163314806114d257506114d28533610541565b6114ee5760405162461bcd60e51b81526004016106309061351e565b610f9e85858585856119e5565b611503611c84565b6001600160a01b0381166115685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610630565b61157181612054565b50565b3233146115c35760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206275726e2066726f6d20636f6e7472616374730000000000006044820152606401610630565b6115cd33836107d6565b6001146116345760405162461bcd60e51b815260206004820152602f60248201527f43616c6c65722073686f756c64206265204e4654206f776e657220627920696460448201526e08185b99081a185d99480c48139195608a1b6064820152608401610630565b336001600160a01b038416146116a05760405162461bcd60e51b815260206004820152602b60248201527f43616c6c65722073686f756c64206275726e206f776e204e46542c206e6f742060448201526a6f74686572206f6e65277360a81b6064820152608401610630565b806001146116f05760405162461bcd60e51b815260206004820152601760248201527f6275726e20616d6f756e742073686f756c6420626520310000000000000000006044820152606401610630565b610e43838383612187565b6060600061170a83600261364a565b61171590600261361e565b6001600160401b0381111561172c5761172c61379b565b6040519080825280601f01601f191660200182016040528015611756576020820181803683370190505b509050600360fc1b8160008151811061177157611771613785565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106117a0576117a0613785565b60200101906001600160f81b031916908160001a90535060006117c484600261364a565b6117cf90600161361e565b90505b6001811115611847576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061180357611803613785565b1a60f81b82828151811061181957611819613785565b60200101906001600160f81b031916908160001a90535060049490941c93611840816136ac565b90506117d2565b5083156118965760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610630565b9392505050565b6001600160a01b0384166118fd5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610630565b33600061190985612317565b9050600061191685612317565b905061192783600089858589612362565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061195790849061361e565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46119b783600089898989612564565b50505050505050565b60006001600160e01b03198216637965db0b60e01b148061088c575061088c826126cf565b6001600160a01b038416611a0b5760405162461bcd60e51b81526004016106309061356c565b336000611a1785612317565b90506000611a2485612317565b9050611a34838989858589612362565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015611a755760405162461bcd60e51b8152600401610630906135b1565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611ab290849061361e565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611b12848a8a8a8a8a612564565b505050505050505050565b6060815160001415611b3d57505060408051602081019091526000815290565b60006040518060600160405280604081526020016138ab6040913990506000600384516002611b6c919061361e565b611b769190613636565b611b8190600461364a565b90506000611b9082602061361e565b6001600160401b03811115611ba757611ba761379b565b6040519080825280601f01601f191660200182016040528015611bd1576020820181803683370190505b509050818152600183018586518101602084015b81831015611c3f5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401611be5565b600389510660018114611c595760028114611c6a57611c76565b613d3d60f01b600119830152611c76565b603d60f81b6000198301525b509398975050505050505050565b6004546001600160a01b031633146113cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610630565b60606000611ceb8361271f565b60010190506000816001600160401b03811115611d0a57611d0a61379b565b6040519080825280601f01601f191660200182016040528015611d34576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611d6d5761135e565b611d3e565b8151835114611dd45760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610630565b6001600160a01b038416611dfa5760405162461bcd60e51b81526004016106309061356c565b33611e09818787878787612362565b60005b8451811015611eef576000858281518110611e2957611e29613785565b602002602001015190506000858381518110611e4757611e47613785565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611e975760405162461bcd60e51b8152600401610630906135b1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611ed490849061361e565b9250508190555050505080611ee89061372a565b9050611e0c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611f3f929190613495565b60405180910390a4611f558187878787876127f7565b505050505050565b61157181336128c1565b611f7182826113cf565b6110445760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611fa93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611ff782826113cf565b156110445760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561211a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610630565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383166121e95760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610630565b3360006121f584612317565b9050600061220284612317565b905061222283876000858560405180602001604052806000815250612362565b6000858152602081815260408083206001600160a01b038a1684529091529020548481101561229f5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610630565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090526119b7565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061235157612351613785565b602090810291909101015292915050565b61236d8460006107d6565b156123ba5760405162461bcd60e51b815260206004820152601a60248201527f72656365697665722068617320616c72656164792031204e46540000000000006044820152606401610630565b6001600160a01b0385166000908152600e6020526040902054156124205760405162461bcd60e51b815260206004820152601960248201527f616c7265616479207472616e73666572656420312074696d65000000000000006044820152606401610630565b6001600160a01b0384166000908152600e60205260409020546124505761244b86868686868661291a565b6124df565b6001600160a01b038516158061246d57506001600160a01b038416155b6124d15760405162461bcd60e51b815260206004820152602f60248201527f4e6f6e5472616e736665727261626c6545524331313535546f6b656e3a206e6f60448201526e6e207472616e736665727261626c6560881b6064820152608401610630565b6124df86868686868661291a565b6001600160a01b0385166000908152600d602052604090205460011415611f55576001600160a01b0385166000908152600e6020526040812080546001929061252990849061361e565b90915550506001600160a01b0384166000908152600e6020526040812080546001929061255790849061361e565b9091555050505050505050565b6001600160a01b0384163b15611f555760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906125a8908990899088908890889060040161343d565b602060405180830381600087803b1580156125c257600080fd5b505af19250505080156125f2575060408051601f3d908101601f191682019092526125ef91810190612fa7565b60015b61269f576125fe6137b1565b806308c379a0141561263857506126136137cc565b8061261e575061263a565b8060405162461bcd60e51b815260040161063091906134c3565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610630565b6001600160e01b0319811663f23a6e6160e01b146119b75760405162461bcd60e51b8152600401610630906134d6565b60006001600160e01b03198216636cdb3d1360e11b148061270057506001600160e01b031982166303a24d0760e21b145b8061088c57506301ffc9a760e01b6001600160e01b031983161461088c565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061275e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061278a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106127a857662386f26fc10000830492506010015b6305f5e10083106127c0576305f5e100830492506008015b61271083106127d457612710830492506004015b606483106127e6576064830492506002015b600a831061088c5760010192915050565b6001600160a01b0384163b15611f555760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061283b90899089908890889088906004016133df565b602060405180830381600087803b15801561285557600080fd5b505af1925050508015612885575060408051601f3d908101601f1916820190925261288291810190612fa7565b60015b612891576125fe6137b1565b6001600160e01b0319811663bc197c8160e01b146119b75760405162461bcd60e51b8152600401610630906134d6565b6128cb82826113cf565b611044576128d881612a93565b6128e38360206116fb565b6040516020016128f492919061336a565b60408051601f198184030181529082905262461bcd60e51b8252610630916004016134c3565b6001600160a01b0385166129a15760005b835181101561299f5782818151811061294657612946613785565b60200260200101516003600086848151811061296457612964613785565b602002602001015181526020019081526020016000206000828254612989919061361e565b9091555061299890508161372a565b905061292b565b505b6001600160a01b038416611f555760005b83518110156119b75760008482815181106129cf576129cf613785565b6020026020010151905060008483815181106129ed576129ed613785565b6020026020010151905060006003600084815260200190815260200160002054905081811015612a705760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610630565b60009283526003602052604090922091039055612a8c8161372a565b90506129b2565b606061088c6001600160a01b03831660146116fb565b828054612ab5906136c3565b90600052602060002090601f016020900481019282612ad75760008555612b1d565b82601f10612af057805160ff1916838001178555612b1d565b82800160010185558215612b1d579182015b82811115612b1d578251825591602001919060010190612b02565b50612b29929150612b2d565b5090565b5b80821115612b295760008155600101612b2e565b80356001600160a01b0381168114612b5957600080fd5b919050565b600082601f830112612b6f57600080fd5b81356020612b7c826135fb565b604051612b8982826136fe565b8381528281019150858301600585901b87018401881015612ba957600080fd5b60005b85811015612bc857813584529284019290840190600101612bac565b5090979650505050505050565b600082601f830112612be657600080fd5b81356001600160401b03811115612bff57612bff61379b565b604051612c16601f8301601f1916602001826136fe565b818152846020838601011115612c2b57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612c5a57600080fd5b61189682612b42565b60008060408385031215612c7657600080fd5b612c7f83612b42565b9150612c8d60208401612b42565b90509250929050565b600080600080600060a08688031215612cae57600080fd5b612cb786612b42565b9450612cc560208701612b42565b935060408601356001600160401b0380821115612ce157600080fd5b612ced89838a01612b5e565b94506060880135915080821115612d0357600080fd5b612d0f89838a01612b5e565b93506080880135915080821115612d2557600080fd5b50612d3288828901612bd5565b9150509295509295909350565b60008060008060808587031215612d5557600080fd5b612d5e85612b42565b9350612d6c60208601612b42565b93969395505050506040820135916060013590565b600080600080600060a08688031215612d9957600080fd5b612da286612b42565b9450612db060208701612b42565b9350604086013592506060860135915060808601356001600160401b03811115612dd957600080fd5b612d3288828901612bd5565b60008060408385031215612df857600080fd5b612e0183612b42565b915060208301358015158114612e1657600080fd5b809150509250929050565b60008060408385031215612e3457600080fd5b612e3d83612b42565b946020939093013593505050565b600080600060608486031215612e6057600080fd5b612e6984612b42565b95602085013595506040909401359392505050565b60008060408385031215612e9157600080fd5b82356001600160401b0380821115612ea857600080fd5b818501915085601f830112612ebc57600080fd5b81356020612ec9826135fb565b604051612ed682826136fe565b8381528281019150858301600585901b870184018b1015612ef657600080fd5b600096505b84871015612f2057612f0c81612b42565b835260019690960195918301918301612efb565b5096505086013592505080821115612f3757600080fd5b50612f4485828601612b5e565b9150509250929050565b600060208284031215612f6057600080fd5b5035919050565b60008060408385031215612f7a57600080fd5b82359150612c8d60208401612b42565b600060208284031215612f9c57600080fd5b813561189681613855565b600060208284031215612fb957600080fd5b815161189681613855565b60008060408385031215612fd757600080fd5b82356001600160401b0380821115612fee57600080fd5b612ffa86838701612bd5565b9350602085013591508082111561301057600080fd5b50612f4485828601612bd5565b6000806040838503121561303057600080fd5b8235915060208301356001600160401b0381111561304d57600080fd5b612f4485828601612bd5565b600081518084526020808501945080840160005b838110156130895781518752958201959082019060010161306d565b509495945050505050565b600081518084526130ac816020860160208601613680565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806130da57607f831692505b60208084108214156130fc57634e487b7160e01b600052602260045260246000fd5b81801561311057600181146131215761314e565b60ff1986168952848901965061314e565b60008881526020902060005b868110156131465781548b82015290850190830161312d565b505084890196505b50505050505092915050565b6000835161316c818460208801613680565b835190830190613180818360208801613680565b01949350505050565b6000865161319b818460208b01613680565b8651908301906131af818360208b01613680565b86519101906131c2818360208a01613680565b6131ce818301876130c0565b91505083516131e1818360208801613680565b01979650505050505050565b600086516131ff818460208b01613680565b865190830190613213818360208b01613680565b6201016960ed1b91019081528551613232816003840160208a01613680565b808201915050601d60f91b8060038301528551613256816004850160208a01613680565b60049201918201528351613271816005840160208801613680565b01600501979650505050505050565b60008851613292818460208d01613680565b61329e8184018a6130c0565b905087516132b0818360208c01613680565b6132bc818301896130c0565b91505085516132cf818360208a01613680565b85519101906132e2818360208901613680565b6132ee818301866130c0565b9b9a5050505050505050505050565b706d696e746572206164647265737320697360781b815260008351613329816011850160208801613680565b740101030b7321036b4b73a32b2103a34b6b29034b99605d1b601191840191820152835161335e816026840160208801613680565b01602601949350505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516133a2816017850160208801613680565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516133d3816028840160208801613680565b01602801949350505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061340b90830186613059565b828103606084015261341d8186613059565b905082810360808401526134318185613094565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061347790830184613094565b979650505050505050565b6020815260006118966020830184613059565b6040815260006134a86040830185613059565b82810360208401526134ba8185613059565b95945050505050565b6020815260006118966020830184613094565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60006001600160401b038211156136145761361461379b565b5060051b60200190565b6000821982111561363157613631613759565b500190565b6000826136455761364561376f565b500490565b600081600019048311821515161561366457613664613759565b500290565b60008282101561367b5761367b613759565b500390565b60005b8381101561369b578181015183820152602001613683565b838111156107d05750506000910152565b6000816136bb576136bb613759565b506000190190565b600181811c908216806136d757607f821691505b602082108114156136f857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b03811182821017156137235761372361379b565b6040525050565b600060001982141561373e5761373e613759565b5060010190565b6000826137545761375461376f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115610e195760046000803e5060005160e01c90565b600060443d10156137da5790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561380957505050505090565b82850191508151818111156138215750505050505090565b843d870101602082850101111561383b5750505050505090565b61384a602082860101876136fe565b509095945050505050565b6001600160e01b03198116811461157157600080fdfe7b226e616d65223a20224368617261637465722044616f204e657720596561722032303233206772656574696e6720536f756c626f756e64204e4654202d204142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222c202261747472696275746573223a205b7b2274726169745f74797065223a20224861707079222c2276616c7565223a20224d4158227d2c7b2274726169745f74797065223a2022526162626974222c2276616c7565223a2022347468227d2c7b2274726169745f74797065223a20224772656574696e672054696d65222c2276616c7565223a2022a26469706673582212201881c4b10ee86e016464b786b2f40a6fa13c369e4d30545f2e6af280f17c1ee464736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b4e6577596561723230323300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e5932303233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047878782f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): NewYear2023
Arg [1] : _symbol (string): NY2023
Arg [2] : uri_ (string): xxx/

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [4] : 4e65775965617232303233000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 4e59323032330000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 7878782f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

79922:10316:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83670:766;;;;;;:::i;:::-;;:::i;:::-;;57764:230;;;;;;:::i;:::-;;:::i;:::-;;;18063:25:1;;;18051:2;18036:18;57764:230:0;;;;;;;;80008:254;;;;;;:::i;:::-;;:::i;:::-;;;17890:14:1;;17883:22;17865:41;;17853:2;17838:18;80008:254:0;17725:187:1;87020:104:0;;;:::i;:::-;;;;;;;:::i;85229:235::-;;;;;;:::i;:::-;;:::i;80353:18::-;;;:::i;89371:226::-;;;;;;:::i;:::-;;:::i;88411:106::-;88498:10;88458:7;88485:24;;;:12;:24;;;;;;88411:106;;82685:946;;;;;;:::i;:::-;;:::i;82350:297::-;;;:::i;44386:131::-;;;;;;:::i;:::-;44460:7;44487:12;;;:6;:12;;;;;:22;;;;44386:131;87938:122;;;;;;:::i;:::-;;:::i;84477:560::-;;;:::i;80274:50::-;;80306:18;80274:50;;59707:438;;;;;;:::i;:::-;;:::i;44827:147::-;;;;;;:::i;:::-;;:::i;45971:218::-;;;;;;:::i;:::-;;:::i;87320:102::-;;;;;;:::i;:::-;;:::i;89080:241::-;;;;;;:::i;:::-;;:::i;58160:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;74240:122::-;;;;;;:::i;:::-;74297:4;74118:16;;;:12;:16;;;;;;-1:-1:-1;;;74240:122:0;87768:130;;;;;;:::i;:::-;;:::i;85075:100::-;85152:15;85075:100;;89651:153;;;;;;:::i;:::-;;:::i;90120:113::-;;;:::i;27147:87::-;27220:6;;27147:87;;-1:-1:-1;;;;;27220:6:0;;;15531:51:1;;15519:2;15504:18;27147:87:0;15385:203:1;42859:147:0;;;;;;:::i;:::-;;:::i;80402:20::-;;;:::i;41964:49::-;;42009:4;41964:49;;58757:155;;;;;;:::i;:::-;;:::i;74029:113::-;;;;;;:::i;:::-;74091:7;74118:16;;;:12;:16;;;;;;;74029:113;88101:106;;;;;;:::i;:::-;;:::i;88254:114::-;88349:10;88305:7;88332:28;;;:16;:28;;;;;;88254:114;;45267:149;;;;;;:::i;:::-;;:::i;87614:112::-;;;;;;:::i;:::-;;:::i;87465:110::-;;;;;;:::i;:::-;;:::i;58984:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;59107:27:0;;;59083:4;59107:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;58984:168;87172:108;;;:::i;59224:406::-;;;;;;:::i;:::-;;:::i;89847:210::-;;;;;;:::i;:::-;;:::i;86528:433::-;;;;;;:::i;:::-;;:::i;83670:766::-;27220:6;;-1:-1:-1;;;;;27220:6:0;25778:10;82098:23;;:53;;;82125:26;80306:18;82140:10;82125:7;:26::i;:::-;82076:126;;;;-1:-1:-1;;;82076:126:0;;27808:2:1;82076:126:0;;;27790:21:1;27847:2;27827:18;;;27820:30;-1:-1:-1;;;27866:18:1;;;27859:53;27929:18;;82076:126:0;;;;;;;;;83829:9:::1;83842:10;83829:23;83821:62;;;::::0;-1:-1:-1;;;83821:62:0;;23265:2:1;83821:62:0::1;::::0;::::1;23247:21:1::0;23304:2;23284:18;;;23277:30;23343:28;23323:18;;;23316:56;23389:18;;83821:62:0::1;23063:350:1::0;83821:62:0::1;83967:1;83945:19;83955:3;83960;83945:9;:19::i;:::-;:23;83937:63;;;::::0;-1:-1:-1;;;83937:63:0;;25097:2:1;83937:63:0::1;::::0;::::1;25079:21:1::0;25136:2;25116:18;;;25109:30;25175:29;25155:18;;;25148:57;25222:18;;83937:63:0::1;24895:351:1::0;83937:63:0::1;84054:7;84065:1;84054:12;84046:44;;;::::0;-1:-1:-1;;;84046:44:0;;23620:2:1;84046:44:0::1;::::0;::::1;23602:21:1::0;23659:2;23639:18;;;23632:30;-1:-1:-1;;;23678:18:1;;;23671:49;23737:18;;84046:44:0::1;23418:343:1::0;84046:44:0::1;84136:22;84161:16;:14;:16::i;:::-;84136:41:::0;-1:-1:-1;84248:53:0::1;84284:10;84298:2;84248:19;:53::i;:::-;84326:8;84211:124;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;84211:124:0;;::::1;::::0;;;;;;-1:-1:-1;;;;;84188:13:0;::::1;;::::0;;;:8:::1;84211:124;84188:13:::0;;;;;;:148;;::::1;::::0;:13;;:148;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;;84347:15:0;::::1;;::::0;;;:10:::1;:15;::::0;;;;;;;:26;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;84401:27;84407:3;84412;84417:7;84401:27;;;;;;;;;;;::::0;:5:::1;:27::i;:::-;83757:679;83670:766:::0;;;:::o;57764:230::-;57850:7;-1:-1:-1;;;;;57878:21:0;;57870:76;;;;-1:-1:-1;;;57870:76:0;;20863:2:1;57870:76:0;;;20845:21:1;20902:2;20882:18;;;20875:30;20941:34;20921:18;;;20914:62;-1:-1:-1;;;20992:18:1;;;20985:40;21042:19;;57870:76:0;20661:406:1;57870:76:0;-1:-1:-1;57964:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;57964:22:0;;;;;;;;;;;;57764:230::o;80008:254::-;80125:4;-1:-1:-1;;;;;;80158:47:0;;-1:-1:-1;;;80158:47:0;;:96;;;80218:36;80242:11;80218:23;:36::i;:::-;80142:112;80008:254;-1:-1:-1;;80008:254:0:o;87020:104::-;87105:10;87096:20;;;;:8;:20;;;;;87089:27;;87063:13;;87096:20;87089:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87020:104;:::o;85229:235::-;27220:6;;-1:-1:-1;;;;;27220:6:0;25778:10;82098:23;;:53;;;82125:26;80306:18;82140:10;82125:7;:26::i;:::-;82076:126;;;;-1:-1:-1;;;82076:126:0;;27808:2:1;82076:126:0;;;27790:21:1;27847:2;27827:18;;;27820:30;-1:-1:-1;;;27866:18:1;;;27859:53;27929:18;;82076:126:0;27606:347:1;82076:126:0;85345:9:::1;85358:10;85345:23;85337:66;;;::::0;-1:-1:-1;;;85337:66:0;;24738:2:1;85337:66:0::1;::::0;::::1;24720:21:1::0;24777:2;24757:18;;;24750:30;24816:32;24796:18;;;24789:60;24866:18;;85337:66:0::1;24536:354:1::0;85337:66:0::1;85414:42;85432:4;85438:2;85442;85446:6;85414:42;;;;;;;;;;;::::0;:17:::1;:42::i;80353:18::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;89371:226::-;89426:13;89483:3;;;;;;;;;;;;;;;;;89487:100;89531:17;89545:2;89531:13;:17::i;:::-;89549:3;;;;;;;;;;;;;;;;;89553;;;;;;;;;;;;;;;;;89568:10;89557:22;;;;:10;:22;;;;;;;;;89580:3;;;;;;;;;;-1:-1:-1;;;89580:3:0;;;;89514:70;;;;;;;89557:22;;89514:70;;:::i;:::-;;;;;;;;;;;;;89487:13;:100::i;:::-;89466:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;89452:137;;89371:226;;;:::o;82685:946::-;82770:15;:13;:15::i;:::-;:23;;82789:4;82770:23;82762:47;;;;-1:-1:-1;;;82762:47:0;;19295:2:1;82762:47:0;;;19277:21:1;19334:2;19314:18;;;19307:30;-1:-1:-1;;;19353:18:1;;;19346:41;19404:18;;82762:47:0;19093:335:1;82762:47:0;82828:9;82841:10;82828:23;82820:62;;;;-1:-1:-1;;;82820:62:0;;23265:2:1;82820:62:0;;;23247:21:1;23304:2;23284:18;;;23277:30;23343:28;23323:18;;;23316:56;23389:18;;82820:62:0;23063:350:1;82820:62:0;82977:26;82987:10;82999:3;82977:9;:26::i;:::-;:31;82969:71;;;;-1:-1:-1;;;82969:71:0;;25097:2:1;82969:71:0;;;25079:21:1;25136:2;25116:18;;;25109:30;25175:29;25155:18;;;25148:57;25222:18;;82969:71:0;24895:351:1;82969:71:0;83072:10;83059:24;;;;:12;:24;;;;;;:29;83051:54;;;;-1:-1:-1;;;83051:54:0;;28160:2:1;83051:54:0;;;28142:21:1;28199:2;28179:18;;;28172:30;-1:-1:-1;;;28218:18:1;;;28211:42;28270:18;;83051:54:0;27958:336:1;83051:54:0;83124:7;83135:1;83124:12;83116:44;;;;-1:-1:-1;;;83116:44:0;;23620:2:1;83116:44:0;;;23602:21:1;23659:2;23639:18;;;23632:30;-1:-1:-1;;;23678:18:1;;;23671:49;23737:18;;83116:44:0;23418:343:1;83116:44:0;83307:22;83332:16;:14;:16::i;:::-;83307:41;-1:-1:-1;83419:53:0;83455:10;83469:2;83419:19;:53::i;:::-;83497:8;83382:124;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;83382:124:0;;;;;;;;;-1:-1:-1;;;;;83359:13:0;;;;;;:8;83382:124;83359:13;;;;;;:148;;;;:13;;:148;;;;;:::i;:::-;-1:-1:-1;;;;;;83518:15:0;;;;;;:10;:15;;;;;;;;:26;;;;;;;;:::i;:::-;;83555:27;83561:3;83566;83571:7;83555:27;;;;;;;;;;;;:5;:27::i;:::-;83606:10;83593:24;;;;:12;:24;;;;;:29;;83621:1;;83593:24;:29;;83621:1;;83593:29;:::i;:::-;;;;-1:-1:-1;;;;;;82685:946:0:o;82350:297::-;82396:4;82435:10;82416:15;:29;;:61;;;;;82467:10;82449:15;:28;82416:61;82412:228;;;-1:-1:-1;82510:4:0;;82350:297::o;82412:228::-;-1:-1:-1;82577:13:0;;82350:297::o;82412:228::-;82350:297;:::o;87938:122::-;27033:13;:11;:13::i;:::-;88026:17:::1;::::0;;;:8:::1;:17;::::0;;;;;;;:26;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;87938:122:::0;;:::o;84477:560::-;84524:13;84613:11;84671:3;84661:5;84629:28;84647:10;84629:15;:28;:::i;:::-;84628:38;;;;:::i;:::-;84627:47;;;;:::i;:::-;84613:61;-1:-1:-1;84685:12:0;84743:2;84734:4;84702:28;84720:10;84702:15;:28;:::i;:::-;84701:37;;;;:::i;:::-;84700:45;;;;:::i;:::-;84685:60;-1:-1:-1;84756:11:0;84812:2;;84772:28;84790:10;84772:15;:28;:::i;:::-;84771:36;;;;:::i;:::-;84770:44;;;;:::i;:::-;84756:58;-1:-1:-1;84825:11:0;84873:2;84840:28;84858:10;84840:15;:28;:::i;:::-;84839:36;;;;:::i;:::-;84825:50;;84917:4;;;;;;;;;;;;;-1:-1:-1;;;84917:4:0;;;84923:21;84940:3;84923:16;:21::i;:::-;84953:22;84970:4;84953:16;:22::i;:::-;84980:21;84997:3;84980:16;:21::i;:::-;85006;85023:3;85006:16;:21::i;:::-;84900:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84886:143;;;;;;84477:560;:::o;59707:438::-;-1:-1:-1;;;;;59940:20:0;;25778:10;59940:20;;:60;;-1:-1:-1;59964:36:0;59981:4;25778:10;58984:168;:::i;59964:36::-;59918:156;;;;-1:-1:-1;;;59918:156:0;;;;;;;:::i;:::-;60085:52;60108:4;60114:2;60118:3;60123:7;60132:4;60085:22;:52::i;:::-;59707:438;;;;;:::o;44827:147::-;44460:7;44487:12;;;:6;:12;;;;;:22;;;42455:16;42466:4;42455:10;:16::i;:::-;44941:25:::1;44952:4;44958:7;44941:10;:25::i;45971:218::-:0;-1:-1:-1;;;;;46067:23:0;;25778:10;46067:23;46059:83;;;;-1:-1:-1;;;46059:83:0;;30087:2:1;46059:83:0;;;30069:21:1;30126:2;30106:18;;;30099:30;30165:34;30145:18;;;30138:62;-1:-1:-1;;;30216:18:1;;;30209:45;30271:19;;46059:83:0;29885:411:1;46059:83:0;46155:26;46167:4;46173:7;46155:11;:26::i;:::-;45971:218;;:::o;87320:102::-;87404:10;;;;:6;:10;;;;;87397:17;;87371:13;;87404:10;87397:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87320:102;;;:::o;89080:241::-;89201:10;89169:20;89192;;;:8;:20;;;;;89169:43;;89143:13;;89169:20;89192;89169:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89254:3;;;;;;;;;;;;;;;;;89258:10;;;;:6;:10;;;;;;;;89269:3;;;;;;;;;;-1:-1:-1;;;89269:3:0;;;;89273:14;;;:10;:14;;;;;89295:3;;;;;;;;;;-1:-1:-1;;;89295:3:0;;;;89299:12;;;:8;:12;;;;;;89237:75;;;;;89258:10;;89269:3;;89273:14;;89288:6;;89295:3;;89299:12;89237:75;;:::i;:::-;;;;;;;;;;;;;89223:90;;;89080:241;;;:::o;58160:524::-;58316:16;58377:3;:10;58358:8;:15;:29;58350:83;;;;-1:-1:-1;;;58350:83:0;;27398:2:1;58350:83:0;;;27380:21:1;27437:2;27417:18;;;27410:30;27476:34;27456:18;;;27449:62;-1:-1:-1;;;27527:18:1;;;27520:39;27576:19;;58350:83:0;27196:405:1;58350:83:0;58446:30;58493:8;:15;-1:-1:-1;;;;;58479:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58479:30:0;;58446:63;;58527:9;58522:122;58546:8;:15;58542:1;:19;58522:122;;;58602:30;58612:8;58621:1;58612:11;;;;;;;;:::i;:::-;;;;;;;58625:3;58629:1;58625:6;;;;;;;;:::i;:::-;;;;;;;58602:9;:30::i;:::-;58583:13;58597:1;58583:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;58563:3;;;:::i;:::-;;;58522:122;;;-1:-1:-1;58663:13:0;58160:524;-1:-1:-1;;;58160:524:0:o;87768:130::-;27033:13;:11;:13::i;:::-;87860:19:::1;::::0;;;:10:::1;:19;::::0;;;;;;;:30;;::::1;::::0;;::::1;::::0;::::1;:::i;89651:153::-:0;27033:13;:11;:13::i;:::-;89753:14;;::::1;::::0;:4:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;89778:18:0;;::::1;::::0;:6:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;90120:113::-:0;27033:13;:11;:13::i;:::-;90186:39:::1;90213:10;90186:18;:39::i;:::-;90120:113::o:0;42859:147::-;42945:4;42969:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;42969:29:0;;;;;;;;;;;;;;;42859:147::o;80402:20::-;;;;;;;:::i;58757:155::-;58852:52;25778:10;58885:8;58895;58852:18;:52::i;88101:106::-;88187:12;;;;:8;:12;;;;;88180:19;;88154:13;;88187:12;88180:19;;;:::i;45267:149::-;44460:7;44487:12;;;:6;:12;;;;;:22;;;42455:16;42466:4;42455:10;:16::i;:::-;45382:26:::1;45394:4;45400:7;45382:11;:26::i;87614:112::-:0;27033:13;:11;:13::i;:::-;87697:14:::1;::::0;;;:6:::1;:14;::::0;;;;;;;:21;;::::1;::::0;;::::1;::::0;::::1;:::i;87465:110::-:0;87553:14;;;;:10;:14;;;;;87546:21;;87520:13;;87553:14;87546:21;;;:::i;87172:108::-;87261:10;87250:22;;;;:10;:22;;;;;87243:29;;87217:13;;87250:22;87243:29;;;:::i;59224:406::-;-1:-1:-1;;;;;59432:20:0;;25778:10;59432:20;;:60;;-1:-1:-1;59456:36:0;59473:4;25778:10;58984:168;:::i;59456:36::-;59410:156;;;;-1:-1:-1;;;59410:156:0;;;;;;;:::i;:::-;59577:45;59595:4;59601:2;59605;59609:6;59617:4;59577:17;:45::i;89847:210::-;27033:13;:11;:13::i;:::-;-1:-1:-1;;;;;89945:22:0;::::1;89937:73;;;::::0;-1:-1:-1;;;89937:73:0;;19635:2:1;89937:73:0::1;::::0;::::1;19617:21:1::0;19674:2;19654:18;;;19647:30;19713:34;19693:18;;;19686:62;-1:-1:-1;;;19764:18:1;;;19757:36;19810:19;;89937:73:0::1;19433:402:1::0;89937:73:0::1;90021:28;90040:8;90021:18;:28::i;:::-;89847:210:::0;:::o;86528:433::-;86615:9;86628:10;86615:23;86607:62;;;;-1:-1:-1;;;86607:62:0;;27043:2:1;86607:62:0;;;27025:21:1;27082:2;27062:18;;;27055:30;27121:28;27101:18;;;27094:56;27167:18;;86607:62:0;26841:350:1;86607:62:0;86688:26;86698:10;86710:3;86688:9;:26::i;:::-;86718:1;86688:31;86680:91;;;;-1:-1:-1;;;86680:91:0;;20042:2:1;86680:91:0;;;20024:21:1;20081:2;20061:18;;;20054:30;20120:34;20100:18;;;20093:62;-1:-1:-1;;;20171:18:1;;;20164:45;20226:19;;86680:91:0;19840:411:1;86680:91:0;86790:10;-1:-1:-1;;;;;86790:19:0;;;86782:75;;;;-1:-1:-1;;;86782:75:0;;26631:2:1;86782:75:0;;;26613:21:1;26670:2;26650:18;;;26643:30;26709:34;26689:18;;;26682:62;-1:-1:-1;;;26760:18:1;;;26753:41;26811:19;;86782:75:0;26429:407:1;86782:75:0;86876:7;86887:1;86876:12;86868:48;;;;-1:-1:-1;;;86868:48:0;;25453:2:1;86868:48:0;;;25435:21:1;25492:2;25472:18;;;25465:30;25531:25;25511:18;;;25504:53;25574:18;;86868:48:0;25251:347:1;86868:48:0;86927:26;86933:5;86940:3;86945:7;86927:5;:26::i;21216:447::-;21291:13;21317:19;21349:10;21353:6;21349:1;:10;:::i;:::-;:14;;21362:1;21349:14;:::i;:::-;-1:-1:-1;;;;;21339:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21339:25:0;;21317:47;;-1:-1:-1;;;21375:6:0;21382:1;21375:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;21375:15:0;;;;;;;;;-1:-1:-1;;;21401:6:0;21408:1;21401:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;21401:15:0;;;;;;;;-1:-1:-1;21432:9:0;21444:10;21448:6;21444:1;:10;:::i;:::-;:14;;21457:1;21444:14;:::i;:::-;21432:26;;21427:131;21464:1;21460;:5;21427:131;;;-1:-1:-1;;;21508:5:0;21516:3;21508:11;21499:21;;;;;;;:::i;:::-;;;;21487:6;21494:1;21487:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;21487:33:0;;;;;;;;-1:-1:-1;21545:1:0;21535:11;;;;;21467:3;;;:::i;:::-;;;21427:131;;;-1:-1:-1;21576:10:0;;21568:55;;;;-1:-1:-1;;;21568:55:0;;18525:2:1;21568:55:0;;;18507:21:1;;;18544:18;;;18537:30;18603:34;18583:18;;;18576:62;18655:18;;21568:55:0;18323:356:1;21568:55:0;21648:6;21216:447;-1:-1:-1;;;21216:447:0:o;64405:729::-;-1:-1:-1;;;;;64558:16:0;;64550:62;;;;-1:-1:-1;;;64550:62:0;;28910:2:1;64550:62:0;;;28892:21:1;28949:2;28929:18;;;28922:30;28988:34;28968:18;;;28961:62;-1:-1:-1;;;29039:18:1;;;29032:31;29080:19;;64550:62:0;28708:397:1;64550:62:0;25778:10;64625:16;64690:21;64708:2;64690:17;:21::i;:::-;64667:44;;64722:24;64749:25;64767:6;64749:17;:25::i;:::-;64722:52;;64787:66;64808:8;64826:1;64830:2;64834:3;64839:7;64848:4;64787:20;:66::i;:::-;64866:9;:13;;;;;;;;;;;-1:-1:-1;;;;;64866:17:0;;;;;;;;;:27;;64887:6;;64866:9;:27;;64887:6;;64866:27;:::i;:::-;;;;-1:-1:-1;;64909:52:0;;;30657:25:1;;;30713:2;30698:18;;30691:34;;;-1:-1:-1;;;;;64909:52:0;;;;64942:1;;64909:52;;;;;;30630:18:1;64909:52:0;;;;;;;65052:74;65083:8;65101:1;65105:2;65109;65113:6;65121:4;65052:30;:74::i;:::-;64539:595;;;64405:729;;;;:::o;42563:204::-;42648:4;-1:-1:-1;;;;;;42672:47:0;;-1:-1:-1;;;42672:47:0;;:87;;;42723:36;42747:11;42723:23;:36::i;60609:974::-;-1:-1:-1;;;;;60797:16:0;;60789:66;;;;-1:-1:-1;;;60789:66:0;;;;;;;:::i;:::-;25778:10;60868:16;60933:21;60951:2;60933:17;:21::i;:::-;60910:44;;60965:24;60992:25;61010:6;60992:17;:25::i;:::-;60965:52;;61030:60;61051:8;61061:4;61067:2;61071:3;61076:7;61085:4;61030:20;:60::i;:::-;61103:19;61125:13;;;;;;;;;;;-1:-1:-1;;;;;61125:19:0;;;;;;;;;;61163:21;;;;61155:76;;;;-1:-1:-1;;;61155:76:0;;;;;;;:::i;:::-;61267:9;:13;;;;;;;;;;;-1:-1:-1;;;;;61267:19:0;;;;;;;;;;61289:20;;;61267:42;;61331:17;;;;;;;:27;;61289:20;;61267:9;61331:27;;61289:20;;61331:27;:::i;:::-;;;;-1:-1:-1;;61376:46:0;;;30657:25:1;;;30713:2;30698:18;;30691:34;;;-1:-1:-1;;;;;61376:46:0;;;;;;;;;;;;;;30630:18:1;61376:46:0;;;;;;;61507:68;61538:8;61548:4;61554:2;61558;61562:6;61570:4;61507:30;:68::i;:::-;60778:805;;;;60609:974;;;;;:::o;4841:1931::-;4899:13;4929:4;:11;4944:1;4929:16;4925:31;;;-1:-1:-1;;4947:9:0;;;;;;;;;-1:-1:-1;4947:9:0;;;4841:1931::o;4925:31::-;5008:19;5030:5;;;;;;;;;;;;;;;;;5008:27;;5087:18;5133:1;5114:4;:11;5128:1;5114:15;;;;:::i;:::-;5113:21;;;;:::i;:::-;5108:27;;:1;:27;:::i;:::-;5087:48;-1:-1:-1;5218:20:0;5252:15;5087:48;5265:2;5252:15;:::i;:::-;-1:-1:-1;;;;;5241:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5241:27:0;;5218:50;;5365:10;5357:6;5350:26;5460:1;5453:5;5449:13;5519:4;5570;5564:11;5555:7;5551:25;5666:2;5658:6;5654:15;5739:780;5758:6;5749:7;5746:19;5739:780;;;5824:1;5811:15;;;5890:14;;6028:4;6016:2;6012:14;;;6008:25;;5994:40;;5988:47;5983:3;5979:57;;;5961:76;;6156:2;6152:14;;;6148:25;;6134:40;;6128:47;6119:57;;6082:1;6067:17;;6101:76;6297:1;6292:14;;;6288:25;;6274:40;;6268:47;6259:57;;6207:17;;;6241:76;6428:25;;6414:40;;6408:47;6399:57;;6347:17;;;6381:76;;;;6487:17;;5739:780;;;6592:1;6585:4;6579:11;6575:19;6613:1;6608:54;;;;6681:1;6676:52;;;;6568:160;;6608:54;-1:-1:-1;;;;;6624:17:0;;6617:43;6608:54;;6676:52;-1:-1:-1;;;;;6692:17:0;;6685:41;6568:160;-1:-1:-1;6758:6:0;;4841:1931;-1:-1:-1;;;;;;;;4841:1931:0:o;27312:132::-;27220:6;;-1:-1:-1;;;;;27220:6:0;25778:10;27376:23;27368:68;;;;-1:-1:-1;;;27368:68:0;;23968:2:1;27368:68:0;;;23950:21:1;;;23987:18;;;23980:30;24046:34;24026:18;;;24019:62;24098:18;;27368:68:0;23766:356:1;20084:716:0;20140:13;20191:14;20208:17;20219:5;20208:10;:17::i;:::-;20228:1;20208:21;20191:38;;20244:20;20278:6;-1:-1:-1;;;;;20267:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20267:18:0;-1:-1:-1;20244:41:0;-1:-1:-1;20409:28:0;;;20425:2;20409:28;20466:288;-1:-1:-1;;20498:5:0;-1:-1:-1;;;20635:2:0;20624:14;;20619:30;20498:5;20606:44;20696:2;20687:11;;;-1:-1:-1;20721:10:0;20717:21;;20733:5;;20717:21;20466:288;;61941:1146;62168:7;:14;62154:3;:10;:28;62146:81;;;;-1:-1:-1;;;62146:81:0;;28501:2:1;62146:81:0;;;28483:21:1;28540:2;28520:18;;;28513:30;28579:34;28559:18;;;28552:62;-1:-1:-1;;;28630:18:1;;;28623:38;28678:19;;62146:81:0;28299:404:1;62146:81:0;-1:-1:-1;;;;;62246:16:0;;62238:66;;;;-1:-1:-1;;;62238:66:0;;;;;;;:::i;:::-;25778:10;62361:60;25778:10;62392:4;62398:2;62402:3;62407:7;62416:4;62361:20;:60::i;:::-;62439:9;62434:421;62458:3;:10;62454:1;:14;62434:421;;;62490:10;62503:3;62507:1;62503:6;;;;;;;;:::i;:::-;;;;;;;62490:19;;62524:14;62541:7;62549:1;62541:10;;;;;;;;:::i;:::-;;;;;;;;;;;;62568:19;62590:13;;;;;;;;;;-1:-1:-1;;;;;62590:19:0;;;;;;;;;;;;62541:10;;-1:-1:-1;62632:21:0;;;;62624:76;;;;-1:-1:-1;;;62624:76:0;;;;;;;:::i;:::-;62744:9;:13;;;;;;;;;;;-1:-1:-1;;;;;62744:19:0;;;;;;;;;;62766:20;;;62744:42;;62816:17;;;;;;;:27;;62766:20;;62744:9;62816:27;;62766:20;;62816:27;:::i;:::-;;;;;;;;62475:380;;;62470:3;;;;:::i;:::-;;;62434:421;;;;62902:2;-1:-1:-1;;;;;62872:47:0;62896:4;-1:-1:-1;;;;;62872:47:0;62886:8;-1:-1:-1;;;;;62872:47:0;;62906:3;62911:7;62872:47;;;;;;;:::i;:::-;;;;;;;;63004:75;63040:8;63050:4;63056:2;63060:3;63065:7;63074:4;63004:35;:75::i;:::-;62135:952;61941:1146;;;;;:::o;43310:105::-;43377:30;43388:4;25778:10;43377;:30::i;47568:238::-;47652:22;47660:4;47666:7;47652;:22::i;:::-;47647:152;;47691:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;47691:29:0;;;;;;;;;:36;;-1:-1:-1;;47691:36:0;47723:4;47691:36;;;47774:12;25778:10;;25698:98;47774:12;-1:-1:-1;;;;;47747:40:0;47765:7;-1:-1:-1;;;;;47747:40:0;47759:4;47747:40;;;;;;;;;;47568:238;;:::o;47986:239::-;48070:22;48078:4;48084:7;48070;:22::i;:::-;48066:152;;;48141:5;48109:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;48109:29:0;;;;;;;;;;:37;;-1:-1:-1;;48109:37:0;;;48166:40;25778:10;;48109:12;;48166:40;;48141:5;48166:40;47986:239;;:::o;28414:191::-;28507:6;;;-1:-1:-1;;;;;28524:17:0;;;-1:-1:-1;;;;;;28524:17:0;;;;;;;28557:40;;28507:6;;;28524:17;28507:6;;28557:40;;28488:16;;28557:40;28477:128;28414:191;:::o;68818:331::-;68973:8;-1:-1:-1;;;;;68964:17:0;:5;-1:-1:-1;;;;;68964:17:0;;;68956:71;;;;-1:-1:-1;;;68956:71:0;;26221:2:1;68956:71:0;;;26203:21:1;26260:2;26240:18;;;26233:30;26299:34;26279:18;;;26272:62;-1:-1:-1;;;26350:18:1;;;26343:39;26399:19;;68956:71:0;26019:405:1;68956:71:0;-1:-1:-1;;;;;69038:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;69038:46:0;;;;;;;;;;69100:41;;17865::1;;;69100::0;;17838:18:1;69100:41:0;;;;;;;68818:331;;;:::o;66648:808::-;-1:-1:-1;;;;;66775:18:0;;66767:66;;;;-1:-1:-1;;;66767:66:0;;22450:2:1;66767:66:0;;;22432:21:1;22489:2;22469:18;;;22462:30;22528:34;22508:18;;;22501:62;-1:-1:-1;;;22579:18:1;;;22572:33;22622:19;;66767:66:0;22248:399:1;66767:66:0;25778:10;66846:16;66911:21;66929:2;66911:17;:21::i;:::-;66888:44;;66943:24;66970:25;66988:6;66970:17;:25::i;:::-;66943:52;;67008:66;67029:8;67039:4;67053:1;67057:3;67062:7;67008:66;;;;;;;;;;;;:20;:66::i;:::-;67087:19;67109:13;;;;;;;;;;;-1:-1:-1;;;;;67109:19:0;;;;;;;;;;67147:21;;;;67139:70;;;;-1:-1:-1;;;67139:70:0;;20458:2:1;67139:70:0;;;20440:21:1;20497:2;20477:18;;;20470:30;20536:34;20516:18;;;20509:62;-1:-1:-1;;;20587:18:1;;;20580:34;20631:19;;67139:70:0;20256:400:1;67139:70:0;67245:9;:13;;;;;;;;;;;-1:-1:-1;;;;;67245:19:0;;;;;;;;;;;;67267:20;;;67245:42;;67316:54;;30657:25:1;;;30698:18;;;30691:34;;;67245:19:0;;67316:54;;;;;;30630:18:1;67316:54:0;;;;;;;67383:65;;;;;;;;;67427:1;67383:65;;;61941:1146;73084:198;73204:16;;;73218:1;73204:16;;;;;;;;;73150;;73179:22;;73204:16;;;;;;;;;;;;-1:-1:-1;73204:16:0;73179:41;;73242:7;73231:5;73237:1;73231:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;73269:5;73084:198;-1:-1:-1;;73084:198:0:o;85502:990::-;85825:16;85835:2;85839:1;85825:9;:16::i;:::-;:21;85817:60;;;;-1:-1:-1;;;85817:60:0;;21689:2:1;85817:60:0;;;21671:21:1;21728:2;21708:18;;;21701:30;21767:28;21747:18;;;21740:56;21813:18;;85817:60:0;21487:350:1;85817:60:0;-1:-1:-1;;;;;85943:22:0;;;;;;:16;:22;;;;;;:27;85935:65;;;;-1:-1:-1;;;85935:65:0;;29312:2:1;85935:65:0;;;29294:21:1;29351:2;29331:18;;;29324:30;29390:27;29370:18;;;29363:55;29435:18;;85935:65:0;29110:349:1;85935:65:0;-1:-1:-1;;;;;86015:20:0;;;;;;:16;:20;;;;;;86011:337;;86058:66;86085:8;86095:4;86101:2;86105:3;86110:7;86119:4;86058:26;:66::i;:::-;86011:337;;;-1:-1:-1;;;;;86165:18:0;;;;:38;;-1:-1:-1;;;;;;86187:16:0;;;86165:38;86157:98;;;;-1:-1:-1;;;86157:98:0;;25805:2:1;86157:98:0;;;25787:21:1;25844:2;25824:18;;;25817:30;25883:34;25863:18;;;25856:62;-1:-1:-1;;;25934:18:1;;;25927:45;25989:19;;86157:98:0;25603:411:1;86157:98:0;86270:66;86297:8;86307:4;86313:2;86317:3;86322:7;86331:4;86270:26;:66::i;:::-;-1:-1:-1;;;;;86362:18:0;;;;;;:12;:18;;;;;;86384:1;86362:23;86358:126;;;-1:-1:-1;;;;;86403:22:0;;;;;;:16;:22;;;;;:27;;86429:1;;86403:22;:27;;86429:1;;86403:27;:::i;:::-;;;;-1:-1:-1;;;;;;;86446:20:0;;;;;;:16;:20;;;;;:25;;86470:1;;86446:20;:25;;86470:1;;86446:25;:::i;:::-;;;;-1:-1:-1;;85502:990:0;;;;;;:::o;71511:744::-;-1:-1:-1;;;;;71726:13:0;;30140:19;:23;71722:526;;71762:72;;-1:-1:-1;;;71762:72:0;;-1:-1:-1;;;;;71762:38:0;;;;;:72;;71801:8;;71811:4;;71817:2;;71821:6;;71829:4;;71762:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71762:72:0;;;;;;;;-1:-1:-1;;71762:72:0;;;;;;;;;;;;:::i;:::-;;;71758:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;72110:6;72103:14;;-1:-1:-1;;;72103:14:0;;;;;;;;:::i;71758:479::-;;;72159:62;;-1:-1:-1;;;72159:62:0;;29666:2:1;72159:62:0;;;29648:21:1;29705:2;29685:18;;;29678:30;29744:34;29724:18;;;29717:62;-1:-1:-1;;;29795:18:1;;;29788:50;29855:19;;72159:62:0;29464:416:1;71758:479:0;-1:-1:-1;;;;;;71884:55:0;;-1:-1:-1;;;71884:55:0;71880:154;;71964:50;;-1:-1:-1;;;71964:50:0;;;;;;;:::i;56787:310::-;56889:4;-1:-1:-1;;;;;;56926:41:0;;-1:-1:-1;;;56926:41:0;;:110;;-1:-1:-1;;;;;;;56984:52:0;;-1:-1:-1;;;56984:52:0;56926:110;:163;;;-1:-1:-1;;;;;;;;;;39931:40:0;;;57053:36;39822:157;16950:922;17003:7;;-1:-1:-1;;;17081:15:0;;17077:102;;-1:-1:-1;;;17117:15:0;;;-1:-1:-1;17161:2:0;17151:12;17077:102;17206:6;17197:5;:15;17193:102;;17242:6;17233:15;;;-1:-1:-1;17277:2:0;17267:12;17193:102;17322:6;17313:5;:15;17309:102;;17358:6;17349:15;;;-1:-1:-1;17393:2:0;17383:12;17309:102;17438:5;17429;:14;17425:99;;17473:5;17464:14;;;-1:-1:-1;17507:1:0;17497:11;17425:99;17551:5;17542;:14;17538:99;;17586:5;17577:14;;;-1:-1:-1;17620:1:0;17610:11;17538:99;17664:5;17655;:14;17651:99;;17699:5;17690:14;;;-1:-1:-1;17733:1:0;17723:11;17651:99;17777:5;17768;:14;17764:66;;17813:1;17803:11;17858:6;16950:922;-1:-1:-1;;16950:922:0:o;72263:813::-;-1:-1:-1;;;;;72503:13:0;;30140:19;:23;72499:570;;72539:79;;-1:-1:-1;;;72539:79:0;;-1:-1:-1;;;;;72539:43:0;;;;;:79;;72583:8;;72593:4;;72599:3;;72604:7;;72613:4;;72539:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72539:79:0;;;;;;;;-1:-1:-1;;72539:79:0;;;;;;;;;;;;:::i;:::-;;;72535:523;;;;:::i;:::-;-1:-1:-1;;;;;;72700:60:0;;-1:-1:-1;;;72700:60:0;72696:159;;72785:50;;-1:-1:-1;;;72785:50:0;;;;;;;:::i;43705:492::-;43794:22;43802:4;43808:7;43794;:22::i;:::-;43789:401;;43982:28;44002:7;43982:19;:28::i;:::-;44083:38;44111:4;44118:2;44083:19;:38::i;:::-;43887:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;43887:257:0;;;;;;;;;;-1:-1:-1;;;43833:345:0;;;;;;;:::i;74437:931::-;-1:-1:-1;;;;;74759:18:0;;74755:160;;74799:9;74794:110;74818:3;:10;74814:1;:14;74794:110;;;74878:7;74886:1;74878:10;;;;;;;;:::i;:::-;;;;;;;74854:12;:20;74867:3;74871:1;74867:6;;;;;;;;:::i;:::-;;;;;;;74854:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;74830:3:0;;-1:-1:-1;74830:3:0;;:::i;:::-;;;74794:110;;;;74755:160;-1:-1:-1;;;;;74931:16:0;;74927:434;;74969:9;74964:386;74988:3;:10;74984:1;:14;74964:386;;;75024:10;75037:3;75041:1;75037:6;;;;;;;;:::i;:::-;;;;;;;75024:19;;75062:14;75079:7;75087:1;75079:10;;;;;;;;:::i;:::-;;;;;;;75062:27;;75108:14;75125:12;:16;75138:2;75125:16;;;;;;;;;;;;75108:33;;75178:6;75168;:16;;75160:69;;;;-1:-1:-1;;;75160:69:0;;24329:2:1;75160:69:0;;;24311:21:1;24368:2;24348:18;;;24341:30;24407:34;24387:18;;;24380:62;-1:-1:-1;;;24458:18:1;;;24451:38;24506:19;;75160:69:0;24127:404:1;75160:69:0;75281:16;;;;:12;:16;;;;;;75300:15;;75281:34;;75000:3;;;:::i;:::-;;;74964:386;;21820:151;21878:13;21911:52;-1:-1:-1;;;;;21923:22:0;;19975:2;21911:11;:52::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:735::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:43;442:2;402:43;:::i;:::-;474:2;468:9;486:31;514:2;506:6;486:31;:::i;:::-;552:18;;;586:15;;;;-1:-1:-1;621:15:1;;;671:1;667:10;;;655:23;;651:32;;648:41;-1:-1:-1;645:61:1;;;702:1;699;692:12;645:61;724:1;734:163;748:2;745:1;742:9;734:163;;;805:17;;793:30;;843:12;;;;875;;;;766:1;759:9;734:163;;;-1:-1:-1;915:6:1;;192:735;-1:-1:-1;;;;;;;192:735:1:o;932:555::-;974:5;1027:3;1020:4;1012:6;1008:17;1004:27;994:55;;1045:1;1042;1035:12;994:55;1081:6;1068:20;-1:-1:-1;;;;;1103:2:1;1100:26;1097:52;;;1129:18;;:::i;:::-;1178:2;1172:9;1190:67;1245:2;1226:13;;-1:-1:-1;;1222:27:1;1251:4;1218:38;1172:9;1190:67;:::i;:::-;1281:2;1273:6;1266:18;1327:3;1320:4;1315:2;1307:6;1303:15;1299:26;1296:35;1293:55;;;1344:1;1341;1334:12;1293:55;1408:2;1401:4;1393:6;1389:17;1382:4;1374:6;1370:17;1357:54;1455:1;1431:15;;;1448:4;1427:26;1420:37;;;;1435:6;932:555;-1:-1:-1;;;932:555:1:o;1492:186::-;1551:6;1604:2;1592:9;1583:7;1579:23;1575:32;1572:52;;;1620:1;1617;1610:12;1572:52;1643:29;1662:9;1643:29;:::i;1683:260::-;1751:6;1759;1812:2;1800:9;1791:7;1787:23;1783:32;1780:52;;;1828:1;1825;1818:12;1780:52;1851:29;1870:9;1851:29;:::i;:::-;1841:39;;1899:38;1933:2;1922:9;1918:18;1899:38;:::i;:::-;1889:48;;1683:260;;;;;:::o;1948:943::-;2102:6;2110;2118;2126;2134;2187:3;2175:9;2166:7;2162:23;2158:33;2155:53;;;2204:1;2201;2194:12;2155:53;2227:29;2246:9;2227:29;:::i;:::-;2217:39;;2275:38;2309:2;2298:9;2294:18;2275:38;:::i;:::-;2265:48;;2364:2;2353:9;2349:18;2336:32;-1:-1:-1;;;;;2428:2:1;2420:6;2417:14;2414:34;;;2444:1;2441;2434:12;2414:34;2467:61;2520:7;2511:6;2500:9;2496:22;2467:61;:::i;:::-;2457:71;;2581:2;2570:9;2566:18;2553:32;2537:48;;2610:2;2600:8;2597:16;2594:36;;;2626:1;2623;2616:12;2594:36;2649:63;2704:7;2693:8;2682:9;2678:24;2649:63;:::i;:::-;2639:73;;2765:3;2754:9;2750:19;2737:33;2721:49;;2795:2;2785:8;2782:16;2779:36;;;2811:1;2808;2801:12;2779:36;;2834:51;2877:7;2866:8;2855:9;2851:24;2834:51;:::i;:::-;2824:61;;;1948:943;;;;;;;;:::o;2896:397::-;2982:6;2990;2998;3006;3059:3;3047:9;3038:7;3034:23;3030:33;3027:53;;;3076:1;3073;3066:12;3027:53;3099:29;3118:9;3099:29;:::i;:::-;3089:39;;3147:38;3181:2;3170:9;3166:18;3147:38;:::i;:::-;2896:397;;3137:48;;-1:-1:-1;;;;3232:2:1;3217:18;;3204:32;;3283:2;3268:18;3255:32;;2896:397::o;3298:606::-;3402:6;3410;3418;3426;3434;3487:3;3475:9;3466:7;3462:23;3458:33;3455:53;;;3504:1;3501;3494:12;3455:53;3527:29;3546:9;3527:29;:::i;:::-;3517:39;;3575:38;3609:2;3598:9;3594:18;3575:38;:::i;:::-;3565:48;;3660:2;3649:9;3645:18;3632:32;3622:42;;3711:2;3700:9;3696:18;3683:32;3673:42;;3766:3;3755:9;3751:19;3738:33;-1:-1:-1;;;;;3786:6:1;3783:30;3780:50;;;3826:1;3823;3816:12;3780:50;3849:49;3890:7;3881:6;3870:9;3866:22;3849:49;:::i;3909:347::-;3974:6;3982;4035:2;4023:9;4014:7;4010:23;4006:32;4003:52;;;4051:1;4048;4041:12;4003:52;4074:29;4093:9;4074:29;:::i;:::-;4064:39;;4153:2;4142:9;4138:18;4125:32;4200:5;4193:13;4186:21;4179:5;4176:32;4166:60;;4222:1;4219;4212:12;4166:60;4245:5;4235:15;;;3909:347;;;;;:::o;4261:254::-;4329:6;4337;4390:2;4378:9;4369:7;4365:23;4361:32;4358:52;;;4406:1;4403;4396:12;4358:52;4429:29;4448:9;4429:29;:::i;:::-;4419:39;4505:2;4490:18;;;;4477:32;;-1:-1:-1;;;4261:254:1:o;4520:322::-;4597:6;4605;4613;4666:2;4654:9;4645:7;4641:23;4637:32;4634:52;;;4682:1;4679;4672:12;4634:52;4705:29;4724:9;4705:29;:::i;:::-;4695:39;4781:2;4766:18;;4753:32;;-1:-1:-1;4832:2:1;4817:18;;;4804:32;;4520:322;-1:-1:-1;;;4520:322:1:o;4847:1219::-;4965:6;4973;5026:2;5014:9;5005:7;5001:23;4997:32;4994:52;;;5042:1;5039;5032:12;4994:52;5082:9;5069:23;-1:-1:-1;;;;;5152:2:1;5144:6;5141:14;5138:34;;;5168:1;5165;5158:12;5138:34;5206:6;5195:9;5191:22;5181:32;;5251:7;5244:4;5240:2;5236:13;5232:27;5222:55;;5273:1;5270;5263:12;5222:55;5309:2;5296:16;5331:4;5354:43;5394:2;5354:43;:::i;:::-;5426:2;5420:9;5438:31;5466:2;5458:6;5438:31;:::i;:::-;5504:18;;;5538:15;;;;-1:-1:-1;5573:11:1;;;5615:1;5611:10;;;5603:19;;5599:28;;5596:41;-1:-1:-1;5593:61:1;;;5650:1;5647;5640:12;5593:61;5672:1;5663:10;;5682:169;5696:2;5693:1;5690:9;5682:169;;;5753:23;5772:3;5753:23;:::i;:::-;5741:36;;5714:1;5707:9;;;;;5797:12;;;;5829;;5682:169;;;-1:-1:-1;5870:6:1;-1:-1:-1;;5914:18:1;;5901:32;;-1:-1:-1;;5945:16:1;;;5942:36;;;5974:1;5971;5964:12;5942:36;;5997:63;6052:7;6041:8;6030:9;6026:24;5997:63;:::i;:::-;5987:73;;;4847:1219;;;;;:::o;6071:180::-;6130:6;6183:2;6171:9;6162:7;6158:23;6154:32;6151:52;;;6199:1;6196;6189:12;6151:52;-1:-1:-1;6222:23:1;;6071:180;-1:-1:-1;6071:180:1:o;6256:254::-;6324:6;6332;6385:2;6373:9;6364:7;6360:23;6356:32;6353:52;;;6401:1;6398;6391:12;6353:52;6437:9;6424:23;6414:33;;6466:38;6500:2;6489:9;6485:18;6466:38;:::i;6515:245::-;6573:6;6626:2;6614:9;6605:7;6601:23;6597:32;6594:52;;;6642:1;6639;6632:12;6594:52;6681:9;6668:23;6700:30;6724:5;6700:30;:::i;6765:249::-;6834:6;6887:2;6875:9;6866:7;6862:23;6858:32;6855:52;;;6903:1;6900;6893:12;6855:52;6935:9;6929:16;6954:30;6978:5;6954:30;:::i;7019:541::-;7107:6;7115;7168:2;7156:9;7147:7;7143:23;7139:32;7136:52;;;7184:1;7181;7174:12;7136:52;7224:9;7211:23;-1:-1:-1;;;;;7294:2:1;7286:6;7283:14;7280:34;;;7310:1;7307;7300:12;7280:34;7333:49;7374:7;7365:6;7354:9;7350:22;7333:49;:::i;:::-;7323:59;;7435:2;7424:9;7420:18;7407:32;7391:48;;7464:2;7454:8;7451:16;7448:36;;;7480:1;7477;7470:12;7448:36;;7503:51;7546:7;7535:8;7524:9;7520:24;7503:51;:::i;7750:389::-;7828:6;7836;7889:2;7877:9;7868:7;7864:23;7860:32;7857:52;;;7905:1;7902;7895:12;7857:52;7941:9;7928:23;7918:33;;8002:2;7991:9;7987:18;7974:32;-1:-1:-1;;;;;8021:6:1;8018:30;8015:50;;;8061:1;8058;8051:12;8015:50;8084:49;8125:7;8116:6;8105:9;8101:22;8084:49;:::i;8144:435::-;8197:3;8235:5;8229:12;8262:6;8257:3;8250:19;8288:4;8317:2;8312:3;8308:12;8301:19;;8354:2;8347:5;8343:14;8375:1;8385:169;8399:6;8396:1;8393:13;8385:169;;;8460:13;;8448:26;;8494:12;;;;8529:15;;;;8421:1;8414:9;8385:169;;;-1:-1:-1;8570:3:1;;8144:435;-1:-1:-1;;;;;8144:435:1:o;8584:257::-;8625:3;8663:5;8657:12;8690:6;8685:3;8678:19;8706:63;8762:6;8755:4;8750:3;8746:14;8739:4;8732:5;8728:16;8706:63;:::i;:::-;8823:2;8802:15;-1:-1:-1;;8798:29:1;8789:39;;;;8830:4;8785:50;;8584:257;-1:-1:-1;;8584:257:1:o;8846:973::-;8931:12;;8896:3;;8986:1;9006:18;;;;9059;;;;9086:61;;9140:4;9132:6;9128:17;9118:27;;9086:61;9166:2;9214;9206:6;9203:14;9183:18;9180:38;9177:161;;;9260:10;9255:3;9251:20;9248:1;9241:31;9295:4;9292:1;9285:15;9323:4;9320:1;9313:15;9177:161;9354:18;9381:104;;;;9499:1;9494:319;;;;9347:466;;9381:104;-1:-1:-1;;9414:24:1;;9402:37;;9459:16;;;;-1:-1:-1;9381:104:1;;9494:319;30997:1;30990:14;;;31034:4;31021:18;;9588:1;9602:165;9616:6;9613:1;9610:13;9602:165;;;9694:14;;9681:11;;;9674:35;9737:16;;;;9631:10;;9602:165;;;9606:3;;9796:6;9791:3;9787:16;9780:23;;9347:466;;;;;;;8846:973;;;;:::o;9824:470::-;10003:3;10041:6;10035:13;10057:53;10103:6;10098:3;10091:4;10083:6;10079:17;10057:53;:::i;:::-;10173:13;;10132:16;;;;10195:57;10173:13;10132:16;10229:4;10217:17;;10195:57;:::i;:::-;10268:20;;9824:470;-1:-1:-1;;;;9824:470:1:o;10299:929::-;10619:3;10657:6;10651:13;10673:53;10719:6;10714:3;10707:4;10699:6;10695:17;10673:53;:::i;:::-;10789:13;;10748:16;;;;10811:57;10789:13;10748:16;10845:4;10833:17;;10811:57;:::i;:::-;10935:13;;10890:20;;;10957:57;10935:13;10890:20;10991:4;10979:17;;10957:57;:::i;:::-;11033:55;11078:8;11071:5;11067:20;11059:6;11033:55;:::i;:::-;11023:65;;;11119:6;11113:13;11135:54;11180:8;11176:2;11169:4;11161:6;11157:17;11135:54;:::i;:::-;11205:17;;10299:929;-1:-1:-1;;;;;;;10299:929:1:o;11233:1482::-;11859:3;11897:6;11891:13;11913:53;11959:6;11954:3;11947:4;11939:6;11935:17;11913:53;:::i;:::-;12029:13;;11988:16;;;;12051:57;12029:13;11988:16;12085:4;12073:17;;12051:57;:::i;:::-;-1:-1:-1;;;12130:20:1;;12159;;;12204:13;;12226:65;12204:13;12278:1;12267:13;;12260:4;12248:17;;12226:65;:::i;:::-;12321:8;12314:5;12310:20;12300:30;;;-1:-1:-1;;;12380:2:1;12376:1;12372:2;12368:10;12361:22;12414:6;12408:13;12430:62;12483:8;12479:1;12475:2;12471:10;12464:4;12456:6;12452:17;12430:62;:::i;:::-;12552:1;12511:17;;12544:10;;;12537:22;12584:13;;12606:62;12584:13;12655:1;12647:10;;12640:4;12628:17;;12606:62;:::i;:::-;12688:17;12707:1;12684:25;;11233:1482;-1:-1:-1;;;;;;;11233:1482:1:o;12720:1080::-;13130:3;13168:6;13162:13;13184:53;13230:6;13225:3;13218:4;13210:6;13206:17;13184:53;:::i;:::-;13256:51;13299:6;13294:3;13290:16;13282:6;13256:51;:::i;:::-;13246:61;;13338:6;13332:13;13354:54;13399:8;13395:2;13388:4;13380:6;13376:17;13354:54;:::i;:::-;13427:52;13469:8;13465:2;13461:17;13453:6;13427:52;:::i;:::-;13417:62;;;13510:6;13504:13;13526:54;13571:8;13567:2;13560:4;13552:6;13548:17;13526:54;:::i;:::-;13644:13;;13602:17;;;13666:57;13644:13;13602:17;13700:4;13688:17;;13666:57;:::i;:::-;13739:55;13784:8;13777:5;13773:20;13765:6;13739:55;:::i;:::-;13732:62;12720:1080;-1:-1:-1;;;;;;;;;;;12720:1080:1:o;13805:784::-;-1:-1:-1;;;14211:3:1;14204:32;14186:3;14265:6;14259:13;14281:62;14336:6;14331:2;14326:3;14322:12;14315:4;14307:6;14303:17;14281:62;:::i;:::-;-1:-1:-1;;;14402:2:1;14362:16;;;14394:11;;;14387:44;14456:13;;14478:63;14456:13;14527:2;14519:11;;14512:4;14500:17;;14478:63;:::i;:::-;14561:17;14580:2;14557:26;;13805:784;-1:-1:-1;;;;13805:784:1:o;14594:786::-;15005:25;15000:3;14993:38;14975:3;15060:6;15054:13;15076:62;15131:6;15126:2;15121:3;15117:12;15110:4;15102:6;15098:17;15076:62;:::i;:::-;-1:-1:-1;;;15197:2:1;15157:16;;;15189:11;;;15182:40;15247:13;;15269:63;15247:13;15318:2;15310:11;;15303:4;15291:17;;15269:63;:::i;:::-;15352:17;15371:2;15348:26;;14594:786;-1:-1:-1;;;;14594:786:1:o;15593:826::-;-1:-1:-1;;;;;15990:15:1;;;15972:34;;16042:15;;16037:2;16022:18;;16015:43;15952:3;16089:2;16074:18;;16067:31;;;15915:4;;16121:57;;16158:19;;16150:6;16121:57;:::i;:::-;16226:9;16218:6;16214:22;16209:2;16198:9;16194:18;16187:50;16260:44;16297:6;16289;16260:44;:::i;:::-;16246:58;;16353:9;16345:6;16341:22;16335:3;16324:9;16320:19;16313:51;16381:32;16406:6;16398;16381:32;:::i;:::-;16373:40;15593:826;-1:-1:-1;;;;;;;;15593:826:1:o;16424:560::-;-1:-1:-1;;;;;16721:15:1;;;16703:34;;16773:15;;16768:2;16753:18;;16746:43;16820:2;16805:18;;16798:34;;;16863:2;16848:18;;16841:34;;;16683:3;16906;16891:19;;16884:32;;;16646:4;;16933:45;;16958:19;;16950:6;16933:45;:::i;:::-;16925:53;16424:560;-1:-1:-1;;;;;;;16424:560:1:o;16989:261::-;17168:2;17157:9;17150:21;17131:4;17188:56;17240:2;17229:9;17225:18;17217:6;17188:56;:::i;17255:465::-;17512:2;17501:9;17494:21;17475:4;17538:56;17590:2;17579:9;17575:18;17567:6;17538:56;:::i;:::-;17642:9;17634:6;17630:22;17625:2;17614:9;17610:18;17603:50;17670:44;17707:6;17699;17670:44;:::i;:::-;17662:52;17255:465;-1:-1:-1;;;;;17255:465:1:o;18099:219::-;18248:2;18237:9;18230:21;18211:4;18268:44;18308:2;18297:9;18293:18;18285:6;18268:44;:::i;18684:404::-;18886:2;18868:21;;;18925:2;18905:18;;;18898:30;18964:34;18959:2;18944:18;;18937:62;-1:-1:-1;;;19030:2:1;19015:18;;19008:38;19078:3;19063:19;;18684:404::o;21072:410::-;21274:2;21256:21;;;21313:2;21293:18;;;21286:30;21352:34;21347:2;21332:18;;21325:62;-1:-1:-1;;;21418:2:1;21403:18;;21396:44;21472:3;21457:19;;21072:410::o;21842:401::-;22044:2;22026:21;;;22083:2;22063:18;;;22056:30;22122:34;22117:2;22102:18;;22095:62;-1:-1:-1;;;22188:2:1;22173:18;;22166:35;22233:3;22218:19;;21842:401::o;22652:406::-;22854:2;22836:21;;;22893:2;22873:18;;;22866:30;22932:34;22927:2;22912:18;;22905:62;-1:-1:-1;;;22998:2:1;22983:18;;22976:40;23048:3;23033:19;;22652:406::o;30736:183::-;30796:4;-1:-1:-1;;;;;30821:6:1;30818:30;30815:56;;;30851:18;;:::i;:::-;-1:-1:-1;30896:1:1;30892:14;30908:4;30888:25;;30736:183::o;31050:128::-;31090:3;31121:1;31117:6;31114:1;31111:13;31108:39;;;31127:18;;:::i;:::-;-1:-1:-1;31163:9:1;;31050:128::o;31183:120::-;31223:1;31249;31239:35;;31254:18;;:::i;:::-;-1:-1:-1;31288:9:1;;31183:120::o;31308:168::-;31348:7;31414:1;31410;31406:6;31402:14;31399:1;31396:21;31391:1;31384:9;31377:17;31373:45;31370:71;;;31421:18;;:::i;:::-;-1:-1:-1;31461:9:1;;31308:168::o;31481:125::-;31521:4;31549:1;31546;31543:8;31540:34;;;31554:18;;:::i;:::-;-1:-1:-1;31591:9:1;;31481:125::o;31611:258::-;31683:1;31693:113;31707:6;31704:1;31701:13;31693:113;;;31783:11;;;31777:18;31764:11;;;31757:39;31729:2;31722:10;31693:113;;;31824:6;31821:1;31818:13;31815:48;;;-1:-1:-1;;31859:1:1;31841:16;;31834:27;31611:258::o;31874:136::-;31913:3;31941:5;31931:39;;31950:18;;:::i;:::-;-1:-1:-1;;;31986:18:1;;31874:136::o;32015:380::-;32094:1;32090:12;;;;32137;;;32158:61;;32212:4;32204:6;32200:17;32190:27;;32158:61;32265:2;32257:6;32254:14;32234:18;32231:38;32228:161;;;32311:10;32306:3;32302:20;32299:1;32292:31;32346:4;32343:1;32336:15;32374:4;32371:1;32364:15;32228:161;;32015:380;;;:::o;32400:249::-;32510:2;32491:13;;-1:-1:-1;;32487:27:1;32475:40;;-1:-1:-1;;;;;32530:34:1;;32566:22;;;32527:62;32524:88;;;32592:18;;:::i;:::-;32628:2;32621:22;-1:-1:-1;;32400:249:1:o;32654:135::-;32693:3;-1:-1:-1;;32714:17:1;;32711:43;;;32734:18;;:::i;:::-;-1:-1:-1;32781:1:1;32770:13;;32654:135::o;32794:112::-;32826:1;32852;32842:35;;32857:18;;:::i;:::-;-1:-1:-1;32891:9:1;;32794:112::o;32911:127::-;32972:10;32967:3;32963:20;32960:1;32953:31;33003:4;33000:1;32993:15;33027:4;33024:1;33017:15;33043:127;33104:10;33099:3;33095:20;33092:1;33085:31;33135:4;33132:1;33125:15;33159:4;33156:1;33149:15;33175:127;33236:10;33231:3;33227:20;33224:1;33217:31;33267:4;33264:1;33257:15;33291:4;33288:1;33281:15;33307:127;33368:10;33363:3;33359:20;33356:1;33349:31;33399:4;33396:1;33389:15;33423:4;33420:1;33413:15;33439:179;33474:3;33516:1;33498:16;33495:23;33492:120;;;33562:1;33559;33556;33541:23;-1:-1:-1;33599:1:1;33593:8;33588:3;33584:18;33439:179;:::o;33623:671::-;33662:3;33704:4;33686:16;33683:26;33680:39;;;33623:671;:::o;33680:39::-;33746:2;33740:9;-1:-1:-1;;33811:16:1;33807:25;;33804:1;33740:9;33783:50;33862:4;33856:11;33886:16;-1:-1:-1;;;;;33992:2:1;33985:4;33977:6;33973:17;33970:25;33965:2;33957:6;33954:14;33951:45;33948:58;;;33999:5;;;;;33623:671;:::o;33948:58::-;34036:6;34030:4;34026:17;34015:28;;34072:3;34066:10;34099:2;34091:6;34088:14;34085:27;;;34105:5;;;;;;33623:671;:::o;34085:27::-;34189:2;34170:16;34164:4;34160:27;34156:36;34149:4;34140:6;34135:3;34131:16;34127:27;34124:69;34121:82;;;34196:5;;;;;;33623:671;:::o;34121:82::-;34212:57;34263:4;34254:6;34246;34242:19;34238:30;34232:4;34212:57;:::i;:::-;-1:-1:-1;34285:3:1;;33623:671;-1:-1:-1;;;;;33623:671:1:o;34299:131::-;-1:-1:-1;;;;;;34373:32:1;;34363:43;;34353:71;;34420:1;34417;34410:12

Swarm Source

ipfs://1881c4b10ee86e016464b786b2f40a6fa13c369e4d30545f2e6af280f17c1ee4
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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