// File: contracts/MATE.sol



// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @title: YUO.+MATE
/// @author: manifold.xyz

import "./manifold/ERC721Creator.sol";

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                                                                                                                //
//                                                                                                                                                                                                                //
//                                                                                                                                                                                                                //
//                                                                                     ......                                                                     .......                                         //
//                ..gMMMMMMMMNNJ, ...JJ..                                    .....  .MMMMMMMMMN,.            ..(gNNNNNag.,       ....                         ..MMMMMMMMMMm,                                      //
//             .gMMMMMMMMMMMMMMMMMM#""HMMN,        .......    .MMMMMa,    .dMMMMMMN&M#"!` _7"MMMMN,       .gMMMMMMMMMMMMMMMNa,.dMMMMMMNJ.    ..gMMMMMMMMNg,  -MM"^     .7WMMN,.&NNg,      ...Jggggg-..            //
//           .MMMM#"!         .7HMMM,   (MMb   .gMMMMMMMMMMNaM@! _TMMMp  .MMM#""YMMMN,        .TMMMN,   .MMM#"`         -"WMMMM@^   .7HMMm..dMMM"""777"TWMMMMB!     .      TMMMMHMMMN. .gMMMMMMMMMMMMMMN,         //
//         .MMM#^                .UMMp    MM[.MMB"!     -7TMMMMa.   /MMc dM#`     ?MMN,    ..    TMMMm.JMM"        .g&.     ?MMN,      .TMMMM=      .,    .TMN,    JMN,     ,MM,   TMNMM@=           (TMMN,       //
//        .MM#'                    ?MM,   -MMB'              TMMN,   dM#.MM`       ,MMb    MMN,   .WMMMM@           HMMa      ?MN. .,    ,MMb       WMR     (MN     JMN.     dM]    qMN                 ?MM2      //
//       .MMF                       dM]   ,M#                  7MMb  ,MM-MF         JMM;   ,MMM,    ?MMM,            ?MMh      HM] HMp    .MMb       MM]     MM      MM]    .MM\     MM|                 -MN.     //
//       MMF        .N.             JM]   (MF          MN       ,MMb ,MMgM{          MMb     MMM,    -MMN,            dMM]     JMF .MMc     MM[      JMD   .JM#       7  ..dMMF      dMb                  MM}     //
//      .MM`        .M]            .MM`   MM\          WMb       ,MM,.MMMM_          MM#     -MMN     JMMb            .MM%    .MM%  dMN     ,MN.      ...JMMMM^       .MMMMMMD       JMN          `      .MM!     //
//      dMF          ?Ma.   `  `..MMM^   .M#           .MM<       MM]dMMMMMN,        MM#     ,MMM      MMM<    `             .MM#   ,MF      dMb     ,MMMMMMM:        -MMMMMN        (MM    `  `  MNJ...JMMF      //
//      MM]          dMMMMNaggMMMMM@`   .MMb            dM]       JMNMMH"MMMM#      .MMF      WMF      JMM]               ..dMMB`            .MN      T"MMMMMb      (a .TMMMN.       .MM` .MN.    MMMMMMMMF       //
//      MM]          MMMMMMMMMMMM=      -MMMMMMMMNg,    dM]       dMMMF    ?"3      -MMt               JMM]     ..(J+gggMMMMM#=               MM|         .TMMb     dMb   TMMN       -MM(+MMM>    dMHMMH"`        //
//      MMb      `  .MM#"!~?THMMMN,     (MMMMMMMMMMMN,  W#`    ` .MM%            ` .MM#                MMM\     (WMMMMMMM""^    .gg.....   `  dM]   .MN.    ?MM|    -MM    4MM[      (MMMMMMF     ,MN             //
//      (MN.         .'        TMMM,              TMMM,          dM#              .MMMF    `      `   JMM#   `        ?MM,      (MMMMMM]      dM]    MMb     MMF    (MM`   .MMF  `   (MMMMMM`      MM]            //
//      .MMb  `                 .MMN.  `  `         MMF      ` .dMM'             .MMMM]       `     .dMMM'      .,     4MN.     .MMY4MMN.    .MM\    JMM    .MMNJ.   7'   .MMM]      (MM MMF       JM#            //
//       (MMp                    .MM]              .MMF       .MMMMm,         ..MMMMMMN           .dMMMM]      .MN      MMN,    .MM$MMMMN,..(MM@     dM#    JMMMMMN,.   .JMMMM       dM# MM]       -MM            //
//        TMMm                   .MMm.....   .....MMMM-....JMMMMMMMMMMMNggggMMMMMMD(MMMNJ......(NMMMMM#MN.     .MM[     -MMMMaggMMM!.""TMMMMMMMN,         .MMM#WMMMMMMMMMMMMMM.     .MM] MMb       JMM            //
//         ?MMNJ                 JMMMMMMMMMMMMMMMMMMMMMMMMMMMM@'.MMMMMMMMMMMMMMM"   UMMMMMMMMMMMMMMMM: 4Mh.   .MMMMe.  .dMMMMMMMMM^      ""UMMMMMMNg+J+gMMMMM@  .TMMMMMMMMM^MMN,...dMM#  dMMm,....MMMF            //
//          ,MMMMm,            .MMMM@"HMMMMMMMM#""`MMWMMMMBM#    MMMN"TMMMMMMMMF     (HMMMMMMMMMMHMMM]  UMMNgMMM#(MMMMMMMMF ?"""'          JMMMHMMMMMMMMMMM@!        _!` MN.,MMMMMMMMM]   TMMMMMMMMMD             //
//            ?MMMMMNaJ......+MMM#(MF        .M]   MM.  dM.MN    dMMM| UMMMMMM#`         ?777!   .MMMN   (WMMMMMF  7WMMMB^         .NNNNNNNMMNF  JMM"MMY7`               MM\ .TMMMM@jM]    .TMMMMMN               //
//              MMMMMMMMMMMMMMMM@ .MF        ,M]  .MM{  MM/M#    .MNMN  .T"""^                    MMNM.     .MMMF.MMM2             MMMMMMMMNMM'  JM# MM]                  `    MF.M].M]      MM].MM,              //
//             .MM.  M#"""""^  MN (MF        .M@   ?"   MM|       dMMM[           ..gNg..         JMMMMMMMMMMMNML,MMM@               ````JMMMF   dM# WM^                       Mb.M].M\      MMb,MM]              //
//              MM~ .MN        MM            ,M#        MM]       .MMMN.         (MMMMMMM,     .(MMMNMMNMMMMMNMMMMMMNF                  .MMN@    JM#                          .M#,MF         MMN.MMt              //
//              ?"  .MM.       MM`           -MM        MMF        -MMMb        .MMMMMMMM#   .JMMMMM"=`      _THMNMMM]           .......MMMM`     "`                          .M#,MF         MMM_                 //
//                  .MM{                     ,MM        TMF         4MMMb        UMMMMMMM%  .MMMM@!        ..+, -MMNMMb         MMMMMMMMMNMt                                  .MN            dMM:                 //
//                  .MM]                      _!                     WMMMp        .TMMM9`  .MMMM^          dMMMMMMMMMMMb        ?HMMMMMMMMF                                   .MM             "^                  //
//                  -MM]                                              HMMM2             ..MMMMM!           .MMMMNMD 4MMM]            .MMNM`                                   .MM.                                //
//                  JMMF                            ..gN,             .MMMMx          .JMMMMNMF              TMMMMb .MNMNNMMMMNNg,.  dMMM\                                    .MM`                                //
//                  JMM#                       ..gMMMMMM#              .MMMMe        .MMMMWMMM)                T"9!  MMMMMMMMMMMMMMMNMMMF                                      MM                                 //
//                   79!                    .MMMMMMMMMMM#               .MMMM[      .MMMF JMMN]                     .MMN#       ?YMMMMN#                                                                          //
//                                          WMMMY4MMMMMM#                 HMMMp    .MMMF  .NMMN.                    (MNMF          .TMMMN,                 ..(gMMMMMMMMNNa,.                                      //
//                                   .MN,       .MMMMMMM#                  WMMMb   MMMF    ?MMMN,                  -MMM@             .UMMMp             .gMMMMMMMMMMMMMMMMMMMm,                                   //
//                                 .dMMMMp     .MMMM^MMM#        ..JgMMMMMMMNMMMb .MMM\     ?MMMMa.              .MMMM@                ?MMMb         .+MMMMMMH"""7???7""HMMMMMMNJJMMMMNJ,                         //
//                                .MMMMMMMh   .MMM#` MMMF     .(MMMMMMMMMMMMMNMMMMMMNM`      .WMNMMNJ,     ` ..gMMMMM3                  ?MMM|      .dMMMM9^                ?YMMMMMY"TWMMMN,                       //
//                               .MMMM^?MMMN.MMMMF   ."^    .dMMMM@=`        _"YMMMNMM         .YMMMMMMMMMMMMMMMMM#=                     MMM#     .MMMB^                      TMMMN,   (MMMp                      //
//                              .MMMM!  (MMMMMMM^          JMMM#^                 7WMD            _THMMMMMMMMMM"^                        JMNM.  .dMM#'                         .MMMN     WMM,    ...(&gg+-..      //
//          .....,             .MMMH`    .MMMM@`         .MMMM^                                                                          (MMMN,.MMMD                             MMM]    .MM] .gMMMMMMMMMMMMMN    //
//        .MMMMMMMMm, .JMMMMNa.MMM#`       7"=          .MMM#`                                               ..   ..         .J,         dMMNMMMMMt           .,                 ,MMF     MMNMMH""!`   `?""MMM    //
//      .MMMMY"""HMMMMMMH"WMMMMMMM`                     JMNM`                   ..,       .gMN. .MMN,      .MMM] JMMMx     .MMMM\       .MMMMMMMMF            M#                 .MMF    .MMM=               ?    //
//     .MMM^  ..,  TMMb   .. 7MMM[                     .MMMt                   JMMMm,    .MMMM^ ,MMMMh,  .dMMM#! ,HMMMN,  .MMMM3       .MMM@-MNM#             MN.                -MM'    (MM`                     //
//     dMM`  dMMMN. (MM| MMMM, MMN.                    (MMM                     TMNMMa..JMMM#!    TMMMMa.MMMMD     ?MMMMNMMMM@`       .MMM@  MMMN             dMh.              .MMF    .MMF                      //
//    .MMF   MMMMMb  HMN MMMMN ,MM]                    dMN#                      .WMMMMMMMMF       .WNMMMMM#'        TMMMMMM3       .dMMM#.. dMMM_           .MMMMa,         .JMMMF    .MM#             .N,       //
//    .MM]   ,MMMMM. -MM .MMMM~.MM]                    JMMN                        ,HNMMMM^          (MNMMN,         .MMMNMN,      jMMMNMMMMMMMNM.           MMMMMMMMMNggNMMMMMM#^    .MMM!             MMN       //
//     MMb   .MMMMM! ,MM(MMMM# dMM\                    ,MMMc                       .MMMNMMN,       .MMMNMNMMm.     .JMMNMMMMMN,    ?MM"""""WMMMMMMN,        -MMMMMMMMMMMMMMMMM"!      dMM^           ...dMMa..    //
//     dMM,  ,MMMM#  -M# TMMM!(MM@                      WMMN.                     (MMMMTMMMMm.    (MMMM% UMMMN,   .MMMMF  7MMMMa               7HMMMN,      dMMB"??7"MMMMMM,         dMMM,.        .MMMMMMMMMM    //
//     ,MMM,  WMMM3 .MMh,  ..MMMM`                      JMMMN,              `   .MMMMD   TMMMMp .MMMN@`   ,MMMMb (MMM#'    .WMMM]                .TMMMh.     `        .WMMMMe       -MMMMMMMMNg,.   ?7774MMYHM    //
//      ?MMMN.....(MMMMMMMMMMMM#-   ...JJ.,             (MNMMMN,.        `     .MMMM^     .WMMF .WM#^       7HB'  T"=        .7'                   ,MMMN.               ,MMMM,      JMMMMMMMMMMMMN,     dMM       //
//       -MMMMMMMMMMMMMMMMMMMMMMMMaMMMMMMMMMN,          ,MMNMMMMMNgJ.......,    ."=                                                                 ,MMMb                .MMM@            _?TWMMMMMb   .MMF       //
//         JMMMMMMMMM""""""""WMMMMMMN,   .TMMMb     ..MMMMMMM/TWMMMMMMMMMMMM[                         .......                                        -MMM|       ...(JJ...-MMM                 (HMMM]  ,""        //
//       .dMMMMM"^              _TMMMMb     ?MMb  .MMMMM""MNMN.   _7""UMMNM3                       .dMMMMMMMMMm,                                      MMMb   ..MMMMMMMMMMMMMMM                   UMMN.JggNNNNa    //
//      .MMMM"`                    ?MMMb     ?MMaMM#"`    ?MNMN,     .MMN@`                        JMMM#"""MMMM#                                      dMNN .dMMMM#"""""T"MMMMMN, .gMMMMN,      ..dMMMMMMMMMMMM    //
//    .dMMM"                        .HMM]     MMM#'        JMNMMx   .MMNF                            `       ?7                                       dMMNJMM#"            (TMMMNMMMMMMMMN,  .MMMMM#""!`          //
//    MMMB`                           MMN     MM#           .MMMMN, dMM#                                                                              MMMMM#!                 TMMMF    TMMMaMMM#=                 //
//    MMF                             JMM     MMF            .MMMMMMMMN]                                                                             .MMMMMMb      MMm,        ,MMN      WMMM"                    //
//    M#           M]                 dM#    .MMF            (MM#WMMNMM{                                                   `    `                   .MMMFTMMMb     ,MMMp        dMM-      HMM[                    //
//    M'           MN                .MMF    -MM:             4MM[ ?MMM)                                               `   JMNg,.                 .JMMNF  4MMMb      WMM]       dMM}      ,MMN.                   //
//    F            -MN.            .MMM@     MM#               MMN  MMMb                                            `      MMMMMMMNJ..         ..MMMMM=    WMMM,     ,MM#      (MMM`       dMMb                   //
//    ]             dMMm,.    ...gMMMMF     -MMb               JMM. (MNM,            `     `   `                           dMNMWMMMMMMMMMMMMMMMMMMM#=      .MNMN      ,"'   ..MMMMF        ,MMN.                  //
//    [            .MMMMMMMMMMMMMMMM@!      MMMMggggggJ..      (MM~  MMMM,        `            (MMb  `           `         dMM#   _TMMMMMMMMMMMH"^          JMMM[       .(gMMMMMMD          MMM[            .M    //
//    ]            .MMMMMMMMMMMMMMr        .MMMMMMMMMMMMMMa.   dM#  .MMNMMm.                 .MMMMM,       `              .MMMF     ?MMN  WMMM[              MMMN       MMMMMMMMb           dMMb             M    //
//    ]            JMMMM9""""MMMMMMh.       WMMMH""HMMMMMMMM,  ."'  .MMMMMMMm,            .+MMMMMMMN,                     (MMM'      vMMb  MMNN              dMMM.      UMMMMMMM#           JMM#   .MMp      d    //
//    N            .MM^        ?HMMMN,                  ?MMMM,      .MNMF?MMMMMNa......JMMMMMMD` MMMN,                   .MMMF        WMMc (MMM]             (MMM}   .-,  TMMMMMM,          -MMM  .MMMM`     .    //
//    Mp.&NMMMMMMMNNg.,          ,MMMM,                   4MMb       MMN@  .TMMMMMMMMMMMMMM"^     UMMMN,      `       `.MMMM#^        .MMN .MNMN             -MNM)   dMN,   .WMMMM,         ,MMM+MMMMMF   ..Jg    //
//    MMMMMMMMMMMMMMMMMMMg,      ..MMMb.                  .MM#       MMMN       ?""""YMMM]         (MMMMNa,.        .(MMMM#'        ..gMMMMMMMMM.            (MMM:    MMN.    JMMMN.     ..NMMMMMMMMMM\ .+MMMM    //
//    MM""7`     ?7TWMMMMMMMm,.JMMMMMMMMMa,            ...MMMh.     .dMNM.            MMNN,          (YMMMMMMMNNNMMMMMMMB^      .(MMMMMMMMMMMMNMb            MMMM     MMMb..JgNMMMMh..  .MMMMMMMMMMMM# .MMMMMM    //
//                     _TMMMMMMMH""77""MMMMN,`  ...(MMMMMMMMMMMMMNMMMMMMN]            ,MMMN,         ...(MMMMMMMMMMM#"'       .MMMMMMM#9"7!``WMMM,          .MNMMh    MMMMMMMMMMMMMMMMMMM%     ?HMMMMF dMM#^      //
//              .N,       .TMMMN,        TMMMMMMMMMMMMMH"""""HMMMMMMMMMMMN             (MMMMN,  jMMMMMMMMMMMMM#"`     .Ngg+&gMMMMMB^         .MMMM,        .MMM#MMb .dMMMY"=`     ?"YMMMMMN,     ?MMM].MM#        //
//              MMMN,        WMMN.         TMMMMMMB^             (TMMMMNMM,             4MNMMM+MMMMMMMMWMMMN   ....(JJMMMMMMMMM#^             .MMMMN,   ..MMMMD JMMgMM"`               ?HMMMN,    MMM]JMM'        //
//               UMMMp        4MMb  ...     ,MMM#`         .N,      (MMMMMb              MMMMMMM"""MMMMp(MMMNMMMMMMMMMMMMMMMMMe.                7MMMMMMMMMMMM^   MMM"                    .TMMMx   -MMNdM#         //
//                UMMMp        MMN  dMN.      MMMb         XMMb       UMMNMc             (MNMMMb    .WMMbJMMMM#""7?!!??7""HMMMMMNJ                ?"MMMMMMM#     MMF             .         ,MMMp  .MMMMM]         //
//                 MMMM.       MMM` ,MMb       MMM|         MMM[      .MMMMM,            -MMMMM#      MMMMB^                 ?YMMMN,                     dMN     MMF            .MN.         HMM[ .MMMMM]         //
//                 dMMM`      .MMM   MMM[      ,MMN.        -MMF      .MMMMMMp           MMMMMMF      ,MMN                      TMMMp M]                .MM#    .MM%            -MMN         .MMN..MMMMM]         //
//                 ,MMD       JMMF   JMMN       JMMb        .WM^     .MMMFUMMMMa,   `  .MMNMMMM%       MMM-                      ,MMM[MN.              .MMM%    dMM`             JMM]         (MM](MMMMMMMN,.     //
//                          .JMMM`   ,MM#        MMN.           ...JMMMM@  ,WMMMMMMMMMMMMMMMMMF        dMM]                       ,MMN-MN,           .JMMMF    .MMF               MMN         .MM@MMMMMMMMMMM.    //
//                        .(MMMM!     T"^        JMM[       .MMMMMMMMMMD      7YMMMMMMMMMMMMM=         dMMF                        MMM.dMMNg.......gMMMMM=     -MMb               JMM.         MMMMMF   .TMMM`    //
//         ............(gMMMMMD                  ,MMb       -MMMMMMMMMF            dMMMMMMM#           gMMF                       .MMM.MMMMMMMMMMMMMMMM"       MMMMMMMMMMNg..     JMM         .MMMMM'             //
//        MMMMMMMMMMMMMMMMMM"                     MMN        ?"WMMMMMMN.        .. ,MMMMMMM@           dMMF             .J.      .MMMF-MMMMMMMMMMMMMM,        .MMMMMMMMMMMMMMN,   dM#         -MMF                //
//         ?"""HMMMMMMY""!      ..                MMM             ?MMMMN       .MM,  .WMMMMb           MMMF    .,.......MMMa,...(MMMM!JMMMB"!`?7"MMMMMN,       7""""""""TWMMMMMb             .MMM!         .+M    //
//               ,MMMb         .MMMMMMMNx                                                                                                                                                                         //
//                                                                                                                                                                                                                //
//                                                                                                                                                                                                                //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


contract MATE is ERC721Creator {
    constructor() ERC721Creator("YUO.+MATE", "MATE") {}
}

// File: contracts/manifold/ERC721Creator.sol



// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @author: manifold.xyz

import "@openzeppelin/contracts/proxy/Proxy.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/StorageSlot.sol";

contract ERC721Creator is Proxy {
    
    constructor(string memory name, string memory symbol) {
        assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = 0x5133522ea5A0494EcB83F26311A095DDD7a9D4b6;
        (bool success, ) = 0x5133522ea5A0494EcB83F26311A095DDD7a9D4b6.delegatecall(abi.encodeWithSignature("initialize(string,string)", name, symbol));
        require(success, "Initialization failed");
    }
        
    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /**
     * @dev Returns the current implementation address.
     */
     function implementation() public view returns (address) {
        return _implementation();
    }

    function _implementation() internal override view returns (address) {
        return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    }    

}

// File: node_modules/@openzeppelin/contracts/proxy/Proxy.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)

pragma solidity ^0.8.0;

/**
 * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
 * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
 * be specified by overriding the virtual {_implementation} function.
 *
 * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
 * different contract through the {_delegate} function.
 *
 * The success and return data of the delegated call will be returned back to the caller of the proxy.
 */
abstract contract Proxy {
    /**
     * @dev Delegates the current call to `implementation`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _delegate(address implementation) internal virtual {
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    /**
     * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function
     * and {_fallback} should delegate.
     */
    function _implementation() internal view virtual returns (address);

    /**
     * @dev Delegates the current call to the address returned by `_implementation()`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _fallback() internal virtual {
        _beforeFallback();
        _delegate(_implementation());
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
     * function in the contract matches the call data.
     */
    fallback() external payable virtual {
        _fallback();
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
     * is empty.
     */
    receive() external payable virtual {
        _fallback();
    }

    /**
     * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
     * call, or as part of the Solidity `fallback` or `receive` functions.
     *
     * If overridden should call `super._beforeFallback()`.
     */
    function _beforeFallback() internal virtual {}
}

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



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [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://consensys.net/diligence/blog/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.8.0/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: node_modules/@openzeppelin/contracts/utils/StorageSlot.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```solidity
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 *
 * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._
 * _Available since v4.9 for `string`, `bytes`._
 */
library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    struct StringSlot {
        string value;
    }

    struct BytesSlot {
        bytes value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `StringSlot` with member `value` located at `slot`.
     */
    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.
     */
    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }

    /**
     * @dev Returns an `BytesSlot` with member `value` located at `slot`.
     */
    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
     */
    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }
}