ETH Price: $3,392.88 (+1.03%)
Gas: 5 Gwei

Token

YING (YING)
 

Overview

Max Total Supply

3,769 YING

Holders

1,358

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 YING
0x368f878765e83912e9564380523c84d049cf565a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
YING

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 24 : YING.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "../hootbase/base/erc721/HootERC721.sol";
import "../hootbase/base/common/HootProvenance.sol";
import "../hootbase/base/erc721/features/HootBaseERC721Raising.sol";
import "../hootbase/base/erc721/features/HootBaseERC721Refund.sol";
import "../hootbase/base/erc721/features/HootBaseERC721URIStorageWithLevel.sol";
import "../hootbase/utils/HootRandTokenID.sol";

abstract contract YINGBlind {
    function ownerOf(uint256 tokenId) public view virtual returns (address);

    function isFreeMintYINGToken(uint256 tokenId)
        public
        view
        virtual
        returns (bool);
}

/**
 * @title HootAirdropBox
 * @author HootLabs
 */
contract YING is
    HootRandTokenID,
    HootBaseERC721Provenance,
    HootBaseERC721Raising,
    HootBaseERC721Refund,
    HootBaseERC721URIStorageWithLevel,
    HootERC721
{
    event YINGConfigChanged(YINGConfig cfg);
    event YINGBlindContractChanged(address blindAddress);
    event YINGRevealed(
        uint256 indexed blindTokenId,
        uint256 indexed yingTokenId
    );
    /**
     * used to mark the contract, each contract have to make a different CONTRACT_SHIELD
     */
    uint256 public constant CONTRACT_SHIELD = 1942123432145421;

    struct YINGConfig {
        uint256 maxSupply;
        bool rejectFreeMintRefund;
    }

    YINGConfig public yingCfg;

    address _yingBlindAddress;

    constructor(YINGConfig memory yingCfg_)
        HootERC721("YING", "YING")
    {
        yingCfg = yingCfg_;
    }

    /***********************************|
    |               Config              |
    |__________________________________*/
    function setYINGConfig(YINGConfig calldata cfg_) external onlyOwner {
        yingCfg = cfg_;
        emit YINGConfigChanged(cfg_);
    }

    // Set authorized contract address for minting the ERC-721 token
    function setYINGBlindContract(address contractAddress_) external onlyOwner {
        _yingBlindAddress = contractAddress_;
        emit YINGBlindContractChanged(contractAddress_);
    }

    /***********************************|
    |               Core                |
    |__________________________________*/
    function mintTransfer(address address_, uint256 blindTokenId_)
        public
        virtual
        returns (uint256)
    {
        require(_msgSender() == _yingBlindAddress, "not authorized");
        unchecked {
            require(
                totalMinted() + 1 <= yingCfg.maxSupply,
                "mint would exceed max supply"
            );
        }
        uint256 tokenId = _genTokenId();
        _safeMint(address_, tokenId);
        emit YINGRevealed(blindTokenId_, tokenId);
        return tokenId;
    }

    function mintTransferBatch(
        address address_,
        uint256[] calldata blindTokenIds_
    ) public virtual returns (uint256[] memory) {
        require(_msgSender() == _yingBlindAddress, "not authorized");
        require(
            blindTokenIds_.length <= yingCfg.maxSupply,
            "mint would exceed max supply"
        );
        unchecked {
            require(
                totalMinted() + blindTokenIds_.length <= yingCfg.maxSupply,
                "mint would exceed max supply"
            );

            uint256[] memory tokenIds = new uint256[](blindTokenIds_.length);
            for (uint256 i = 0; i < blindTokenIds_.length; i++) {
                uint256 tokenId = _genTokenId();
                _safeMint(address_, tokenId);
                tokenIds[i] = tokenId;

                emit YINGRevealed(blindTokenIds_[i], tokenId);
            }
            return tokenIds;
        }
    }

    /***********************************|
    |      HootBaseERC721Owners         |
    |__________________________________*/
    function exists(uint256 tokenId_)
        public
        view
        virtual
        override(HootBaseERC721Owners, HootERC721)
        returns (bool)
    {
        return HootERC721.exists(tokenId_);
    }

    /***********************************|
    |         HootRandTokenID           |
    |__________________________________*/
    function _remainSupply() internal view virtual override returns (uint256) {
        return yingCfg.maxSupply - totalMinted();
    }

    /***********************************|
    |        HootBaseERC721Refund       |
    |__________________________________*/
    function _refundPrice(uint256 tokenId_)
        internal
        view
        virtual
        override
        returns (uint256)
    {
        if (yingCfg.rejectFreeMintRefund) {
            YINGBlind yingBlind = YINGBlind(_yingBlindAddress);
            if (yingBlind.isFreeMintYINGToken(tokenId_)) {
                return 0;
            }
        }
        return super._refundPrice(tokenId_);
    }

    /***********************************|
    | HootBaseERC721URIStorageWithLevel |
    |__________________________________*/
    function tokenURI(uint256 tokenId_)
        public
        view
        virtual
        override(ERC721, HootBaseERC721URIStorage)
        returns (string memory)
    {
        return HootBaseERC721URIStorage.tokenURI(tokenId_);
    }

    /***********************************|
    |          HootERC721               |
    |__________________________________*/
    function tokenByIndex(uint256 index)
        external
        view
        virtual
        override
        returns (uint256)
    {
        require(index < totalMinted(), "out of range");
        return _unsafeGetTokenIdByIndex(index);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        override
        returns (uint256)
    {
        require(balanceOf(owner) > index, "there are not enough tokens");
        uint256 totalMinted = totalMinted();
        uint256 scanIndex = 0;
        uint256 tokenId = 0;
        for (uint256 i = 0; i < totalMinted; i++) {
            tokenId = _unsafeGetTokenIdByIndex(i);
            require(tokenId >= _startTokenId(), "token not minted");
            if (_unsafeOwnerOf(tokenId) != owner) {
                continue;
            }
            if (scanIndex == index) {
                return tokenId;
            }
            ++scanIndex;
        }
        revert("not found token");
    }

    function tokensOfOwner(address owner_)
        external
        view
        returns (uint256[] memory)
    {
        uint256 balance = balanceOf(owner_);
        if (balance == 0) {
            return new uint256[](0);
        }
        uint256[] memory tokens = new uint256[](balance);
        uint256 totalMinted = totalMinted();
        uint256 scanIndex = 0;
        uint256 tokenId = 0;
        for (uint256 i = 0; i < totalMinted; i++) {
            tokenId = _unsafeGetTokenIdByIndex(i);
            require(tokenId >= _startTokenId(), "token not minted");
            if (_unsafeOwnerOf(tokenId) != owner_) {
                continue;
            }
            tokens[scanIndex] = tokenId;
            ++scanIndex;
            if(scanIndex == balance){
                break;
            }
        }
        require(scanIndex == balance, "not enough tokens were found");
        return tokens;
    }

    /***********************************|
    |               ERC721A             |
    |__________________________________*/
    /**
     * @notice hook function, used to intercept the transfer of token.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(HootBaseERC721Raising, HootERC721) {
        HootBaseERC721Raising._beforeTokenTransfer(from, to, tokenId);
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

File 2 of 24 : HootRandTokenID.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

/**
 * @title Hootbirds
 * @author HootLabs
 */
abstract contract HootRandTokenID is ReentrancyGuard, Ownable {
    using Strings for uint256;

    uint256 public constant MAX_SUPPLY = 5831;
    uint256[MAX_SUPPLY] internal _randIndices; // Used to generate random tokenids

    constructor() {}

    /***********************************|
    |               abstract            |
    |__________________________________*/
    function _remainSupply() internal view virtual returns (uint256);

    /***********************************|
    |               RandomTokenId       |
    |__________________________________*/
    function init(uint256 startIndex, uint256 stopIndex) external onlyOwner {
        unchecked {
            for(uint256 i=startIndex; i<stopIndex; i++){
                _randIndices[i] = i+1;
            }
        }
    }
    function freeStores() external virtual onlyOwner nonReentrant {
        require(_remainSupply() == 0, "there is some token left");
        delete _randIndices;
    }
    function _genTokenId() internal returns (uint256 tokenId_) {
        uint256 remain = _remainSupply();
        require(remain > 0, "tokenId has been exhausted");
        unchecked {
            tokenId_ = _changePos(remain-1, _unsafeRandom(remain) % remain);
        }
    }
    function _genTokenIdBatch(uint256 supply) internal returns (uint256[] memory){
        require(supply > 0, "tokenId has been exhausted");

       uint256 remain = _remainSupply();
       require(supply <= remain, "not enough tokenIDs");

       uint256[] memory tokenIDs = new uint256[](supply);
       unchecked {
            for(uint256 i=0;i<supply; i++){
                tokenIDs[i] = _changePos(remain-i-1, _unsafeRandom(i) % (remain-i));
            }
       } 
       return tokenIDs;
    }
    function _genFirstTokenId() internal returns (uint256 tokenId_){
        require(_remainSupply() == _randIndices.length, "the first tokenId already generated");
        return _changePos(_randIndices.length-1, 0);
    }
    function _changePos(uint256 lastestPos, uint256 pos) private returns (uint256) {
        uint256 val = _randIndices[pos];
        _randIndices[pos] = _randIndices[lastestPos];
        _randIndices[lastestPos] = val;
        return val;
    }
    function _unsafeGetTokenIdByIndex(uint256 index_) internal view returns (uint256) {
        if(index_ >= _randIndices.length){
            return 0;
        }
        return _randIndices[_randIndices.length - index_ - 1];
    }

    /***********************************|
    |               Util               |
    |__________________________________*/
    /**
     * @notice unsafeRandom is used to generate a random number by on-chain randomness.
     * Please note that on-chain random is potentially manipulated by miners, and most scenarios suggest using VRF.
     * @return randomly generated number.
     */
    function _unsafeRandom(uint256 n) private view returns (uint256) {
        unchecked {
            return
                uint256(
                    keccak256(
                        abi.encodePacked(
                            blockhash(block.number - 1),
                            block.difficulty,
                            block.timestamp,
                            block.coinbase,
                            n,
                            tx.origin
                        )
                    )
                );
        }
    }
}

File 3 of 24 : HootBaseERC721URIStorageWithLevel.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "../../common/HootBase.sol";
import "../extensions/HootBaseERC721Owners.sol";
import "./HootBaseERC721URIStorage.sol";

/**
 * @title HootBaseERC721URIStorageWithLevel
 * @author HootLabs
 */
abstract contract HootBaseERC721URIStorageWithLevel is HootBaseERC721URIStorage
{
    using Strings for uint256;

    event LevelBaseURIChanged(uint256 level, string uri);
    event TokenLevelChanged(uint256 tokenId, uint256 level);

    // Optional mapping for token URIs
    mapping(uint256=>string) _levelPreURIs;
    mapping(uint256 => uint256) private _tokenLevels;

    function setLevelsBaseURI(uint256[] calldata levels_, string[] calldata uris_)
             external
            atLeastManager
    {
        require(levels_.length == uris_.length, "the length of Listing Level is different from that of Listing URI");
        for(uint256 i = 0; i<levels_.length; i++){
            _levelPreURIs[levels_[i]] = uris_[i];
            emit LevelBaseURIChanged(levels_[i], uris_[i]);
        }
    }
    function setTokensLevel(uint256[] calldata tokens_, uint256[] calldata levels_)
             external
            atLeastManager
    {
        require(tokens_.length == levels_.length, "the length of Listing Token is different from that of Listing Level");
        for(uint256 i = 0; i<tokens_.length; i++){
            _tokenLevels[tokens_[i]] = levels_[i];
            emit TokenLevelChanged(tokens_[i], levels_[i]);
        }
    }

    function _baseURI(uint256 tokenId_) internal view virtual override returns (string memory) {
        uint256 level = _tokenLevels[tokenId_];
        if(level == 0){
            return super._baseURI(tokenId_);
        }
        string memory baseURI = _levelPreURIs[level];
        if(bytes(baseURI).length == 0){
            return super._baseURI(tokenId_);
        }
        return baseURI;
    }
}

File 4 of 24 : HootBaseERC721Refund.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "../../common/HootBase.sol";

/**
 * @title HootBaseERC721Refund
 * @author HootLabs
 */
abstract contract HootBaseERC721Refund is HootBase, IERC721 {
    using Address for address;

    event RefundConfigChanged(RefundConfig config);
    event RefundAddressChanged(address indexed refundAddress);
    event Refunded(address indexed from, address indexed to, uint256 tokenId, uint256 amount);

    constructor(){
        refundAddress = _msgSender();
    }
    // mint State Variables
    address public refundAddress;

    struct RefundConfig {
        uint256 startTime;
        uint256 stopTime;
        uint256 price;
    }
    RefundConfig public refundConfig;

    // refund config
    function isRefundEnabled() public view virtual returns (bool) {
        return block.timestamp > refundConfig.startTime && block.timestamp < refundConfig.stopTime;
    }
    function setRefundAddress(address refundAddress_) external onlyOwner {
        refundAddress = refundAddress_;
        emit RefundAddressChanged(refundAddress_);
    }
    function setRefundConfig(RefundConfig calldata cfg_) external onlyOwner {
        refundConfig = cfg_;
        emit RefundConfigChanged(refundConfig);
    }

    function _refundPrice(uint256 /*tokenId_*/) internal view virtual returns (uint256) {
        return refundConfig.price;
    }

    // refund
    function refund(uint256 tokenId_) external callerIsUser nonReentrant {
        require(_msgSender() == this.ownerOf(tokenId_), "not token owner");
        require(_msgSender() != refundAddress, "stock account refunds are not allowed");
        require(isRefundEnabled(), "outside the refundable period");

        uint256 refundPrice = _refundPrice(tokenId_);
        require(refundPrice > 0, "only sale NFT can be refunded");
        require(address(this).balance >= refundPrice, "insufficient contract funds");

        this.safeTransferFrom(_msgSender(), refundAddress, tokenId_);
        //Address.sendValue(payable(_msgSender()), refundPrice);
        payable(_msgSender()).transfer(refundPrice);

        emit Refunded(_msgSender(), refundAddress, tokenId_, refundPrice);
    }
}

File 5 of 24 : HootBaseERC721Raising.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "../../common/HootBase.sol";
import "../extensions/HootBaseERC721Owners.sol";

/**
 * @title HootBaseERC721Raising
 * @author HootLabs
 */
abstract contract HootBaseERC721Raising is
    HootBase,
    HootBaseERC721Owners,
    IERC721
{
    event RaisingStatusChanged(
        uint256 indexed tokenId,
        address indexed owner,
        uint16 indexed raisingType,
        bool isStart
    );
    event RaisingInterrupted(uint256 indexed tokenId, address indexed operator);
    event RaisingTokenTransfered(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event RaisingAllowedFlagChanged(
        bool isRaisingAllowed,
        bool isRaisingTransferAllowed
    );

    struct RaisingStatus {
        uint256 raisingStartTime;
        uint256 total;
        uint16 raisingType;
        bool provisionalFree;
    }
    struct RaisingCurrentStatus {
        uint256 total;
        uint256 current;
        uint16 raisingType;
        bool isRaising;
    }
    mapping(uint256 => RaisingStatus) private _raisingStatuses;
    bool public isRaisingAllowed;
    bool public isRaisingTransferAllowed;

    /***********************************|
    |               Raising Config      |
    |__________________________________*/
    /**
     * @notice setIsRaisingAllowed is used to set the global switch to control whether users are allowed to brew.
     * @param isRaisingAllowed_ set to true to allow
     */
    function setIsRaisingAllowed(
        bool isRaisingAllowed_,
        bool isRaisingTransferAllowed_
    ) external atLeastMaintainer {
        isRaisingAllowed = isRaisingAllowed_;
        isRaisingTransferAllowed = isRaisingTransferAllowed_;
        emit RaisingAllowedFlagChanged(
            isRaisingAllowed_,
            isRaisingTransferAllowed_
        );
    }

    /***********************************|
    |               Raising Core        |
    |__________________________________*/
    /**
     * @notice safeTransferWhileRaising is used to safely transfer tokens while raising
     * @param from_ transfer from address, cannot be the zero.
     * @param to_ transfer to address, cannot be the zero.
     * @param tokenId_ token must exist and be owned by `from`.
     */
    function safeTransferWhileRaising(
        address from_,
        address to_,
        uint256 tokenId_
    ) external nonReentrant {
        require(this.ownerOf(tokenId_) == _msgSender(), "caller is not owner");
        require(
            isRaisingTransferAllowed,
            "transfer while raising is not enabled"
        );
        _raisingStatuses[tokenId_].provisionalFree = true;
        this.safeTransferFrom(from_, to_, tokenId_);
        _raisingStatuses[tokenId_].provisionalFree = false;
        if (_raisingStatuses[tokenId_].raisingStartTime != 0) {
            emit RaisingTokenTransfered(from_, to_, tokenId_);
        }
    }

    /**
     * @notice getTokenRaisingStatus is used to get the detailed raising status of a specific token.
     * @param tokenIDs_ token id
     * @return RaisingCurrentStatus[] how long the token has been raising in the hands of the current hodler.
     */
    function getTokenRaisingStatus(uint256[] calldata tokenIDs_)
        external
        view
        returns (RaisingCurrentStatus[] memory)
    {
        RaisingCurrentStatus[] memory statusList = new RaisingCurrentStatus[](tokenIDs_.length);
        for (uint256 i = 0; i < tokenIDs_.length; ++i) {
            uint256 tokenId = tokenIDs_[i];
            if(!this.exists(tokenId)){
                continue;
            }
            RaisingStatus memory status = _raisingStatuses[tokenId];
            if (status.raisingStartTime != 0) {
                statusList[i].isRaising = true;
                statusList[i].raisingType = status.raisingType;
                statusList[i].current = block.timestamp - status.raisingStartTime;
            }
            statusList[i].total = status.total + statusList[i].current;
        }
        return statusList;
    }

    function _isTokenRaising(uint256 tokenId_) internal view returns (bool) {
        return _raisingStatuses[tokenId_].raisingStartTime != 0;
    }

    /**
     * @notice setTokenRaisingState is used to modify the Raising state of the Token,
     * only the Owner of the Token has this permission.
     * @param tokenIds_ list of tokenId
     */
    function doTokenRaising(
        uint256[] calldata tokenIds_,
        uint16 raisingType_,
        bool isStart_
    ) external nonReentrant {
        if (isStart_) {
            require(isRaisingAllowed, "raising is not allowed");
        }
        unchecked {
            for (uint256 i = 0; i < tokenIds_.length; i++) {
                uint256 tokenId = tokenIds_[i];
                require(
                    this.ownerOf(tokenId) == _msgSender(),
                    "caller is not owner"
                );

                RaisingStatus storage status = _raisingStatuses[tokenId];
                uint256 raisingStartTime = status.raisingStartTime;
                if (isStart_) {
                    if (raisingStartTime == 0) {
                        status.raisingStartTime = block.timestamp;
                        status.raisingType = raisingType_;
                        emit RaisingStatusChanged(
                            tokenId,
                            _msgSender(),
                            raisingType_,
                            isStart_
                        );
                    } else {
                        require(
                            status.raisingType == raisingType_,
                            "raising is already started, but with a different raising type set"
                        );
                    }
                } else {
                    if (raisingStartTime > 0) {
                        status.total += block.timestamp - raisingStartTime;
                        status.raisingStartTime = 0;
                        emit RaisingStatusChanged(
                            tokenId,
                            _msgSender(),
                            raisingType_,
                            isStart_
                        );
                    }
                }
            }
        }
    }

    /**
     * @notice interruptTokenRaising gives the issuer the right to forcibly interrupt the raising state of the token.
     * One scenario of using it is: someone may maliciously place low-priced raising tokens on
     * the secondary market (because raising tokens cannot be traded).
     * @param tokenIds_ the tokenId list to operate
     */
    function interruptTokenRaising(uint256[] calldata tokenIds_)
        external
        nonReentrant
        atLeastMaintainer
    {
        unchecked {
            for (uint256 i = 0; i < tokenIds_.length; i++) {
                uint256 tokenId = tokenIds_[i];
                address owner = this.ownerOf(tokenId);
                RaisingStatus storage status = _raisingStatuses[tokenId];
                if (status.raisingStartTime == 0) {
                    continue;
                }
                status.total += block.timestamp - status.raisingStartTime;
                status.raisingStartTime = 0;
                emit RaisingStatusChanged(
                    tokenId,
                    owner,
                    status.raisingType,
                    false
                );
                emit RaisingInterrupted(tokenId, _msgSender());
            }
        }
    }

    function _beforeTokenTransfer(
        address, /*from_*/
        address, /*to_*/
        uint256 tokenId_
    ) internal virtual {
        if (_isTokenRaising(tokenId_)) {
            require(
                _raisingStatuses[tokenId_].provisionalFree,
                "token is raising"
            );
        }
    }

    function _beforeTokenTransfers(
        address, /*from_*/
        address, /*to_*/
        uint256 startTokenId_,
        uint256 quantity_
    ) internal virtual {
        for (uint256 i = 0; i < quantity_; ++i) {
            if (_isTokenRaising(startTokenId_ + i)) {
                require(
                    _raisingStatuses[startTokenId_ + i].provisionalFree,
                    "token is raising"
                );
            }
        }
    }
}

File 6 of 24 : HootProvenance.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "./HootBase.sol";

/**
 * @title HootBlindBox
 * @author HootLabs
 */
contract HootBaseERC721Provenance is HootBase {
    event ProvenanceUpdated(string procenance);

    string public provenance;

    /***********************************|
    |               Provenance          |
    |__________________________________*/
    function setProvenance(string calldata provenance_) external onlyOwner {
        provenance = provenance_;
        emit ProvenanceUpdated(provenance_);
    }
}

File 7 of 24 : HootERC721.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "./extensions/HootBaseERC721Owners.sol";
import "../common/HootBase.sol";

/**
 * @title Hootbirds
 * @author HootLabs
 */
abstract contract HootERC721 is
    HootBase,
    HootBaseERC721Owners,
    ERC721,
    IERC721Enumerable
{
    using Strings for uint256;

    constructor(string memory name_, string memory symbol_)
        ERC721(name_, symbol_)
    {}

    uint256 private _totalMinted;
    uint256 private _totalBurned;


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

    /***********************************|
    |               Config              |
    |__________________________________*/
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /***********************************|
    |               Core                |
    |__________________________________*/
    function _mint(address to, uint256 tokenId) internal virtual override {
        super._mint(to, tokenId);
        unchecked {
            ++_totalMinted;
        }
    }

    /**
     * @notice issuer have permission to burn token.
     * @param tokenIds_ list of tokenId
     */
    function burn(uint256[] calldata tokenIds_)
        external
        onlyOwner
        nonReentrant
    {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            uint256 tokenId = tokenIds_[i];
            require(ownerOf(tokenId) == _msgSender(), "caller is not owner");
            _burn(tokenId);
        }
        _totalBurned += tokenIds_.length;
    }

    function totalBurned() public view returns (uint256) {
        return _totalBurned;
    }
    function totalMinted() public view returns (uint256) {
        return _totalMinted;
    }

    /***********************************|
    |        IERC721Enumerable          |
    |__________________________________*/
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view override returns (uint256) {
        return _totalMinted - _totalBurned;
    }

    /***********************************|
    |        HootBaseERC721Owners       |
    |__________________________________*/
    function _unsafeOwnerOf(uint256 tokenID_) internal view virtual override returns (address){
        if (_exists(tokenID_)) {
            return this.ownerOf(tokenID_);
        }
        return address(0);
    }
    function exists(uint256 tokenId_) public view virtual override returns (bool){
        return _exists(tokenId_);
    }

    /***********************************|
    |               ERC721              |
    |__________________________________*/
    /**
     * @notice hook function, used to intercept the transfer of token.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        require(!paused(), "token transfer paused");
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

File 8 of 24 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_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) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_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 9 of 24 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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 10 of 24 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

File 11 of 24 : HootBaseERC721URIStorage.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "../../common/HootBase.sol";
import "../../../utils/HootCrypto.sol";
import "../extensions/HootBaseERC721Owners.sol";

/**
 * @title HootBaseERC721URIStorage
 * @author HootLabs
 */
abstract contract HootBaseERC721URIStorage is
    HootBase,
    HootBaseERC721Owners,
    HootCrypto,
    IERC721,
    IERC721Metadata
{
    using Strings for uint256;

    event BaseURIChanged(string uri);
    event TokenHashSet(uint256 tokenId, bytes32 tokenHash);

    string private _preURI;
    // Optional mapping for token URIs
    mapping(uint256 => bytes32) private _tokenHashes;

    function _baseURI(
        uint256 /* tokenId_*/
    ) internal view virtual returns (string memory) {
        return _preURI;
    }

    /**
     * @notice set base URI
     * This process is under the supervision of the community.
     */
    function setBaseURI(string calldata uri_) external onlyOwner {
        _preURI = uri_;
        emit BaseURIChanged(uri_);
    }

    /**
     * @notice setTokenHash is used to set the ipfs hash of the token
     * This process is under the supervision of the community.
     */
    function setTokenHash(uint256 tokenId_, bytes32 tokenHash_)
        external
        atLeastManager
    {
        require(this.exists(tokenId_), "token is not exist");
        _tokenHashes[tokenId_] = tokenHash_;
        emit TokenHashSet(tokenId_, tokenHash_);
    }
    /**
     * @notice setTokenHashBatch is used to set the ipfs hash of the token
     * This process is under the supervision of the community.
     */
    function setTokenHashBatch(uint256[] calldata tokenIds_, bytes32[] calldata tokenHashes_)
        external
        atLeastManager
    {
        require(tokenIds_.length > 0, "no token id");
        require(tokenIds_.length == tokenHashes_.length, "token id array and token hash array have different lengths");
        unchecked {
            for (uint256 i = 0; i < tokenIds_.length; i++) {
                uint256 tokenId = tokenIds_[i];
                require(this.exists(tokenId), "token is not exist");
                _tokenHashes[tokenId] = tokenHashes_[i];
                emit TokenHashSet(tokenId, tokenHashes_[i]);
            }
        }
    }

    function tokenURI(uint256 tokenId_)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(this.exists(tokenId_), "token is not exist");

        bytes32 tokenHash = _tokenHashes[tokenId_];
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (tokenHash == "") {
            string memory baseURI = _baseURI(tokenId_);
            return
                bytes(baseURI).length > 0
                    ? string(abi.encodePacked(baseURI, tokenId_.toString()))
                    : "";
        }
        return string(abi.encodePacked("ipfs://", cidv0(tokenHash)));
    }

    function unsafeTokenURIBatch(uint256[] calldata tokenIds_)
        public
        view
        virtual
        returns (string[] memory)
    {
        string[] memory uris = new string[](tokenIds_.length);
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            uint256 tokenId = tokenIds_[i];
            if (!this.exists(tokenId)) {
                uris[i] = "";
                continue;
            }
            bytes32 tokenHash = _tokenHashes[tokenId];
            // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
            if (tokenHash == "") {
                string memory baseURI = _baseURI(tokenId);
                uris[i] = bytes(baseURI).length > 0
                    ? string(abi.encodePacked(baseURI, tokenId.toString()))
                    : "";
                continue;
            }
            uris[i] = string(abi.encodePacked("ipfs://", cidv0(tokenHash)));
        }
        return uris;
    }
}

File 12 of 24 : HootBaseERC721Owners.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

/**
 * @title HootBaseERC721Refund
 * @author HootLabs
 */
abstract contract HootBaseERC721Owners {
    /***********************************|
    |               abstract            |
    |__________________________________*/
    function _unsafeOwnerOf(uint256 tokenId_)
        internal
        view
        virtual
        returns (address);

    /***********************************|
    |               Core                |
    |__________________________________*/
    function exists(uint256 tokenId_) public view virtual returns (bool) {
        return _unsafeOwnerOf(tokenId_) != address(0);
    }

    function ownersOf(uint256[] calldata tokenIDs_)
        external
        view
        virtual
        returns (address[] memory)
    {
        address[] memory owners = new address[](tokenIDs_.length);
        for (uint256 i = 0; i < tokenIDs_.length; ++i) {
            owners[i] = _unsafeOwnerOf(tokenIDs_[i]);
        }
        return owners;
    }
}

File 13 of 24 : HootBase.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

contract HootBase is ReentrancyGuard, Pausable, Ownable {
    event PermissionChanged(address indexed addr, uint8 permission);

    event Deposit(address indexed account, uint256 amount);
    event Withdraw(address indexed account, uint256 amount);
    event ContractParsed();
    event ContractUnparsed();
    event ContractSealed();

    uint8 public constant NO_PERMISSION = 0;
    uint8 public constant MANAGER = 1;
    uint8 public constant MAINTAINER = 2;
    uint8 public constant OPERATOR = 3;

    mapping(address => uint8) private _permissions;
    address[] maintainers;

    bool public contractSealed = false;

    /***********************************|
    |               Config              |
    |__________________________________*/
    /**
     * @notice setManagerAddress is used to allow the issuer to modify the maintainerAddress
     */
    function setPermission(address address_, uint8 permission_)
        external
        onlyOwner
    {
        if (permission_ == NO_PERMISSION) {
            delete _permissions[address_];
        } else {
            _permissions[address_] = permission_;
        }

        emit PermissionChanged(address_, permission_);
    }

    function getPermissions()
        external
        view
        atLeastManager
        returns (address[] memory, uint8[] memory)
    {
        uint8[] memory permissions = new uint8[](maintainers.length);
        unchecked {
            for (uint256 i = 0; i < maintainers.length; i++) {
                permissions[i] = _permissions[maintainers[i]];
            }
        }
        return (maintainers, permissions);
    }

    function getPermission(address address_) external view returns (uint8) {
        return _permissions[address_];
    }

    /***********************************|
    |               Core                |
    |__________________________________*/
    /**
     * @notice issuer deposit ETH into the contract. only issuer have permission
     */
    function deposit() external payable atLeastMaintainer nonReentrant {
        emit Deposit(_msgSender(), msg.value);
    }

    /**
     * issuer withdraws the ETH temporarily stored in the contract through this method.
     */
    function withdraw(uint256 w) external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(w <= balance, "balance is not enough");
        payable(_msgSender()).transfer(w);
        emit Withdraw(_msgSender(), w);
    }

    /***********************************|
    |               Basic               |
    |__________________________________*/
    /**
     * @notice for the purpose of protecting user assets, under extreme conditions,
     * the circulation of all tokens in the contract needs to be frozen.
     * This process is under the supervision of the community.
     */
    function emergencyPause() external atLeastManager notSealed {
        _pause();
        emit ContractParsed();
    }

    /**
     * @notice unpause the contract
     */
    function unpause() external atLeastManager notSealed {
        _unpause();
        emit ContractUnparsed();
    }

    /**
     * @notice when the project is stable enough, the issuer will call sealContract
     * to give up the permission to call emergencyPause and unpause.
     */
    function sealContract() external onlyOwner {
        contractSealed = true;
        emit ContractSealed();
    }

    /***********************************|
    |               Modifier            |
    |__________________________________*/
    /**
     * @notice only owner or manager has the permission to call this method
     */
    modifier atLeastManager() {
        uint8 permission = _permissions[_msgSender()];
        require(
            owner() == _msgSender() || permission == MANAGER,
            "not authorized"
        );
        _;
    }
    /**
     * @notice only owner, manager or maintainer has the permission to call this method
     */
    modifier atLeastMaintainer() {
        uint8 permission = _permissions[_msgSender()];
        require(
            owner() == _msgSender() ||
                permission == MAINTAINER ||
                permission == MANAGER,
            "not authorized"
        );
        _;
    }
    /**
     * @notice only owner, manager or maintainer or operator has the permission to call this method
     */
    modifier atLeastOperator() {
        uint8 permission = _permissions[_msgSender()];
        require(
            owner() == _msgSender() ||
                permission == MAINTAINER ||
                permission == MANAGER ||
                permission == OPERATOR,
            "not authorized"
        );
        _;
    }

    /**
     * @notice for security reasons, CA is not allowed to call sensitive methods.
     */
    modifier callerIsUser() {
        require(tx.origin == _msgSender(), "caller is another contract");
        _;
    }

    /**
     * @notice function call is only allowed when the contract has not been sealed
     */
    modifier notSealed() {
        require(!contractSealed, "contract sealed");
        _;
    }
}

File 14 of 24 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 15 of 24 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.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 functionCall(target, data, "Address: low-level call failed");
    }

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // 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 16 of 24 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 17 of 24 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 18 of 24 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

File 19 of 24 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 20 of 24 : HootCrypto.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

/**
 * @title HootCrypto
 * @author HootLabs
 */
contract HootCrypto {
    bytes constant ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
    /**
     * @notice base58 is used to calculate the base58 encoded value of given bytes.
     * This algorithm was migrated from github.com/mr-tron/base58 to solidity by our developers.
     * Note that it is not yet optimized for gas, so please use it only in read-only scenarios.
     * @param data_ bytes.
     * @return base58 encoded results.
     */
    function base58(bytes memory data_) public pure returns (bytes memory){
        uint256 size = data_.length;
        uint256 zeroCount;
        while (zeroCount < size && data_[zeroCount] == 0) {
            zeroCount++;
        }
        size = zeroCount + (size - zeroCount)*8351/6115+1;
        bytes memory slot = new bytes(size);
        uint32 carry;
        int256 m;
        int256 high = int256(size) - 1;
        for (uint256 i = 0; i < data_.length; i++) {
            m = int256(size - 1);
            for (carry = uint8(data_[i]); m > high || carry != 0; m--) {
                carry = carry + 256 * uint8(slot[uint256(m)]);
                slot[uint256(m)] = bytes1(uint8(carry % 58));
                carry /= 58;
            }
            high = m;
        }
        uint256 n;
        for (n = zeroCount; n < size && slot[n] == 0; n++) {}
        size = slot.length - (n - zeroCount);
        bytes memory out = new bytes(size);
        for (uint256 i = 0; i < size; i++) {
            uint256 j = i + n - zeroCount;
            out[i] = ALPHABET[uint8(slot[j])];
        }
        return out;
    }

    /**
     * @notice cidv0 is used to convert sha256 hash to cid(v0) used by IPFS.
     * @param sha256Hash_ sha256 hash generated by anything.
     * @return IPFS cid that meets the version0 specification.
     */
    function cidv0(bytes32 sha256Hash_) public pure returns (string memory) {
        bytes memory hashString = new bytes(34);
        hashString[0] = 0x12;
        hashString[1] = 0x20;
        for (uint256 i = 0; i < sha256Hash_.length; i++) {
            hashString[i+2] = sha256Hash_[i];
        }
        return string(base58(hashString));
    }
}

File 21 of 24 : IERC165.sol
// SPDX-License-Identifier: MIT
// 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 22 of 24 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 23 of 24 : Context.sol
// SPDX-License-Identifier: MIT
// 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 24 of 24 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"rejectFreeMintRefund","type":"bool"}],"internalType":"struct YING.YINGConfig","name":"yingCfg_","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractParsed","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractSealed","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractUnparsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"LevelBaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint8","name":"permission","type":"uint8"}],"name":"PermissionChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"procenance","type":"string"}],"name":"ProvenanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isRaisingAllowed","type":"bool"},{"indexed":false,"internalType":"bool","name":"isRaisingTransferAllowed","type":"bool"}],"name":"RaisingAllowedFlagChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"RaisingInterrupted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint16","name":"raisingType","type":"uint16"},{"indexed":false,"internalType":"bool","name":"isStart","type":"bool"}],"name":"RaisingStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"RaisingTokenTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"refundAddress","type":"address"}],"name":"RefundAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"indexed":false,"internalType":"struct HootBaseERC721Refund.RefundConfig","name":"config","type":"tuple"}],"name":"RefundConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"tokenHash","type":"bytes32"}],"name":"TokenHashSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"level","type":"uint256"}],"name":"TokenLevelChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"blindAddress","type":"address"}],"name":"YINGBlindContractChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"rejectFreeMintRefund","type":"bool"}],"indexed":false,"internalType":"struct YING.YINGConfig","name":"cfg","type":"tuple"}],"name":"YINGConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"blindTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"yingTokenId","type":"uint256"}],"name":"YINGRevealed","type":"event"},{"inputs":[],"name":"CONTRACT_SHIELD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAINTAINER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_PERMISSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"base58","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"sha256Hash_","type":"bytes32"}],"name":"cidv0","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"uint16","name":"raisingType_","type":"uint16"},{"internalType":"bool","name":"isStart_","type":"bool"}],"name":"doTokenRaising","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeStores","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getPermission","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPermissions","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIDs_","type":"uint256[]"}],"name":"getTokenRaisingStatus","outputs":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint16","name":"raisingType","type":"uint16"},{"internalType":"bool","name":"isRaising","type":"bool"}],"internalType":"struct HootBaseERC721Raising.RaisingCurrentStatus[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"stopIndex","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"interruptTokenRaising","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRaisingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRaisingTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRefundEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"blindTokenId_","type":"uint256"}],"name":"mintTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256[]","name":"blindTokenIds_","type":"uint256[]"}],"name":"mintTransferBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIDs_","type":"uint256[]"}],"name":"ownersOf","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"safeTransferWhileRaising","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealContract","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":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isRaisingAllowed_","type":"bool"},{"internalType":"bool","name":"isRaisingTransferAllowed_","type":"bool"}],"name":"setIsRaisingAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"levels_","type":"uint256[]"},{"internalType":"string[]","name":"uris_","type":"string[]"}],"name":"setLevelsBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint8","name":"permission_","type":"uint8"}],"name":"setPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance_","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"refundAddress_","type":"address"}],"name":"setRefundAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct HootBaseERC721Refund.RefundConfig","name":"cfg_","type":"tuple"}],"name":"setRefundConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes32","name":"tokenHash_","type":"bytes32"}],"name":"setTokenHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"bytes32[]","name":"tokenHashes_","type":"bytes32[]"}],"name":"setTokenHashBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens_","type":"uint256[]"},{"internalType":"uint256[]","name":"levels_","type":"uint256[]"}],"name":"setTokensLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"}],"name":"setYINGBlindContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"rejectFreeMintRefund","type":"bool"}],"internalType":"struct YING.YINGConfig","name":"cfg_","type":"tuple"}],"name":"setYINGConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"unsafeTokenURIBatch","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"w","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yingCfg","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"rejectFreeMintRefund","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526116cb805460ff191690553480156200001c57600080fd5b5060405162005ed038038062005ed08339810160408190526200003f9162000159565b60408051808201825260048082526359494e4760e01b602080840182905284518086019095529184529083015260016000819055805460ff191690559081816200008933620000e9565b6116ce805462010000600160b01b0319166201000033021790556116d6620000b2838262000247565b506116d7620000c2828262000247565b505083516116de55505050602001516116df805460ff191691151591909117905562000313565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b6000604082840312156200016c57600080fd5b604080519081016001600160401b038111828210171562000191576200019162000143565b6040528251815260208301518015158114620001ac57600080fd5b60208201529392505050565b600181811c90821680620001cd57607f821691505b602082108103620001ee57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200024257600081815260208120601f850160051c810160208610156200021d5750805b601f850160051c820191505b818110156200023e5782815560010162000229565b5050505b505050565b81516001600160401b0381111562000263576200026362000143565b6200027b81620002748454620001b8565b84620001f4565b602080601f831160018114620002b357600084156200029a5750858301515b600019600386901b1c1916600185901b1785556200023e565b600085815260208120601f198616915b82811015620002e457888601518255948401946001909101908401620002c3565b5085821015620003035787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615bad80620003236000396000f3fe6080604052600436106104105760003560e01c8063715018a61161021e578063b88d4fde11610123578063df13b8a7116100ab578063f2fde38b1161007a578063f2fde38b14610c86578063f37e20ba14610ca6578063f68dc5de14610cc1578063fe71ba8f14610ce1578063ffe630b514610d0157600080fd5b8063df13b8a714610bdc578063e697188f14610bfc578063e985e9c514610c1c578063ef11e90514610c6657600080fd5b8063d0e30db0116100f2578063d0e30db014610b51578063d5890fe814610b59578063d7d7dfb614610b79578063d89135cd14610ba6578063dd5ddfe814610bbc57600080fd5b8063b88d4fde14610ace578063c349c93e14610aee578063c3a07df614610b0e578063c87b56dd14610b3157600080fd5b80639e8f2908116101a6578063a5843f0811610175578063a5843f0814610a1e578063b354bbb314610a3e578063b54d1d9f14610a73578063b650163714610a93578063b80f55c914610aae57600080fd5b80639e8f29081461099b578063a22cb465146109bb578063a2309ff8146109db578063a2fafacd146109f157600080fd5b80638746475a116101ed5780638746475a1461091957806387cda6b81461092e5780638da5cb5b1461094e57806395d89b4114610971578063983d27371461098657600080fd5b8063715018a61461087d578063813ec0e81461089257806383c1cd8a146108b25780638462151c146108ec57600080fd5b80632e1a7d4d116103245780634f6ccce7116102ac5780635ff2f2e81161027b5780635ff2f2e8146107db57806361acdaaf146108085780636352211e1461082857806368bd580e1461084857806370a082311461085d57600080fd5b80634f6ccce71461076e57806351858e271461078e57806355f804b3146107a35780635c975abb146107c357600080fd5b806334e12155116102f357806334e12155146106e45780633f4ba83a146106f9578063401135e61461070e57806342842e0e1461072e5780634f558e791461074e57600080fd5b80632e1a7d4d146106515780632e1dfd10146106715780632f745c59146106ae57806332cb6b0c146106ce57600080fd5b806315b75bea116103a75780631d63ff2b116103765780631d63ff2b146105cc57806323b872dd146105e1578063278ecde11461060157806327ee47c7146106215780632aabb7261461063c57600080fd5b806315b75bea1461054257806318160ddd146105625780631a2e971f146105855780631b2df850146105a557600080fd5b8063095ea7b3116103e3578063095ea7b3146104c65780630cb61f6c146104e65780630f7309e81461050d5780631117a3321461052257600080fd5b806301ffc9a7146104155780630282938e1461044a57806306fdde031461046c578063081812fc1461048e575b600080fd5b34801561042157600080fd5b50610435610430366004614d50565b610d21565b60405190151581526020015b60405180910390f35b34801561045657600080fd5b5061046a610465366004614d82565b610d4c565b005b34801561047857600080fd5b50610481610f6f565b6040516104419190614e1b565b34801561049a57600080fd5b506104ae6104a9366004614e2e565b611002565b6040516001600160a01b039091168152602001610441565b3480156104d257600080fd5b5061046a6104e1366004614e47565b61102a565b3480156104f257600080fd5b506116ce546104ae906201000090046001600160a01b031681565b34801561051957600080fd5b5061048161113f565b34801561052e57600080fd5b5061046a61053d366004614e73565b6111ce565b34801561054e57600080fd5b5061046a61055d366004614e8b565b611221565b34801561056e57600080fd5b5061057761127e565b604051908152602001610441565b34801561059157600080fd5b5061046a6105a0366004614ea8565b611297565b3480156105b157600080fd5b506105ba600181565b60405160ff9091168152602001610441565b3480156105d857600080fd5b506105ba600081565b3480156105ed57600080fd5b5061046a6105fc366004614d82565b6113c2565b34801561060d57600080fd5b5061046a61061c366004614e2e565b6113f3565b34801561062d57600080fd5b506116ce546104359060ff1681565b34801561064857600080fd5b506105ba600281565b34801561065d57600080fd5b5061046a61066c366004614e2e565b6117a8565b34801561067d57600080fd5b506116cf546116d0546116d15461069392919083565b60408051938452602084019290925290820152606001610441565b3480156106ba57600080fd5b506105776106c9366004614e47565b61188c565b3480156106da57600080fd5b506105776116c781565b3480156106f057600080fd5b5061046a6119dc565b34801561070557600080fd5b5061046a611a73565b34801561071a57600080fd5b5061046a610729366004614f15565b611b4a565b34801561073a57600080fd5b5061046a610749366004614d82565b611d1e565b34801561075a57600080fd5b50610435610769366004614e2e565b611d39565b34801561077a57600080fd5b50610577610789366004614e2e565b611d44565b34801561079a57600080fd5b5061046a611d96565b3480156107af57600080fd5b5061046a6107be366004614f80565b611e6d565b3480156107cf57600080fd5b5060015460ff16610435565b3480156107e757600080fd5b506107fb6107f6366004614ff1565b611ec1565b6040516104419190615076565b34801561081457600080fd5b5061048161082336600461512b565b611f77565b34801561083457600080fd5b506104ae610843366004614e2e565b6122ab565b34801561085457600080fd5b5061046a61230c565b34801561086957600080fd5b50610577610878366004614e8b565b61234d565b34801561088957600080fd5b5061046a6123d4565b34801561089e57600080fd5b5061046a6108ad36600461516d565b6123e8565b3480156108be57600080fd5b506105ba6108cd366004614e8b565b6001600160a01b031660009081526116c9602052604090205460ff1690565b3480156108f857600080fd5b5061090c610907366004614e8b565b6124b0565b60405161044191906151a6565b34801561092557600080fd5b5061043561264d565b34801561093a57600080fd5b50610481610949366004614e2e565b612667565b34801561095a57600080fd5b5060015461010090046001600160a01b03166104ae565b34801561097d57600080fd5b50610481612761565b34801561099257600080fd5b506105ba600381565b3480156109a757600080fd5b5061046a6109b6366004614f15565b612771565b3480156109c757600080fd5b5061046a6109d63660046151ea565b6129ba565b3480156109e757600080fd5b506116dc54610577565b3480156109fd57600080fd5b50610a11610a0c366004614ff1565b6129c9565b6040516104419190615208565b348015610a2a57600080fd5b5061046a610a39366004614ea8565b612bcb565b348015610a4a57600080fd5b506116de546116df54610a5e919060ff1682565b60408051928352901515602083015201610441565b348015610a7f57600080fd5b5061090c610a8e36600461526a565b612bff565b348015610a9f57600080fd5b506116cb546104359060ff1681565b348015610aba57600080fd5b5061046a610ac9366004614ff1565b612d65565b348015610ada57600080fd5b5061046a610ae93660046152be565b612e3c565b348015610afa57600080fd5b50610577610b09366004614e47565b612e74565b348015610b1a57600080fd5b50610b23612f1e565b604051610441929190615329565b348015610b3d57600080fd5b50610481610b4c366004614e2e565b6130a9565b61046a6130b4565b348015610b6557600080fd5b5061046a610b74366004615383565b613183565b348015610b8557600080fd5b50610b99610b94366004614ff1565b61344a565b60405161044191906153f1565b348015610bb257600080fd5b506116dd54610577565b348015610bc857600080fd5b5061046a610bd736600461545b565b61368a565b348015610be857600080fd5b5061046a610bf7366004614f15565b61372c565b348015610c0857600080fd5b506116ce5461043590610100900460ff1681565b348015610c2857600080fd5b50610435610c3736600461548f565b6001600160a01b0391821660009081526116db6020908152604080832093909416825291909152205460ff1690565b348015610c7257600080fd5b5061046a610c813660046154bd565b6138e2565b348015610c9257600080fd5b5061046a610ca1366004614e8b565b613943565b348015610cb257600080fd5b506105776606e659d948720d81565b348015610ccd57600080fd5b5061046a610cdc366004614ff1565b6139bc565b348015610ced57600080fd5b5061046a610cfc366004614e8b565b613bb0565b348015610d0d57600080fd5b5061046a610d1c366004614f80565b613c07565b60006001600160e01b0319821663780e9d6360e01b1480610d465750610d4682613c4f565b92915050565b600260005403610d775760405162461bcd60e51b8152600401610d6e906154cf565b60405180910390fd5b6002600055336040516331a9108f60e11b8152600481018390526001600160a01b0391909116903090636352211e90602401602060405180830381865afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea9190615506565b6001600160a01b031614610e105760405162461bcd60e51b8152600401610d6e90615523565b6116ce54610100900460ff16610e765760405162461bcd60e51b815260206004820152602560248201527f7472616e73666572207768696c652072616973696e67206973206e6f7420656e60448201526418589b195960da1b6064820152608401610d6e565b60008181526116cd602052604090819020600201805462ff000019166201000017905551632142170760e11b81526001600160a01b038481166004830152831660248201526044810182905230906342842e0e90606401600060405180830381600087803b158015610ee757600080fd5b505af1158015610efb573d6000803e3d6000fd5b50505060008281526116cd6020526040902060028101805462ff00001916905554159050610f655780826001600160a01b0316846001600160a01b03167ff315af4c34ce2407cc1da2405672c4c7387fd44d616401235c21ef22b9bbd13860405160405180910390a45b5050600160005550565b60606116d68054610f7f90615550565b80601f0160208091040260200160405190810160405280929190818152602001828054610fab90615550565b8015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b600061100d82613c9f565b5060009081526116da60205260409020546001600160a01b031690565b6000611035826122ab565b9050806001600160a01b0316836001600160a01b0316036110a25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d6e565b336001600160a01b03821614806110be57506110be8133610c37565b6111305760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610d6e565b61113a8383613cff565b505050565b6116cc805461114d90615550565b80601f016020809104026020016040519081016040528092919081815260200182805461117990615550565b80156111c65780601f1061119b576101008083540402835291602001916111c6565b820191906000526020600020905b8154815290600101906020018083116111a957829003601f168201915b505050505081565b6111d6613d6e565b806116de6111e48282615584565b9050507f0dbe1ce901a0e8d75feb7f2d9d5928ecdcf3b0a031614120a51cf430eb45e1f18160405161121691906155b0565b60405180910390a150565b611229613d6e565b6116ce805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517fa7cb165192538768851363c5aa55b1ade75d692a51063730feccdd57d002a6ed90600090a250565b60006116dd546116dc5461129291906155eb565b905090565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b031614806112d8575060ff81166001145b6112f45760405162461bcd60e51b8152600401610d6e90615602565b604051634f558e7960e01b8152600481018490523090634f558e7990602401602060405180830381865afa158015611330573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611354919061562a565b6113705760405162461bcd60e51b8152600401610d6e90615647565b60008381526116d3602090815260409182902084905581518581529081018490527f600275bc3a309792283115dfb884cfc262977806bbf86a0cd92afdada40c960f91015b60405180910390a1505050565b6113cc3382613dce565b6113e85760405162461bcd60e51b8152600401610d6e90615673565b61113a838383613e4e565b3233146114425760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610d6e565b6002600054036114645760405162461bcd60e51b8152600401610d6e906154cf565b60026000556040516331a9108f60e11b8152600481018290523090636352211e90602401602060405180830381865afa1580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c99190615506565b6001600160a01b0316336001600160a01b03161461151b5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b6044820152606401610d6e565b6116ce546201000090046001600160a01b0316330361158a5760405162461bcd60e51b815260206004820152602560248201527f73746f636b206163636f756e7420726566756e647320617265206e6f7420616c6044820152641b1bddd95960da1b6064820152608401610d6e565b61159261264d565b6115de5760405162461bcd60e51b815260206004820152601d60248201527f6f7574736964652074686520726566756e6461626c6520706572696f640000006044820152606401610d6e565b60006115e982613ff8565b90506000811161163b5760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c792073616c65204e46542063616e20626520726566756e6465640000006044820152606401610d6e565b8047101561168b5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e7420636f6e74726163742066756e647300000000006044820152606401610d6e565b6116ce5460408051632142170760e11b8152336004820152620100009092046001600160a01b03166024830152604482018490525130916342842e0e91606480830192600092919082900301818387803b1580156116e857600080fd5b505af11580156116fc573d6000803e3d6000fd5b505050506117073390565b6001600160a01b03166108fc829081150290604051600060405180830381858888f1935050505015801561173f573d6000803e3d6000fd5b506116ce546201000090046001600160a01b0316336001600160a01b03167f88808afc48888c0e3ec9c545474e31ce16f177be8d0c8ba3922274893615750e8484604051611797929190918252602082015260400190565b60405180910390a350506001600055565b6117b0613d6e565b6002600054036117d25760405162461bcd60e51b8152600401610d6e906154cf565b600260005547808211156118205760405162461bcd60e51b81526020600482015260156024820152740c4c2d8c2dcc6ca40d2e640dcdee840cadcdeeaced605b1b6044820152606401610d6e565b604051339083156108fc029084906000818181858888f1935050505015801561184d573d6000803e3d6000fd5b5060405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001600055565b6000816118988461234d565b116118e55760405162461bcd60e51b815260206004820152601b60248201527f746865726520617265206e6f7420656e6f75676820746f6b656e7300000000006044820152606401610d6e565b60006118f16116dc5490565b905060008060005b838110156119a15761190a81614090565b915060018210156119505760405162461bcd60e51b815260206004820152601060248201526f1d1bdad95b881b9bdd081b5a5b9d195960821b6044820152606401610d6e565b866001600160a01b0316611963836140d6565b6001600160a01b03160361198f5785830361198357509250610d46915050565b61198c836156c1565b92505b80611999816156c1565b9150506118f9565b5060405162461bcd60e51b815260206004820152600f60248201526e3737ba103337bab732103a37b5b2b760891b6044820152606401610d6e565b6119e4613d6e565b600260005403611a065760405162461bcd60e51b8152600401610d6e906154cf565b6002600055611a1361415c565b15611a605760405162461bcd60e51b815260206004820152601860248201527f746865726520697320736f6d6520746f6b656e206c65667400000000000000006044820152606401610d6e565b611a6c60026000614d16565b6001600055565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611ab4575060ff81166001145b611ad05760405162461bcd60e51b8152600401610d6e90615602565b6116cb5460ff1615611b165760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610d6e565b611b1e614176565b6040517f092af66b0bd1c72d72f759dca6111b54869afce41de52c8b070daca48832ff3290600090a150565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611b8b575060ff81166001145b611ba75760405162461bcd60e51b8152600401610d6e90615602565b838214611c265760405162461bcd60e51b815260206004820152604160248201527f746865206c656e677468206f66204c697374696e67204c6576656c206973206460448201527f6966666572656e742066726f6d2074686174206f66204c697374696e672055526064820152604960f81b608482015260a401610d6e565b60005b84811015611d1657838382818110611c4357611c436156da565b9050602002810190611c5591906156f0565b6116d46000898986818110611c6c57611c6c6156da565b9050602002013581526020019081526020016000209182611c8e92919061577c565b507f837de06a2a9ac4d012f19a7c78d66f12f1c02a31fdf60ffee2ce634788d3a151868683818110611cc257611cc26156da565b90506020020135858584818110611cdb57611cdb6156da565b9050602002810190611ced91906156f0565b604051611cfc93929190615865565b60405180910390a180611d0e816156c1565b915050611c29565b505050505050565b61113a83838360405180602001604052806000815250612e3c565b6000610d46826141c8565b6000611d506116dc5490565b8210611d8d5760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610d6e565b610d4682614090565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611dd7575060ff81166001145b611df35760405162461bcd60e51b8152600401610d6e90615602565b6116cb5460ff1615611e395760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610d6e565b611e416141e8565b6040517f76ba3851df4b69972443b0c99bcba0f237d990fbc8cd7ab5c86537c15da180ca90600090a150565b611e75613d6e565b6116d2611e8382848361577c565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051611eb5929190615888565b60405180910390a15050565b60606000826001600160401b03811115611edd57611edd615089565b604051908082528060200260200182016040528015611f06578160200160208202803683370190505b50905060005b83811015611f6f57611f35858583818110611f2957611f296156da565b905060200201356140d6565b828281518110611f4757611f476156da565b6001600160a01b0390921660209283029190910190910152611f68816156c1565b9050611f0c565b509392505050565b805160609060005b8181108015611fac5750838181518110611f9b57611f9b6156da565b01602001516001600160f81b031916155b15611fc35780611fbb816156c1565b915050611f7f565b6117e3611fd082846155eb565b611fdc9061209f61589c565b611fe691906158d1565b611ff090826158e5565b611ffb9060016158e5565b91506000826001600160401b0381111561201757612017615089565b6040519080825280601f01601f191660200182016040528015612041576020820181803683370190505b509050600080806120536001876158fd565b905060005b88518110156121445761206c6001886155eb565b9250888181518110612080576120806156da565b016020015160f81c93505b8183138061209e575063ffffffff841615155b1561212f578483815181106120b5576120b56156da565b01602001516120c99060f81c61010061593c565b6120d79061ffff1685615966565b93506120e4603a8561598e565b60f81b8584815181106120f9576120f96156da565b60200101906001600160f81b031916908160001a90535061211b603a856159b1565b935082612127816159d4565b93505061208b565b8291508061213c816156c1565b915050612058565b50845b86811080156121745750848181518110612163576121636156da565b01602001516001600160f81b031916155b1561218b5780612183816156c1565b915050612147565b61219586826155eb565b85516121a191906155eb565b96506000876001600160401b038111156121bd576121bd615089565b6040519080825280601f01601f1916602001820160405280156121e7576020820181803683370190505b50905060005b8881101561229d5760008861220285846158e5565b61220c91906155eb565b90506040518060600160405280603a8152602001615b3e603a9139888281518110612239576122396156da565b0160200151815160f89190911c908110612255576122556156da565b602001015160f81c60f81b838381518110612272576122726156da565b60200101906001600160f81b031916908160001a905350508080612295906156c1565b9150506121ed565b509998505050505050505050565b60008181526116d860205260408120546001600160a01b031680610d465760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d6e565b612314613d6e565b6116cb805460ff191660011790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b60006001600160a01b0382166123b75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610d6e565b506001600160a01b031660009081526116d9602052604090205490565b6123dc613d6e565b6123e66000614223565b565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480612429575060ff81166002145b80612437575060ff81166001145b6124535760405162461bcd60e51b8152600401610d6e90615602565b6116ce8054831515610100810261ff001987151590811661ffff1990941693909317179092556040805191825260208201929092527f8cb0f99e5929303cba6a2267864c0d25f5c818f7b99fa9e8d1d4d818690127dc91016113b5565b606060006124bd8361234d565b9050806000036124dd576040805160008082526020820190925290611f6f565b6000816001600160401b038111156124f7576124f7615089565b604051908082528060200260200182016040528015612520578160200160208202803683370190505b509050600061252f6116dc5490565b905060008060005b838110156125f25761254881614090565b9150600182101561258e5760405162461bcd60e51b815260206004820152601060248201526f1d1bdad95b881b9bdd081b5a5b9d195960821b6044820152606401610d6e565b876001600160a01b03166125a1836140d6565b6001600160a01b0316036125e057818584815181106125c2576125c26156da565b60209081029190910101526125d6836156c1565b92508583146125f2575b806125ea816156c1565b915050612537565b508482146126425760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420656e6f75676820746f6b656e73207765726520666f756e64000000006044820152606401610d6e565b509195945050505050565b6116cf54600090421180156112925750506116d054421090565b604080516022808252606082810190935260009190602082018180368337019050509050601260f81b816000815181106126a3576126a36156da565b60200101906001600160f81b031916908160001a905350602060f81b816001815181106126d2576126d26156da565b60200101906001600160f81b031916908160001a90535060005b602081101561275057838160208110612707576127076156da565b1a60f81b826127178360026158e5565b81518110612727576127276156da565b60200101906001600160f81b031916908160001a90535080612748816156c1565b9150506126ec565b5061275a81611f77565b9392505050565b60606116d78054610f7f90615550565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b031614806127b2575060ff81166001145b6127ce5760405162461bcd60e51b8152600401610d6e90615602565b836128095760405162461bcd60e51b815260206004820152600b60248201526a1b9bc81d1bdad95b881a5960aa1b6044820152606401610d6e565b83821461287e5760405162461bcd60e51b815260206004820152603a60248201527f746f6b656e20696420617272617920616e6420746f6b656e206861736820617260448201527f726179206861766520646966666572656e74206c656e677468730000000000006064820152608401610d6e565b60005b84811015611d1657600086868381811061289d5761289d6156da565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa1580156128e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290a919061562a565b6129265760405162461bcd60e51b8152600401610d6e90615647565b848483818110612938576129386156da565b905060200201356116d36000838152602001908152602001600020819055507f600275bc3a309792283115dfb884cfc262977806bbf86a0cd92afdada40c960f8186868581811061298b5761298b6156da565b905060200201356040516129a9929190918252602082015260400190565b60405180910390a150600101612881565b6129c533838361427d565b5050565b60606000826001600160401b038111156129e5576129e5615089565b604051908082528060200260200182016040528015612a1857816020015b6060815260200190600190039081612a035790505b50905060005b83811015611f6f576000858583818110612a3a57612a3a6156da565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa158015612a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa7919061562a565b612ade5760405180602001604052806000815250838381518110612acd57612acd6156da565b602002602001018190525050612bb9565b60008181526116d3602052604081205490819003612b71576000612b018361434c565b90506000815111612b215760405180602001604052806000815250612b4c565b80612b2b8461441b565b604051602001612b3c9291906159f1565b6040516020818303038152906040525b858581518110612b5e57612b5e6156da565b6020026020010181905250505050612bb9565b612b7a81612667565b604051602001612b8a9190615a17565b604051602081830303815290604052848481518110612bab57612bab6156da565b602002602001018190525050505b80612bc3816156c1565b915050612a1e565b612bd3613d6e565b815b8181101561113a57806001016002826116c78110612bf557612bf56156da565b0155600101612bd5565b6116e0546060906001600160a01b0316336001600160a01b031614612c365760405162461bcd60e51b8152600401610d6e90615602565b6116de54821115612c595760405162461bcd60e51b8152600401610d6e90615a46565b6116de5482612c686116dc5490565b011115612c875760405162461bcd60e51b8152600401610d6e90615a46565b6000826001600160401b03811115612ca157612ca1615089565b604051908082528060200260200182016040528015612cca578160200160208202803683370190505b50905060005b83811015612d5c576000612ce261451b565b9050612cee8782614605565b80838381518110612d0157612d016156da565b60200260200101818152505080868684818110612d2057612d206156da565b905060200201357f3dc0fefcc324b820a6c919fbd23ec11b998fddc2b064bcce236d4a7bbbf8f96860405160405180910390a350600101612cd0565b50949350505050565b612d6d613d6e565b600260005403612d8f5760405162461bcd60e51b8152600401610d6e906154cf565b600260009081555b81811015612e17576000838383818110612db357612db36156da565b905060200201359050612dc33390565b6001600160a01b0316612dd5826122ab565b6001600160a01b031614612dfb5760405162461bcd60e51b8152600401610d6e90615523565b612e048161461f565b5080612e0f816156c1565b915050612d97565b50818190506116dd6000828254612e2e91906158e5565b909155505060016000555050565b612e463383613dce565b612e625760405162461bcd60e51b8152600401610d6e90615673565b612e6e848484846146c8565b50505050565b6116e0546000906001600160a01b0316336001600160a01b031614612eab5760405162461bcd60e51b8152600401610d6e90615602565b6116de546116dc546001011115612ed45760405162461bcd60e51b8152600401610d6e90615a46565b6000612ede61451b565b9050612eea8482614605565b604051819084907f3dc0fefcc324b820a6c919fbd23ec11b998fddc2b064bcce236d4a7bbbf8f96890600090a39392505050565b3360008181526116c96020526040902054600154606092839260ff169161010090046001600160a01b03161480612f58575060ff81166001145b612f745760405162461bcd60e51b8152600401610d6e90615602565b6116ca546000906001600160401b03811115612f9257612f92615089565b604051908082528060200260200182016040528015612fbb578160200160208202803683370190505b50905060005b6116ca5481101561303e576116c960006116ca8381548110612fe557612fe56156da565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825160ff90911690839083908110613024576130246156da565b60ff90921660209283029190910190910152600101612fc1565b506116ca818180548060200260200160405190810160405280929190818152602001828054801561309857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161307a575b505050505091509350935050509091565b6060610d46826146fb565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b031614806130f5575060ff81166002145b80613103575060ff81166001145b61311f5760405162461bcd60e51b8152600401610d6e90615602565b6002600054036131415760405162461bcd60e51b8152600401610d6e906154cf565b600260005560405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2506001600055565b6002600054036131a55760405162461bcd60e51b8152600401610d6e906154cf565b600260005580156131fc576116ce5460ff166131fc5760405162461bcd60e51b81526020600482015260166024820152751c985a5cda5b99c81a5cc81b9bdd08185b1b1bddd95960521b6044820152606401610d6e565b60005b8381101561343e57600085858381811061321b5761321b6156da565b90506020020135905061322b3390565b6040516331a9108f60e11b8152600481018390526001600160a01b0391909116903090636352211e90602401602060405180830381865afa158015613274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132989190615506565b6001600160a01b0316146132be5760405162461bcd60e51b8152600401610d6e90615523565b60008181526116cd60205260409020805484156133d057806000036133415742825560028201805461ffff191661ffff8816908117909155336001600160a01b0316847fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd588604051613334911515815260200190565b60405180910390a4613433565b600282015461ffff8781169116146133cb5760405162461bcd60e51b815260206004820152604160248201527f72616973696e6720697320616c726561647920737461727465642c206275742060448201527f77697468206120646966666572656e742072616973696e6720747970652073656064820152601d60fa1b608482015260a401610d6e565b613433565b801561343357600182018054428390030190556000825561ffff8616336001600160a01b0316847fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd58860405161342a911515815260200190565b60405180910390a45b5050506001016131ff565b50506001600055505050565b60606000826001600160401b0381111561346657613466615089565b6040519080825280602002602001820160405280156134b857816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816134845790505b50905060005b83811015611f6f5760008585838181106134da576134da6156da565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa158015613523573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613547919061562a565b613551575061367a565b60008181526116cd60209081526040918290208251608081018452815480825260018301549382019390935260029091015461ffff8116938201939093526201000090920460ff16151560608301521561362c5760018484815181106135b9576135b96156da565b6020026020010151606001901515908115158152505080604001518484815181106135e6576135e66156da565b602090810291909101015161ffff909116604090910152805161360990426155eb565b84848151811061361b5761361b6156da565b602002602001015160200181815250505b83838151811061363e5761363e6156da565b602002602001015160200151816020015161365991906158e5565b84848151811061366b5761366b6156da565b60209081029190910101515250505b613683816156c1565b90506134be565b613692613d6e565b60ff81166136c0576001600160a01b03821660009081526116c960205260409020805460ff191690556136e7565b6001600160a01b03821660009081526116c960205260409020805460ff191660ff83161790555b60405160ff821681526001600160a01b038316907f02ab42f6b82517d797a585d5319a95696ea5167a6fbb0e0322c9ee66edec682c9060200160405180910390a25050565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b0316148061376d575060ff81166001145b6137895760405162461bcd60e51b8152600401610d6e90615602565b83821461380a5760405162461bcd60e51b815260206004820152604360248201527f746865206c656e677468206f66204c697374696e6720546f6b656e206973206460448201527f6966666572656e742066726f6d2074686174206f66204c697374696e67204c656064820152621d995b60ea1b608482015260a401610d6e565b60005b84811015611d1657838382818110613827576138276156da565b905060200201356116d56000888885818110613845576138456156da565b905060200201358152602001908152602001600020819055507fd043c6bcfaea0d1a8cf3a53585ed02c284a5bc394f0487acb6b324daf94af684868683818110613891576138916156da565b905060200201358585848181106138aa576138aa6156da565b905060200201356040516138c8929190918252602082015260400190565b60405180910390a1806138da816156c1565b91505061380d565b6138ea613d6e565b80356116cf8190556020808301356116d08190556040808501356116d18190558151948552928401919091528201527f61467bd874c25765186e5d914938f0b7ac6f48d10b8d0a7f9d9b15dfe1b520f490606001611216565b61394b613d6e565b6001600160a01b0381166139b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d6e565b6139b981614223565b50565b6002600054036139de5760405162461bcd60e51b8152600401610d6e906154cf565b60026000908155338082526116c960205260409091205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480613a25575060ff81166002145b80613a33575060ff81166001145b613a4f5760405162461bcd60e51b8152600401610d6e90615602565b60005b82811015613ba5576000848483818110613a6e57613a6e6156da565b9050602002013590506000306001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401613aa791815260200190565b602060405180830381865afa158015613ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae89190615506565b60008381526116cd602052604081208054929350919003613b0b57505050613b9d565b8054600182018054429290920390910190556000808255600282015460405191825261ffff16906001600160a01b0384169085907fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd59060200160405180910390a4604051339084907f376b2166c0aaa2fc263d60dbcf1a4fa8f55e709487fcc9073ba90faa78d5005790600090a35050505b600101613a52565b505060016000555050565b613bb8613d6e565b6116e080546001600160a01b0319166001600160a01b0383169081179091556040519081527f68be7b539d1836c43a5f5a4407cefe8452f303a444c06c2f78cbf75f2eff8b6d90602001611216565b613c0f613d6e565b6116cc613c1d82848361577c565b507f638b2296aed59fe9e4f72c7536065ba3e36cb7690c2d130f66334da9cc2406cf8282604051611eb5929190615888565b60006001600160e01b031982166380ac58cd60e01b1480613c8057506001600160e01b03198216635b5e139f60e01b145b80610d4657506301ffc9a760e01b6001600160e01b0319831614610d46565b60008181526116d860205260409020546001600160a01b03166139b95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d6e565b60008181526116da6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613d35826122ab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001546001600160a01b036101009091041633146123e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d6e565b600080613dda836122ab565b9050806001600160a01b0316846001600160a01b03161480613e2257506001600160a01b0380821660009081526116db602090815260408083209388168352929052205460ff165b80613e465750836001600160a01b0316613e3b84611002565b6001600160a01b0316145b949350505050565b826001600160a01b0316613e61826122ab565b6001600160a01b031614613ec55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d6e565b6001600160a01b038216613f275760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d6e565b613f3283838361481f565b613f3d600082613cff565b6001600160a01b03831660009081526116d960205260408120805460019290613f679084906155eb565b90915550506001600160a01b03821660009081526116d960205260408120805460019290613f969084906158e5565b909155505060008181526116d8602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116df5460009060ff1615614087576116e05460405163042d801560e51b8152600481018490526001600160a01b039091169081906385b002a090602401602060405180830381865afa158015614053573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614077919061562a565b156140855750600092915050565b505b6116d154610d46565b60006116c782106140a357506000919050565b600260016140b3846116c76155eb565b6140bd91906155eb565b6116c781106140ce576140ce6156da565b015492915050565b60008181526116d860205260408120546001600160a01b031615614154576040516331a9108f60e11b8152600481018390523090636352211e90602401602060405180830381865afa158015614130573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d469190615506565b506000919050565b60006141686116dc5490565b6116de5461129291906155eb565b61417e614835565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008181526116d860205260408120546001600160a01b03161515610d46565b6141f061487e565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336141ab565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036142de5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d6e565b6001600160a01b0383811660008181526116db6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008181526116d5602052604081205460609181900361436f5761275a836148c4565b60008181526116d460205260408120805461438990615550565b80601f01602080910402602001604051908101604052809291908181526020018280546143b590615550565b80156144025780601f106143d757610100808354040283529160200191614402565b820191906000526020600020905b8154815290600101906020018083116143e557829003601f168201915b50505050509050805160000361275a57613e46846148c4565b6060816000036144425750506040805180820190915260018152600360fc1b602082015290565b8160005b811561446c5780614456816156c1565b91506144659050600a836158d1565b9150614446565b6000816001600160401b0381111561448657614486615089565b6040519080825280601f01601f1916602001820160405280156144b0576020820181803683370190505b5090505b8415613e46576144c56001836155eb565b91506144d2600a86615a7d565b6144dd9060306158e5565b60f81b8183815181106144f2576144f26156da565b60200101906001600160f81b031916908160001a905350614514600a866158d1565b94506144b4565b60008061452661415c565b9050600081116145785760405162461bcd60e51b815260206004820152601a60248201527f746f6b656e496420686173206265656e206578686175737465640000000000006044820152606401610d6e565b6145ff60018203826145ec846040805143600019014060208083019190915244828401524260608084019190915241811b6bffffffffffffffffffffffff199081166080850152609484019590955232901b90931660b4820152815160a881830301815260c8909101909152805191012090565b816145f9576145f96158bb565b06614959565b91505090565b6129c58282604051806020016040528060008152506149be565b600061462a826122ab565b90506146388160008461481f565b614643600083613cff565b6001600160a01b03811660009081526116d96020526040812080546001929061466d9084906155eb565b909155505060008281526116d8602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6146d3848484613e4e565b6146df848484846149f1565b612e6e5760405162461bcd60e51b8152600401610d6e90615a91565b604051634f558e7960e01b8152600481018290526060903090634f558e7990602401602060405180830381865afa15801561473a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061475e919061562a565b61477a5760405162461bcd60e51b8152600401610d6e90615647565b60008281526116d36020526040812054908190036147ef57600061479d8461434c565b905060008151116147bd5760405180602001604052806000815250613e46565b806147c78561441b565b6040516020016147d89291906159f1565b604051602081830303815290604052949350505050565b6147f881612667565b6040516020016148089190615a17565b604051602081830303815290604052915050919050565b61482a838383614af2565b61113a838383614b62565b60015460ff166123e65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d6e565b60015460ff16156123e65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d6e565b60606116d280546148d490615550565b80601f016020809104026020016040519081016040528092919081815260200182805461490090615550565b801561494d5780601f106149225761010080835404028352916020019161494d565b820191906000526020600020905b81548152906001019060200180831161493057829003601f168201915b50505050509050919050565b6000806002836116c78110614970576149706156da565b015490506002846116c78110614988576149886156da565b01546002846116c7811061499e5761499e6156da565b0155806002856116c781106149b5576149b56156da565b01559392505050565b6149c88383614bad565b6149d560008484846149f1565b61113a5760405162461bcd60e51b8152600401610d6e90615a91565b60006001600160a01b0384163b15614ae757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614a35903390899088908890600401615ae3565b6020604051808303816000875af1925050508015614a70575060408051601f3d908101601f19168201909252614a6d91810190615b20565b60015b614acd573d808015614a9e576040519150601f19603f3d011682016040523d82523d6000602084013e614aa3565b606091505b508051600003614ac55760405162461bcd60e51b8152600401610d6e90615a91565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613e46565b506001949350505050565b60008181526116cd60205260409020541561113a5760008181526116cd602052604090206002015462010000900460ff1661113a5760405162461bcd60e51b815260206004820152601060248201526f746f6b656e2069732072616973696e6760801b6044820152606401610d6e565b60015460ff161561113a5760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c881c185d5cd959605a1b6044820152606401610d6e565b614bb78282614bc5565b50506116dc80546001019055565b6001600160a01b038216614c1b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d6e565b60008181526116d860205260409020546001600160a01b031615614c815760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d6e565b614c8d6000838361481f565b6001600160a01b03821660009081526116d960205260408120805460019290614cb79084906158e5565b909155505060008181526116d8602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b506139b9906116c78101905b80821115614d365760008155600101614d22565b5090565b6001600160e01b0319811681146139b957600080fd5b600060208284031215614d6257600080fd5b813561275a81614d3a565b6001600160a01b03811681146139b957600080fd5b600080600060608486031215614d9757600080fd5b8335614da281614d6d565b92506020840135614db281614d6d565b929592945050506040919091013590565b60005b83811015614dde578181015183820152602001614dc6565b83811115612e6e5750506000910152565b60008151808452614e07816020860160208601614dc3565b601f01601f19169290920160200192915050565b60208152600061275a6020830184614def565b600060208284031215614e4057600080fd5b5035919050565b60008060408385031215614e5a57600080fd5b8235614e6581614d6d565b946020939093013593505050565b600060408284031215614e8557600080fd5b50919050565b600060208284031215614e9d57600080fd5b813561275a81614d6d565b60008060408385031215614ebb57600080fd5b50508035926020909101359150565b60008083601f840112614edc57600080fd5b5081356001600160401b03811115614ef357600080fd5b6020830191508360208260051b8501011115614f0e57600080fd5b9250929050565b60008060008060408587031215614f2b57600080fd5b84356001600160401b0380821115614f4257600080fd5b614f4e88838901614eca565b90965094506020870135915080821115614f6757600080fd5b50614f7487828801614eca565b95989497509550505050565b60008060208385031215614f9357600080fd5b82356001600160401b0380821115614faa57600080fd5b818501915085601f830112614fbe57600080fd5b813581811115614fcd57600080fd5b866020828501011115614fdf57600080fd5b60209290920196919550909350505050565b6000806020838503121561500457600080fd5b82356001600160401b0381111561501a57600080fd5b61502685828601614eca565b90969095509350505050565b600081518084526020808501945080840160005b8381101561506b5781516001600160a01b031687529582019590820190600101615046565b509495945050505050565b60208152600061275a6020830184615032565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126150b057600080fd5b81356001600160401b03808211156150ca576150ca615089565b604051601f8301601f19908116603f011681019082821181831017156150f2576150f2615089565b8160405283815286602085880101111561510b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561513d57600080fd5b81356001600160401b0381111561515357600080fd5b613e468482850161509f565b80151581146139b957600080fd5b6000806040838503121561518057600080fd5b823561518b8161515f565b9150602083013561519b8161515f565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156151de578351835292840192918401916001016151c2565b50909695505050505050565b600080604083850312156151fd57600080fd5b823561518b81614d6d565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561525d57603f1988860301845261524b858351614def565b9450928501929085019060010161522f565b5092979650505050505050565b60008060006040848603121561527f57600080fd5b833561528a81614d6d565b925060208401356001600160401b038111156152a557600080fd5b6152b186828701614eca565b9497909650939450505050565b600080600080608085870312156152d457600080fd5b84356152df81614d6d565b935060208501356152ef81614d6d565b92506040850135915060608501356001600160401b0381111561531157600080fd5b61531d8782880161509f565b91505092959194509250565b60408152600061533c6040830185615032565b82810360208481019190915284518083528582019282019060005b8181101561537657845160ff1683529383019391830191600101615357565b5090979650505050505050565b6000806000806060858703121561539957600080fd5b84356001600160401b038111156153af57600080fd5b6153bb87828801614eca565b909550935050602085013561ffff811681146153d657600080fd5b915060408501356153e68161515f565b939692955090935050565b602080825282518282018190526000919060409081850190868401855b8281101561544e5781518051855286810151878601528581015161ffff16868601526060908101511515908501526080909301929085019060010161540e565b5091979650505050505050565b6000806040838503121561546e57600080fd5b823561547981614d6d565b9150602083013560ff8116811461519b57600080fd5b600080604083850312156154a257600080fd5b82356154ad81614d6d565b9150602083013561519b81614d6d565b600060608284031215614e8557600080fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006020828403121561551857600080fd5b815161275a81614d6d565b60208082526013908201527231b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b600181811c9082168061556457607f821691505b602082108103614e8557634e487b7160e01b600052602260045260246000fd5b8135815560018101602083013561559a8161515f565b815490151560ff1660ff19919091161790555050565b813581526040810160208301356155c68161515f565b80151560208401525092915050565b634e487b7160e01b600052601160045260246000fd5b6000828210156155fd576155fd6155d5565b500390565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b60006020828403121561563c57600080fd5b815161275a8161515f565b6020808252601290820152711d1bdad95b881a5cc81b9bdd08195e1a5cdd60721b604082015260600190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6000600182016156d3576156d36155d5565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261570757600080fd5b8301803591506001600160401b0382111561572157600080fd5b602001915036819003821315614f0e57600080fd5b601f82111561113a57600081815260208120601f850160051c8101602086101561575d5750805b601f850160051c820191505b81811015611d1657828155600101615769565b6001600160401b0383111561579357615793615089565b6157a7836157a18354615550565b83615736565b6000601f8411600181146157db57600085156157c35750838201355b600019600387901b1c1916600186901b178355615835565b600083815260209020601f19861690835b8281101561580c57868501358255602094850194600190920191016157ec565b50868210156158295760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061587f60408301848661583c565b95945050505050565b602081526000613e4660208301848661583c565b60008160001904831182151516156158b6576158b66155d5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826158e0576158e06158bb565b500490565b600082198211156158f8576158f86155d5565b500190565b60008083128015600160ff1b85018412161561591b5761591b6155d5565b6001600160ff1b0384018313811615615936576159366155d5565b50500390565b600061ffff8083168185168183048111821515161561595d5761595d6155d5565b02949350505050565b600063ffffffff808316818516808303821115615985576159856155d5565b01949350505050565b600063ffffffff808416806159a5576159a56158bb565b92169190910692915050565b600063ffffffff808416806159c8576159c86158bb565b92169190910492915050565b6000600160ff1b82016159e9576159e96155d5565b506000190190565b60008351615a03818460208801614dc3565b835190830190615985818360208801614dc3565b66697066733a2f2f60c81b815260008251615a39816007850160208701614dc3565b9190910160070192915050565b6020808252601c908201527f6d696e7420776f756c6420657863656564206d617820737570706c7900000000604082015260600190565b600082615a8c57615a8c6158bb565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615b1690830184614def565b9695505050505050565b600060208284031215615b3257600080fd5b815161275a81614d3a56fe31323334353637383941424344454647484a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f707172737475767778797aa26469706673582212201728a250767714a117cfabd82abbb06d8bbf59455cfdedec7bec50cea2e6185a64736f6c634300080f003300000000000000000000000000000000000000000000000000000000000016c70000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106104105760003560e01c8063715018a61161021e578063b88d4fde11610123578063df13b8a7116100ab578063f2fde38b1161007a578063f2fde38b14610c86578063f37e20ba14610ca6578063f68dc5de14610cc1578063fe71ba8f14610ce1578063ffe630b514610d0157600080fd5b8063df13b8a714610bdc578063e697188f14610bfc578063e985e9c514610c1c578063ef11e90514610c6657600080fd5b8063d0e30db0116100f2578063d0e30db014610b51578063d5890fe814610b59578063d7d7dfb614610b79578063d89135cd14610ba6578063dd5ddfe814610bbc57600080fd5b8063b88d4fde14610ace578063c349c93e14610aee578063c3a07df614610b0e578063c87b56dd14610b3157600080fd5b80639e8f2908116101a6578063a5843f0811610175578063a5843f0814610a1e578063b354bbb314610a3e578063b54d1d9f14610a73578063b650163714610a93578063b80f55c914610aae57600080fd5b80639e8f29081461099b578063a22cb465146109bb578063a2309ff8146109db578063a2fafacd146109f157600080fd5b80638746475a116101ed5780638746475a1461091957806387cda6b81461092e5780638da5cb5b1461094e57806395d89b4114610971578063983d27371461098657600080fd5b8063715018a61461087d578063813ec0e81461089257806383c1cd8a146108b25780638462151c146108ec57600080fd5b80632e1a7d4d116103245780634f6ccce7116102ac5780635ff2f2e81161027b5780635ff2f2e8146107db57806361acdaaf146108085780636352211e1461082857806368bd580e1461084857806370a082311461085d57600080fd5b80634f6ccce71461076e57806351858e271461078e57806355f804b3146107a35780635c975abb146107c357600080fd5b806334e12155116102f357806334e12155146106e45780633f4ba83a146106f9578063401135e61461070e57806342842e0e1461072e5780634f558e791461074e57600080fd5b80632e1a7d4d146106515780632e1dfd10146106715780632f745c59146106ae57806332cb6b0c146106ce57600080fd5b806315b75bea116103a75780631d63ff2b116103765780631d63ff2b146105cc57806323b872dd146105e1578063278ecde11461060157806327ee47c7146106215780632aabb7261461063c57600080fd5b806315b75bea1461054257806318160ddd146105625780631a2e971f146105855780631b2df850146105a557600080fd5b8063095ea7b3116103e3578063095ea7b3146104c65780630cb61f6c146104e65780630f7309e81461050d5780631117a3321461052257600080fd5b806301ffc9a7146104155780630282938e1461044a57806306fdde031461046c578063081812fc1461048e575b600080fd5b34801561042157600080fd5b50610435610430366004614d50565b610d21565b60405190151581526020015b60405180910390f35b34801561045657600080fd5b5061046a610465366004614d82565b610d4c565b005b34801561047857600080fd5b50610481610f6f565b6040516104419190614e1b565b34801561049a57600080fd5b506104ae6104a9366004614e2e565b611002565b6040516001600160a01b039091168152602001610441565b3480156104d257600080fd5b5061046a6104e1366004614e47565b61102a565b3480156104f257600080fd5b506116ce546104ae906201000090046001600160a01b031681565b34801561051957600080fd5b5061048161113f565b34801561052e57600080fd5b5061046a61053d366004614e73565b6111ce565b34801561054e57600080fd5b5061046a61055d366004614e8b565b611221565b34801561056e57600080fd5b5061057761127e565b604051908152602001610441565b34801561059157600080fd5b5061046a6105a0366004614ea8565b611297565b3480156105b157600080fd5b506105ba600181565b60405160ff9091168152602001610441565b3480156105d857600080fd5b506105ba600081565b3480156105ed57600080fd5b5061046a6105fc366004614d82565b6113c2565b34801561060d57600080fd5b5061046a61061c366004614e2e565b6113f3565b34801561062d57600080fd5b506116ce546104359060ff1681565b34801561064857600080fd5b506105ba600281565b34801561065d57600080fd5b5061046a61066c366004614e2e565b6117a8565b34801561067d57600080fd5b506116cf546116d0546116d15461069392919083565b60408051938452602084019290925290820152606001610441565b3480156106ba57600080fd5b506105776106c9366004614e47565b61188c565b3480156106da57600080fd5b506105776116c781565b3480156106f057600080fd5b5061046a6119dc565b34801561070557600080fd5b5061046a611a73565b34801561071a57600080fd5b5061046a610729366004614f15565b611b4a565b34801561073a57600080fd5b5061046a610749366004614d82565b611d1e565b34801561075a57600080fd5b50610435610769366004614e2e565b611d39565b34801561077a57600080fd5b50610577610789366004614e2e565b611d44565b34801561079a57600080fd5b5061046a611d96565b3480156107af57600080fd5b5061046a6107be366004614f80565b611e6d565b3480156107cf57600080fd5b5060015460ff16610435565b3480156107e757600080fd5b506107fb6107f6366004614ff1565b611ec1565b6040516104419190615076565b34801561081457600080fd5b5061048161082336600461512b565b611f77565b34801561083457600080fd5b506104ae610843366004614e2e565b6122ab565b34801561085457600080fd5b5061046a61230c565b34801561086957600080fd5b50610577610878366004614e8b565b61234d565b34801561088957600080fd5b5061046a6123d4565b34801561089e57600080fd5b5061046a6108ad36600461516d565b6123e8565b3480156108be57600080fd5b506105ba6108cd366004614e8b565b6001600160a01b031660009081526116c9602052604090205460ff1690565b3480156108f857600080fd5b5061090c610907366004614e8b565b6124b0565b60405161044191906151a6565b34801561092557600080fd5b5061043561264d565b34801561093a57600080fd5b50610481610949366004614e2e565b612667565b34801561095a57600080fd5b5060015461010090046001600160a01b03166104ae565b34801561097d57600080fd5b50610481612761565b34801561099257600080fd5b506105ba600381565b3480156109a757600080fd5b5061046a6109b6366004614f15565b612771565b3480156109c757600080fd5b5061046a6109d63660046151ea565b6129ba565b3480156109e757600080fd5b506116dc54610577565b3480156109fd57600080fd5b50610a11610a0c366004614ff1565b6129c9565b6040516104419190615208565b348015610a2a57600080fd5b5061046a610a39366004614ea8565b612bcb565b348015610a4a57600080fd5b506116de546116df54610a5e919060ff1682565b60408051928352901515602083015201610441565b348015610a7f57600080fd5b5061090c610a8e36600461526a565b612bff565b348015610a9f57600080fd5b506116cb546104359060ff1681565b348015610aba57600080fd5b5061046a610ac9366004614ff1565b612d65565b348015610ada57600080fd5b5061046a610ae93660046152be565b612e3c565b348015610afa57600080fd5b50610577610b09366004614e47565b612e74565b348015610b1a57600080fd5b50610b23612f1e565b604051610441929190615329565b348015610b3d57600080fd5b50610481610b4c366004614e2e565b6130a9565b61046a6130b4565b348015610b6557600080fd5b5061046a610b74366004615383565b613183565b348015610b8557600080fd5b50610b99610b94366004614ff1565b61344a565b60405161044191906153f1565b348015610bb257600080fd5b506116dd54610577565b348015610bc857600080fd5b5061046a610bd736600461545b565b61368a565b348015610be857600080fd5b5061046a610bf7366004614f15565b61372c565b348015610c0857600080fd5b506116ce5461043590610100900460ff1681565b348015610c2857600080fd5b50610435610c3736600461548f565b6001600160a01b0391821660009081526116db6020908152604080832093909416825291909152205460ff1690565b348015610c7257600080fd5b5061046a610c813660046154bd565b6138e2565b348015610c9257600080fd5b5061046a610ca1366004614e8b565b613943565b348015610cb257600080fd5b506105776606e659d948720d81565b348015610ccd57600080fd5b5061046a610cdc366004614ff1565b6139bc565b348015610ced57600080fd5b5061046a610cfc366004614e8b565b613bb0565b348015610d0d57600080fd5b5061046a610d1c366004614f80565b613c07565b60006001600160e01b0319821663780e9d6360e01b1480610d465750610d4682613c4f565b92915050565b600260005403610d775760405162461bcd60e51b8152600401610d6e906154cf565b60405180910390fd5b6002600055336040516331a9108f60e11b8152600481018390526001600160a01b0391909116903090636352211e90602401602060405180830381865afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea9190615506565b6001600160a01b031614610e105760405162461bcd60e51b8152600401610d6e90615523565b6116ce54610100900460ff16610e765760405162461bcd60e51b815260206004820152602560248201527f7472616e73666572207768696c652072616973696e67206973206e6f7420656e60448201526418589b195960da1b6064820152608401610d6e565b60008181526116cd602052604090819020600201805462ff000019166201000017905551632142170760e11b81526001600160a01b038481166004830152831660248201526044810182905230906342842e0e90606401600060405180830381600087803b158015610ee757600080fd5b505af1158015610efb573d6000803e3d6000fd5b50505060008281526116cd6020526040902060028101805462ff00001916905554159050610f655780826001600160a01b0316846001600160a01b03167ff315af4c34ce2407cc1da2405672c4c7387fd44d616401235c21ef22b9bbd13860405160405180910390a45b5050600160005550565b60606116d68054610f7f90615550565b80601f0160208091040260200160405190810160405280929190818152602001828054610fab90615550565b8015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b600061100d82613c9f565b5060009081526116da60205260409020546001600160a01b031690565b6000611035826122ab565b9050806001600160a01b0316836001600160a01b0316036110a25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d6e565b336001600160a01b03821614806110be57506110be8133610c37565b6111305760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610d6e565b61113a8383613cff565b505050565b6116cc805461114d90615550565b80601f016020809104026020016040519081016040528092919081815260200182805461117990615550565b80156111c65780601f1061119b576101008083540402835291602001916111c6565b820191906000526020600020905b8154815290600101906020018083116111a957829003601f168201915b505050505081565b6111d6613d6e565b806116de6111e48282615584565b9050507f0dbe1ce901a0e8d75feb7f2d9d5928ecdcf3b0a031614120a51cf430eb45e1f18160405161121691906155b0565b60405180910390a150565b611229613d6e565b6116ce805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517fa7cb165192538768851363c5aa55b1ade75d692a51063730feccdd57d002a6ed90600090a250565b60006116dd546116dc5461129291906155eb565b905090565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b031614806112d8575060ff81166001145b6112f45760405162461bcd60e51b8152600401610d6e90615602565b604051634f558e7960e01b8152600481018490523090634f558e7990602401602060405180830381865afa158015611330573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611354919061562a565b6113705760405162461bcd60e51b8152600401610d6e90615647565b60008381526116d3602090815260409182902084905581518581529081018490527f600275bc3a309792283115dfb884cfc262977806bbf86a0cd92afdada40c960f91015b60405180910390a1505050565b6113cc3382613dce565b6113e85760405162461bcd60e51b8152600401610d6e90615673565b61113a838383613e4e565b3233146114425760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610d6e565b6002600054036114645760405162461bcd60e51b8152600401610d6e906154cf565b60026000556040516331a9108f60e11b8152600481018290523090636352211e90602401602060405180830381865afa1580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c99190615506565b6001600160a01b0316336001600160a01b03161461151b5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b6044820152606401610d6e565b6116ce546201000090046001600160a01b0316330361158a5760405162461bcd60e51b815260206004820152602560248201527f73746f636b206163636f756e7420726566756e647320617265206e6f7420616c6044820152641b1bddd95960da1b6064820152608401610d6e565b61159261264d565b6115de5760405162461bcd60e51b815260206004820152601d60248201527f6f7574736964652074686520726566756e6461626c6520706572696f640000006044820152606401610d6e565b60006115e982613ff8565b90506000811161163b5760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c792073616c65204e46542063616e20626520726566756e6465640000006044820152606401610d6e565b8047101561168b5760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e7420636f6e74726163742066756e647300000000006044820152606401610d6e565b6116ce5460408051632142170760e11b8152336004820152620100009092046001600160a01b03166024830152604482018490525130916342842e0e91606480830192600092919082900301818387803b1580156116e857600080fd5b505af11580156116fc573d6000803e3d6000fd5b505050506117073390565b6001600160a01b03166108fc829081150290604051600060405180830381858888f1935050505015801561173f573d6000803e3d6000fd5b506116ce546201000090046001600160a01b0316336001600160a01b03167f88808afc48888c0e3ec9c545474e31ce16f177be8d0c8ba3922274893615750e8484604051611797929190918252602082015260400190565b60405180910390a350506001600055565b6117b0613d6e565b6002600054036117d25760405162461bcd60e51b8152600401610d6e906154cf565b600260005547808211156118205760405162461bcd60e51b81526020600482015260156024820152740c4c2d8c2dcc6ca40d2e640dcdee840cadcdeeaced605b1b6044820152606401610d6e565b604051339083156108fc029084906000818181858888f1935050505015801561184d573d6000803e3d6000fd5b5060405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001600055565b6000816118988461234d565b116118e55760405162461bcd60e51b815260206004820152601b60248201527f746865726520617265206e6f7420656e6f75676820746f6b656e7300000000006044820152606401610d6e565b60006118f16116dc5490565b905060008060005b838110156119a15761190a81614090565b915060018210156119505760405162461bcd60e51b815260206004820152601060248201526f1d1bdad95b881b9bdd081b5a5b9d195960821b6044820152606401610d6e565b866001600160a01b0316611963836140d6565b6001600160a01b03160361198f5785830361198357509250610d46915050565b61198c836156c1565b92505b80611999816156c1565b9150506118f9565b5060405162461bcd60e51b815260206004820152600f60248201526e3737ba103337bab732103a37b5b2b760891b6044820152606401610d6e565b6119e4613d6e565b600260005403611a065760405162461bcd60e51b8152600401610d6e906154cf565b6002600055611a1361415c565b15611a605760405162461bcd60e51b815260206004820152601860248201527f746865726520697320736f6d6520746f6b656e206c65667400000000000000006044820152606401610d6e565b611a6c60026000614d16565b6001600055565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611ab4575060ff81166001145b611ad05760405162461bcd60e51b8152600401610d6e90615602565b6116cb5460ff1615611b165760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610d6e565b611b1e614176565b6040517f092af66b0bd1c72d72f759dca6111b54869afce41de52c8b070daca48832ff3290600090a150565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611b8b575060ff81166001145b611ba75760405162461bcd60e51b8152600401610d6e90615602565b838214611c265760405162461bcd60e51b815260206004820152604160248201527f746865206c656e677468206f66204c697374696e67204c6576656c206973206460448201527f6966666572656e742066726f6d2074686174206f66204c697374696e672055526064820152604960f81b608482015260a401610d6e565b60005b84811015611d1657838382818110611c4357611c436156da565b9050602002810190611c5591906156f0565b6116d46000898986818110611c6c57611c6c6156da565b9050602002013581526020019081526020016000209182611c8e92919061577c565b507f837de06a2a9ac4d012f19a7c78d66f12f1c02a31fdf60ffee2ce634788d3a151868683818110611cc257611cc26156da565b90506020020135858584818110611cdb57611cdb6156da565b9050602002810190611ced91906156f0565b604051611cfc93929190615865565b60405180910390a180611d0e816156c1565b915050611c29565b505050505050565b61113a83838360405180602001604052806000815250612e3c565b6000610d46826141c8565b6000611d506116dc5490565b8210611d8d5760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610d6e565b610d4682614090565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611dd7575060ff81166001145b611df35760405162461bcd60e51b8152600401610d6e90615602565b6116cb5460ff1615611e395760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610d6e565b611e416141e8565b6040517f76ba3851df4b69972443b0c99bcba0f237d990fbc8cd7ab5c86537c15da180ca90600090a150565b611e75613d6e565b6116d2611e8382848361577c565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051611eb5929190615888565b60405180910390a15050565b60606000826001600160401b03811115611edd57611edd615089565b604051908082528060200260200182016040528015611f06578160200160208202803683370190505b50905060005b83811015611f6f57611f35858583818110611f2957611f296156da565b905060200201356140d6565b828281518110611f4757611f476156da565b6001600160a01b0390921660209283029190910190910152611f68816156c1565b9050611f0c565b509392505050565b805160609060005b8181108015611fac5750838181518110611f9b57611f9b6156da565b01602001516001600160f81b031916155b15611fc35780611fbb816156c1565b915050611f7f565b6117e3611fd082846155eb565b611fdc9061209f61589c565b611fe691906158d1565b611ff090826158e5565b611ffb9060016158e5565b91506000826001600160401b0381111561201757612017615089565b6040519080825280601f01601f191660200182016040528015612041576020820181803683370190505b509050600080806120536001876158fd565b905060005b88518110156121445761206c6001886155eb565b9250888181518110612080576120806156da565b016020015160f81c93505b8183138061209e575063ffffffff841615155b1561212f578483815181106120b5576120b56156da565b01602001516120c99060f81c61010061593c565b6120d79061ffff1685615966565b93506120e4603a8561598e565b60f81b8584815181106120f9576120f96156da565b60200101906001600160f81b031916908160001a90535061211b603a856159b1565b935082612127816159d4565b93505061208b565b8291508061213c816156c1565b915050612058565b50845b86811080156121745750848181518110612163576121636156da565b01602001516001600160f81b031916155b1561218b5780612183816156c1565b915050612147565b61219586826155eb565b85516121a191906155eb565b96506000876001600160401b038111156121bd576121bd615089565b6040519080825280601f01601f1916602001820160405280156121e7576020820181803683370190505b50905060005b8881101561229d5760008861220285846158e5565b61220c91906155eb565b90506040518060600160405280603a8152602001615b3e603a9139888281518110612239576122396156da565b0160200151815160f89190911c908110612255576122556156da565b602001015160f81c60f81b838381518110612272576122726156da565b60200101906001600160f81b031916908160001a905350508080612295906156c1565b9150506121ed565b509998505050505050505050565b60008181526116d860205260408120546001600160a01b031680610d465760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d6e565b612314613d6e565b6116cb805460ff191660011790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b60006001600160a01b0382166123b75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610d6e565b506001600160a01b031660009081526116d9602052604090205490565b6123dc613d6e565b6123e66000614223565b565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480612429575060ff81166002145b80612437575060ff81166001145b6124535760405162461bcd60e51b8152600401610d6e90615602565b6116ce8054831515610100810261ff001987151590811661ffff1990941693909317179092556040805191825260208201929092527f8cb0f99e5929303cba6a2267864c0d25f5c818f7b99fa9e8d1d4d818690127dc91016113b5565b606060006124bd8361234d565b9050806000036124dd576040805160008082526020820190925290611f6f565b6000816001600160401b038111156124f7576124f7615089565b604051908082528060200260200182016040528015612520578160200160208202803683370190505b509050600061252f6116dc5490565b905060008060005b838110156125f25761254881614090565b9150600182101561258e5760405162461bcd60e51b815260206004820152601060248201526f1d1bdad95b881b9bdd081b5a5b9d195960821b6044820152606401610d6e565b876001600160a01b03166125a1836140d6565b6001600160a01b0316036125e057818584815181106125c2576125c26156da565b60209081029190910101526125d6836156c1565b92508583146125f2575b806125ea816156c1565b915050612537565b508482146126425760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420656e6f75676820746f6b656e73207765726520666f756e64000000006044820152606401610d6e565b509195945050505050565b6116cf54600090421180156112925750506116d054421090565b604080516022808252606082810190935260009190602082018180368337019050509050601260f81b816000815181106126a3576126a36156da565b60200101906001600160f81b031916908160001a905350602060f81b816001815181106126d2576126d26156da565b60200101906001600160f81b031916908160001a90535060005b602081101561275057838160208110612707576127076156da565b1a60f81b826127178360026158e5565b81518110612727576127276156da565b60200101906001600160f81b031916908160001a90535080612748816156c1565b9150506126ec565b5061275a81611f77565b9392505050565b60606116d78054610f7f90615550565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b031614806127b2575060ff81166001145b6127ce5760405162461bcd60e51b8152600401610d6e90615602565b836128095760405162461bcd60e51b815260206004820152600b60248201526a1b9bc81d1bdad95b881a5960aa1b6044820152606401610d6e565b83821461287e5760405162461bcd60e51b815260206004820152603a60248201527f746f6b656e20696420617272617920616e6420746f6b656e206861736820617260448201527f726179206861766520646966666572656e74206c656e677468730000000000006064820152608401610d6e565b60005b84811015611d1657600086868381811061289d5761289d6156da565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa1580156128e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290a919061562a565b6129265760405162461bcd60e51b8152600401610d6e90615647565b848483818110612938576129386156da565b905060200201356116d36000838152602001908152602001600020819055507f600275bc3a309792283115dfb884cfc262977806bbf86a0cd92afdada40c960f8186868581811061298b5761298b6156da565b905060200201356040516129a9929190918252602082015260400190565b60405180910390a150600101612881565b6129c533838361427d565b5050565b60606000826001600160401b038111156129e5576129e5615089565b604051908082528060200260200182016040528015612a1857816020015b6060815260200190600190039081612a035790505b50905060005b83811015611f6f576000858583818110612a3a57612a3a6156da565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa158015612a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa7919061562a565b612ade5760405180602001604052806000815250838381518110612acd57612acd6156da565b602002602001018190525050612bb9565b60008181526116d3602052604081205490819003612b71576000612b018361434c565b90506000815111612b215760405180602001604052806000815250612b4c565b80612b2b8461441b565b604051602001612b3c9291906159f1565b6040516020818303038152906040525b858581518110612b5e57612b5e6156da565b6020026020010181905250505050612bb9565b612b7a81612667565b604051602001612b8a9190615a17565b604051602081830303815290604052848481518110612bab57612bab6156da565b602002602001018190525050505b80612bc3816156c1565b915050612a1e565b612bd3613d6e565b815b8181101561113a57806001016002826116c78110612bf557612bf56156da565b0155600101612bd5565b6116e0546060906001600160a01b0316336001600160a01b031614612c365760405162461bcd60e51b8152600401610d6e90615602565b6116de54821115612c595760405162461bcd60e51b8152600401610d6e90615a46565b6116de5482612c686116dc5490565b011115612c875760405162461bcd60e51b8152600401610d6e90615a46565b6000826001600160401b03811115612ca157612ca1615089565b604051908082528060200260200182016040528015612cca578160200160208202803683370190505b50905060005b83811015612d5c576000612ce261451b565b9050612cee8782614605565b80838381518110612d0157612d016156da565b60200260200101818152505080868684818110612d2057612d206156da565b905060200201357f3dc0fefcc324b820a6c919fbd23ec11b998fddc2b064bcce236d4a7bbbf8f96860405160405180910390a350600101612cd0565b50949350505050565b612d6d613d6e565b600260005403612d8f5760405162461bcd60e51b8152600401610d6e906154cf565b600260009081555b81811015612e17576000838383818110612db357612db36156da565b905060200201359050612dc33390565b6001600160a01b0316612dd5826122ab565b6001600160a01b031614612dfb5760405162461bcd60e51b8152600401610d6e90615523565b612e048161461f565b5080612e0f816156c1565b915050612d97565b50818190506116dd6000828254612e2e91906158e5565b909155505060016000555050565b612e463383613dce565b612e625760405162461bcd60e51b8152600401610d6e90615673565b612e6e848484846146c8565b50505050565b6116e0546000906001600160a01b0316336001600160a01b031614612eab5760405162461bcd60e51b8152600401610d6e90615602565b6116de546116dc546001011115612ed45760405162461bcd60e51b8152600401610d6e90615a46565b6000612ede61451b565b9050612eea8482614605565b604051819084907f3dc0fefcc324b820a6c919fbd23ec11b998fddc2b064bcce236d4a7bbbf8f96890600090a39392505050565b3360008181526116c96020526040902054600154606092839260ff169161010090046001600160a01b03161480612f58575060ff81166001145b612f745760405162461bcd60e51b8152600401610d6e90615602565b6116ca546000906001600160401b03811115612f9257612f92615089565b604051908082528060200260200182016040528015612fbb578160200160208202803683370190505b50905060005b6116ca5481101561303e576116c960006116ca8381548110612fe557612fe56156da565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825160ff90911690839083908110613024576130246156da565b60ff90921660209283029190910190910152600101612fc1565b506116ca818180548060200260200160405190810160405280929190818152602001828054801561309857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161307a575b505050505091509350935050509091565b6060610d46826146fb565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b031614806130f5575060ff81166002145b80613103575060ff81166001145b61311f5760405162461bcd60e51b8152600401610d6e90615602565b6002600054036131415760405162461bcd60e51b8152600401610d6e906154cf565b600260005560405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2506001600055565b6002600054036131a55760405162461bcd60e51b8152600401610d6e906154cf565b600260005580156131fc576116ce5460ff166131fc5760405162461bcd60e51b81526020600482015260166024820152751c985a5cda5b99c81a5cc81b9bdd08185b1b1bddd95960521b6044820152606401610d6e565b60005b8381101561343e57600085858381811061321b5761321b6156da565b90506020020135905061322b3390565b6040516331a9108f60e11b8152600481018390526001600160a01b0391909116903090636352211e90602401602060405180830381865afa158015613274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132989190615506565b6001600160a01b0316146132be5760405162461bcd60e51b8152600401610d6e90615523565b60008181526116cd60205260409020805484156133d057806000036133415742825560028201805461ffff191661ffff8816908117909155336001600160a01b0316847fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd588604051613334911515815260200190565b60405180910390a4613433565b600282015461ffff8781169116146133cb5760405162461bcd60e51b815260206004820152604160248201527f72616973696e6720697320616c726561647920737461727465642c206275742060448201527f77697468206120646966666572656e742072616973696e6720747970652073656064820152601d60fa1b608482015260a401610d6e565b613433565b801561343357600182018054428390030190556000825561ffff8616336001600160a01b0316847fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd58860405161342a911515815260200190565b60405180910390a45b5050506001016131ff565b50506001600055505050565b60606000826001600160401b0381111561346657613466615089565b6040519080825280602002602001820160405280156134b857816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816134845790505b50905060005b83811015611f6f5760008585838181106134da576134da6156da565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa158015613523573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613547919061562a565b613551575061367a565b60008181526116cd60209081526040918290208251608081018452815480825260018301549382019390935260029091015461ffff8116938201939093526201000090920460ff16151560608301521561362c5760018484815181106135b9576135b96156da565b6020026020010151606001901515908115158152505080604001518484815181106135e6576135e66156da565b602090810291909101015161ffff909116604090910152805161360990426155eb565b84848151811061361b5761361b6156da565b602002602001015160200181815250505b83838151811061363e5761363e6156da565b602002602001015160200151816020015161365991906158e5565b84848151811061366b5761366b6156da565b60209081029190910101515250505b613683816156c1565b90506134be565b613692613d6e565b60ff81166136c0576001600160a01b03821660009081526116c960205260409020805460ff191690556136e7565b6001600160a01b03821660009081526116c960205260409020805460ff191660ff83161790555b60405160ff821681526001600160a01b038316907f02ab42f6b82517d797a585d5319a95696ea5167a6fbb0e0322c9ee66edec682c9060200160405180910390a25050565b3360008181526116c9602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b0316148061376d575060ff81166001145b6137895760405162461bcd60e51b8152600401610d6e90615602565b83821461380a5760405162461bcd60e51b815260206004820152604360248201527f746865206c656e677468206f66204c697374696e6720546f6b656e206973206460448201527f6966666572656e742066726f6d2074686174206f66204c697374696e67204c656064820152621d995b60ea1b608482015260a401610d6e565b60005b84811015611d1657838382818110613827576138276156da565b905060200201356116d56000888885818110613845576138456156da565b905060200201358152602001908152602001600020819055507fd043c6bcfaea0d1a8cf3a53585ed02c284a5bc394f0487acb6b324daf94af684868683818110613891576138916156da565b905060200201358585848181106138aa576138aa6156da565b905060200201356040516138c8929190918252602082015260400190565b60405180910390a1806138da816156c1565b91505061380d565b6138ea613d6e565b80356116cf8190556020808301356116d08190556040808501356116d18190558151948552928401919091528201527f61467bd874c25765186e5d914938f0b7ac6f48d10b8d0a7f9d9b15dfe1b520f490606001611216565b61394b613d6e565b6001600160a01b0381166139b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d6e565b6139b981614223565b50565b6002600054036139de5760405162461bcd60e51b8152600401610d6e906154cf565b60026000908155338082526116c960205260409091205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480613a25575060ff81166002145b80613a33575060ff81166001145b613a4f5760405162461bcd60e51b8152600401610d6e90615602565b60005b82811015613ba5576000848483818110613a6e57613a6e6156da565b9050602002013590506000306001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401613aa791815260200190565b602060405180830381865afa158015613ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae89190615506565b60008381526116cd602052604081208054929350919003613b0b57505050613b9d565b8054600182018054429290920390910190556000808255600282015460405191825261ffff16906001600160a01b0384169085907fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd59060200160405180910390a4604051339084907f376b2166c0aaa2fc263d60dbcf1a4fa8f55e709487fcc9073ba90faa78d5005790600090a35050505b600101613a52565b505060016000555050565b613bb8613d6e565b6116e080546001600160a01b0319166001600160a01b0383169081179091556040519081527f68be7b539d1836c43a5f5a4407cefe8452f303a444c06c2f78cbf75f2eff8b6d90602001611216565b613c0f613d6e565b6116cc613c1d82848361577c565b507f638b2296aed59fe9e4f72c7536065ba3e36cb7690c2d130f66334da9cc2406cf8282604051611eb5929190615888565b60006001600160e01b031982166380ac58cd60e01b1480613c8057506001600160e01b03198216635b5e139f60e01b145b80610d4657506301ffc9a760e01b6001600160e01b0319831614610d46565b60008181526116d860205260409020546001600160a01b03166139b95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610d6e565b60008181526116da6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613d35826122ab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001546001600160a01b036101009091041633146123e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d6e565b600080613dda836122ab565b9050806001600160a01b0316846001600160a01b03161480613e2257506001600160a01b0380821660009081526116db602090815260408083209388168352929052205460ff165b80613e465750836001600160a01b0316613e3b84611002565b6001600160a01b0316145b949350505050565b826001600160a01b0316613e61826122ab565b6001600160a01b031614613ec55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d6e565b6001600160a01b038216613f275760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d6e565b613f3283838361481f565b613f3d600082613cff565b6001600160a01b03831660009081526116d960205260408120805460019290613f679084906155eb565b90915550506001600160a01b03821660009081526116d960205260408120805460019290613f969084906158e5565b909155505060008181526116d8602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116df5460009060ff1615614087576116e05460405163042d801560e51b8152600481018490526001600160a01b039091169081906385b002a090602401602060405180830381865afa158015614053573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614077919061562a565b156140855750600092915050565b505b6116d154610d46565b60006116c782106140a357506000919050565b600260016140b3846116c76155eb565b6140bd91906155eb565b6116c781106140ce576140ce6156da565b015492915050565b60008181526116d860205260408120546001600160a01b031615614154576040516331a9108f60e11b8152600481018390523090636352211e90602401602060405180830381865afa158015614130573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d469190615506565b506000919050565b60006141686116dc5490565b6116de5461129291906155eb565b61417e614835565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008181526116d860205260408120546001600160a01b03161515610d46565b6141f061487e565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336141ab565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036142de5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d6e565b6001600160a01b0383811660008181526116db6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008181526116d5602052604081205460609181900361436f5761275a836148c4565b60008181526116d460205260408120805461438990615550565b80601f01602080910402602001604051908101604052809291908181526020018280546143b590615550565b80156144025780601f106143d757610100808354040283529160200191614402565b820191906000526020600020905b8154815290600101906020018083116143e557829003601f168201915b50505050509050805160000361275a57613e46846148c4565b6060816000036144425750506040805180820190915260018152600360fc1b602082015290565b8160005b811561446c5780614456816156c1565b91506144659050600a836158d1565b9150614446565b6000816001600160401b0381111561448657614486615089565b6040519080825280601f01601f1916602001820160405280156144b0576020820181803683370190505b5090505b8415613e46576144c56001836155eb565b91506144d2600a86615a7d565b6144dd9060306158e5565b60f81b8183815181106144f2576144f26156da565b60200101906001600160f81b031916908160001a905350614514600a866158d1565b94506144b4565b60008061452661415c565b9050600081116145785760405162461bcd60e51b815260206004820152601a60248201527f746f6b656e496420686173206265656e206578686175737465640000000000006044820152606401610d6e565b6145ff60018203826145ec846040805143600019014060208083019190915244828401524260608084019190915241811b6bffffffffffffffffffffffff199081166080850152609484019590955232901b90931660b4820152815160a881830301815260c8909101909152805191012090565b816145f9576145f96158bb565b06614959565b91505090565b6129c58282604051806020016040528060008152506149be565b600061462a826122ab565b90506146388160008461481f565b614643600083613cff565b6001600160a01b03811660009081526116d96020526040812080546001929061466d9084906155eb565b909155505060008281526116d8602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6146d3848484613e4e565b6146df848484846149f1565b612e6e5760405162461bcd60e51b8152600401610d6e90615a91565b604051634f558e7960e01b8152600481018290526060903090634f558e7990602401602060405180830381865afa15801561473a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061475e919061562a565b61477a5760405162461bcd60e51b8152600401610d6e90615647565b60008281526116d36020526040812054908190036147ef57600061479d8461434c565b905060008151116147bd5760405180602001604052806000815250613e46565b806147c78561441b565b6040516020016147d89291906159f1565b604051602081830303815290604052949350505050565b6147f881612667565b6040516020016148089190615a17565b604051602081830303815290604052915050919050565b61482a838383614af2565b61113a838383614b62565b60015460ff166123e65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d6e565b60015460ff16156123e65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d6e565b60606116d280546148d490615550565b80601f016020809104026020016040519081016040528092919081815260200182805461490090615550565b801561494d5780601f106149225761010080835404028352916020019161494d565b820191906000526020600020905b81548152906001019060200180831161493057829003601f168201915b50505050509050919050565b6000806002836116c78110614970576149706156da565b015490506002846116c78110614988576149886156da565b01546002846116c7811061499e5761499e6156da565b0155806002856116c781106149b5576149b56156da565b01559392505050565b6149c88383614bad565b6149d560008484846149f1565b61113a5760405162461bcd60e51b8152600401610d6e90615a91565b60006001600160a01b0384163b15614ae757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614a35903390899088908890600401615ae3565b6020604051808303816000875af1925050508015614a70575060408051601f3d908101601f19168201909252614a6d91810190615b20565b60015b614acd573d808015614a9e576040519150601f19603f3d011682016040523d82523d6000602084013e614aa3565b606091505b508051600003614ac55760405162461bcd60e51b8152600401610d6e90615a91565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613e46565b506001949350505050565b60008181526116cd60205260409020541561113a5760008181526116cd602052604090206002015462010000900460ff1661113a5760405162461bcd60e51b815260206004820152601060248201526f746f6b656e2069732072616973696e6760801b6044820152606401610d6e565b60015460ff161561113a5760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c881c185d5cd959605a1b6044820152606401610d6e565b614bb78282614bc5565b50506116dc80546001019055565b6001600160a01b038216614c1b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d6e565b60008181526116d860205260409020546001600160a01b031615614c815760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d6e565b614c8d6000838361481f565b6001600160a01b03821660009081526116d960205260408120805460019290614cb79084906158e5565b909155505060008181526116d8602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b506139b9906116c78101905b80821115614d365760008155600101614d22565b5090565b6001600160e01b0319811681146139b957600080fd5b600060208284031215614d6257600080fd5b813561275a81614d3a565b6001600160a01b03811681146139b957600080fd5b600080600060608486031215614d9757600080fd5b8335614da281614d6d565b92506020840135614db281614d6d565b929592945050506040919091013590565b60005b83811015614dde578181015183820152602001614dc6565b83811115612e6e5750506000910152565b60008151808452614e07816020860160208601614dc3565b601f01601f19169290920160200192915050565b60208152600061275a6020830184614def565b600060208284031215614e4057600080fd5b5035919050565b60008060408385031215614e5a57600080fd5b8235614e6581614d6d565b946020939093013593505050565b600060408284031215614e8557600080fd5b50919050565b600060208284031215614e9d57600080fd5b813561275a81614d6d565b60008060408385031215614ebb57600080fd5b50508035926020909101359150565b60008083601f840112614edc57600080fd5b5081356001600160401b03811115614ef357600080fd5b6020830191508360208260051b8501011115614f0e57600080fd5b9250929050565b60008060008060408587031215614f2b57600080fd5b84356001600160401b0380821115614f4257600080fd5b614f4e88838901614eca565b90965094506020870135915080821115614f6757600080fd5b50614f7487828801614eca565b95989497509550505050565b60008060208385031215614f9357600080fd5b82356001600160401b0380821115614faa57600080fd5b818501915085601f830112614fbe57600080fd5b813581811115614fcd57600080fd5b866020828501011115614fdf57600080fd5b60209290920196919550909350505050565b6000806020838503121561500457600080fd5b82356001600160401b0381111561501a57600080fd5b61502685828601614eca565b90969095509350505050565b600081518084526020808501945080840160005b8381101561506b5781516001600160a01b031687529582019590820190600101615046565b509495945050505050565b60208152600061275a6020830184615032565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126150b057600080fd5b81356001600160401b03808211156150ca576150ca615089565b604051601f8301601f19908116603f011681019082821181831017156150f2576150f2615089565b8160405283815286602085880101111561510b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561513d57600080fd5b81356001600160401b0381111561515357600080fd5b613e468482850161509f565b80151581146139b957600080fd5b6000806040838503121561518057600080fd5b823561518b8161515f565b9150602083013561519b8161515f565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156151de578351835292840192918401916001016151c2565b50909695505050505050565b600080604083850312156151fd57600080fd5b823561518b81614d6d565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561525d57603f1988860301845261524b858351614def565b9450928501929085019060010161522f565b5092979650505050505050565b60008060006040848603121561527f57600080fd5b833561528a81614d6d565b925060208401356001600160401b038111156152a557600080fd5b6152b186828701614eca565b9497909650939450505050565b600080600080608085870312156152d457600080fd5b84356152df81614d6d565b935060208501356152ef81614d6d565b92506040850135915060608501356001600160401b0381111561531157600080fd5b61531d8782880161509f565b91505092959194509250565b60408152600061533c6040830185615032565b82810360208481019190915284518083528582019282019060005b8181101561537657845160ff1683529383019391830191600101615357565b5090979650505050505050565b6000806000806060858703121561539957600080fd5b84356001600160401b038111156153af57600080fd5b6153bb87828801614eca565b909550935050602085013561ffff811681146153d657600080fd5b915060408501356153e68161515f565b939692955090935050565b602080825282518282018190526000919060409081850190868401855b8281101561544e5781518051855286810151878601528581015161ffff16868601526060908101511515908501526080909301929085019060010161540e565b5091979650505050505050565b6000806040838503121561546e57600080fd5b823561547981614d6d565b9150602083013560ff8116811461519b57600080fd5b600080604083850312156154a257600080fd5b82356154ad81614d6d565b9150602083013561519b81614d6d565b600060608284031215614e8557600080fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006020828403121561551857600080fd5b815161275a81614d6d565b60208082526013908201527231b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b600181811c9082168061556457607f821691505b602082108103614e8557634e487b7160e01b600052602260045260246000fd5b8135815560018101602083013561559a8161515f565b815490151560ff1660ff19919091161790555050565b813581526040810160208301356155c68161515f565b80151560208401525092915050565b634e487b7160e01b600052601160045260246000fd5b6000828210156155fd576155fd6155d5565b500390565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b60006020828403121561563c57600080fd5b815161275a8161515f565b6020808252601290820152711d1bdad95b881a5cc81b9bdd08195e1a5cdd60721b604082015260600190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6000600182016156d3576156d36155d5565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261570757600080fd5b8301803591506001600160401b0382111561572157600080fd5b602001915036819003821315614f0e57600080fd5b601f82111561113a57600081815260208120601f850160051c8101602086101561575d5750805b601f850160051c820191505b81811015611d1657828155600101615769565b6001600160401b0383111561579357615793615089565b6157a7836157a18354615550565b83615736565b6000601f8411600181146157db57600085156157c35750838201355b600019600387901b1c1916600186901b178355615835565b600083815260209020601f19861690835b8281101561580c57868501358255602094850194600190920191016157ec565b50868210156158295760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061587f60408301848661583c565b95945050505050565b602081526000613e4660208301848661583c565b60008160001904831182151516156158b6576158b66155d5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826158e0576158e06158bb565b500490565b600082198211156158f8576158f86155d5565b500190565b60008083128015600160ff1b85018412161561591b5761591b6155d5565b6001600160ff1b0384018313811615615936576159366155d5565b50500390565b600061ffff8083168185168183048111821515161561595d5761595d6155d5565b02949350505050565b600063ffffffff808316818516808303821115615985576159856155d5565b01949350505050565b600063ffffffff808416806159a5576159a56158bb565b92169190910692915050565b600063ffffffff808416806159c8576159c86158bb565b92169190910492915050565b6000600160ff1b82016159e9576159e96155d5565b506000190190565b60008351615a03818460208801614dc3565b835190830190615985818360208801614dc3565b66697066733a2f2f60c81b815260008251615a39816007850160208701614dc3565b9190910160070192915050565b6020808252601c908201527f6d696e7420776f756c6420657863656564206d617820737570706c7900000000604082015260600190565b600082615a8c57615a8c6158bb565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615b1690830184614def565b9695505050505050565b600060208284031215615b3257600080fd5b815161275a81614d3a56fe31323334353637383941424344454647484a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f707172737475767778797aa26469706673582212201728a250767714a117cfabd82abbb06d8bbf59455cfdedec7bec50cea2e6185a64736f6c634300080f0033

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

00000000000000000000000000000000000000000000000000000000000016c70000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : yingCfg_ (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000016c7
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

4967:6997:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5182:290:15;;;;;;;;;;-1:-1:-1;5182:290:15;;;;;:::i;:::-;;:::i;:::-;;;565:14:24;;558:22;540:41;;528:2;513:18;5182:290:15;;;;;;;;6637:646:17;;;;;;;;;;-1:-1:-1;6637:646:17;;;;;:::i;:::-;;:::i;:::-;;2470:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3935:167::-;;;;;;;;;;-1:-1:-1;3935:167:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2289:32:24;;;2271:51;;2259:2;2244:18;3935:167:3;2125:203:24;3467:407:3;;;;;;;;;;-1:-1:-1;3467:407:3;;;;;:::i;:::-;;:::i;4923:28:18:-;;;;;;;;;;-1:-1:-1;4923:28:18;;;;;;;-1:-1:-1;;;;;4923:28:18;;;4494:24:14;;;;;;;;;;;;;:::i;5929:137:23:-;;;;;;;;;;-1:-1:-1;5929:137:23;;;;;:::i;:::-;;:::i;5300:167:18:-;;;;;;;;;;-1:-1:-1;5300:167:18;;;;;:::i;:::-;;:::i;6888:115:15:-;;;;;;;;;;;;;:::i;:::-;;;3252:25:24;;;3240:2;3225:18;6888:115:15;3106:177:24;5556:267:19;;;;;;;;;;-1:-1:-1;5556:267:19;;;;;:::i;:::-;;:::i;4940:33:13:-;;;;;;;;;;;;4972:1;4940:33;;;;;3713:4:24;3701:17;;;3683:36;;3671:2;3656:18;4940:33:13;3541:184:24;4895:39:13;;;;;;;;;;;;4933:1;4895:39;;4612:327:3;;;;;;;;;;-1:-1:-1;4612:327:3;;;;;:::i;:::-;;:::i;5780:783:18:-;;;;;;;;;;-1:-1:-1;5780:783:18;;;;;:::i;:::-;;:::i;5460:28:17:-;;;;;;;;;;-1:-1:-1;5460:28:17;;;;;;;;4979:36:13;;;;;;;;;;;;5014:1;4979:36;;6757:256;;;;;;;;;;-1:-1:-1;6757:256:13;;;;;:::i;:::-;;:::i;5066:32:18:-;;;;;;;;;;-1:-1:-1;5066:32:18;;;;;;;;;;;;;;;;3932:25:24;;;3988:2;3973:18;;3966:34;;;;4016:18;;;4009:34;3920:2;3905:18;5066:32:18;3730:319:24;9792:740:23;;;;;;;;;;-1:-1:-1;9792:740:23;;;;;:::i;:::-;;:::i;4633:41:22:-;;;;;;;;;;;;4670:4;4633:41;;5333:165;;;;;;;;;;;;;:::i;7555:113:13:-;;;;;;;;;;;;;:::i;5021:428:20:-;;;;;;;;;;-1:-1:-1;5021:428:20;;;;;:::i;:::-;;:::i;5005:179:3:-;;;;;;;;;;-1:-1:-1;5005:179:3;;;;;:::i;:::-;;:::i;8043:207:23:-;;;;;;;;;;-1:-1:-1;8043:207:23;;;;;:::i;:::-;;:::i;9545:241::-;;;;;;;;;;-1:-1:-1;9545:241:23;;;;;:::i;:::-;;:::i;7381:116:13:-;;;;;;;;;;;;;:::i;5274:127:19:-;;;;;;;;;;-1:-1:-1;5274:127:19;;;;;:::i;:::-;;:::i;1615:84:1:-;;;;;;;;;;-1:-1:-1;1685:7:1;;;;1615:84;;4929:351:16;;;;;;;;;;-1:-1:-1;4929:351:16;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4842:1116:21:-;;;;;;;;;;-1:-1:-1;4842:1116:21;;;;;:::i;:::-;;:::i;2190:218:3:-;;;;;;;;;;-1:-1:-1;2190:218:3;;;;;:::i;:::-;;:::i;7843:112:13:-;;;;;;;;;;;;;:::i;1929:204:3:-;;;;;;;;;;-1:-1:-1;1929:204:3;;;;;:::i;:::-;;:::i;1831:101:0:-;;;;;;;;;;;;;:::i;5846:369:17:-;;;;;;;;;;-1:-1:-1;5846:369:17;;;;;:::i;:::-;;:::i;6180:117:13:-;;;;;;;;;;-1:-1:-1;6180:117:13;;;;;:::i;:::-;-1:-1:-1;;;;;6268:22:13;6244:5;6268:22;;;:12;:22;;;;;;;;;6180:117;10538:908:23;;;;;;;;;;-1:-1:-1;10538:908:23;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5126:169:18:-;;;;;;;;;;;;;:::i;6181:346:21:-;;;;;;;;;;-1:-1:-1;6181:346:21;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1273:6:0;;;;;-1:-1:-1;;;;;1273:6:0;1201:85;;2632:102:3;;;;;;;;;;;;;:::i;5021:34:13:-;;;;;;;;;;;;5054:1;5021:34;;5982:655:19;;;;;;;;;;-1:-1:-1;5982:655:19;;;;;:::i;:::-;;:::i;4169:153:3:-;;;;;;;;;;-1:-1:-1;4169:153:3;;;;;:::i;:::-;;:::i;6580:89:15:-;;;;;;;;;;-1:-1:-1;6650:12:15;;6580:89;;7324:967:19;;;;;;;;;;-1:-1:-1;7324:967:19;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5109:219:22:-;;;;;;;;;;-1:-1:-1;5109:219:22;;;;;:::i;:::-;;:::i;5619:25:23:-;;;;;;;;;;-1:-1:-1;5619:25:23;;;;;;;;;;;;;;;12110::24;;;12178:14;;12171:22;12166:2;12151:18;;12144:50;12083:18;5619:25:23;11942:258:24;6988:923:23;;;;;;;;;;-1:-1:-1;6988:923:23;;;;;:::i;:::-;;:::i;5142:34:13:-;;;;;;;;;;-1:-1:-1;5142:34:13;;;;;;;;6110:370:15;;;;;;;;;;-1:-1:-1;6110:370:15;;;;;:::i;:::-;;:::i;5250:315:3:-;;;;;;;;;;-1:-1:-1;5250:315:3;;;;;:::i;:::-;;:::i;6458:524:23:-;;;;;;;;;;-1:-1:-1;6458:524:23;;;;;:::i;:::-;;:::i;5750:424:13:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;9179:234:23:-;;;;;;;;;;-1:-1:-1;9179:234:23;;;;;:::i;:::-;;:::i;6526:121:13:-;;;:::i;8765:1881:17:-;;;;;;;;;;-1:-1:-1;8765:1881:17;;;;;:::i;:::-;;:::i;7549:862::-;;;;;;;;;;-1:-1:-1;7549:862:17;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6486:89:15:-;;;;;;;;;;-1:-1:-1;6556:12:15;;6486:89;;5418:326:13;;;;;;;;;;-1:-1:-1;5418:326:13;;;;;:::i;:::-;;:::i;5454:434:20:-;;;;;;;;;;-1:-1:-1;5454:434:20;;;;;:::i;:::-;;:::i;5494:36:17:-;;;;;;;;;;-1:-1:-1;5494:36:17;;;;;;;;;;;4388:162:3;;;;;;;;;;-1:-1:-1;4388:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4508:25:3;;;4485:4;4508:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4388:162;5472:156:18;;;;;;;;;;-1:-1:-1;5472:156:18;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;5461:58:23:-;;;;;;;;;;;;5503:16;5461:58;;11004:886:17;;;;;;;;;;-1:-1:-1;11004:886:17;;;;;:::i;:::-;;:::i;6141:185:23:-;;;;;;;;;;-1:-1:-1;6141:185:23;;;;;:::i;:::-;;:::i;4651:157:14:-;;;;;;;;;;-1:-1:-1;4651:157:14;;;;;:::i;:::-;;:::i;5182:290:15:-;5324:4;-1:-1:-1;;;;;;5363:50:15;;-1:-1:-1;;;5363:50:15;;:102;;;5429:36;5453:11;5429:23;:36::i;:::-;5344:121;5182:290;-1:-1:-1;;5182:290:15:o;6637:646:17:-;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;719:10:9;6787:22:17::1;::::0;-1:-1:-1;;;6787:22:17;;::::1;::::0;::::1;3252:25:24::0;;;-1:-1:-1;;;;;6787:38:17;;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;3225:18:24;;6787:22:17::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6787:38:17::1;;6779:70;;;;-1:-1:-1::0;;;6779:70:17::1;;;;;;;:::i;:::-;6880:24;::::0;::::1;::::0;::::1;;;6859:108;;;::::0;-1:-1:-1;;;6859:108:17;;18945:2:24;6859:108:17::1;::::0;::::1;18927:21:24::0;18984:2;18964:18;;;18957:30;19023:34;19003:18;;;18996:62;-1:-1:-1;;;19074:18:24;;;19067:35;19119:19;;6859:108:17::1;18743:401:24::0;6859:108:17::1;6977:26;::::0;;;:16:::1;:26;::::0;;;;;;:42:::1;;:49:::0;;-1:-1:-1;;6977:49:17::1;::::0;::::1;::::0;;7036:43;-1:-1:-1;;;7036:43:17;;-1:-1:-1;;;;;19407:15:24;;;7036:43:17::1;::::0;::::1;19389:34:24::0;19459:15;;19439:18;;;19432:43;19491:18;;;19484:34;;;7036:4:17::1;::::0;:21:::1;::::0;19324:18:24;;7036:43:17::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;7134:5:17::1;7089:26:::0;;;:16:::1;:26;::::0;;;;:42:::1;::::0;::::1;:50:::0;;-1:-1:-1;;7089:50:17::1;::::0;;7153:43;:48;;-1:-1:-1;7149:128:17::1;;7257:8;7252:3;-1:-1:-1::0;;;;;7222:44:17::1;7245:5;-1:-1:-1::0;;;;;7222:44:17::1;;;;;;;;;;;7149:128;-1:-1:-1::0;;1701:1:2;2628:7;:22;-1:-1:-1;6637:646:17:o;2470:98:3:-;2524:13;2556:5;2549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2470:98;:::o;3935:167::-;4011:7;4030:23;4045:7;4030:14;:23::i;:::-;-1:-1:-1;4071:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4071:24:3;;3935:167::o;3467:407::-;3547:13;3563:23;3578:7;3563:14;:23::i;:::-;3547:39;;3610:5;-1:-1:-1;;;;;3604:11:3;:2;-1:-1:-1;;;;;3604:11:3;;3596:57;;;;-1:-1:-1;;;3596:57:3;;20116:2:24;3596:57:3;;;20098:21:24;20155:2;20135:18;;;20128:30;20194:34;20174:18;;;20167:62;-1:-1:-1;;;20245:18:24;;;20238:31;20286:19;;3596:57:3;19914:397:24;3596:57:3;719:10:9;-1:-1:-1;;;;;3685:21:3;;;;:62;;-1:-1:-1;3710:37:3;3727:5;719:10:9;4388:162:3;:::i;3710:37::-;3664:171;;;;-1:-1:-1;;;3664:171:3;;20518:2:24;3664:171:3;;;20500:21:24;20557:2;20537:18;;;20530:30;20596:34;20576:18;;;20569:62;20667:32;20647:18;;;20640:60;20717:19;;3664:171:3;20316:426:24;3664:171:3;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3537:337;3467:407;;:::o;4494:24:14:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5929:137:23:-;1094:13:0;:11;:13::i;:::-;6017:4:23;6007:7:::1;:14;6017:4:::0;6007:7;:14:::1;:::i;:::-;;;;6036:23;6054:4;6036:23;;;;;;:::i;:::-;;;;;;;;5929:137:::0;:::o;5300:167:18:-;1094:13:0;:11;:13::i;:::-;5379::18::1;:30:::0;;-1:-1:-1;;;;;;5379:30:18::1;::::0;-1:-1:-1;;;;;5379:30:18;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;5424:36:::1;::::0;::::1;::::0;-1:-1:-1;;5424:36:18::1;5300:167:::0;:::o;6888:115:15:-;6943:7;6984:12;;6969;;:27;;;;:::i;:::-;6962:34;;6888:115;:::o;5556:267:19:-;719:10:9;8215:16:13;8234:26;;;:12;:26;;;;;;1273:6:0;;8234:26:13;;;;;719:10:9;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8291:23:13;;:48;;;-1:-1:-1;8318:21:13;;;4972:1;8318:21;8291:48;8270:109;;;;-1:-1:-1;;;8270:109:13;;;;;;;:::i;:::-;5678:21:19::1;::::0;-1:-1:-1;;;5678:21:19;;::::1;::::0;::::1;3252:25:24::0;;;5678:4:19::1;::::0;:11:::1;::::0;3225:18:24;;5678:21:19::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5670:52;;;;-1:-1:-1::0;;;5670:52:19::1;;;;;;;:::i;:::-;5732:22;::::0;;;:12:::1;:22;::::0;;;;;;;;:35;;;5782:34;;22975:25:24;;;23016:18;;;23009:34;;;5782::19::1;::::0;22948:18:24;5782:34:19::1;;;;;;;;8205:192:13::0;5556:267:19;;:::o;4612:327:3:-;4801:41;719:10:9;4834:7:3;4801:18;:41::i;:::-;4793:100;;;;-1:-1:-1;;;4793:100:3;;;;;;;:::i;:::-;4904:28;4914:4;4920:2;4924:7;4904:9;:28::i;5780:783:18:-;9375:9:13;719:10:9;9375:25:13;9367:64;;;;-1:-1:-1;;;9367:64:13;;23671:2:24;9367:64:13;;;23653:21:24;23710:2;23690:18;;;23683:30;23749:28;23729:18;;;23722:56;23795:18;;9367:64:13;23469:350:24;9367:64:13;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;5883:22:18::2;::::0;-1:-1:-1;;;5883:22:18;;::::2;::::0;::::2;3252:25:24::0;;;5883:4:18::2;::::0;:12:::2;::::0;3225:18:24;;5883:22:18::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5867:38:18::2;719:10:9::0;-1:-1:-1;;;;;5867:38:18::2;;5859:66;;;::::0;-1:-1:-1;;;5859:66:18;;24026:2:24;5859:66:18::2;::::0;::::2;24008:21:24::0;24065:2;24045:18;;;24038:30;-1:-1:-1;;;24084:18:24;;;24077:45;24139:18;;5859:66:18::2;23824:339:24::0;5859:66:18::2;5959:13;::::0;;;::::2;-1:-1:-1::0;;;;;5959:13:18::2;719:10:9::0;5943:29:18;5935:79:::2;;;::::0;-1:-1:-1;;;5935:79:18;;24370:2:24;5935:79:18::2;::::0;::::2;24352:21:24::0;24409:2;24389:18;;;24382:30;24448:34;24428:18;;;24421:62;-1:-1:-1;;;24499:18:24;;;24492:35;24544:19;;5935:79:18::2;24168:401:24::0;5935:79:18::2;6032:17;:15;:17::i;:::-;6024:59;;;::::0;-1:-1:-1;;;6024:59:18;;24776:2:24;6024:59:18::2;::::0;::::2;24758:21:24::0;24815:2;24795:18;;;24788:30;24854:31;24834:18;;;24827:59;24903:18;;6024:59:18::2;24574:353:24::0;6024:59:18::2;6094:19;6116:22;6129:8;6116:12;:22::i;:::-;6094:44;;6170:1;6156:11;:15;6148:57;;;::::0;-1:-1:-1;;;6148:57:18;;25134:2:24;6148:57:18::2;::::0;::::2;25116:21:24::0;25173:2;25153:18;;;25146:30;25212:31;25192:18;;;25185:59;25261:18;;6148:57:18::2;24932:353:24::0;6148:57:18::2;6248:11;6223:21;:36;;6215:76;;;::::0;-1:-1:-1;;;6215:76:18;;25492:2:24;6215:76:18::2;::::0;::::2;25474:21:24::0;25531:2;25511:18;;;25504:30;25570:29;25550:18;;;25543:57;25617:18;;6215:76:18::2;25290:351:24::0;6215:76:18::2;6338:13;::::0;6302:60:::2;::::0;;-1:-1:-1;;;6302:60:18;;719:10:9;6302:60:18::2;::::0;::::2;19389:34:24::0;6338:13:18;;;::::2;-1:-1:-1::0;;;;;6338:13:18::2;19439:18:24::0;;;19432:43;19491:18;;;19484:34;;;6302:60:18;:4:::2;::::0;:21:::2;::::0;19324:18:24;;;;;-1:-1:-1;;6302:60:18;;;;;;;-1:-1:-1;6302:4:18;:60;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;6445:12;719:10:9::0;;640:96;6445:12:18::2;-1:-1:-1::0;;;;;6437:30:18::2;:43;6468:11;6437:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;6519:13:18::2;::::0;;;::::2;-1:-1:-1::0;;;;;6519:13:18::2;719:10:9::0;-1:-1:-1;;;;;6496:60:18::2;;6534:8;6544:11;6496:60;;;;;;22975:25:24::0;;;23031:2;23016:18;;23009:34;22963:2;22948:18;;22801:248;6496:60:18::2;;;;;;;;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;5780:783:18:o;6757:256:13:-;1094:13:0;:11;:13::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;6846:21:13::2;6885:12:::0;;::::2;;6877:46;;;::::0;-1:-1:-1;;;6877:46:13;;26101:2:24;6877:46:13::2;::::0;::::2;26083:21:24::0;26140:2;26120:18;;;26113:30;-1:-1:-1;;;26159:18:24;;;26152:51;26220:18;;6877:46:13::2;25899:345:24::0;6877:46:13::2;6933:33;::::0;719:10:9;;6933:33:13;::::2;;;::::0;6964:1;;6933:33:::2;::::0;;;6964:1;719:10:9;6933:33:13;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;6981:25:13::2;::::0;3252::24;;;719:10:9;;6981:25:13::2;::::0;3240:2:24;3225:18;6981:25:13::2;;;;;;;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;6757:256:13:o;9792:740:23:-;9915:7;9965:5;9946:16;9956:5;9946:9;:16::i;:::-;:24;9938:64;;;;-1:-1:-1;;;9938:64:23;;26451:2:24;9938:64:23;;;26433:21:24;26490:2;26470:18;;;26463:30;26529:29;26509:18;;;26502:57;26576:18;;9938:64:23;26249:351:24;9938:64:23;10012:19;10034:13;6650:12:15;;;6580:89;10034:13:23;10012:35;;10057:17;10088:15;10122:9;10117:374;10141:11;10137:1;:15;10117:374;;;10183:27;10208:1;10183:24;:27::i;:::-;10173:37;-1:-1:-1;5686:1:15;10232:7:23;:26;;10224:55;;;;-1:-1:-1;;;10224:55:23;;26807:2:24;10224:55:23;;;26789:21:24;26846:2;26826:18;;;26819:30;-1:-1:-1;;;26865:18:24;;;26858:46;26921:18;;10224:55:23;26605:340:24;10224:55:23;10324:5;-1:-1:-1;;;;;10297:32:23;:23;10312:7;10297:14;:23::i;:::-;-1:-1:-1;;;;;10297:32:23;;10349:8;10293:79;10402:5;10389:9;:18;10385:71;;-1:-1:-1;10434:7:23;-1:-1:-1;10427:14:23;;-1:-1:-1;;10427:14:23;10385:71;10469:11;;;:::i;:::-;;;10117:374;10154:3;;;;:::i;:::-;;;;10117:374;;;-1:-1:-1;10500:25:23;;-1:-1:-1;;;10500:25:23;;27292:2:24;10500:25:23;;;27274:21:24;27331:2;27311:18;;;27304:30;-1:-1:-1;;;27350:18:24;;;27343:45;27405:18;;10500:25:23;27090:339:24;5333:165:22;1094:13:0;:11;:13::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;5413:15:22::2;:13;:15::i;:::-;:20:::0;5405:57:::2;;;::::0;-1:-1:-1;;;5405:57:22;;27636:2:24;5405:57:22::2;::::0;::::2;27618:21:24::0;27675:2;27655:18;;;27648:30;27714:26;27694:18;;;27687:54;27758:18;;5405:57:22::2;27434:348:24::0;5405:57:22::2;5472:19;5479:12;;5472:19;:::i;:::-;1701:1:2::1;2628:7;:22:::0;5333:165:22:o;7555:113:13:-;719:10:9;8215:16:13;8234:26;;;:12;:26;;;;;;1273:6:0;;8234:26:13;;;;;719:10:9;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8291:23:13;;:48;;;-1:-1:-1;8318:21:13;;;4972:1;8318:21;8291:48;8270:109;;;;-1:-1:-1;;;8270:109:13;;;;;;;:::i;:::-;9594:14:::1;::::0;::::1;;9593:15;9585:43;;;::::0;-1:-1:-1;;;9585:43:13;;27989:2:24;9585:43:13::1;::::0;::::1;27971:21:24::0;28028:2;28008:18;;;28001:30;-1:-1:-1;;;28047:18:24;;;28040:45;28102:18;;9585:43:13::1;27787:339:24::0;9585:43:13::1;7618:10:::2;:8;:10::i;:::-;7643:18;::::0;::::2;::::0;;;::::2;8205:192:::0;7555:113::o;5021:428:20:-;719:10:9;8215:16:13;8234:26;;;:12;:26;;;;;;1273:6:0;;8234:26:13;;;;;719:10:9;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8291:23:13;;:48;;;-1:-1:-1;8318:21:13;;;4972:1;8318:21;8291:48;8270:109;;;;-1:-1:-1;;;8270:109:13;;;;;;;:::i;:::-;5171:30:20;;::::1;5163:108;;;::::0;-1:-1:-1;;;5163:108:20;;28333:2:24;5163:108:20::1;::::0;::::1;28315:21:24::0;28372:2;28352:18;;;28345:30;28411:34;28391:18;;;28384:62;28482:34;28462:18;;;28455:62;-1:-1:-1;;;28533:19:24;;;28526:32;28575:19;;5163:108:20::1;28131:469:24::0;5163:108:20::1;5285:9;5281:162;5300:16:::0;;::::1;5281:162;;;5364:5;;5370:1;5364:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;5336:13;:25;5350:7;;5358:1;5350:10;;;;;;;:::i;:::-;;;;;;;5336:25;;;;;;;;;;;:36;;;;;;;:::i;:::-;;5391:41;5411:7;;5419:1;5411:10;;;;;;;:::i;:::-;;;;;;;5423:5;;5429:1;5423:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;5391:41;;;;;;;;:::i;:::-;;;;;;;;5318:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5281:162;;;;8205:192:13::0;5021:428:20;;;;:::o;5005:179:3:-;5138:39;5155:4;5161:2;5165:7;5138:39;;;;;;;;;;;;:16;:39::i;8043:207:23:-;8189:4;8216:27;8234:8;8216:17;:27::i;9545:241::-;9662:7;9701:13;6650:12:15;;;6580:89;9701:13:23;9693:5;:21;9685:46;;;;-1:-1:-1;;;9685:46:23;;32119:2:24;9685:46:23;;;32101:21:24;32158:2;32138:18;;;32131:30;-1:-1:-1;;;32177:18:24;;;32170:42;32229:18;;9685:46:23;31917:336:24;9685:46:23;9748:31;9773:5;9748:24;:31::i;7381:116:13:-;719:10:9;8215:16:13;8234:26;;;:12;:26;;;;;;1273:6:0;;8234:26:13;;;;;719:10:9;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8291:23:13;;:48;;;-1:-1:-1;8318:21:13;;;4972:1;8318:21;8291:48;8270:109;;;;-1:-1:-1;;;8270:109:13;;;;;;;:::i;:::-;9594:14:::1;::::0;::::1;;9593:15;9585:43;;;::::0;-1:-1:-1;;;9585:43:13;;27989:2:24;9585:43:13::1;::::0;::::1;27971:21:24::0;28028:2;28008:18;;;28001:30;-1:-1:-1;;;28047:18:24;;;28040:45;28102:18;;9585:43:13::1;27787:339:24::0;9585:43:13::1;7451:8:::2;:6;:8::i;:::-;7474:16;::::0;::::2;::::0;;;::::2;8205:192:::0;7381:116::o;5274:127:19:-;1094:13:0;:11;:13::i;:::-;5345:7:19::1;:14;5355:4:::0;;5345:7;:14:::1;:::i;:::-;;5374:20;5389:4;;5374:20;;;;;;;:::i;:::-;;;;;;;;5274:127:::0;;:::o;4929:351:16:-;5040:16;5072:23;5112:9;-1:-1:-1;;;;;5098:31:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5098:31:16;;5072:57;;5144:9;5139:112;5159:20;;;5139:112;;;5212:28;5227:9;;5237:1;5227:12;;;;;;;:::i;:::-;;;;;;;5212:14;:28::i;:::-;5200:6;5207:1;5200:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5200:40:16;;;:9;;;;;;;;;;;:40;5181:3;;;:::i;:::-;;;5139:112;;;-1:-1:-1;5267:6:16;4929:351;-1:-1:-1;;;4929:351:16:o;4842:1116:21:-;4937:12;;4899;;4922;4986:86;5005:4;4993:9;:16;:41;;;;;5013:5;5019:9;5013:16;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;5013:16:21;:21;4993:41;4986:86;;;5050:11;;;;:::i;:::-;;;;4986:86;;;5124:4;5101:16;5108:9;5101:4;:16;:::i;:::-;5100:23;;5119:4;5100:23;:::i;:::-;:28;;;;:::i;:::-;5088:40;;:9;:40;:::i;:::-;:42;;5129:1;5088:42;:::i;:::-;5081:49;;5140:17;5170:4;-1:-1:-1;;;;;5160:15:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5160:15:21;-1:-1:-1;5140:35:21;-1:-1:-1;5185:12:21;;;5239:16;5254:1;5246:4;5239:16;:::i;:::-;5225:30;;5270:9;5265:351;5289:5;:12;5285:1;:16;5265:351;;;5333:8;5340:1;5333:4;:8;:::i;:::-;5322:20;;5375:5;5381:1;5375:8;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;5356:228:21;5390:4;5386:1;:8;:22;;;-1:-1:-1;5398:10:21;;;;;5386:22;5356:228;;;5461:4;5474:1;5461:16;;;;;;;;:::i;:::-;;;;;5449:29;;5461:16;;5449:3;:29;:::i;:::-;5441:37;;;;:5;:37;:::i;:::-;5433:45;-1:-1:-1;5528:10:21;5536:2;5433:45;5528:10;:::i;:::-;5515:25;;5496:4;5509:1;5496:16;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;5496:44:21;;;;;;;;-1:-1:-1;5558:11:21;5567:2;5558:11;;:::i;:::-;;-1:-1:-1;5410:3:21;;;;:::i;:::-;;;;5356:228;;;5604:1;;-1:-1:-1;5303:3:21;;;;:::i;:::-;;;;5265:351;;;-1:-1:-1;5653:9:21;5644:53;5668:4;5664:1;:8;:24;;;;;5676:4;5681:1;5676:7;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;5676:7:21;:12;5664:24;5644:53;;;5690:3;;;;:::i;:::-;;;;5644:53;;;5728:13;5732:9;5728:1;:13;:::i;:::-;5713:4;:11;:29;;;;:::i;:::-;5706:36;;5752:16;5781:4;-1:-1:-1;;;;;5771:15:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5771:15:21;;5752:34;;5801:9;5796:136;5820:4;5816:1;:8;5796:136;;;5845:9;5865;5857:5;5861:1;5857;:5;:::i;:::-;:17;;;;:::i;:::-;5845:29;;5897:8;;;;;;;;;;;;;;;;;5912:4;5917:1;5912:7;;;;;;;;:::i;:::-;;;;;5897:24;;5912:7;;;;;;5897:24;;;;;;:::i;:::-;;;;;;;;;5888:3;5892:1;5888:6;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;5888:33:21;;;;;;;;;5831:101;5826:3;;;;;:::i;:::-;;;;5796:136;;;-1:-1:-1;5948:3:21;4842:1116;-1:-1:-1;;;;;;;;;4842:1116:21:o;2190:218:3:-;2262:7;2297:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2297:16:3;;2323:56;;;;-1:-1:-1;;;2323:56:3;;34576:2:24;2323:56:3;;;34558:21:24;34615:2;34595:18;;;34588:30;-1:-1:-1;;;34634:18:24;;;34627:54;34698:18;;2323:56:3;34374:348:24;7843:112:13;1094:13:0;:11;:13::i;:::-;7896:14:13::1;:21:::0;;-1:-1:-1;;7896:21:13::1;7913:4;7896:21;::::0;;7932:16:::1;::::0;::::1;::::0;7896:14:::1;::::0;7932:16:::1;7843:112::o:0;1929:204:3:-;2001:7;-1:-1:-1;;;;;2028:19:3;;2020:73;;;;-1:-1:-1;;;2020:73:3;;34929:2:24;2020:73:3;;;34911:21:24;34968:2;34948:18;;;34941:30;35007:34;34987:18;;;34980:62;-1:-1:-1;;;35058:18:24;;;35051:39;35107:19;;2020:73:3;34727:405:24;2020:73:3;-1:-1:-1;;;;;;2110:16:3;;;;;:9;:16;;;;;;;1929:204::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;5846:369:17:-;719:10:9;8545:16:13;8564:26;;;:12;:26;;;;;;1273:6:0;;8564:26:13;;;;;719:10:9;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8621:23:13;;:67;;;-1:-1:-1;8664:24:13;;;5014:1;8664:24;8621:67;:108;;;-1:-1:-1;8708:21:13;;;4972:1;8708:21;8621:108;8600:169;;;;-1:-1:-1;;;8600:169:13;;;;;;;:::i;:::-;5990:16:17::1;:36:::0;;6036:52;::::1;;5990:36;6036:52:::0;::::1;-1:-1:-1::0;;5990:36:17;::::1;;6036:52:::0;;;-1:-1:-1;;6036:52:17;;;;;;;::::1;::::0;;;6103:105:::1;::::0;;35299:41:24;;;35371:2;35356:18;;35349:50;;;;6103:105:17::1;::::0;35272:18:24;6103:105:17::1;35137:268:24::0;10538:908:23;10624:16;10656:15;10674:17;10684:6;10674:9;:17::i;:::-;10656:35;;10705:7;10716:1;10705:12;10701:66;;10740:16;;;10754:1;10740:16;;;;;;;;;;;;10701:66;10776:23;10816:7;-1:-1:-1;;;;;10802:22:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10802:22:23;;10776:48;;10834:19;10856:13;6650:12:15;;;6580:89;10856:13:23;10834:35;;10879:17;10910:15;10944:9;10939:407;10963:11;10959:1;:15;10939:407;;;11005:27;11030:1;11005:24;:27::i;:::-;10995:37;-1:-1:-1;5686:1:15;11054:7:23;:26;;11046:55;;;;-1:-1:-1;;;11046:55:23;;26807:2:24;11046:55:23;;;26789:21:24;26846:2;26826:18;;;26819:30;-1:-1:-1;;;26865:18:24;;;26858:46;26921:18;;11046:55:23;26605:340:24;11046:55:23;11146:6;-1:-1:-1;;;;;11119:33:23;:23;11134:7;11119:14;:23::i;:::-;-1:-1:-1;;;;;11119:33:23;;11172:8;11115:80;11228:7;11208:6;11215:9;11208:17;;;;;;;;:::i;:::-;;;;;;;;;;:27;11249:11;;;:::i;:::-;;-1:-1:-1;11274:62:23;;;11316:5;11274:62;;10976:3;;;;:::i;:::-;;;;10939:407;;;;11376:7;11363:9;:20;11355:61;;;;-1:-1:-1;;;11355:61:23;;35612:2:24;11355:61:23;;;35594:21:24;35651:2;35631:18;;;35624:30;35690;35670:18;;;35663:58;35738:18;;11355:61:23;35410:352:24;11355:61:23;-1:-1:-1;11433:6:23;;10538:908;-1:-1:-1;;;;;10538:908:23:o;5126:169:18:-;5223:12;:22;5182:4;;5205:15;:40;:83;;;;-1:-1:-1;;5267:21:18;;5249:15;:39;;5126:169::o;6181:346:21:-;6289:13;;;6299:2;6289:13;;;6238;6289;;;;;;6263:23;;6289:13;;;;;;;;;;;-1:-1:-1;6289:13:21;6263:39;;6328:4;6312:20;;:10;6323:1;6312:13;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;6312:20:21;;;;;;;;;6358:4;6342:20;;:10;6353:1;6342:13;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;6342:20:21;;;;;;;;;6377:9;6372:106;6396:18;6392:22;;6372:106;;;6453:11;6465:1;6453:14;;;;;;;:::i;:::-;;;;6435:10;6446:3;:1;6448;6446:3;:::i;:::-;6435:15;;;;;;;;:::i;:::-;;;;:32;-1:-1:-1;;;;;6435:32:21;;;;;;;;-1:-1:-1;6416:3:21;;;;:::i;:::-;;;;6372:106;;;;6501:18;6508:10;6501:6;:18::i;:::-;6487:33;6181:346;-1:-1:-1;;;6181:346:21:o;2632:102:3:-;2688:13;2720:7;2713:14;;;;;:::i;5982:655:19:-;719:10:9;8215:16:13;8234:26;;;:12;:26;;;;;;1273:6:0;;8234:26:13;;;;;719:10:9;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8291:23:13;;:48;;;-1:-1:-1;8318:21:13;;;4972:1;8318:21;8291:48;8270:109;;;;-1:-1:-1;;;8270:109:13;;;;;;;:::i;:::-;6134:20:19;6126:44:::1;;;::::0;-1:-1:-1;;;6126:44:19;;35969:2:24;6126:44:19::1;::::0;::::1;35951:21:24::0;36008:2;35988:18;;;35981:30;-1:-1:-1;;;36027:18:24;;;36020:41;36078:18;;6126:44:19::1;35767:335:24::0;6126:44:19::1;6188:39:::0;;::::1;6180:110;;;::::0;-1:-1:-1;;;6180:110:19;;36309:2:24;6180:110:19::1;::::0;::::1;36291:21:24::0;36348:2;36328:18;;;36321:30;36387:34;36367:18;;;36360:62;36458:28;36438:18;;;36431:56;36504:19;;6180:110:19::1;36107:422:24::0;6180:110:19::1;6329:9;6324:297;6344:20:::0;;::::1;6324:297;;;6389:15;6407:9;;6417:1;6407:12;;;;;;;:::i;:::-;6445:20;::::0;-1:-1:-1;;;6445:20:19;;6407:12:::1;::::0;;::::1;::::0;;;::::1;;6445:20;::::0;::::1;3252:25:24::0;;;6407:12:19;-1:-1:-1;6445:4:19::1;::::0;:11:::1;::::0;-1:-1:-1;3225:18:24;;6445:20:19::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6437:51;;;;-1:-1:-1::0;;;6437:51:19::1;;;;;;;:::i;:::-;6530:12;;6543:1;6530:15;;;;;;;:::i;:::-;;;;;;;6506:12;:21;6519:7;6506:21;;;;;;;;;;;:39;;;;6568:38;6581:7;6590:12;;6603:1;6590:15;;;;;;;:::i;:::-;;;;;;;6568:38;;;;;;22975:25:24::0;;;23031:2;23016:18;;23009:34;22963:2;22948:18;;22801:248;6568:38:19::1;;;;;;;;-1:-1:-1::0;6366:3:19::1;;6324:297;;4169:153:3::0;4263:52;719:10:9;4296:8:3;4306;4263:18;:52::i;:::-;4169:153;;:::o;7324:967:19:-;7444:15;7475:20;7511:9;-1:-1:-1;;;;;7498:30:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7475:53;;7543:9;7538:726;7558:20;;;7538:726;;;7599:15;7617:9;;7627:1;7617:12;;;;;;;:::i;:::-;7648:20;;-1:-1:-1;;;7648:20:19;;7617:12;;;;;;;;;7648:20;;;3252:25:24;;;7617:12:19;-1:-1:-1;7648:4:19;;:11;;-1:-1:-1;3225:18:24;;7648:20:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7643:98;;7688:12;;;;;;;;;;;;:4;7693:1;7688:7;;;;;;;;:::i;:::-;;;;;;:12;;;;7718:8;;;7643:98;7754:17;7774:21;;;:12;:21;;;;;;;7906:15;;;7902:275;;7941:21;7965:17;7974:7;7965:8;:17::i;:::-;7941:41;;8034:1;8016:7;8010:21;:25;:126;;;;;;;;;;;;;;;;;8082:7;8091:18;:7;:16;:18::i;:::-;8065:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8010:126;8000:4;8005:1;8000:7;;;;;;;;:::i;:::-;;;;;;:136;;;;8154:8;;;;;7902:275;8235:16;8241:9;8235:5;:16::i;:::-;8207:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;8190:4;8195:1;8190:7;;;;;;;;:::i;:::-;;;;;;:63;;;;7585:679;;7538:726;7580:3;;;;:::i;:::-;;;;7538:726;;5109:219:22;1094:13:0;:11;:13::i;:::-;5229:10:22;5215:97:::1;5243:9;5241:1;:11;5215:97;;;5294:1;5296;5294:3;5276:12;5289:1;5276:15;;;;;;;:::i;:::-;;:21:::0;5254:3:::1;;5215:97;;6988:923:23::0;7166:17;;7114:16;;-1:-1:-1;;;;;7166:17:23;719:10:9;-1:-1:-1;;;;;7150:33:23;;7142:60;;;;-1:-1:-1;;;7142:60:23;;;;;;;:::i;:::-;7258:7;:17;7233:42;;;7212:117;;;;-1:-1:-1;;;7212:117:23;;;;;;;:::i;:::-;7429:7;:17;7404:14;7388:13;6650:12:15;;;6580:89;7388:13:23;:37;:58;;7363:145;;;;-1:-1:-1;;;7363:145:23;;;;;;;:::i;:::-;7523:25;7565:14;-1:-1:-1;;;;;7551:36:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7551:36:23;;7523:64;;7606:9;7601:265;7621:25;;;7601:265;;;7671:15;7689:13;:11;:13::i;:::-;7671:31;;7720:28;7730:8;7740:7;7720:9;:28::i;:::-;7780:7;7766:8;7775:1;7766:11;;;;;;;;:::i;:::-;;;;;;:21;;;;;7843:7;7824:14;;7839:1;7824:17;;;;;;;:::i;:::-;;;;;;;7811:40;;;;;;;;;;-1:-1:-1;7648:3:23;;7601:265;;;-1:-1:-1;7886:8:23;6988:923;-1:-1:-1;;;;6988:923:23:o;6110:370:15:-;1094:13:0;:11;:13::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;;;6224:208:15::2;6244:20:::0;;::::2;6224:208;;;6285:15;6303:9;;6313:1;6303:12;;;;;;;:::i;:::-;;;;;;;6285:30;;6357:12;719:10:9::0;;640:96;6357:12:15::2;-1:-1:-1::0;;;;;6337:32:15::2;:16;6345:7;6337;:16::i;:::-;-1:-1:-1::0;;;;;6337:32:15::2;;6329:64;;;;-1:-1:-1::0;;;6329:64:15::2;;;;;;;:::i;:::-;6407:14;6413:7;6407:5;:14::i;:::-;-1:-1:-1::0;6266:3:15;::::2;::::0;::::2;:::i;:::-;;;;6224:208;;;;6457:9;;:16;;6441:12;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;1701:1:2::1;2628:7;:22:::0;-1:-1:-1;;6110:370:15:o;5250:315:3:-;5418:41;719:10:9;5451:7:3;5418:18;:41::i;:::-;5410:100;;;;-1:-1:-1;;;5410:100:3;;;;;;;:::i;:::-;5520:38;5534:4;5540:2;5544:7;5553:4;5520:13;:38::i;:::-;5250:315;;;;:::o;6458:524:23:-;6616:17;;6569:7;;-1:-1:-1;;;;;6616:17:23;719:10:9;-1:-1:-1;;;;;6600:33:23;;6592:60;;;;-1:-1:-1;;;6592:60:23;;;;;;;:::i;:::-;6732:7;:17;6650:12:15;;6727:1:23;6711:17;:38;;6686:125;;;;-1:-1:-1;;;6686:125:23;;;;;;;:::i;:::-;6831:15;6849:13;:11;:13::i;:::-;6831:31;;6872:28;6882:8;6892:7;6872:9;:28::i;:::-;6915:36;;6943:7;;6928:13;;6915:36;;;;;6968:7;6458:524;-1:-1:-1;;;6458:524:23:o;5750:424:13:-;719:10:9;8215:16:13;8234:26;;;:12;:26;;;;;;1273:6:0;;5846:16:13;;;;8234:26;;;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;8291:23:13;;:48;;-1:-1:-1;8318:21:13;;;4972:1;8318:21;8291:48;8270:109;;;;-1:-1:-1;;;8270:109:13;;;;;;;:::i;:::-;5935:11:::1;:18:::0;5894:26:::1;::::0;-1:-1:-1;;;;;5923:31:13;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;5923:31:13::1;;5894:60;;5993:9;5988:127;6012:11;:18:::0;6008:22;::::1;5988:127;;;6072:12;:28;6085:11;6097:1;6085:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;6085:14:13::1;6072:28:::0;;;::::1;::::0;;;;;;;;;6055:14;;6072:28:::1;::::0;;::::1;::::0;6055:11;;6067:1;;6055:14;::::1;;;;;:::i;:::-;:45;::::0;;::::1;:14;::::0;;::::1;::::0;;;;;;;:45;6032:3:::1;;5988:127;;;;6142:11;6155;6134:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;6134:33:13::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;;;;;;8205:192:::0;5750:424;;:::o;9179:234:23:-;9327:13;9363:43;9397:8;9363:33;:43::i;6526:121:13:-;719:10:9;8545:16:13;8564:26;;;:12;:26;;;;;;1273:6:0;;8564:26:13;;;;;719:10:9;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8621:23:13;;:67;;;-1:-1:-1;8664:24:13;;;5014:1;8664:24;8621:67;:108;;;-1:-1:-1;8708:21:13;;;4972:1;8708:21;8621:108;8600:169;;;;-1:-1:-1;;;8600:169:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;6608:32:13::2;::::0;6630:9:::2;3252:25:24::0;;719:10:9;;6608:32:13::2;::::0;3240:2:24;3225:18;6608:32:13::2;;;;;;;-1:-1:-1::0;1701:1:2::1;2628:7;:22:::0;6526:121:13:o;8765:1881:17:-;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;8917:90:17;::::1;;;8953:16;::::0;::::1;;8945:51;;;::::0;-1:-1:-1;;;8945:51:17;;37997:2:24;8945:51:17::1;::::0;::::1;37979:21:24::0;38036:2;38016:18;;;38009:30;-1:-1:-1;;;38055:18:24;;;38048:52;38117:18;;8945:51:17::1;37795:346:24::0;8945:51:17::1;9045:9;9040:1590;9060:20:::0;;::::1;9040:1590;;;9105:15;9123:9;;9133:1;9123:12;;;;;;;:::i;:::-;;;;;;;9105:30;;9207:12;719:10:9::0;;640:96;9207:12:17::1;9182:21;::::0;-1:-1:-1;;;9182:21:17;;::::1;::::0;::::1;3252:25:24::0;;;-1:-1:-1;;;;;9182:37:17;;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;3225:18:24;;9182:21:17::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;9182:37:17::1;;9153:127;;;;-1:-1:-1::0;;;9153:127:17::1;;;;;;;:::i;:::-;9299:28;9330:25:::0;;;:16:::1;:25;::::0;;;;9400:23;;9441:1175;::::1;;;9481:16;9501:1;9481:21:::0;9477:661:::1;;9556:15;9530:41:::0;;9597:18:::1;::::0;::::1;:33:::0;;-1:-1:-1;;9597:33:17::1;;::::0;::::1;::::0;;::::1;::::0;;;719:10:9;-1:-1:-1;;;;;9661:205:17::1;9711:7;9661:205;9832:8;9661:205;;;;565:14:24::0;558:22;540:41;;528:2;513:18;;400:187;9661:205:17::1;;;;;;;;9441:1175;;9477:661;9958:18;::::0;::::1;::::0;:34:::1;::::0;;::::1;:18:::0;::::1;:34;9921:194;;;::::0;-1:-1:-1;;;9921:194:17;;38348:2:24;9921:194:17::1;::::0;::::1;38330:21:24::0;38387:2;38367:18;;;38360:30;38426:34;38406:18;;;38399:62;38497:34;38477:18;;;38470:62;-1:-1:-1;;;38548:19:24;;;38541:32;38590:19;;9921:194:17::1;38146:469:24::0;9921:194:17::1;9441:1175;;;10188:20:::0;;10184:414:::1;;10236:12;::::0;::::1;:50:::0;;10252:15:::1;:34:::0;;::::1;10236:50;::::0;;-1:-1:-1;10312:27:17;;10370:205:::1;::::0;::::1;719:10:9::0;-1:-1:-1;;;;;10370:205:17::1;10420:7;10370:205;10541:8;10370:205;;;;565:14:24::0;558:22;540:41;;528:2;513:18;;400:187;10370:205:17::1;;;;;;;;10184:414;-1:-1:-1::0;;;9082:3:17::1;;9040:1590;;;-1:-1:-1::0;;1701:1:2;2628:7;:22;-1:-1:-1;;;8765:1881:17:o;7549:862::-;7657:29;7702:40;7772:9;-1:-1:-1;;;;;7745:44:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7745:44:17;;-1:-1:-1;;7745:44:17;;;;;;;;;;;;7702:87;;7804:9;7799:579;7819:20;;;7799:579;;;7860:15;7878:9;;7888:1;7878:12;;;;;;;:::i;:::-;7908:20;;-1:-1:-1;;;7908:20:17;;7878:12;;;;;;;;;7908:20;;;3252:25:24;;;7878:12:17;-1:-1:-1;7908:4:17;;:11;;-1:-1:-1;3225:18:24;;7908:20:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7904:66;;7947:8;;;7904:66;7983:27;8013:25;;;:16;:25;;;;;;;;;7983:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8056:28;8052:244;;8130:4;8104:10;8115:1;8104:13;;;;;;;;:::i;:::-;;;;;;;:23;;:30;;;;;;;;;;;8180:6;:18;;;8152:10;8163:1;8152:13;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;;:25;;;;:46;8258:23;;8240:41;;:15;:41;:::i;:::-;8216:10;8227:1;8216:13;;;;;;;;:::i;:::-;;;;;;;:21;;:65;;;;;8052:244;8346:10;8357:1;8346:13;;;;;;;;:::i;:::-;;;;;;;:21;;;8331:6;:12;;;:36;;;;:::i;:::-;8309:10;8320:1;8309:13;;;;;;;;:::i;:::-;;;;;;;;;;;:58;-1:-1:-1;;7799:579:17;7841:3;;;:::i;:::-;;;7799:579;;5418:326:13;1094:13:0;:11;:13::i;:::-;5531:28:13::1;::::0;::::1;5527:155;;-1:-1:-1::0;;;;;5582:22:13;::::1;;::::0;;;:12:::1;:22;::::0;;;;5575:29;;-1:-1:-1;;5575:29:13::1;::::0;;5527:155:::1;;;-1:-1:-1::0;;;;;5635:22:13;::::1;;::::0;;;:12:::1;:22;::::0;;;;:36;;-1:-1:-1;;5635:36:13::1;;::::0;::::1;;::::0;;5527:155:::1;5697:40;::::0;3713:4:24;3701:17;;3683:36;;-1:-1:-1;;;;;5697:40:13;::::1;::::0;::::1;::::0;3671:2:24;3656:18;5697:40:13::1;;;;;;;5418:326:::0;;:::o;5454:434:20:-;719:10:9;8215:16:13;8234:26;;;:12;:26;;;;;;1273:6:0;;8234:26:13;;;;;719:10:9;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8291:23:13;;:48;;;-1:-1:-1;8318:21:13;;;4972:1;8318:21;8291:48;8270:109;;;;-1:-1:-1;;;8270:109:13;;;;;;;:::i;:::-;5605:32:20;;::::1;5597:112;;;::::0;-1:-1:-1;;;5597:112:20;;38822:2:24;5597:112:20::1;::::0;::::1;38804:21:24::0;38861:2;38841:18;;;38834:30;38900:34;38880:18;;;38873:62;38971:34;38951:18;;;38944:62;-1:-1:-1;;;39022:19:24;;;39015:34;39066:19;;5597:112:20::1;38620:471:24::0;5597:112:20::1;5723:9;5719:163;5738:16:::0;;::::1;5719:163;;;5801:7;;5809:1;5801:10;;;;;;;:::i;:::-;;;;;;;5774:12;:24;5787:7;;5795:1;5787:10;;;;;;;:::i;:::-;;;;;;;5774:24;;;;;;;;;;;:37;;;;5830:41;5848:7;;5856:1;5848:10;;;;;;;:::i;:::-;;;;;;;5860:7;;5868:1;5860:10;;;;;;;:::i;:::-;;;;;;;5830:41;;;;;;22975:25:24::0;;;23031:2;23016:18;;23009:34;22963:2;22948:18;;22801:248;5830:41:20::1;;;;;;;;5756:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5719:163;;5472:156:18::0;1094:13:0;:11;:13::i;:::-;39256:19:24;;5554:12:18::1;39243:33:24::0;;;39330:2;39319:14;;;39306:28;39292:12;39285:50;;;39389:2;39378:14;;;39365:28;39351:12;39344:50;;;5588:33:18;;39608:32:24;;;39656:20;;;39649:54;;;;39719:20;;39712:54;5588:33:18::1;::::0;39596:2:24;39581:18;5588:33:18::1;39405:367:24::0;2081:198:0;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;39979:2:24;2161:73:0::1;::::0;::::1;39961:21:24::0;40018:2;39998:18;;;39991:30;40057:34;40037:18;;;40030:62;-1:-1:-1;;;40108:18:24;;;40101:36;40154:19;;2161:73:0::1;39777:402:24::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;11004:886:17:-;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;;;719:10:9;8564:26:13;;;:12:::1;:26;::::0;;;;;;1273:6:0;;8564:26:13::1;::::0;;::::1;::::0;719:10:9;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8621:23:13::1;;:67;;;-1:-1:-1::0;8664:24:13::1;::::0;::::1;5014:1;8664:24;8621:67;:108;;;-1:-1:-1::0;8708:21:13::1;::::0;::::1;4972:1;8708:21;8621:108;8600:169;;;;-1:-1:-1::0;;;8600:169:13::1;;;;;;;:::i;:::-;11172:9:17::2;11167:707;11187:20:::0;;::::2;11167:707;;;11232:15;11250:9;;11260:1;11250:12;;;;;;;:::i;:::-;;;;;;;11232:30;;11280:13;11296:4;-1:-1:-1::0;;;;;11296:12:17::2;;11309:7;11296:21;;;;;;;;;;;;;3252:25:24::0;;3240:2;3225:18;;3106:177;11296:21:17::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11335:28;11366:25:::0;;;:16:::2;:25;::::0;;;;11413:23;;11280:37;;-1:-1:-1;11366:25:17;11413:28;;11409:83:::2;;11465:8;;;;;11409:83;11543:23:::0;;11509:12:::2;::::0;::::2;:57:::0;;11525:15:::2;:41:::0;;;::::2;11509:57:::0;;::::2;::::0;;-1:-1:-1;11584:27:17;;;11732:18:::2;::::0;::::2;::::0;11634:161:::2;::::0;540:41:24;;;11732:18:17::2;;::::0;-1:-1:-1;;;;;11634:161:17;::::2;::::0;11676:7;;11634:161:::2;::::0;528:2:24;513:18;11634:161:17::2;;;;;;;11818:41;::::0;719:10:9;;11837:7:17;;11818:41:::2;::::0;;;::::2;11214:660;;;11167:707;11209:3;;11167:707;;;-1:-1:-1::0;;1701:1:2;2628:7;:22;-1:-1:-1;;11004:886:17:o;6141:185:23:-;1094:13:0;:11;:13::i;:::-;6226:17:23::1;:36:::0;;-1:-1:-1;;;;;;6226:36:23::1;-1:-1:-1::0;;;;;6226:36:23;::::1;::::0;;::::1;::::0;;;6277:42:::1;::::0;2271:51:24;;;6277:42:23::1;::::0;2259:2:24;2244:18;6277:42:23::1;2125:203:24::0;4651:157:14;1094:13:0;:11;:13::i;:::-;4732:10:14::1;:24;4745:11:::0;;4732:10;:24:::1;:::i;:::-;;4771:30;4789:11;;4771:30;;;;;;;:::i;1570:300:3:-:0;1672:4;-1:-1:-1;;;;;;1707:40:3;;-1:-1:-1;;;1707:40:3;;:104;;-1:-1:-1;;;;;;;1763:48:3;;-1:-1:-1;;;1763:48:3;1707:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:11;;;1827:36:3;829:155:11;11657:133:3;7099:4;7122:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7122:16:3;11730:53;;;;-1:-1:-1;;;11730:53:3;;34576:2:24;11730:53:3;;;34558:21:24;34615:2;34595:18;;;34588:30;-1:-1:-1;;;34634:18:24;;;34627:54;34698:18;;11730:53:3;34374:348:24;10959:171:3;11033:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11033:29:3;-1:-1:-1;;;;;11033:29:3;;;;;;;;:24;;11086:23;11033:24;11086:14;:23::i;:::-;-1:-1:-1;;;;;11077:46:3;;;;;;;;;;;10959:171;;:::o;1359:130:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;;;;;719:10:9;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;40386:2:24;1414:68:0;;;40368:21:24;;;40405:18;;;40398:30;40464:34;40444:18;;;40437:62;40516:18;;1414:68:0;40184:356:24;7317:261:3;7410:4;7426:13;7442:23;7457:7;7442:14;:23::i;:::-;7426:39;;7494:5;-1:-1:-1;;;;;7483:16:3;:7;-1:-1:-1;;;;;7483:16:3;;:52;;;-1:-1:-1;;;;;;4508:25:3;;;4485:4;4508:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7503:32;7483:87;;;;7563:7;-1:-1:-1;;;;;7539:31:3;:20;7551:7;7539:11;:20::i;:::-;-1:-1:-1;;;;;7539:31:3;;7483:87;7475:96;7317:261;-1:-1:-1;;;;7317:261:3:o;10242:605::-;10396:4;-1:-1:-1;;;;;10369:31:3;:23;10384:7;10369:14;:23::i;:::-;-1:-1:-1;;;;;10369:31:3;;10361:81;;;;-1:-1:-1;;;10361:81:3;;40747:2:24;10361:81:3;;;40729:21:24;40786:2;40766:18;;;40759:30;40825:34;40805:18;;;40798:62;-1:-1:-1;;;40876:18:24;;;40869:35;40921:19;;10361:81:3;40545:401:24;10361:81:3;-1:-1:-1;;;;;10460:16:3;;10452:65;;;;-1:-1:-1;;;10452:65:3;;41153:2:24;10452:65:3;;;41135:21:24;41192:2;41172:18;;;41165:30;41231:34;41211:18;;;41204:62;-1:-1:-1;;;41282:18:24;;;41275:34;41326:19;;10452:65:3;40951:400:24;10452:65:3;10528:39;10549:4;10555:2;10559:7;10528:20;:39::i;:::-;10629:29;10646:1;10650:7;10629:8;:29::i;:::-;-1:-1:-1;;;;;10669:15:3;;;;;;:9;:15;;;;;:20;;10688:1;;10669:15;:20;;10688:1;;10669:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10699:13:3;;;;;;:9;:13;;;;;:18;;10716:1;;10699:13;:18;;10716:1;;10699:18;:::i;:::-;;;;-1:-1:-1;;10727:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10727:21:3;-1:-1:-1;;;;;10727:21:3;;;;;;;;;10764:27;;10727:16;;10764:27;;;;;;;3537:337;3467:407;;:::o;8645:402:23:-;8792:28;;8765:7;;8792:28;;8788:208;;;8868:17;;8904:39;;-1:-1:-1;;;8904:39:23;;;;;3252:25:24;;;-1:-1:-1;;;;;8868:17:23;;;;;;8904:29;;3225:18:24;;8904:39:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8900:86;;;-1:-1:-1;8970:1:23;;8645:402;-1:-1:-1;;8645:402:23:o;8900:86::-;8822:174;8788:208;5735:18:18;;9012:28:23;5634:126:18;6754:227:22;6827:7;6859:19;6849:6;:29;6846:66;;-1:-1:-1;6900:1:22;;6754:227;-1:-1:-1;6754:227:22:o;6846:66::-;6928:12;6972:1;6941:28;6963:6;6941:19;:28;:::i;:::-;:32;;;;:::i;:::-;6928:46;;;;;;;:::i;:::-;;;;6754:227;-1:-1:-1;;6754:227:22:o;7135:210:15:-;7217:7;7122:16:3;;;:7;:16;;;;;;-1:-1:-1;;;;;7122:16:3;:30;7235:77:15;;7279:22;;-1:-1:-1;;;7279:22:15;;;;;3252:25:24;;;7279:4:15;;:12;;3225:18:24;;7279:22:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7235:77::-;-1:-1:-1;7336:1:15;;7135:210;-1:-1:-1;7135:210:15:o;8382:131:23:-;8447:7;8493:13;6650:12:15;;;6580:89;8493:13:23;8473:7;:17;:33;;;;:::i;2433:117:1:-;1486:16;:14;:16::i;:::-;2491:7:::1;:15:::0;;-1:-1:-1;;2491:15:1::1;::::0;;2521:22:::1;719:10:9::0;2530:12:1::1;2521:22;::::0;-1:-1:-1;;;;;2289:32:24;;;2271:51;;2259:2;2244:18;2521:22:1::1;;;;;;;2433:117::o:0;7350:118:15:-;7422:4;7122:16:3;;;:7;:16;;;;;;-1:-1:-1;;;;;7122:16:3;:30;;7444:17:15;7034:125:3;2186:115:1;1239:19;:17;:19::i;:::-;2255:4:::1;2245:14:::0;;-1:-1:-1;;2245:14:1::1;::::0;::::1;::::0;;2274:20:::1;719:10:9::0;2281:12:1::1;640:96:9::0;2433:187:0;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;2525:6;2541:17;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;11266:307:3:-;11416:8;-1:-1:-1;;;;;11407:17:3;:5;-1:-1:-1;;;;;11407:17:3;;11399:55;;;;-1:-1:-1;;;11399:55:3;;41558:2:24;11399:55:3;;;41540:21:24;41597:2;41577:18;;;41570:30;41636:27;41616:18;;;41609:55;41681:18;;11399:55:3;41356:349:24;11399:55:3;-1:-1:-1;;;;;11464:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11464:46:3;;;;;;;;;;11525:41;;540::24;;;11525::3;;513:18:24;11525:41:3;;;;;;;11266:307;;;:::o;5894:398:20:-;5995:13;6011:22;;;:12;:22;;;;;;5970:13;;6046:10;;;6043:70;;6078:24;6093:8;6078:14;:24::i;6043:70::-;6122:21;6146:20;;;:13;:20;;;;;6122:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6185:7;6179:21;6204:1;6179:26;6176:86;;6227:24;6242:8;6227:14;:24::i;392:703:10:-;448:13;665:5;674:1;665:10;661:51;;-1:-1:-1;;691:10:10;;;;;;;;;;;;-1:-1:-1;;;691:10:10;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:10;;-1:-1:-1;837:2:10;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;-1:-1:-1;;;;;881:17:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:10;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:10;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;966:56:10;;;;;;;;-1:-1:-1;1036:11:10;1045:2;1036:11;;:::i;:::-;;;908:150;;5503:274:22;5544:16;5572:14;5589:15;:13;:15::i;:::-;5572:32;;5631:1;5622:6;:10;5614:49;;;;-1:-1:-1;;;5614:49:22;;42029:2:24;5614:49:22;;;42011:21:24;42068:2;42048:18;;;42041:30;42107:28;42087:18;;;42080:56;42153:18;;5614:49:22;41827:350:24;5614:49:22;5708:52;5726:1;5719:6;:8;5753:6;5729:21;5743:6;7560:304;;;7616:12;-1:-1:-1;;7616:16:22;7606:27;7560:304;;;;43580:19:24;;;;7663:16:22;43615:12:24;;;43608:28;7709:15:22;43652:12:24;;;;43645:28;;;;7754:14:22;43757:15:24;;-1:-1:-1;;43753:24:24;;;43739:12;;;43732:46;43794:13;;;43787:29;;;;7829:9:22;43851:15:24;;43847:24;;;43832:13;;;43825:47;7560:304:22;;;;;;;;;43888:13:24;;;;7560:304:22;;;7525:361;;;;;;7374:547;5729:21;:30;;;;;:::i;:::-;;5708:10;:52::i;:::-;5697:63;;5562:215;5503:274;:::o;7908:108:3:-;7983:26;7993:2;7997:7;7983:26;;;;;;;;;;;;:9;:26::i;9512:406::-;9571:13;9587:23;9602:7;9587:14;:23::i;:::-;9571:39;;9621:48;9642:5;9657:1;9661:7;9621:20;:48::i;:::-;9707:29;9724:1;9728:7;9707:8;:29::i;:::-;-1:-1:-1;;;;;9747:16:3;;;;;;:9;:16;;;;;:21;;9767:1;;9747:16;:21;;9767:1;;9747:21;:::i;:::-;;;;-1:-1:-1;;9785:16:3;;;;:7;:16;;;;;;9778:23;;-1:-1:-1;;;;;;9778:23:3;;;9817:36;9793:7;;9785:16;-1:-1:-1;;;;;9817:36:3;;;;;9785:16;;9817:36;4169:153;;:::o;6426:305::-;6576:28;6586:4;6592:2;6596:7;6576:9;:28::i;:::-;6622:47;6645:4;6651:2;6655:7;6664:4;6622:22;:47::i;:::-;6614:110;;;;-1:-1:-1;;;6614:110:3;;;;;;;:::i;6643:675:19:-;6794:21;;-1:-1:-1;;;6794:21:19;;;;;3252:25:24;;;6757:13:19;;6794:4;;:11;;3225:18:24;;6794:21:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6786:52;;;;-1:-1:-1;;;6786:52:19;;;;;;;:::i;:::-;6849:17;6869:22;;;:12;:22;;;;;;;6994:15;;;6990:252;;7025:21;7049:18;7058:8;7049;:18::i;:::-;7025:42;;7128:1;7110:7;7104:21;:25;:127;;;;;;;;;;;;;;;;;7176:7;7185:19;:8;:17;:19::i;:::-;7159:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7081:150;6643:675;-1:-1:-1;;;;6643:675:19:o;6990:252::-;7293:16;7299:9;7293:5;:16::i;:::-;7265:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;7251:60;;;6643:675;;;:::o;11665:297:23:-;11839:61;11882:4;11888:2;11892:7;11839:42;:61::i;:::-;11910:45;11937:4;11943:2;11947:7;11910:26;:45::i;1945:106:1:-;1685:7;;;;2003:41;;;;-1:-1:-1;;;2003:41:1;;42803:2:24;2003:41:1;;;42785:21:24;42842:2;42822:18;;;42815:30;-1:-1:-1;;;42861:18:24;;;42854:50;42921:18;;2003:41:1;42601:344:24;1767:106:1;1685:7;;;;1836:9;1828:38;;;;-1:-1:-1;;;1828:38:1;;43152:2:24;1828:38:1;;;43134:21:24;43191:2;43171:18;;;43164:30;-1:-1:-1;;;43210:18:24;;;43203:46;43266:18;;1828:38:1;42950:340:24;5029:132:19;5115:13;5147:7;5140:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5029:132;;;:::o;6508:241:22:-;6578:7;6597:11;6611:12;6624:3;6611:17;;;;;;;:::i;:::-;;;6597:31;;6658:12;6671:10;6658:24;;;;;;;:::i;:::-;;;6638:12;6651:3;6638:17;;;;;;;:::i;:::-;;:44;6719:3;6692:12;6705:10;6692:24;;;;;;;:::i;:::-;;:30;6739:3;6508:241;-1:-1:-1;;;6508:241:22:o;8237:309:3:-;8361:18;8367:2;8371:7;8361:5;:18::i;:::-;8410:53;8441:1;8445:2;8449:7;8458:4;8410:22;:53::i;:::-;8389:150;;;;-1:-1:-1;;;8389:150:3;;;;;;;:::i;12342:831::-;12491:4;-1:-1:-1;;;;;12511:13:3;;1465:19:8;:23;12507:660:3;;12546:71;;-1:-1:-1;;;12546:71:3;;-1:-1:-1;;;;;12546:36:3;;;;;:71;;719:10:9;;12597:4:3;;12603:7;;12612:4;;12546:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12546:71:3;;;;;;;;-1:-1:-1;;12546:71:3;;;;;;;;;;;;:::i;:::-;;;12542:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12784:6;:13;12801:1;12784:18;12780:321;;12826:60;;-1:-1:-1;;;12826:60:3;;;;;;;:::i;12780:321::-;13053:6;13047:13;13038:6;13034:2;13030:15;13023:38;12542:573;-1:-1:-1;;;;;;12667:51:3;-1:-1:-1;;;12667:51:3;;-1:-1:-1;12660:58:3;;12507:660;-1:-1:-1;13152:4:3;12342:831;;;;;;:::o;11896:320:17:-;8483:4;8506:26;;;:16;:26;;;;;:43;:48;12037:173;;12107:26;;;;:16;:26;;;;;:42;;;;;;;;12082:117;;;;-1:-1:-1;;;12082:117:17;;44862:2:24;12082:117:17;;;44844:21:24;44901:2;44881:18;;;44874:30;-1:-1:-1;;;44920:18:24;;;44913:46;44976:18;;12082:117:17;44660:340:24;7687:244:15;1685:7:1;;;;7834:9:15;7826:43;;;;-1:-1:-1;;;7826:43:15;;45207:2:24;7826:43:15;;;45189:21:24;45246:2;45226:18;;;45219:30;-1:-1:-1;;;45265:18:24;;;45258:51;45326:18;;7826:43:15;45005:345:24;5826:169:15;5906:24;5918:2;5922:7;5906:11;:24::i;:::-;-1:-1:-1;;5966:12:15;5964:14;;;;;;5826:169::o;8868:427:3:-;-1:-1:-1;;;;;8947:16:3;;8939:61;;;;-1:-1:-1;;;8939:61:3;;45557:2:24;8939:61:3;;;45539:21:24;;;45576:18;;;45569:30;45635:34;45615:18;;;45608:62;45687:18;;8939:61:3;45355:356:24;8939:61:3;7099:4;7122:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7122:16:3;:30;9010:58;;;;-1:-1:-1;;;9010:58:3;;45918:2:24;9010:58:3;;;45900:21:24;45957:2;45937:18;;;45930:30;45996;45976:18;;;45969:58;46044:18;;9010:58:3;45716:352:24;9010:58:3;9079:45;9108:1;9112:2;9116:7;9079:20;:45::i;:::-;-1:-1:-1;;;;;9135:13:3;;;;;;:9;:13;;;;;:18;;9152:1;;9135:13;:18;;9152:1;;9135:18;:::i;:::-;;;;-1:-1:-1;;9163:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9163:21:3;-1:-1:-1;;;;;9163:21:3;;;;;;;;9200:33;;9163:16;;;9200:33;;9163:16;;9200:33;4169:153;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:24:-;-1:-1:-1;;;;;;88:32:24;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:131::-;-1:-1:-1;;;;;667:31:24;;657:42;;647:70;;713:1;710;703:12;728:456;805:6;813;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;929:9;916:23;948:31;973:5;948:31;:::i;:::-;998:5;-1:-1:-1;1055:2:24;1040:18;;1027:32;1068:33;1027:32;1068:33;:::i;:::-;728:456;;1120:7;;-1:-1:-1;;;1174:2:24;1159:18;;;;1146:32;;728:456::o;1189:258::-;1261:1;1271:113;1285:6;1282:1;1279:13;1271:113;;;1361:11;;;1355:18;1342:11;;;1335:39;1307:2;1300:10;1271:113;;;1402:6;1399:1;1396:13;1393:48;;;-1:-1:-1;;1437:1:24;1419:16;;1412:27;1189:258::o;1452:::-;1494:3;1532:5;1526:12;1559:6;1554:3;1547:19;1575:63;1631:6;1624:4;1619:3;1615:14;1608:4;1601:5;1597:16;1575:63;:::i;:::-;1692:2;1671:15;-1:-1:-1;;1667:29:24;1658:39;;;;1699:4;1654:50;;1452:258;-1:-1:-1;;1452:258:24:o;1715:220::-;1864:2;1853:9;1846:21;1827:4;1884:45;1925:2;1914:9;1910:18;1902:6;1884:45;:::i;1940:180::-;1999:6;2052:2;2040:9;2031:7;2027:23;2023:32;2020:52;;;2068:1;2065;2058:12;2020:52;-1:-1:-1;2091:23:24;;1940:180;-1:-1:-1;1940:180:24:o;2333:315::-;2401:6;2409;2462:2;2450:9;2441:7;2437:23;2433:32;2430:52;;;2478:1;2475;2468:12;2430:52;2517:9;2504:23;2536:31;2561:5;2536:31;:::i;:::-;2586:5;2638:2;2623:18;;;;2610:32;;-1:-1:-1;;;2333:315:24:o;2653:196::-;2742:6;2795:2;2783:9;2774:7;2770:23;2766:32;2763:52;;;2811:1;2808;2801:12;2763:52;-1:-1:-1;2834:9:24;2653:196;-1:-1:-1;2653:196:24:o;2854:247::-;2913:6;2966:2;2954:9;2945:7;2941:23;2937:32;2934:52;;;2982:1;2979;2972:12;2934:52;3021:9;3008:23;3040:31;3065:5;3040:31;:::i;3288:248::-;3356:6;3364;3417:2;3405:9;3396:7;3392:23;3388:32;3385:52;;;3433:1;3430;3423:12;3385:52;-1:-1:-1;;3456:23:24;;;3526:2;3511:18;;;3498:32;;-1:-1:-1;3288:248:24:o;4054:367::-;4117:8;4127:6;4181:3;4174:4;4166:6;4162:17;4158:27;4148:55;;4199:1;4196;4189:12;4148:55;-1:-1:-1;4222:20:24;;-1:-1:-1;;;;;4254:30:24;;4251:50;;;4297:1;4294;4287:12;4251:50;4334:4;4326:6;4322:17;4310:29;;4394:3;4387:4;4377:6;4374:1;4370:14;4362:6;4358:27;4354:38;4351:47;4348:67;;;4411:1;4408;4401:12;4348:67;4054:367;;;;;:::o;4426:785::-;4560:6;4568;4576;4584;4637:2;4625:9;4616:7;4612:23;4608:32;4605:52;;;4653:1;4650;4643:12;4605:52;4693:9;4680:23;-1:-1:-1;;;;;4763:2:24;4755:6;4752:14;4749:34;;;4779:1;4776;4769:12;4749:34;4818:70;4880:7;4871:6;4860:9;4856:22;4818:70;:::i;:::-;4907:8;;-1:-1:-1;4792:96:24;-1:-1:-1;4995:2:24;4980:18;;4967:32;;-1:-1:-1;5011:16:24;;;5008:36;;;5040:1;5037;5030:12;5008:36;;5079:72;5143:7;5132:8;5121:9;5117:24;5079:72;:::i;:::-;4426:785;;;;-1:-1:-1;5170:8:24;-1:-1:-1;;;;4426:785:24:o;5216:592::-;5287:6;5295;5348:2;5336:9;5327:7;5323:23;5319:32;5316:52;;;5364:1;5361;5354:12;5316:52;5404:9;5391:23;-1:-1:-1;;;;;5474:2:24;5466:6;5463:14;5460:34;;;5490:1;5487;5480:12;5460:34;5528:6;5517:9;5513:22;5503:32;;5573:7;5566:4;5562:2;5558:13;5554:27;5544:55;;5595:1;5592;5585:12;5544:55;5635:2;5622:16;5661:2;5653:6;5650:14;5647:34;;;5677:1;5674;5667:12;5647:34;5722:7;5717:2;5708:6;5704:2;5700:15;5696:24;5693:37;5690:57;;;5743:1;5740;5733:12;5690:57;5774:2;5766:11;;;;;5796:6;;-1:-1:-1;5216:592:24;;-1:-1:-1;;;;5216:592:24:o;5813:437::-;5899:6;5907;5960:2;5948:9;5939:7;5935:23;5931:32;5928:52;;;5976:1;5973;5966:12;5928:52;6016:9;6003:23;-1:-1:-1;;;;;6041:6:24;6038:30;6035:50;;;6081:1;6078;6071:12;6035:50;6120:70;6182:7;6173:6;6162:9;6158:22;6120:70;:::i;:::-;6209:8;;6094:96;;-1:-1:-1;5813:437:24;-1:-1:-1;;;;5813:437:24:o;6255:461::-;6308:3;6346:5;6340:12;6373:6;6368:3;6361:19;6399:4;6428:2;6423:3;6419:12;6412:19;;6465:2;6458:5;6454:14;6486:1;6496:195;6510:6;6507:1;6504:13;6496:195;;;6575:13;;-1:-1:-1;;;;;6571:39:24;6559:52;;6631:12;;;;6666:15;;;;6607:1;6525:9;6496:195;;;-1:-1:-1;6707:3:24;;6255:461;-1:-1:-1;;;;;6255:461:24:o;6721:261::-;6900:2;6889:9;6882:21;6863:4;6920:56;6972:2;6961:9;6957:18;6949:6;6920:56;:::i;6987:127::-;7048:10;7043:3;7039:20;7036:1;7029:31;7079:4;7076:1;7069:15;7103:4;7100:1;7093:15;7119:718;7161:5;7214:3;7207:4;7199:6;7195:17;7191:27;7181:55;;7232:1;7229;7222:12;7181:55;7268:6;7255:20;-1:-1:-1;;;;;7331:2:24;7327;7324:10;7321:36;;;7337:18;;:::i;:::-;7412:2;7406:9;7380:2;7466:13;;-1:-1:-1;;7462:22:24;;;7486:2;7458:31;7454:40;7442:53;;;7510:18;;;7530:22;;;7507:46;7504:72;;;7556:18;;:::i;:::-;7596:10;7592:2;7585:22;7631:2;7623:6;7616:18;7677:3;7670:4;7665:2;7657:6;7653:15;7649:26;7646:35;7643:55;;;7694:1;7691;7684:12;7643:55;7758:2;7751:4;7743:6;7739:17;7732:4;7724:6;7720:17;7707:54;7805:1;7798:4;7793:2;7785:6;7781:15;7777:26;7770:37;7825:6;7816:15;;;;;;7119:718;;;;:::o;7842:320::-;7910:6;7963:2;7951:9;7942:7;7938:23;7934:32;7931:52;;;7979:1;7976;7969:12;7931:52;8019:9;8006:23;-1:-1:-1;;;;;8044:6:24;8041:30;8038:50;;;8084:1;8081;8074:12;8038:50;8107:49;8148:7;8139:6;8128:9;8124:22;8107:49;:::i;8390:118::-;8476:5;8469:13;8462:21;8455:5;8452:32;8442:60;;8498:1;8495;8488:12;8513:376;8575:6;8583;8636:2;8624:9;8615:7;8611:23;8607:32;8604:52;;;8652:1;8649;8642:12;8604:52;8691:9;8678:23;8710:28;8732:5;8710:28;:::i;:::-;8757:5;-1:-1:-1;8814:2:24;8799:18;;8786:32;8827:30;8786:32;8827:30;:::i;:::-;8876:7;8866:17;;;8513:376;;;;;:::o;8894:632::-;9065:2;9117:21;;;9187:13;;9090:18;;;9209:22;;;9036:4;;9065:2;9288:15;;;;9262:2;9247:18;;;9036:4;9331:169;9345:6;9342:1;9339:13;9331:169;;;9406:13;;9394:26;;9475:15;;;;9440:12;;;;9367:1;9360:9;9331:169;;;-1:-1:-1;9517:3:24;;8894:632;-1:-1:-1;;;;;;8894:632:24:o;10494:382::-;10559:6;10567;10620:2;10608:9;10599:7;10595:23;10591:32;10588:52;;;10636:1;10633;10626:12;10588:52;10675:9;10662:23;10694:31;10719:5;10694:31;:::i;10881:803::-;11043:4;11072:2;11112;11101:9;11097:18;11142:2;11131:9;11124:21;11165:6;11200;11194:13;11231:6;11223;11216:22;11269:2;11258:9;11254:18;11247:25;;11331:2;11321:6;11318:1;11314:14;11303:9;11299:30;11295:39;11281:53;;11369:2;11361:6;11357:15;11390:1;11400:255;11414:6;11411:1;11408:13;11400:255;;;11507:2;11503:7;11491:9;11483:6;11479:22;11475:36;11470:3;11463:49;11535:40;11568:6;11559;11553:13;11535:40;:::i;:::-;11525:50;-1:-1:-1;11633:12:24;;;;11598:15;;;;11436:1;11429:9;11400:255;;;-1:-1:-1;11672:6:24;;10881:803;-1:-1:-1;;;;;;;10881:803:24:o;12205:572::-;12300:6;12308;12316;12369:2;12357:9;12348:7;12344:23;12340:32;12337:52;;;12385:1;12382;12375:12;12337:52;12424:9;12411:23;12443:31;12468:5;12443:31;:::i;:::-;12493:5;-1:-1:-1;12549:2:24;12534:18;;12521:32;-1:-1:-1;;;;;12565:30:24;;12562:50;;;12608:1;12605;12598:12;12562:50;12647:70;12709:7;12700:6;12689:9;12685:22;12647:70;:::i;:::-;12205:572;;12736:8;;-1:-1:-1;12621:96:24;;-1:-1:-1;;;;12205:572:24:o;12782:665::-;12877:6;12885;12893;12901;12954:3;12942:9;12933:7;12929:23;12925:33;12922:53;;;12971:1;12968;12961:12;12922:53;13010:9;12997:23;13029:31;13054:5;13029:31;:::i;:::-;13079:5;-1:-1:-1;13136:2:24;13121:18;;13108:32;13149:33;13108:32;13149:33;:::i;:::-;13201:7;-1:-1:-1;13255:2:24;13240:18;;13227:32;;-1:-1:-1;13310:2:24;13295:18;;13282:32;-1:-1:-1;;;;;13326:30:24;;13323:50;;;13369:1;13366;13359:12;13323:50;13392:49;13433:7;13424:6;13413:9;13409:22;13392:49;:::i;:::-;13382:59;;;12782:665;;;;;;;:::o;13452:811::-;13705:2;13694:9;13687:21;13668:4;13731:56;13783:2;13772:9;13768:18;13760:6;13731:56;:::i;:::-;13844:22;;;13806:2;13824:18;;;13817:50;;;;13916:13;;13938:22;;;14014:15;;;;13976;;;14047:1;14057:180;14071:6;14068:1;14065:13;14057:180;;;14136:13;;14151:4;14132:24;14120:37;;14212:15;;;;14177:12;;;;14093:1;14086:9;14057:180;;;-1:-1:-1;14254:3:24;;13452:811;-1:-1:-1;;;;;;;13452:811:24:o;14268:732::-;14368:6;14376;14384;14392;14445:2;14433:9;14424:7;14420:23;14416:32;14413:52;;;14461:1;14458;14451:12;14413:52;14501:9;14488:23;-1:-1:-1;;;;;14526:6:24;14523:30;14520:50;;;14566:1;14563;14556:12;14520:50;14605:70;14667:7;14658:6;14647:9;14643:22;14605:70;:::i;:::-;14694:8;;-1:-1:-1;14579:96:24;-1:-1:-1;;14779:2:24;14764:18;;14751:32;14823:6;14812:18;;14802:29;;14792:57;;14845:1;14842;14835:12;14792:57;14868:5;-1:-1:-1;14925:2:24;14910:18;;14897:32;14938:30;14897:32;14938:30;:::i;:::-;14268:732;;;;-1:-1:-1;14268:732:24;;-1:-1:-1;;14268:732:24:o;15005:978::-;15252:2;15304:21;;;15374:13;;15277:18;;;15396:22;;;15223:4;;15252:2;15437;;15455:18;;;;15496:15;;;15223:4;15539:418;15553:6;15550:1;15547:13;15539:418;;;15612:13;;15650:9;;15638:22;;15700:11;;;15694:18;15680:12;;;15673:40;15757:11;;;15751:18;15771:6;15747:31;15733:12;;;15726:53;15802:4;15860:11;;;15854:18;15847:26;15840:34;15826:12;;;15819:56;15904:4;15895:14;;;;15932:15;;;;15575:1;15568:9;15539:418;;;-1:-1:-1;15974:3:24;;15005:978;-1:-1:-1;;;;;;;15005:978:24:o;15988:412::-;16054:6;16062;16115:2;16103:9;16094:7;16090:23;16086:32;16083:52;;;16131:1;16128;16121:12;16083:52;16170:9;16157:23;16189:31;16214:5;16189:31;:::i;:::-;16239:5;-1:-1:-1;16296:2:24;16281:18;;16268:32;16344:4;16331:18;;16319:31;;16309:59;;16364:1;16361;16354:12;17183:388;17251:6;17259;17312:2;17300:9;17291:7;17287:23;17283:32;17280:52;;;17328:1;17325;17318:12;17280:52;17367:9;17354:23;17386:31;17411:5;17386:31;:::i;:::-;17436:5;-1:-1:-1;17493:2:24;17478:18;;17465:32;17506:33;17465:32;17506:33;:::i;17576:198::-;17667:6;17720:2;17708:9;17699:7;17695:23;17691:32;17688:52;;;17736:1;17733;17726:12;17779:355;17981:2;17963:21;;;18020:2;18000:18;;;17993:30;18059:33;18054:2;18039:18;;18032:61;18125:2;18110:18;;17779:355::o;18139:251::-;18209:6;18262:2;18250:9;18241:7;18237:23;18233:32;18230:52;;;18278:1;18275;18268:12;18230:52;18310:9;18304:16;18329:31;18354:5;18329:31;:::i;18395:343::-;18597:2;18579:21;;;18636:2;18616:18;;;18609:30;-1:-1:-1;;;18670:2:24;18655:18;;18648:49;18729:2;18714:18;;18395:343::o;19529:380::-;19608:1;19604:12;;;;19651;;;19672:61;;19726:4;19718:6;19714:17;19704:27;;19672:61;19779:2;19771:6;19768:14;19748:18;19745:38;19742:161;;19825:10;19820:3;19816:20;19813:1;19806:31;19860:4;19857:1;19850:15;19888:4;19885:1;19878:15;20747:443;20916:5;20903:19;20897:4;20890:33;20960:1;20954:4;20950:12;21010:2;21003:5;20999:14;20986:28;21023:30;21045:7;21023:30;:::i;:::-;21081:17;;21160:15;;21153:23;21104:3;21149:33;-1:-1:-1;;21077:32:24;;;;21137:46;21118:66;;-1:-1:-1;;20747:443:24:o;21195:399::-;21417:20;;21399:39;;21387:2;21372:18;;21485:4;21473:17;;21460:31;21500:28;21460:31;21500:28;:::i;:::-;21580:5;21573:13;21566:21;21559:4;21548:9;21544:20;21537:51;;21195:399;;;;:::o;21599:127::-;21660:10;21655:3;21651:20;21648:1;21641:31;21691:4;21688:1;21681:15;21715:4;21712:1;21705:15;21731:125;21771:4;21799:1;21796;21793:8;21790:34;;;21804:18;;:::i;:::-;-1:-1:-1;21841:9:24;;21731:125::o;21861:338::-;22063:2;22045:21;;;22102:2;22082:18;;;22075:30;-1:-1:-1;;;22136:2:24;22121:18;;22114:44;22190:2;22175:18;;21861:338::o;22204:245::-;22271:6;22324:2;22312:9;22303:7;22299:23;22295:32;22292:52;;;22340:1;22337;22330:12;22292:52;22372:9;22366:16;22391:28;22413:5;22391:28;:::i;22454:342::-;22656:2;22638:21;;;22695:2;22675:18;;;22668:30;-1:-1:-1;;;22729:2:24;22714:18;;22707:48;22787:2;22772:18;;22454:342::o;23054:410::-;23256:2;23238:21;;;23295:2;23275:18;;;23268:30;23334:34;23329:2;23314:18;;23307:62;-1:-1:-1;;;23400:2:24;23385:18;;23378:44;23454:3;23439:19;;23054:410::o;26950:135::-;26989:3;27010:17;;;27007:43;;27030:18;;:::i;:::-;-1:-1:-1;27077:1:24;27066:13;;26950:135::o;28605:127::-;28666:10;28661:3;28657:20;28654:1;28647:31;28697:4;28694:1;28687:15;28721:4;28718:1;28711:15;28737:522;28815:4;28821:6;28881:11;28868:25;28975:2;28971:7;28960:8;28944:14;28940:29;28936:43;28916:18;28912:68;28902:96;;28994:1;28991;28984:12;28902:96;29021:33;;29073:20;;;-1:-1:-1;;;;;;29105:30:24;;29102:50;;;29148:1;29145;29138:12;29102:50;29181:4;29169:17;;-1:-1:-1;29212:14:24;29208:27;;;29198:38;;29195:58;;;29249:1;29246;29239:12;29390:545;29492:2;29487:3;29484:11;29481:448;;;29528:1;29553:5;29549:2;29542:17;29598:4;29594:2;29584:19;29668:2;29656:10;29652:19;29649:1;29645:27;29639:4;29635:38;29704:4;29692:10;29689:20;29686:47;;;-1:-1:-1;29727:4:24;29686:47;29782:2;29777:3;29773:12;29770:1;29766:20;29760:4;29756:31;29746:41;;29837:82;29855:2;29848:5;29845:13;29837:82;;;29900:17;;;29881:1;29870:13;29837:82;;30111:1206;-1:-1:-1;;;;;30230:3:24;30227:27;30224:53;;;30257:18;;:::i;:::-;30286:94;30376:3;30336:38;30368:4;30362:11;30336:38;:::i;:::-;30330:4;30286:94;:::i;:::-;30406:1;30431:2;30426:3;30423:11;30448:1;30443:616;;;;31103:1;31120:3;31117:93;;;-1:-1:-1;31176:19:24;;;31163:33;31117:93;-1:-1:-1;;30068:1:24;30064:11;;;30060:24;30056:29;30046:40;30092:1;30088:11;;;30043:57;31223:78;;30416:895;;30443:616;29337:1;29330:14;;;29374:4;29361:18;;-1:-1:-1;;30479:17:24;;;30580:9;30602:229;30616:7;30613:1;30610:14;30602:229;;;30705:19;;;30692:33;30677:49;;30812:4;30797:20;;;;30765:1;30753:14;;;;30632:12;30602:229;;;30606:3;30859;30850:7;30847:16;30844:159;;;30983:1;30979:6;30973:3;30967;30964:1;30960:11;30956:21;30952:34;30948:39;30935:9;30930:3;30926:19;30913:33;30909:79;30901:6;30894:95;30844:159;;;31046:1;31040:3;31037:1;31033:11;31029:19;31023:4;31016:33;30416:895;;;30111:1206;;;:::o;31322:267::-;31411:6;31406:3;31399:19;31463:6;31456:5;31449:4;31444:3;31440:14;31427:43;-1:-1:-1;31515:1:24;31490:16;;;31508:4;31486:27;;;31479:38;;;;31571:2;31550:15;;;-1:-1:-1;;31546:29:24;31537:39;;;31533:50;;31322:267::o;31594:318::-;31781:6;31770:9;31763:25;31824:2;31819;31808:9;31804:18;31797:30;31744:4;31844:62;31902:2;31891:9;31887:18;31879:6;31871;31844:62;:::i;:::-;31836:70;31594:318;-1:-1:-1;;;;;31594:318:24:o;32258:247::-;32417:2;32406:9;32399:21;32380:4;32437:62;32495:2;32484:9;32480:18;32472:6;32464;32437:62;:::i;32510:168::-;32550:7;32616:1;32612;32608:6;32604:14;32601:1;32598:21;32593:1;32586:9;32579:17;32575:45;32572:71;;;32623:18;;:::i;:::-;-1:-1:-1;32663:9:24;;32510:168::o;32683:127::-;32744:10;32739:3;32735:20;32732:1;32725:31;32775:4;32772:1;32765:15;32799:4;32796:1;32789:15;32815:120;32855:1;32881;32871:35;;32886:18;;:::i;:::-;-1:-1:-1;32920:9:24;;32815:120::o;32940:128::-;32980:3;33011:1;33007:6;33004:1;33001:13;32998:39;;;33017:18;;:::i;:::-;-1:-1:-1;33053:9:24;;32940:128::o;33073:267::-;33112:4;33141:9;;;33166:10;;-1:-1:-1;;;33185:19:24;;33178:27;;33162:44;33159:70;;;33209:18;;:::i;:::-;-1:-1:-1;;;;;33256:27:24;;33249:35;;33241:44;;33238:70;;;33288:18;;:::i;:::-;-1:-1:-1;;33325:9:24;;33073:267::o;33345:258::-;33384:7;33416:6;33449:2;33446:1;33442:10;33479:2;33476:1;33472:10;33535:3;33531:2;33527:12;33522:3;33519:21;33512:3;33505:11;33498:19;33494:47;33491:73;;;33544:18;;:::i;:::-;33584:13;;33345:258;-1:-1:-1;;;;33345:258:24:o;33608:228::-;33647:3;33675:10;33712:2;33709:1;33705:10;33742:2;33739:1;33735:10;33773:3;33769:2;33765:12;33760:3;33757:21;33754:47;;;33781:18;;:::i;:::-;33817:13;;33608:228;-1:-1:-1;;;;33608:228:24:o;33841:183::-;33872:1;33898:10;33935:2;33932:1;33928:10;33957:3;33947:37;;33964:18;;:::i;:::-;34002:10;;33998:20;;;;;33841:183;-1:-1:-1;;33841:183:24:o;34029:191::-;34068:1;34094:10;34131:2;34128:1;34124:10;34153:3;34143:37;;34160:18;;:::i;:::-;34198:10;;34194:20;;;;;34029:191;-1:-1:-1;;34029:191:24:o;34225:144::-;34263:3;-1:-1:-1;;;34284:22:24;;34281:48;;34309:18;;:::i;:::-;-1:-1:-1;;;34345:18:24;;34225:144::o;36534:470::-;36713:3;36751:6;36745:13;36767:53;36813:6;36808:3;36801:4;36793:6;36789:17;36767:53;:::i;:::-;36883:13;;36842:16;;;;36905:57;36883:13;36842:16;36939:4;36927:17;;36905:57;:::i;37009:424::-;-1:-1:-1;;;37266:3:24;37259:22;37241:3;37310:6;37304:13;37326:61;37380:6;37376:1;37371:3;37367:11;37360:4;37352:6;37348:17;37326:61;:::i;:::-;37407:16;;;;37425:1;37403:24;;37009:424;-1:-1:-1;;37009:424:24:o;37438:352::-;37640:2;37622:21;;;37679:2;37659:18;;;37652:30;37718;37713:2;37698:18;;37691:58;37781:2;37766:18;;37438:352::o;41710:112::-;41742:1;41768;41758:35;;41773:18;;:::i;:::-;-1:-1:-1;41807:9:24;;41710:112::o;42182:414::-;42384:2;42366:21;;;42423:2;42403:18;;;42396:30;42462:34;42457:2;42442:18;;42435:62;-1:-1:-1;;;42528:2:24;42513:18;;42506:48;42586:3;42571:19;;42182:414::o;43912:489::-;-1:-1:-1;;;;;44181:15:24;;;44163:34;;44233:15;;44228:2;44213:18;;44206:43;44280:2;44265:18;;44258:34;;;44328:3;44323:2;44308:18;;44301:31;;;44106:4;;44349:46;;44375:19;;44367:6;44349:46;:::i;:::-;44341:54;43912:489;-1:-1:-1;;;;;;43912:489:24:o;44406:249::-;44475:6;44528:2;44516:9;44507:7;44503:23;44499:32;44496:52;;;44544:1;44541;44534:12;44496:52;44576:9;44570:16;44595:30;44619:5;44595:30;:::i

Swarm Source

ipfs://1728a250767714a117cfabd82abbb06d8bbf59455cfdedec7bec50cea2e6185a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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