ETH Price: $2,624.51 (+0.53%)

Token

NextGen 6529 (NEXTG)
 

Overview

Max Total Supply

1,000 NEXTG

Holders

478

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
cuttlemint.eth
Balance
0 NEXTG
0xf0cf0a85c08527d8207a3ef45c5dc5af38a61da5
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:
NextGenCore

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 19 of 22: NextGenCore.sol
// SPDX-License-Identifier: MIT

/**
 *
 *  @title: NextGen 6529 - Core Contract
 *  @date: 29-January-2023
 *  @version: 10.31
 *  @author: 6529 team
 */

pragma solidity ^0.8.19;

import "./ERC721Enumerable.sol";
import "./Strings.sol";
import "./Base64.sol";
import "./IRandomizer.sol";
import "./INextGenAdmins.sol";
import "./IMinterContract.sol";
import "./ERC2981.sol";
import "./Ownable.sol";
import "./IDependencyRegistry.sol";

contract NextGenCore is ERC721Enumerable, ERC2981, Ownable {
    using Strings for uint256;

    // declare variables
    uint256 public newCollectionIndex;

    // struct that holds a collection's info
    struct collectionInfoStructure {
        string collectionName;
        string collectionArtist;
        string collectionDescription;
        string collectionWebsite;
        string collectionLicense;
        string collectionBaseURI;
        string collectionLibrary;
        bytes32 collectionDependencyScript;
        string[] collectionScript;
    }

    // mapping of collectionInfo struct
    mapping (uint256 => collectionInfoStructure) private collectionInfo;

    // struct that holds a collection's additional data
    struct collectionAdditonalDataStructure {
        address collectionArtistAddress;
        uint256 maxCollectionPurchases;
        uint256 collectionCirculationSupply;
        uint256 collectionTotalSupply;
        uint256 reservedMinTokensIndex;
        uint256 reservedMaxTokensIndex;
        uint setFinalSupplyTimeAfterMint;
        address randomizerContract;
        IRandomizer randomizer;
    }

    // mapping of collectionAdditionalData struct
    mapping (uint256 => collectionAdditonalDataStructure) private collectionAdditionalData;

    // checks if a collection was created
    mapping (uint256 => bool) private isCollectionCreated; 

    // checks if data on a collection were added
    mapping (uint256 => bool) private wereDataAdded;

    // maps tokends ids with collectionsids
    mapping (uint256 => uint256) private tokenIdsToCollectionIds;

    // stores the token hash generated by randomizer contracts
    mapping(uint256 => bytes32) private tokenToHash;

    // amount of minted tokens per address per collection during public sale
    mapping (uint256 => mapping (address => uint256)) private tokensMintedPerAddress;

    // amount of minted tokens per address per collection during allowlist
    mapping (uint256 => mapping (address => uint256)) private tokensMintedAllowlistAddress;

    // amount of tokens airdropped per address per collection 
    mapping (uint256 => mapping (address => uint256)) private tokensAirdropPerAddress;

    // amount of burnt tokens per collection
    mapping (uint256 => uint256) public burnAmount;

    // metadata view (offchain/onchain)
    mapping (uint256 => bool) public onchainMetadata; 

    // artist signature per collection
    mapping (uint256 => string) public artistsSignatures;

    // additional metadata per token
    mapping (uint256 => string) public tokenData;

    // on-chain image URI and attributes per token
    mapping (uint256 => string[2]) private tokenImageAndAttributes;

    // collection lock status (status cannot revert) 
    mapping (uint256 => bool) private collectionFreeze;

    // checks if an artist signed its collection
    mapping (uint256 => bool) public artistSigned; 

    // external contracts declaration
    INextGenAdmins private adminsContract;
    IDependencyRegistry private dependencyRegistry;
    address public minterContract;

    // events
    event CollectionCreated(uint256 indexed _collectionID);

    // constructor
    constructor(string memory name, string memory symbol, address _adminsContract, address _dependencyRegistry) ERC721(name, symbol) {
        adminsContract = INextGenAdmins(_adminsContract);
        dependencyRegistry = IDependencyRegistry(_dependencyRegistry);
        newCollectionIndex = newCollectionIndex + 1;
        _setDefaultRoyalty(0xC8ed02aFEBD9aCB14c33B5330c803feacAF01377, 690);
    }

    // certain functions can only be called by a global or function admin

    modifier FunctionAdminRequired(bytes4 _selector) {
      require(adminsContract.retrieveFunctionAdmin(msg.sender, _selector) == true || adminsContract.retrieveGlobalAdmin(msg.sender) == true , "Not allowed");
      _;
    }

    // certain functions can only be called by a collection, global or function admin

    modifier CollectionAdminRequired(uint256 _collectionID, bytes4 _selector) {
      require(adminsContract.retrieveCollectionAdmin(msg.sender,_collectionID) == true || adminsContract.retrieveFunctionAdmin(msg.sender, _selector) == true || adminsContract.retrieveGlobalAdmin(msg.sender) == true, "Not allowed");
      _;
    }

    // function to create a Collection

    function createCollection(string memory _collectionName, string memory _collectionArtist, string memory _collectionDescription, string memory _collectionWebsite, string memory _collectionLicense, string memory _collectionBaseURI, string memory _collectionLibrary, bytes32 _collectionDependencyScript, string[] memory _collectionScript) public FunctionAdminRequired(this.createCollection.selector) {
        collectionInfo[newCollectionIndex].collectionName = _collectionName;
        collectionInfo[newCollectionIndex].collectionArtist = _collectionArtist;
        collectionInfo[newCollectionIndex].collectionDescription = _collectionDescription;
        collectionInfo[newCollectionIndex].collectionWebsite = _collectionWebsite;
        collectionInfo[newCollectionIndex].collectionLicense = _collectionLicense;
        collectionInfo[newCollectionIndex].collectionBaseURI = _collectionBaseURI;
        collectionInfo[newCollectionIndex].collectionLibrary = _collectionLibrary;
        collectionInfo[newCollectionIndex].collectionDependencyScript = _collectionDependencyScript;
        collectionInfo[newCollectionIndex].collectionScript = _collectionScript;
        isCollectionCreated[newCollectionIndex] = true;
        emit CollectionCreated(newCollectionIndex);
        newCollectionIndex = newCollectionIndex + 1;
    }

    // function to add/modify the additional data of a collection
    // once a collection is created and total supply is set it cannot change

    function setCollectionData(uint256 _collectionID, address _collectionArtistAddress, uint256 _maxCollectionPurchases, uint256 _collectionTotalSupply, uint _setFinalSupplyTimeAfterMint) public CollectionAdminRequired(_collectionID, this.setCollectionData.selector) {
        require((isCollectionCreated[_collectionID] == true) && (collectionFreeze[_collectionID] == false) && (_collectionTotalSupply <= 10000000000), "err/freezed");
        if (collectionAdditionalData[_collectionID].collectionTotalSupply == 0) {
            collectionAdditionalData[_collectionID].collectionArtistAddress = _collectionArtistAddress;
            collectionAdditionalData[_collectionID].maxCollectionPurchases = _maxCollectionPurchases;
            collectionAdditionalData[_collectionID].collectionCirculationSupply = 0;
            collectionAdditionalData[_collectionID].collectionTotalSupply = _collectionTotalSupply;
            collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint = _setFinalSupplyTimeAfterMint;
            collectionAdditionalData[_collectionID].reservedMinTokensIndex = (_collectionID * 10000000000);
            collectionAdditionalData[_collectionID].reservedMaxTokensIndex = (_collectionID * 10000000000) + _collectionTotalSupply - 1;
            wereDataAdded[_collectionID] = true;
        } else if (artistSigned[_collectionID] == false) {
            collectionAdditionalData[_collectionID].collectionArtistAddress = _collectionArtistAddress;
            collectionAdditionalData[_collectionID].maxCollectionPurchases = _maxCollectionPurchases;
            collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint = _setFinalSupplyTimeAfterMint;
        } else {
            collectionAdditionalData[_collectionID].maxCollectionPurchases = _maxCollectionPurchases;
            collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint = _setFinalSupplyTimeAfterMint;
        }
    }

    // set a randomizer contract on a collection

    function addRandomizer(uint256 _collectionID, address _randomizerContract) public FunctionAdminRequired(this.addRandomizer.selector) {
        require(IRandomizer(_randomizerContract).isRandomizerContract() == true, "Contract is not Randomizer");
        collectionAdditionalData[_collectionID].randomizerContract = _randomizerContract;
        collectionAdditionalData[_collectionID].randomizer = IRandomizer(_randomizerContract);
    }

    // airdrop (function is called from minter contract)
    
    function airDropTokens(uint256 mintIndex, address _recipient, string memory _tokenData, uint256 _saltfun_o, uint256 _collectionID) external {
        require(msg.sender == minterContract, "Caller is not the Minter Contract");
        collectionAdditionalData[_collectionID].collectionCirculationSupply = collectionAdditionalData[_collectionID].collectionCirculationSupply + 1;
        if (collectionAdditionalData[_collectionID].collectionTotalSupply >= collectionAdditionalData[_collectionID].collectionCirculationSupply) {
            tokensAirdropPerAddress[_collectionID][_recipient] = tokensAirdropPerAddress[_collectionID][_recipient] + 1;
            _mintProcessing(mintIndex, _recipient, _tokenData, _collectionID, _saltfun_o);
        } else {
            revert("Supply reached");
        }
    }

    // mint (function is called from minter contract)

    function mint(uint256 mintIndex, address _mintingAddress , address _mintTo, string memory _tokenData, uint256 _saltfun_o, uint256 _collectionID, uint256 phase) external {
        require(msg.sender == minterContract, "Caller is not the Minter Contract");
        collectionAdditionalData[_collectionID].collectionCirculationSupply = collectionAdditionalData[_collectionID].collectionCirculationSupply + 1;
        if (collectionAdditionalData[_collectionID].collectionTotalSupply >= collectionAdditionalData[_collectionID].collectionCirculationSupply) {
            if (phase == 1) {
                tokensMintedAllowlistAddress[_collectionID][_mintingAddress] = tokensMintedAllowlistAddress[_collectionID][_mintingAddress] + 1;
            } else {
                tokensMintedPerAddress[_collectionID][_mintingAddress] = tokensMintedPerAddress[_collectionID][_mintingAddress] + 1;
            }
            _mintProcessing(mintIndex, _mintTo, _tokenData, _collectionID, _saltfun_o);
        } else {
            revert("Supply reached");
        }
    }

    // burn function

    function burn(uint256 _collectionID, uint256 _tokenId) public {
        require(_isApprovedOrOwner(_msgSender(), _tokenId), "ERC721: caller is not token owner or approved");
        require ((_tokenId >= collectionAdditionalData[_collectionID].reservedMinTokensIndex) && (_tokenId <= collectionAdditionalData[_collectionID].reservedMaxTokensIndex), "id err");
        _burn(_tokenId);
        burnAmount[_collectionID] = burnAmount[_collectionID] + 1;
    }

    // burn to mint (function is called from minter contract)

    function burnToMint(uint256 mintIndex, uint256 _burnCollectionID, uint256 _tokenId, uint256 _mintCollectionID, uint256 _saltfun_o, address burner) external {
        require(msg.sender == minterContract, "Caller is not the Minter Contract");
        require(_isApprovedOrOwner(burner, _tokenId), "ERC721: caller is not token owner or approved");
        collectionAdditionalData[_mintCollectionID].collectionCirculationSupply = collectionAdditionalData[_mintCollectionID].collectionCirculationSupply + 1;
        if (collectionAdditionalData[_mintCollectionID].collectionTotalSupply >= collectionAdditionalData[_mintCollectionID].collectionCirculationSupply) {
            address owner = ownerOf(_tokenId);
            _burn(_tokenId);
            burnAmount[_burnCollectionID] = burnAmount[_burnCollectionID] + 1;
            tokensMintedPerAddress[_mintCollectionID][owner] = tokensMintedPerAddress[_mintCollectionID][owner] + 1;
            _mintProcessing(mintIndex, owner, tokenData[_tokenId], _mintCollectionID, _saltfun_o);
        } else {
            revert("Supply reached");
        }
    }

    // mint processing

    function _mintProcessing(uint256 _mintIndex, address _recipient, string memory _tokenData, uint256 _collectionID, uint256 _saltfun_o) internal {
        tokenData[_mintIndex] = _tokenData;
        tokenIdsToCollectionIds[_mintIndex] = _collectionID;
        _safeMint(_recipient, _mintIndex);
        collectionAdditionalData[_collectionID].randomizer.calculateTokenHash(_collectionID, _mintIndex, _saltfun_o);
    }

    // Additional setter functions

    // function to update a collection's info

    function updateCollectionInfo(uint256 _collectionID, string memory _newCollectionName, string memory _newCollectionArtist, string memory _newCollectionDescription, string memory _newCollectionWebsite, string memory _newCollectionLicense, string memory _newCollectionBaseURI, string memory _newCollectionLibrary, bytes32 _newCollectionDependencyScript, uint256 _index, string[] memory _newCollectionScript) public CollectionAdminRequired(_collectionID, this.updateCollectionInfo.selector) {
        require((isCollectionCreated[_collectionID] == true) && (collectionFreeze[_collectionID] == false), "Not allowed");
         if (_index == 1000000) {
            collectionInfo[_collectionID].collectionName = _newCollectionName;
            collectionInfo[_collectionID].collectionArtist = _newCollectionArtist;
            collectionInfo[_collectionID].collectionDescription = _newCollectionDescription;
            collectionInfo[_collectionID].collectionWebsite = _newCollectionWebsite;
            collectionInfo[_collectionID].collectionLicense = _newCollectionLicense;
            collectionInfo[_collectionID].collectionLibrary = _newCollectionLibrary;
            collectionInfo[_collectionID].collectionDependencyScript = _newCollectionDependencyScript;
            collectionInfo[_collectionID].collectionScript = _newCollectionScript;
        } else if (_index == 999999) {
            collectionInfo[_collectionID].collectionBaseURI = _newCollectionBaseURI;
        } else {
            collectionInfo[_collectionID].collectionScript[_index] = _newCollectionScript[0];
        }
    }

    // function that is used by artists for signing

    function artistSignature(uint256 _collectionID, string memory _signature) public {
        require(msg.sender == collectionAdditionalData[_collectionID].collectionArtistAddress && artistSigned[_collectionID] == false, "Not artist/Signed");
        artistsSignatures[_collectionID] = _signature;
        artistSigned[_collectionID] = true;
    }

    // function to change the metadata view of a collection

    function changeMetadataView(uint256 _collectionID, bool _status) public CollectionAdminRequired(_collectionID, this.changeMetadataView.selector) { 
        require((isCollectionCreated[_collectionID] == true) && (collectionFreeze[_collectionID] == false), "Not allowed");
        onchainMetadata[_collectionID] = _status;
    }

    // function to change the token data of a token

    function changeTokenData(uint256 _tokenId, string memory newData) public FunctionAdminRequired(this.changeTokenData.selector) {
        require(collectionFreeze[tokenIdsToCollectionIds[_tokenId]] == false, "Data frozen");
        _requireMinted(_tokenId);
        tokenData[_tokenId] = newData;
    }

    // function to store onchain an imageURI and attributes for a token

    function updateImagesAndAttributes(uint256[] memory _tokenId, string[] memory _images, string[] memory _attributes) public FunctionAdminRequired(this.updateImagesAndAttributes.selector) {
        require((_tokenId.length == _images.length) && (_images.length == _attributes.length) , "inv len");
        for (uint256 x; x < _tokenId.length; x++) {
            require(collectionFreeze[tokenIdsToCollectionIds[_tokenId[x]]] == false, "Data frozen");
            _requireMinted(_tokenId[x]);
            tokenImageAndAttributes[_tokenId[x]][0] = _images[x];
            tokenImageAndAttributes[_tokenId[x]][1] = _attributes[x];
        }
    }

    // function to lock collection, this action connot be reverted

    function freezeCollection(uint256 _collectionID) public FunctionAdminRequired(this.freezeCollection.selector) {
        require(block.timestamp > IMinterContract(minterContract).getEndTime(_collectionID) && IMinterContract(minterContract).getEndTime(_collectionID) != 0 && wereDataAdded[_collectionID] == true);
        collectionFreeze[_collectionID] = true;
    }

    // function to set the tokenHash (this function is called only from randomizer contracts)

    function setTokenHash(uint256 _collectionID, uint256 _mintIndex, bytes32 _hash) external {
        require(msg.sender == collectionAdditionalData[_collectionID].randomizerContract);
        require(tokenToHash[_mintIndex] == 0x0000000000000000000000000000000000000000000000000000000000000000);
        tokenToHash[_mintIndex] = _hash;
    }

    // function to set final supply, this applies only for unminted collections and will adjust totalSupply = circulatingSupply

    function setFinalSupply(uint256 _collectionID) public FunctionAdminRequired(this.setFinalSupply.selector) {
        require (block.timestamp > IMinterContract(minterContract).getEndTime(_collectionID) + collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint, "Time has not passed");
        collectionAdditionalData[_collectionID].collectionTotalSupply = collectionAdditionalData[_collectionID].collectionCirculationSupply;
        collectionAdditionalData[_collectionID].reservedMaxTokensIndex = (_collectionID * 10000000000) + collectionAdditionalData[_collectionID].collectionTotalSupply - 1;
    }

    // function to update the admin, minter or dependency contract
    // 1. admin contract 2. minter contract 3. dependency registry contract

    function updateContracts(uint8 _opt, address _newContract) public FunctionAdminRequired(this.updateContracts.selector) {
        if (_opt == 1) {
            require(INextGenAdmins(_newContract).isAdminContract() == true, "Not Admin");
            adminsContract = INextGenAdmins(_newContract);
        } else if (_opt == 2) {
            require(IMinterContract(_newContract).isMinterContract() == true, "Not Minter");
            minterContract = _newContract;
        } else {
            dependencyRegistry = IDependencyRegistry(_newContract);
        }
    }

    // Retrieve Functions

    // function that overrides supportInterface

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC2981) returns (bool) { 
        return super.supportsInterface(interfaceId); 
    }

    // function that return the tokenURI

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);
        if (onchainMetadata[tokenIdsToCollectionIds[tokenId]] == false && tokenToHash[tokenId] != 0x0000000000000000000000000000000000000000000000000000000000000000) {
            string memory baseURI = collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionBaseURI;
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
        } else if (onchainMetadata[tokenIdsToCollectionIds[tokenId]] == false && tokenToHash[tokenId] == 0x0000000000000000000000000000000000000000000000000000000000000000) {
            string memory baseURI = collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionBaseURI;
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "pending")) : "";
        }
        else {
            string memory b64 = Base64.encode(abi.encodePacked("<html><head></head><body><script src=\"",collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionLibrary,"\"></script><script>",retrieveGenerativeScript(tokenId),"</script></body></html>"));
            string memory _uri = string(abi.encodePacked("data:application/json;utf8,{\"name\":\"",getTokenName(tokenId),"\",\"description\":\"",collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionDescription,"\",\"image\":\"",tokenImageAndAttributes[tokenId][0],"\",\"attributes\":[",tokenImageAndAttributes[tokenId][1],"],\"animation_url\":\"data:text/html;base64,",b64,"\"}"));
            return _uri;
        }
    }

    // function to retrieve the name attribute

    function getTokenName(uint256 tokenId) private view returns(string memory)  {
        uint256 tok = tokenId - collectionAdditionalData[tokenIdsToCollectionIds[tokenId]].reservedMinTokensIndex;
        return string(abi.encodePacked(collectionInfo[viewColIDforTokenID(tokenId)].collectionName, " #" ,tok.toString()));
    }

    // function to retrieve the collection freeze status
    function collectionFreezeStatus(uint256 _collectionID) public view returns(bool){
        return collectionFreeze[_collectionID];
    }

    // function to return the collection id given a token id
    function viewColIDforTokenID(uint256 _tokenid) public view returns (uint256) {
        return(tokenIdsToCollectionIds[_tokenid]);
    }

    // function to retrieve if data were added on a collection
    function retrievewereDataAdded(uint256 _collectionID) external view returns(bool){
        return wereDataAdded[_collectionID];
    }

    // function to return the min index id of a collection
    function viewTokensIndexMin(uint256 _collectionID) external view returns (uint256) {
        return(collectionAdditionalData[_collectionID].reservedMinTokensIndex);
    }

    // function to return the max index id of a collection
    function viewTokensIndexMax(uint256 _collectionID) external view returns (uint256) {
        return(collectionAdditionalData[_collectionID].reservedMaxTokensIndex);
    }

    // function to return the circ supply of a collection
    function viewCirSupply(uint256 _collectionID) external view returns (uint256) {
        return(collectionAdditionalData[_collectionID].collectionCirculationSupply);
    }

    // function to return max allowance per address during public sale
    function viewMaxAllowance(uint256 _collectionID) external view returns (uint256) {
        return(collectionAdditionalData[_collectionID].maxCollectionPurchases);
    }

    // function to return tokens minted per address during allowlist
    function retrieveTokensMintedALPerAddress(uint256 _collectionID, address _address) external view returns(uint256) {
        return (tokensMintedAllowlistAddress[_collectionID][_address]);
    }

    // function to return tokens minted per address during public
    function retrieveTokensMintedPublicPerAddress(uint256 _collectionID, address _address) external view returns(uint256) {
        return (tokensMintedPerAddress[_collectionID][_address]);
    }

    // function to retrieve the airdropped tokens per address 
    function retrieveTokensAirdroppedPerAddress(uint256 _collectionID, address _address) public view returns(uint256) {
        return (tokensAirdropPerAddress[_collectionID][_address]);
    }

    // function to return the artist's address
    function retrieveArtistAddress(uint256 _collectionID) external view returns(address) {
        return (collectionAdditionalData[_collectionID].collectionArtistAddress);
    }

    // function to retrieve a collection's info

    function retrieveCollectionInfo(uint256 _collectionID) public view returns(string memory, string memory, string memory, string memory, string memory, string memory){
        return (collectionInfo[_collectionID].collectionName, collectionInfo[_collectionID].collectionArtist, collectionInfo[_collectionID].collectionDescription, collectionInfo[_collectionID].collectionWebsite, collectionInfo[_collectionID].collectionLicense, collectionInfo[_collectionID].collectionBaseURI);
    }

    // function to retrieve the library and script of a collection

    function retrieveCollectionLibraryAndScript(uint256 _collectionID) public view returns(string memory, bytes32, string[] memory){
        return (collectionInfo[_collectionID].collectionLibrary, collectionInfo[_collectionID].collectionDependencyScript, collectionInfo[_collectionID].collectionScript);
    }

    // function to retrieve the additional data of a Collection

    function retrieveCollectionAdditionalData(uint256 _collectionID) public view returns(address, uint256, uint256, uint256, uint, address){
        return (collectionAdditionalData[_collectionID].collectionArtistAddress, collectionAdditionalData[_collectionID].maxCollectionPurchases, collectionAdditionalData[_collectionID].collectionCirculationSupply, collectionAdditionalData[_collectionID].collectionTotalSupply, collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint, collectionAdditionalData[_collectionID].randomizerContract);
    }

    // function to retrieve the token hash

    function retrieveTokenHash(uint256 _tokenid) public view returns(bytes32){
        return (tokenToHash[_tokenid]);
    }

    // function to retrieve the generative script of a token

    function retrieveGenerativeScript(uint256 tokenId) public view returns(string memory) {
        _requireMinted(tokenId);
        string memory scripttext;
        for (uint256 i=0; i < collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionScript.length; i++) {
            scripttext = string(abi.encodePacked(scripttext, collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionScript[i])); 
        }
        return string(abi.encodePacked("let hash='",Strings.toHexString(uint256(tokenToHash[tokenId]), 32),"';let tokenId=",tokenId.toString(),";let tokenData=[",tokenData[tokenId],"]",";let dependencyScript='",retrieveDependencyScript(tokenId),"';", scripttext));
    }

    // function to retrieve on-chain dependency script

    function retrieveDependencyScript(uint256 tokenId) private view returns(string memory) {
        string memory scripttext;
        for (uint256 i=0; i < dependencyRegistry.getDependencyScriptCount(collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionDependencyScript); i++) {
            scripttext = string(abi.encodePacked(scripttext, dependencyRegistry.getDependencyScript(collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionDependencyScript, i))); 
        }
        return string(abi.encodePacked(scripttext));
    }

    // function to retrieve the supply of a collection

    function totalSupplyOfCollection(uint256 _collectionID) public view returns (uint256) {
        return (collectionAdditionalData[_collectionID].collectionCirculationSupply - burnAmount[_collectionID]);
    }

    // function to retrieve the token image uri and the attributes stored on-chain for a token id.

    function retrievetokenImageAndAttributes(uint256 _tokenId) public view returns(string memory, string memory) {
        return (tokenImageAndAttributes[_tokenId][0],tokenImageAndAttributes[_tokenId][1]);
    }

}

File 1 of 22: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 22: Base64.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.19;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

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

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

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

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

pragma solidity ^0.8.0;

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

import "./IERC165.sol";

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 5 of 22: ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.19;

import "./IERC2981.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1).
     */
    error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator);

    /**
     * @dev The default royalty receiver is invalid.
     */
    error ERC2981InvalidDefaultRoyaltyReceiver(address receiver);

    /**
     * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1).
     */
    error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator);

    /**
     * @dev The royalty receiver for `tokenId` is invalid.
     */
    error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver);

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        uint256 denominator = _feeDenominator();
        if (feeNumerator > denominator) {
            // Royalty fee will exceed the sale price
            revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator);
        }
        if (receiver == address(0)) {
            revert ERC2981InvalidDefaultRoyaltyReceiver(address(0));
        }

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
        uint256 denominator = _feeDenominator();
        if (feeNumerator > denominator) {
            // Royalty fee will exceed the sale price
            revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator);
        }
        if (receiver == address(0)) {
            revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0));
        }

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 6 of 22: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */

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

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

File 7 of 22: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 8 of 22: IDependencyRegistry.sol
// SPDX-License-Identifier: LGPL-3.0-only

pragma solidity 0.8.19;

interface IDependencyRegistry {   

    function getDependencyScriptCount(bytes32 dependencyNameAndVersion ) external view returns (uint256);

    function getDependencyScript(bytes32 dependencyNameAndVersion, uint256 index) external view returns (string memory);

}

File 9 of 22: 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 10 of 22: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.19;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}

File 11 of 22: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */

import "./IERC165.sol";

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */

import "./IERC721.sol";

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 13 of 22: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */

import "./IERC721.sol";

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 14 of 22: 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);
}

File 15 of 22: IMinterContract.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface IMinterContract {

    // retrieve if the contract is minter contract
    function isMinterContract() external view returns (bool);

    // retrieve the public end time of a sale
    function getEndTime(uint256 _collectionID) external view returns (uint);

    // retrieve auction end time
    function getAuctionEndTime(uint256 _tokenId) external view returns (uint);

    // retrieve auction status
    function getAuctionStatus(uint256 _tokenId) external view  returns (bool);

    // retrieve primary addresses
    function retrievePrimaryAddressesAndPercentages(uint256 _collectionID) external view returns(address, address, address, uint256, uint256, uint256, bool);
    
    // retrieve secondary addresses
    function retrieveSecondaryAddressesAndPercentages(uint256 _collectionID) external view returns(address, address, address, uint256, uint256, uint256, bool);
}

File 16 of 22: INextGenAdmins.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface INextGenAdmins {

    // retrieve global admin
    function retrieveGlobalAdmin(address _address) external view returns(bool);

    // retrieve function admin
    function retrieveFunctionAdmin(address _address, bytes4 _selector) external view returns(bool);

    // retrieve collection admin
    function retrieveCollectionAdmin(address _address, uint256 _collectionID) external view returns(bool);

    // retrieve if the contract is admin contract
    function isAdminContract() external view returns (bool);

    // retrieve owner
    function owner() external view returns (address);

}

File 17 of 22: IRandomizer.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface IRandomizer {

    // function that calculates the random hash and returns it to the gencore contract
    function calculateTokenHash(uint256 _collectionID, uint256 _mintIndex, uint256 _saltfun_o) external;

    // get randomizer contract status
    function isRandomizerContract() external view returns (bool);
    
}

File 18 of 22: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 20 of 22: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

import "./Context.sol";

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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 21 of 22: SignedMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

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

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */

import "./Math.sol";
import "./SignedMath.sol";

library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

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

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

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

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"_adminsContract","type":"address"},{"internalType":"address","name":"_dependencyRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_randomizerContract","type":"address"}],"name":"addRandomizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"string","name":"_tokenData","type":"string"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"airDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"string","name":"_signature","type":"string"}],"name":"artistSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artistSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artistsSignatures","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"},{"internalType":"uint256","name":"_burnCollectionID","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_mintCollectionID","type":"uint256"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"address","name":"burner","type":"address"}],"name":"burnToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"changeMetadataView","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"newData","type":"string"}],"name":"changeTokenData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"collectionFreezeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_collectionName","type":"string"},{"internalType":"string","name":"_collectionArtist","type":"string"},{"internalType":"string","name":"_collectionDescription","type":"string"},{"internalType":"string","name":"_collectionWebsite","type":"string"},{"internalType":"string","name":"_collectionLicense","type":"string"},{"internalType":"string","name":"_collectionBaseURI","type":"string"},{"internalType":"string","name":"_collectionLibrary","type":"string"},{"internalType":"bytes32","name":"_collectionDependencyScript","type":"bytes32"},{"internalType":"string[]","name":"_collectionScript","type":"string[]"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"freezeCollection","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"},{"internalType":"address","name":"_mintingAddress","type":"address"},{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"string","name":"_tokenData","type":"string"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"phase","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newCollectionIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"onchainMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveArtistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionAdditionalData","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionInfo","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionLibraryAndScript","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"retrieveGenerativeScript","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenid","type":"uint256"}],"name":"retrieveTokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"retrieveTokensAirdroppedPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"retrieveTokensMintedALPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"retrieveTokensMintedPublicPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"retrievetokenImageAndAttributes","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrievewereDataAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_collectionArtistAddress","type":"address"},{"internalType":"uint256","name":"_maxCollectionPurchases","type":"uint256"},{"internalType":"uint256","name":"_collectionTotalSupply","type":"uint256"},{"internalType":"uint256","name":"_setFinalSupplyTimeAfterMint","type":"uint256"}],"name":"setCollectionData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"setFinalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_mintIndex","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"setTokenHash","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":"uint256","name":"","type":"uint256"}],"name":"tokenData","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"totalSupplyOfCollection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"string","name":"_newCollectionName","type":"string"},{"internalType":"string","name":"_newCollectionArtist","type":"string"},{"internalType":"string","name":"_newCollectionDescription","type":"string"},{"internalType":"string","name":"_newCollectionWebsite","type":"string"},{"internalType":"string","name":"_newCollectionLicense","type":"string"},{"internalType":"string","name":"_newCollectionBaseURI","type":"string"},{"internalType":"string","name":"_newCollectionLibrary","type":"string"},{"internalType":"bytes32","name":"_newCollectionDependencyScript","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"string[]","name":"_newCollectionScript","type":"string[]"}],"name":"updateCollectionInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_opt","type":"uint8"},{"internalType":"address","name":"_newContract","type":"address"}],"name":"updateContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"string[]","name":"_images","type":"string[]"},{"internalType":"string[]","name":"_attributes","type":"string[]"}],"name":"updateImagesAndAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewCirSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenid","type":"uint256"}],"name":"viewColIDforTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewMaxAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewTokensIndexMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewTokensIndexMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620064e0380380620064e08339810160408190526200003491620002c2565b83836000620000448382620003e0565b506001620000538282620003e0565b505050620000706200006a620000df60201b60201c565b620000e3565b601e80546001600160a01b038085166001600160a01b031992831617909255601f805492841692909116919091179055600d54620000b0906001620004ac565b600d55620000d573c8ed02afebd9acb14c33b5330c803feacaf013776102b262000135565b50505050620004d4565b3390565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382168110156200017a57604051636f483d0960e01b81526001600160601b0383166004820152602481018290526044015b60405180910390fd5b6001600160a01b038316620001a657604051635b6cc80560e11b81526000600482015260240162000171565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020857600080fd5b81516001600160401b0380821115620002255762000225620001e0565b604051601f8301601f19908116603f01168101908282118183101715620002505762000250620001e0565b816040528381526020925086838588010111156200026d57600080fd5b600091505b8382101562000291578582018301518183018401529082019062000272565b600093810190920192909252949350505050565b80516001600160a01b0381168114620002bd57600080fd5b919050565b60008060008060808587031215620002d957600080fd5b84516001600160401b0380821115620002f157600080fd5b620002ff88838901620001f6565b955060208701519150808211156200031657600080fd5b506200032587828801620001f6565b9350506200033660408601620002a5565b91506200034660608601620002a5565b905092959194509250565b600181811c908216806200036657607f821691505b6020821081036200038757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003db57600081815260208120601f850160051c81016020861015620003b65750805b601f850160051c820191505b81811015620003d757828155600101620003c2565b5050505b505050565b81516001600160401b03811115620003fc57620003fc620001e0565b62000414816200040d845462000351565b846200038d565b602080601f8311600181146200044c5760008415620004335750858301515b600019600386901b1c1916600185901b178555620003d7565b600085815260208120601f198616915b828110156200047d578886015182559484019460019091019084016200045c565b50858210156200049c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620004ce57634e487b7160e01b600052601160045260246000fd5b92915050565b615ffc80620004e46000396000f3fe608060405234801561001057600080fd5b506004361061032f5760003560e01c80638da5cb5b116101b4578063c87b56dd116100fa578063e943a2c71161009d578063e943a2c7146108c1578063e985e9c5146108f7578063e9b7a8601461090a578063f18332dd1461092d578063f2fde38b14610940578063f35c145214610953578063f6a85dd014610966578063fa92668a1461097957600080fd5b8063c87b56dd146107d4578063cb6d67e0146107e7578063d09502711461081d578063d3322d5314610842578063d374100014610855578063d3d5492814610878578063d9a03e381461089b578063e1fa8089146108ae57600080fd5b8063a22cb46511610162578063a22cb46514610716578063ad24102014610729578063af569fd41461073c578063b390c0ab1461075f578063b4b5b48f14610772578063b88d4fde14610785578063b990296814610798578063bcc405d0146107c157600080fd5b80638da5cb5b1461066b57806392f002331461067c578063945e549b1461068f57806394c14957146106b257806395d89b41146106e85780639a8490f3146106f05780639cac0f1f1461070357600080fd5b80634ab6897c116102795780636fa13531116102275780636fa13531146105c35780636fafdf83146105d657806370a08231146105f6578063715018a61461060957806373b40ae9146106115780637b5dbac51461062457806380f8c8ab1461063757806388c2dd081461065857600080fd5b80634ab6897c146104b35780634f6ccce7146104d35780635c91d74a146104e65780636352211e14610571578063663a3c00146105845780636799a46a1461058d5780636c6aab16146105a057600080fd5b806323b872dd116102e157806323b872dd146103ee5780632a55205a146104015780632ed330f7146104225780632f745c5914610445578063366b0ab21461045857806339143a1d1461046b5780633d2bed8d1461047e57806342842e0e146104a057600080fd5b806301ffc9a71461033457806306fdde031461035c578063074b553914610371578063081812fc14610394578063095ea7b3146103b457806318160ddd146103c95780631aab8d69146103db575b600080fd5b610347610342366004614b7d565b610999565b60405190151581526020015b60405180910390f35b6103646109aa565b6040516103539190614bea565b61034761037f366004614bfd565b60186020526000908152604090205460ff1681565b6103a76103a2366004614bfd565b610a3c565b6040516103539190614c16565b6103c76103c2366004614c41565b610a63565b005b6008545b604051908152602001610353565b6103c76103e9366004614c6b565b610b7d565b6103c76103fc366004614c97565b610d89565b61041461040f366004614cd3565b610dbb565b604051610353929190614cf5565b610347610430366004614bfd565b6000908152601c602052604090205460ff1690565b6103cd610453366004614c41565b610e67565b6103c7610466366004614bfd565b610efd565b6103c7610479366004614d0e565b61113e565b61049161048c366004614bfd565b611341565b60405161035393929190614d5f565b6103c76104ae366004614c97565b6114d2565b6103cd6104c1366004614bfd565b60009081526013602052604090205490565b6103cd6104e1366004614bfd565b6114ed565b6105356104f4366004614bfd565b6000908152600f60205260409020805460018201546002830154600384015460068501546007909501546001600160a01b0394851696939592949193911690565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c001610353565b6103a761057f366004614bfd565b611580565b6103cd600d5481565b6103c761059b366004614ea3565b6115b5565b6103cd6105ae366004614bfd565b6000908152600f602052604090206005015490565b6103646105d1366004614bfd565b61165f565b6103cd6105e4366004614bfd565b60176020526000908152604090205481565b6103cd610604366004614ee9565b61176f565b6103c76117f5565b6103c761061f366004614fb1565b611809565b6103c761063236600461511a565b611b61565b61064a610645366004614bfd565b611ec0565b604051610353929190615160565b6103c761066636600461518e565b611ffa565b600c546001600160a01b03166103a7565b6020546103a7906001600160a01b031681565b6103cd61069d366004614bfd565b6000908152600f602052604090206001015490565b6103cd6106c0366004614c6b565b60009182526016602090815260408084206001600160a01b0393909316845291905290205490565b6103646122cd565b6103c76106fe366004614ea3565b6122dc565b6103c76107113660046151c0565b612457565b6103c76107243660046151fa565b6124a9565b6103c7610737366004615231565b6124b8565b6103cd61074a366004614bfd565b6000908152600f602052604090206002015490565b6103c761076d366004614cd3565b612799565b610364610780366004614bfd565b61285e565b6103c761079336600461530d565b6128f8565b6103a76107a6366004614bfd565b6000908152600f60205260409020546001600160a01b031690565b6103c76107cf366004614bfd565b61292a565b6103646107e2366004614bfd565b612b6c565b6103cd6107f5366004614c6b565b60009182526015602090815260408084206001600160a01b0393909316845291905290205490565b61083061082b366004614bfd565b612e6b565b60405161035396959493929190615388565b6103c761085036600461540a565b6131fd565b610347610863366004614bfd565b60009081526011602052604090205460ff1690565b610347610886366004614bfd565b601d6020526000908152604090205460ff1681565b6103646108a9366004614bfd565b613324565b6103c76108bc36600461548c565b61333d565b6103cd6108cf366004614c6b565b60009182526014602090815260408084206001600160a01b0393909316845291905290205490565b6103476109053660046155d5565b6135c5565b6103cd610918366004614bfd565b6000908152600f602052604090206004015490565b6103cd61093b366004614bfd565b6135f3565b6103c761094e366004614ee9565b61361a565b6103c76109613660046155f1565b613693565b6103c7610974366004615659565b61375b565b6103cd610987366004614bfd565b60009081526012602052604090205490565b60006109a482613966565b92915050565b6060600080546109b99061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546109e59061567e565b8015610a325780601f10610a0757610100808354040283529160200191610a32565b820191906000526020600020905b815481529060010190602001808311610a1557829003601f168201915b5050505050905090565b6000610a478261398b565b506000908152600460205260409020546001600160a01b031690565b6000610a6e82611580565b9050806001600160a01b0316836001600160a01b031603610ae05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610afc5750610afc81336135c5565b610b6e5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610ad7565b610b7883836139b0565b505050565b601e5460405163feb2e23360e01b8152631aab8d6960e01b916001600160a01b03169063feb2e23390610bb690339085906004016156b8565b602060405180830381865afa158015610bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf791906156db565b151560011480610c795750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610c32903390600401614c16565b602060405180830381865afa158015610c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7391906156db565b15156001145b610c955760405162461bcd60e51b8152600401610ad7906156f8565b816001600160a01b0316634cf0c6976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf791906156db565b1515600114610d485760405162461bcd60e51b815260206004820152601a60248201527f436f6e7472616374206973206e6f742052616e646f6d697a65720000000000006044820152606401610ad7565b506000918252600f60205260409091206007810180546001600160a01b039093166001600160a01b0319938416811790915560089091018054909216179055565b610d94335b82613a1e565b610db05760405162461bcd60e51b8152600401610ad79061571d565b610b78838383613a7d565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e30575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610e4f906001600160601b031687615780565b610e599190615797565b915196919550909350505050565b6000610e728361176f565b8210610ed45760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ad7565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b601e5460405163feb2e23360e01b8152631b35855960e11b916001600160a01b03169063feb2e23390610f3690339085906004016156b8565b602060405180830381865afa158015610f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7791906156db565b151560011480610ff95750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610fb2903390600401614c16565b602060405180830381865afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff391906156db565b15156001145b6110155760405162461bcd60e51b8152600401610ad7906156f8565b6000828152600f60209081526040918290206006015490549151639067b67760e01b81526004810185905290916001600160a01b031690639067b67790602401602060405180830381865afa158015611072573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109691906157b9565b6110a091906157d2565b42116110e45760405162461bcd60e51b8152602060048201526013602482015272151a5b59481a185cc81b9bdd081c185cdcd959606a1b6044820152606401610ad7565b6000828152600f6020526040902060028101546003909101819055600190611111846402540be400615780565b61111b91906157d2565b61112591906157e5565b6000928352600f60205260409092206005019190915550565b6020546001600160a01b031633146111685760405162461bcd60e51b8152600401610ad7906157f8565b6111728185613a1e565b61118e5760405162461bcd60e51b8152600401610ad79061571d565b6000838152600f60205260409020600201546111ab9060016157d2565b6000848152600f602052604090206002810182905560030154106113005760006111d485611580565b90506111df85613bdc565b6000868152601760205260409020546111f99060016157d2565b600087815260176020908152604080832093909355868252601481528282206001600160a01b0385168352905220546112339060016157d2565b60008581526014602090815260408083206001600160a01b0386168452825280832093909355878252601a90522080546112fa9189918491906112759061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546112a19061567e565b80156112ee5780601f106112c3576101008083540402835291602001916112ee565b820191906000526020600020905b8154815290600101906020018083116112d157829003601f168201915b50505050508787613c6d565b50611339565b60405162461bcd60e51b815260206004820152600e60248201526d14dd5c1c1b1e481c995858da195960921b6044820152606401610ad7565b505050505050565b6000818152600e6020526040812060078101546006820180546060949385939160089091019083906113729061567e565b80601f016020809104026020016040519081016040528092919081815260200182805461139e9061567e565b80156113eb5780601f106113c0576101008083540402835291602001916113eb565b820191906000526020600020905b8154815290600101906020018083116113ce57829003601f168201915b5050505050925080805480602002602001604051908101604052809291908181526020016000905b828210156114bf5783829060005260206000200180546114329061567e565b80601f016020809104026020016040519081016040528092919081815260200182805461145e9061567e565b80156114ab5780601f10611480576101008083540402835291602001916114ab565b820191906000526020600020905b81548152906001019060200180831161148e57829003601f168201915b505050505081526020019060010190611413565b5050505090509250925092509193909250565b610b78838383604051806020016040528060008152506128f8565b60006114f860085490565b821061155b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ad7565b6008828154811061156e5761156e615839565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109a45760405162461bcd60e51b8152600401610ad79061584f565b6000828152600f60205260409020546001600160a01b0316331480156115ea57506000828152601d602052604090205460ff16155b61162a5760405162461bcd60e51b8152602060048201526011602482015270139bdd08185c9d1a5cdd0bd4da59db9959607a1b6044820152606401610ad7565b600082815260196020526040902061164282826158c7565b50506000908152601d60205260409020805460ff19166001179055565b606061166a8261398b565b606060005b6000848152601260209081526040808320548352600e909152902060080154811015611707576000848152601260209081526040808320548352600e90915290206008018054839190839081106116c8576116c8615839565b906000526020600020016040516020016116e39291906159f9565b604051602081830303815290604052915080806116ff90615a17565b91505061166f565b5060008381526013602090815260409091205461172391613d24565b61172c84613ebf565b6000858152601a6020526040902061174386613f51565b84604051602001611758959493929190615a30565b604051602081830303815290604052915050919050565b60006001600160a01b0382166117d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610ad7565b506001600160a01b031660009081526003602052604090205490565b6117fd6140d1565b611807600061412b565b565b601e54604051630cab15dd60e31b81528c916373b40ae960e01b916001600160a01b0390911690636558aee8906118469033908690600401614cf5565b602060405180830381865afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188791906156db565b15156001148061190b5750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e233906118c490339085906004016156b8565b602060405180830381865afa1580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190591906156db565b15156001145b806119885750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611941903390600401614c16565b602060405180830381865afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198291906156db565b15156001145b6119a45760405162461bcd60e51b8152600401610ad7906156f8565b60008d81526010602052604090205460ff16151560011480156119d6575060008d8152601c602052604090205460ff16155b6119f25760405162461bcd60e51b8152600401610ad7906156f8565b83620f424003611ad35760008d8152600e60205260409020611a148d826158c7565b5060008d8152600e60205260409020600101611a308c826158c7565b5060008d8152600e60205260409020600201611a4c8b826158c7565b5060008d8152600e60205260409020600301611a688a826158c7565b5060008d8152600e60205260409020600401611a8489826158c7565b5060008d8152600e60205260409020600601611aa087826158c7565b5060008d8152600e60209081526040909120600781018790558451611acd92600890920191860190614aaa565b50611b52565b83620f423f03611af85760008d8152600e60205260409020600501611acd88826158c7565b82600081518110611b0b57611b0b615839565b6020026020010151600e60008f81526020019081526020016000206008018581548110611b3a57611b3a615839565b906000526020600020019081611b5091906158c7565b505b50505050505050505050505050565b601e54604051630cab15dd60e31b81528691637b5dbac560e01b916001600160a01b0390911690636558aee890611b9e9033908690600401614cf5565b602060405180830381865afa158015611bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdf91906156db565b151560011480611c635750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390611c1c90339085906004016156b8565b602060405180830381865afa158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d91906156db565b15156001145b80611ce05750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611c99903390600401614c16565b602060405180830381865afa158015611cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cda91906156db565b15156001145b611cfc5760405162461bcd60e51b8152600401610ad7906156f8565b60008781526010602052604090205460ff1615156001148015611d2e57506000878152601c602052604090205460ff16155b8015611d3f57506402540be4008411155b611d795760405162461bcd60e51b815260206004820152600b60248201526a195c9c8bd99c99595e995960aa1b6044820152606401610ad7565b6000878152600f60205260408120600301549003611e48576000878152600f6020526040812080546001600160a01b0319166001600160a01b03891617815560018101879055600281019190915560038101859055600601839055611de3876402540be400615780565b6000888152600f6020526040902060040155600184611e07896402540be400615780565b611e1191906157d2565b611e1b91906157e5565b6000888152600f60209081526040808320600501939093556011905220805460ff19166001179055611eb7565b6000878152601d602052604081205460ff1615159003611e9b576000878152600f6020526040902080546001600160a01b0319166001600160a01b03881617815560018101869055600601839055611eb7565b6000878152600f60205260409020600181018690556006018390555b50505050505050565b6000818152601b602052604090208054606091829160018201908290611ee59061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f119061567e565b8015611f5e5780601f10611f3357610100808354040283529160200191611f5e565b820191906000526020600020905b815481529060010190602001808311611f4157829003601f168201915b50505050509150808054611f719061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9d9061567e565b8015611fea5780601f10611fbf57610100808354040283529160200191611fea565b820191906000526020600020905b815481529060010190602001808311611fcd57829003601f168201915b5050505050905091509150915091565b601e5460405163feb2e23360e01b81526311185ba160e31b916001600160a01b03169063feb2e2339061203390339085906004016156b8565b602060405180830381865afa158015612050573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207491906156db565b1515600114806120f65750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906120af903390600401614c16565b602060405180830381865afa1580156120cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f091906156db565b15156001145b6121125760405162461bcd60e51b8152600401610ad7906156f8565b8260ff166001036121de57816001600160a01b0316639068edac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561215b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217f91906156db565b15156001146121bc5760405162461bcd60e51b81526020600482015260096024820152682737ba1020b236b4b760b91b6044820152606401610ad7565b601e80546001600160a01b0384166001600160a01b0319909116179055505050565b8260ff166002036122ab57816001600160a01b031663fb9422ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224b91906156db565b15156001146122895760405162461bcd60e51b815260206004820152600a6024820152692737ba1026b4b73a32b960b11b6044820152606401610ad7565b602080546001600160a01b0384166001600160a01b0319909116179055505050565b601f80546001600160a01b0384166001600160a01b0319909116179055505050565b6060600180546109b99061567e565b601e5460405163feb2e23360e01b8152639a8490f360e01b916001600160a01b03169063feb2e2339061231590339085906004016156b8565b602060405180830381865afa158015612332573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235691906156db565b1515600114806123d85750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612391903390600401614c16565b602060405180830381865afa1580156123ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d291906156db565b15156001145b6123f45760405162461bcd60e51b8152600401610ad7906156f8565b6000838152601260209081526040808320548352601c90915290205460ff16156124305760405162461bcd60e51b8152600401610ad790615b1c565b6124398361398b565b6000838152601a6020526040902061245183826158c7565b50505050565b6000838152600f60205260409020600701546001600160a01b0316331461247d57600080fd5b6000828152601360205260409020541561249657600080fd5b6000918252601360205260409091205550565b6124b433838361417d565b5050565b601e5460405163feb2e23360e01b8152630569208160e51b916001600160a01b03169063feb2e233906124f190339085906004016156b8565b602060405180830381865afa15801561250e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253291906156db565b1515600114806125b45750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061256d903390600401614c16565b602060405180830381865afa15801561258a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ae91906156db565b15156001145b6125d05760405162461bcd60e51b8152600401610ad7906156f8565b825184511480156125e2575081518351145b6126185760405162461bcd60e51b815260206004820152600760248201526634b73b103632b760c91b6044820152606401610ad7565b60005b845181101561279257601c60006012600088858151811061263e5761263e615839565b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff16151560001515146126945760405162461bcd60e51b8152600401610ad790615b1c565b6126b68582815181106126a9576126a9615839565b602002602001015161398b565b8381815181106126c8576126c8615839565b6020026020010151601b60008784815181106126e6576126e6615839565b6020026020010151815260200190815260200160002060006002811061270e5761270e615839565b019061271a90826158c7565b5082818151811061272d5761272d615839565b6020026020010151601b600087848151811061274b5761274b615839565b6020026020010151815260200190815260200160002060016002811061277357612773615839565b019061277f90826158c7565b508061278a81615a17565b91505061261b565b5050505050565b6127a233610d8e565b6127be5760405162461bcd60e51b8152600401610ad79061571d565b6000828152600f602052604090206004015481108015906127f057506000828152600f60205260409020600501548111155b6128255760405162461bcd60e51b815260206004820152600660248201526534b21032b93960d11b6044820152606401610ad7565b61282e81613bdc565b6000828152601760205260409020546128489060016157d2565b6000928352601760205260409092209190915550565b601a60205260009081526040902080546128779061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546128a39061567e565b80156128f05780601f106128c5576101008083540402835291602001916128f0565b820191906000526020600020905b8154815290600101906020018083116128d357829003601f168201915b505050505081565b6129023383613a1e565b61291e5760405162461bcd60e51b8152600401610ad79061571d565b61245184848484614247565b601e5460405163feb2e23360e01b8152630bcc405d60e41b916001600160a01b03169063feb2e2339061296390339085906004016156b8565b602060405180830381865afa158015612980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a491906156db565b151560011480612a265750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906129df903390600401614c16565b602060405180830381865afa1580156129fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2091906156db565b15156001145b612a425760405162461bcd60e51b8152600401610ad7906156f8565b602054604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aaf91906157b9565b42118015612b285750602054604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2591906157b9565b15155b8015612b47575060008281526011602052604090205460ff1615156001145b612b5057600080fd5b506000908152601c60205260409020805460ff19166001179055565b6060612b778261398b565b6000828152601260209081526040808320548352601890915290205460ff16158015612bb0575060008281526013602052604090205415155b15612c9e576000828152601260209081526040808320548352600e90915281206005018054612bde9061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0a9061567e565b8015612c575780601f10612c2c57610100808354040283529160200191612c57565b820191906000526020600020905b815481529060010190602001808311612c3a57829003601f168201915b505050505090506000815111612c7c5760405180602001604052806000815250612c97565b80612c8684613ebf565b604051602001611758929190615b41565b9392505050565b6000828152601260209081526040808320548352601890915290205460ff16158015612cd65750600082815260136020526040902054155b15612db3576000828152601260209081526040808320548352600e90915281206005018054612d049061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612d309061567e565b8015612d7d5780601f10612d5257610100808354040283529160200191612d7d565b820191906000526020600020905b815481529060010190602001808311612d6057829003601f168201915b505050505090506000815111612da25760405180602001604052806000815250612c97565b806040516020016117589190615b70565b6000828152601260209081526040808320548352600e9091528120612e0390600601612dde8561165f565b604051602001612def929190615b9b565b60405160208183030381529060405261427a565b90506000612e10846143cc565b6000858152601260209081526040808320548352600e8252808320888452601b8352928190209051612e4e9493600201926001830191889101615c38565b60408051601f19818403018152919052949350505050565b919050565b6000818152600e60205260409020805460609182918291829182918291600182019060028301906003840190600485019060058601908690612eac9061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612ed89061567e565b8015612f255780601f10612efa57610100808354040283529160200191612f25565b820191906000526020600020905b815481529060010190602001808311612f0857829003601f168201915b50505050509550848054612f389061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612f649061567e565b8015612fb15780601f10612f8657610100808354040283529160200191612fb1565b820191906000526020600020905b815481529060010190602001808311612f9457829003601f168201915b50505050509450838054612fc49061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff09061567e565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b505050505093508280546130509061567e565b80601f016020809104026020016040519081016040528092919081815260200182805461307c9061567e565b80156130c95780601f1061309e576101008083540402835291602001916130c9565b820191906000526020600020905b8154815290600101906020018083116130ac57829003601f168201915b505050505092508180546130dc9061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546131089061567e565b80156131555780601f1061312a57610100808354040283529160200191613155565b820191906000526020600020905b81548152906001019060200180831161313857829003601f168201915b505050505091508080546131689061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546131949061567e565b80156131e15780601f106131b6576101008083540402835291602001916131e1565b820191906000526020600020905b8154815290600101906020018083116131c457829003601f168201915b5050505050905095509550955095509550955091939550919395565b6020546001600160a01b031633146132275760405162461bcd60e51b8152600401610ad7906157f8565b6000828152600f60205260409020600201546132449060016157d2565b6000838152600f6020526040902060028101829055600301541061130057806001036132c05760008281526015602090815260408083206001600160a01b038a1684529091529020546132989060016157d2565b60008381526015602090815260408083206001600160a01b038b168452909152902055613312565b60008281526014602090815260408083206001600160a01b038a1684529091529020546132ee9060016157d2565b60008381526014602090815260408083206001600160a01b038b1684529091529020555b61331f8786868587613c6d565b611eb7565b601960205260009081526040902080546128779061567e565b601e5460405163feb2e23360e01b815263e1fa808960e01b916001600160a01b03169063feb2e2339061337690339085906004016156b8565b602060405180830381865afa158015613393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b791906156db565b1515600114806134395750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906133f2903390600401614c16565b602060405180830381865afa15801561340f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343391906156db565b15156001145b6134555760405162461bcd60e51b8152600401610ad7906156f8565b600d546000908152600e602052604090206134708b826158c7565b50600d546000908152600e6020526040902060010161348f8a826158c7565b50600d546000908152600e602052604090206002016134ae89826158c7565b50600d546000908152600e602052604090206003016134cd88826158c7565b50600d546000908152600e602052604090206004016134ec87826158c7565b50600d546000908152600e6020526040902060050161350b86826158c7565b50600d546000908152600e6020526040902060060161352a85826158c7565b50600d80546000908152600e6020908152604080832060070187905592548252919020835161356192600890920191850190614aaa565b50600d8054600090815260106020526040808220805460ff19166001179055915491517f5baee347cce9899b119eb4f42984958a6e25dc5b505f4f1ab8f3837120cf241f9190a2600d546135b69060016157d2565b600d5550505050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600081815260176020908152604080832054600f9092528220600201546109a491906157e5565b6136226140d1565b6001600160a01b0381166136875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ad7565b6136908161412b565b50565b6020546001600160a01b031633146136bd5760405162461bcd60e51b8152600401610ad7906157f8565b6000818152600f60205260409020600201546136da9060016157d2565b6000828152600f602052604090206002810182905560030154106113005760008181526016602090815260408083206001600160a01b03881684529091529020546137269060016157d2565b60008281526016602090815260408083206001600160a01b03891684529091529020556137568585858486613c6d565b612792565b601e54604051630cab15dd60e31b81528391630f6a85dd60e41b916001600160a01b0390911690636558aee8906137989033908690600401614cf5565b602060405180830381865afa1580156137b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d991906156db565b15156001148061385d5750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e2339061381690339085906004016156b8565b602060405180830381865afa158015613833573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385791906156db565b15156001145b806138da5750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590613893903390600401614c16565b602060405180830381865afa1580156138b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d491906156db565b15156001145b6138f65760405162461bcd60e51b8152600401610ad7906156f8565b60008481526010602052604090205460ff161515600114801561392857506000848152601c602052604090205460ff16155b6139445760405162461bcd60e51b8152600401610ad7906156f8565b5050600091825260186020526040909120805460ff1916911515919091179055565b60006001600160e01b0319821663152a902d60e11b14806109a457506109a482614431565b61399481614456565b6136905760405162461bcd60e51b8152600401610ad79061584f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906139e582611580565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080613a2a83611580565b9050806001600160a01b0316846001600160a01b03161480613a515750613a5181856135c5565b80613a755750836001600160a01b0316613a6a84610a3c565b6001600160a01b0316145b949350505050565b826001600160a01b0316613a9082611580565b6001600160a01b031614613ab65760405162461bcd60e51b8152600401610ad790615d55565b6001600160a01b038216613b185760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ad7565b613b258383836001614473565b826001600160a01b0316613b3882611580565b6001600160a01b031614613b5e5760405162461bcd60e51b8152600401610ad790615d55565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080546000190190559087168086528386208054600101905586865260029094528285208054909216841790915590518493600080516020615fa783398151915291a4505050565b6000613be782611580565b9050613bf7816000846001614473565b613c0082611580565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038516808552600384528285208054600019019055878552600290935281842080549091169055519293508492600080516020615fa7833981519152908390a45050565b6000858152601a60205260409020613c8584826158c7565b506000858152601260205260409020829055613ca1848661459b565b6000828152600f60205260409081902060080154905163bf1b89d360e01b81526004810184905260248101879052604481018390526001600160a01b039091169063bf1b89d390606401600060405180830381600087803b158015613d0557600080fd5b505af1158015613d19573d6000803e3d6000fd5b505050505050505050565b60606000613d33836002615780565b613d3e9060026157d2565b6001600160401b03811115613d5557613d55614dd8565b6040519080825280601f01601f191660200182016040528015613d7f576020820181803683370190505b509050600360fc1b81600081518110613d9a57613d9a615839565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613dc957613dc9615839565b60200101906001600160f81b031916908160001a9053506000613ded846002615780565b613df89060016157d2565b90505b6001811115613e70576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613e2c57613e2c615839565b1a60f81b828281518110613e4257613e42615839565b60200101906001600160f81b031916908160001a90535060049490941c93613e6981615d9a565b9050613dfb565b508315612c975760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ad7565b60606000613ecc836145b5565b60010190506000816001600160401b03811115613eeb57613eeb614dd8565b6040519080825280601f01601f191660200182016040528015613f15576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613f1f57509392505050565b60608060005b601f546000858152601260209081526040808320548352600e90915290819020600701549051632b345e2f60e11b81526001600160a01b0390921691635668bc5e91613fa99160040190815260200190565b602060405180830381865afa158015613fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fea91906157b9565b8110156140bf57601f546000858152601260209081526040808320548352600e9091529081902060070154905163518cb3df60e01b815260048101919091526024810183905283916001600160a01b03169063518cb3df90604401600060405180830381865afa158015614062573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261408a9190810190615db1565b60405160200161409b929190615b41565b604051602081830303815290604052915080806140b790615a17565b915050613f57565b50806040516020016117589190615e1e565b600c546001600160a01b031633146118075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ad7565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036141da5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610ad7565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b614252848484613a7d565b61425e8484848461468d565b6124515760405162461bcd60e51b8152600401610ad790615e3a565b6060815160000361429957505060408051602081019091526000815290565b6000604051806060016040528060408152602001615f6760409139905060006003845160026142c891906157d2565b6142d29190615797565b6142dd906004615780565b6001600160401b038111156142f4576142f4614dd8565b6040519080825280601f01601f19166020018201604052801561431e576020820181803683370190505b509050600182016020820185865187015b8082101561438a576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061432f565b50506003865106600181146143a657600281146143b9576143c1565b603d6001830353603d60028303536143c1565b603d60018303535b509195945050505050565b6000818152601260209081526040808320548352600f909152812060040154606091906143f990846157e5565b6000848152601260209081526040808320548352600e909152902090915061442082613ebf565b604051602001611758929190615e8c565b60006001600160e01b0319821663780e9d6360e01b14806109a457506109a48261478e565b6000908152600260205260409020546001600160a01b0316151590565b60018111156144e25760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610ad7565b816001600160a01b03851661453e5761453981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614561565b836001600160a01b0316856001600160a01b0316146145615761456185826147de565b6001600160a01b038416614578576137568161487b565b846001600160a01b0316846001600160a01b03161461279257612792848261492a565b6124b482826040518060200160405280600081525061496e565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106145f45772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614620576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061463e57662386f26fc10000830492506010015b6305f5e1008310614656576305f5e100830492506008015b612710831061466a57612710830492506004015b6064831061467c576064830492506002015b600a83106109a45760010192915050565b60006001600160a01b0384163b1561478357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906146d1903390899088908890600401615ebf565b6020604051808303816000875af192505050801561470c575060408051601f3d908101601f1916820190925261470991810190615efc565b60015b614769573d80801561473a576040519150601f19603f3d011682016040523d82523d6000602084013e61473f565b606091505b5080516000036147615760405162461bcd60e51b8152600401610ad790615e3a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613a75565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b14806147bf57506001600160e01b03198216635b5e139f60e01b145b806109a457506301ffc9a760e01b6001600160e01b03198316146109a4565b600060016147eb8461176f565b6147f591906157e5565b600083815260076020526040902054909150808214614848576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061488d906001906157e5565b600083815260096020526040812054600880549394509092849081106148b5576148b5615839565b9060005260206000200154905080600883815481106148d6576148d6615839565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061490e5761490e615f19565b6001900381819060005260206000200160009055905550505050565b60006149358361176f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b61497883836149a1565b614985600084848461468d565b610b785760405162461bcd60e51b8152600401610ad790615e3a565b6001600160a01b0382166149f75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ad7565b614a0081614456565b15614a1d5760405162461bcd60e51b8152600401610ad790615f2f565b614a2b600083836001614473565b614a3481614456565b15614a515760405162461bcd60e51b8152600401610ad790615f2f565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020615fa7833981519152908290a45050565b828054828255906000526020600020908101928215614af0579160200282015b82811115614af05782518290614ae090826158c7565b5091602001919060010190614aca565b50614afc929150614b00565b5090565b80821115614afc576000614b148282614b1d565b50600101614b00565b508054614b299061567e565b6000825580601f10614b39575050565b601f01602090049060005260206000209081019061369091905b80821115614afc5760008155600101614b53565b6001600160e01b03198116811461369057600080fd5b600060208284031215614b8f57600080fd5b8135612c9781614b67565b60005b83811015614bb5578181015183820152602001614b9d565b50506000910152565b60008151808452614bd6816020860160208601614b9a565b601f01601f19169290920160200192915050565b602081526000612c976020830184614bbe565b600060208284031215614c0f57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114612e6657600080fd5b60008060408385031215614c5457600080fd5b614c5d83614c2a565b946020939093013593505050565b60008060408385031215614c7e57600080fd5b82359150614c8e60208401614c2a565b90509250929050565b600080600060608486031215614cac57600080fd5b614cb584614c2a565b9250614cc360208501614c2a565b9150604084013590509250925092565b60008060408385031215614ce657600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b60008060008060008060c08789031215614d2757600080fd5b8635955060208701359450604087013593506060870135925060808701359150614d5360a08801614c2a565b90509295509295509295565b606081526000614d726060830186614bbe565b6020858185015283820360408501528185518084528284019150828160051b85010183880160005b83811015614dc857601f19878403018552614db6838351614bbe565b94860194925090850190600101614d9a565b50909a9950505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614e1657614e16614dd8565b604052919050565b60006001600160401b03821115614e3757614e37614dd8565b50601f01601f191660200190565b6000614e58614e5384614e1e565b614dee565b9050828152838383011115614e6c57600080fd5b828260208301376000602084830101529392505050565b600082601f830112614e9457600080fd5b612c9783833560208501614e45565b60008060408385031215614eb657600080fd5b8235915060208301356001600160401b03811115614ed357600080fd5b614edf85828601614e83565b9150509250929050565b600060208284031215614efb57600080fd5b612c9782614c2a565b60006001600160401b03821115614f1d57614f1d614dd8565b5060051b60200190565b600082601f830112614f3857600080fd5b81356020614f48614e5383614f04565b82815260059290921b84018101918181019086841115614f6757600080fd5b8286015b84811015614fa65780356001600160401b03811115614f8a5760008081fd5b614f988986838b0101614e83565b845250918301918301614f6b565b509695505050505050565b60008060008060008060008060008060006101608c8e031215614fd357600080fd5b8b359a506001600160401b038060208e01351115614ff057600080fd5b6150008e60208f01358f01614e83565b9a508060408e0135111561501357600080fd5b6150238e60408f01358f01614e83565b99508060608e0135111561503657600080fd5b6150468e60608f01358f01614e83565b98508060808e0135111561505957600080fd5b6150698e60808f01358f01614e83565b97508060a08e0135111561507c57600080fd5b61508c8e60a08f01358f01614e83565b96508060c08e0135111561509f57600080fd5b6150af8e60c08f01358f01614e83565b95508060e08e013511156150c257600080fd5b6150d28e60e08f01358f01614e83565b94506101008d013593506101208d01359250806101408e013511156150f657600080fd5b506151088d6101408e01358e01614f27565b90509295989b509295989b9093969950565b600080600080600060a0868803121561513257600080fd5b8535945061514260208701614c2a565b94979496505050506040830135926060810135926080909101359150565b6040815260006151736040830185614bbe565b82810360208401526151858185614bbe565b95945050505050565b600080604083850312156151a157600080fd5b823560ff811681146151b257600080fd5b9150614c8e60208401614c2a565b6000806000606084860312156151d557600080fd5b505081359360208301359350604090920135919050565b801515811461369057600080fd5b6000806040838503121561520d57600080fd5b61521683614c2a565b91506020830135615226816151ec565b809150509250929050565b60008060006060848603121561524657600080fd5b83356001600160401b038082111561525d57600080fd5b818601915086601f83011261527157600080fd5b81356020615281614e5383614f04565b82815260059290921b8401810191818101908a8411156152a057600080fd5b948201945b838610156152be578535825294820194908201906152a5565b975050870135925050808211156152d457600080fd5b6152e087838801614f27565b935060408601359150808211156152f657600080fd5b5061530386828701614f27565b9150509250925092565b6000806000806080858703121561532357600080fd5b61532c85614c2a565b935061533a60208601614c2a565b92506040850135915060608501356001600160401b0381111561535c57600080fd5b8501601f8101871361536d57600080fd5b61537c87823560208401614e45565b91505092959194509250565b60c08152600061539b60c0830189614bbe565b82810360208401526153ad8189614bbe565b905082810360408401526153c18188614bbe565b905082810360608401526153d58187614bbe565b905082810360808401526153e98186614bbe565b905082810360a08401526153fd8185614bbe565b9998505050505050505050565b600080600080600080600060e0888a03121561542557600080fd5b8735965061543560208901614c2a565b955061544360408901614c2a565b945060608801356001600160401b0381111561545e57600080fd5b61546a8a828b01614e83565b979a969950949760808101359660a0820135965060c090910135945092505050565b60008060008060008060008060006101208a8c0312156154ab57600080fd5b89356001600160401b03808211156154c257600080fd5b6154ce8d838e01614e83565b9a5060208c01359150808211156154e457600080fd5b6154f08d838e01614e83565b995060408c013591508082111561550657600080fd5b6155128d838e01614e83565b985060608c013591508082111561552857600080fd5b6155348d838e01614e83565b975060808c013591508082111561554a57600080fd5b6155568d838e01614e83565b965060a08c013591508082111561556c57600080fd5b6155788d838e01614e83565b955060c08c013591508082111561558e57600080fd5b61559a8d838e01614e83565b945060e08c013593506101008c01359150808211156155b857600080fd5b506155c58c828d01614f27565b9150509295985092959850929598565b600080604083850312156155e857600080fd5b6151b283614c2a565b600080600080600060a0868803121561560957600080fd5b8535945061561960208701614c2a565b935060408601356001600160401b0381111561563457600080fd5b61564088828901614e83565b9598949750949560608101359550608001359392505050565b6000806040838503121561566c57600080fd5b823591506020830135615226816151ec565b600181811c9082168061569257607f821691505b6020821081036156b257634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b6000602082840312156156ed57600080fd5b8151612c97816151ec565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109a4576109a461576a565b6000826157b457634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156157cb57600080fd5b5051919050565b808201808211156109a4576109a461576a565b818103818111156109a4576109a461576a565b60208082526021908201527f43616c6c6572206973206e6f7420746865204d696e74657220436f6e747261636040820152601d60fa1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b601f821115610b7857600081815260208120601f850160051c810160208610156158a85750805b601f850160051c820191505b81811015611339578281556001016158b4565b81516001600160401b038111156158e0576158e0614dd8565b6158f4816158ee845461567e565b84615881565b602080601f83116001811461592957600084156159115750858301515b600019600386901b1c1916600185901b178555611339565b600085815260208120601f198616915b8281101561595857888601518255948401946001909101908401615939565b50858210156159765787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546159938161567e565b600182811680156159ab57600181146159c0576159ef565b60ff19841687528215158302870194506159ef565b8560005260208060002060005b858110156159e65781548a8201529084019082016159cd565b50505082870194505b5050505092915050565b60008351615a0b818460208801614b9a565b61518581840185615986565b600060018201615a2957615a2961576a565b5060010190565b696c657420686173683d2760b01b815260008651615a5581600a850160208b01614b9a565b6d273b6c657420746f6b656e49643d60901b600a918401918201528651615a83816018840160208b01614b9a565b6f3b6c657420746f6b656e446174613d5b60801b60189290910191820152615aae6028820187615986565b9050605d60f81b8152763b6c657420646570656e64656e63795363726970743d2760481b60018201528451615aea816018840160208901614b9a565b61273b60f01b601892909101918201528351615b0d81601a840160208801614b9a565b01601a01979650505050505050565b6020808252600b908201526a2230ba3090333937bd32b760a91b604082015260600190565b60008351615b53818460208801614b9a565b835190830190615b67818360208801614b9a565b01949350505050565b60008251615b82818460208701614b9a565b6670656e64696e6760c81b920191825250600701919050565b7f3c68746d6c3e3c686561643e3c2f686561643e3c626f64793e3c7363726970748152651039b9319e9160d11b60208201526000615bdc6026830185615986565b72111f1e17b9b1b934b83a1f1e39b1b934b83a1f60691b81528351615c08816013840160208801614b9a565b761e17b9b1b934b83a1f1e17b137b23c9f1e17b43a36b61f60491b60139290910191820152602a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81526332911d1160e11b602082015260008651615c7d816024850160208b01614b9a565b701116113232b9b1b934b83a34b7b7111d1160791b602491840191820152615ca86035820188615986565b6a11161134b6b0b3b2911d1160a91b81529050615cc8600b820187615986565b6f222c2261747472696275746573223a5b60801b81529050615ced6010820186615986565b90507f5d2c22616e696d6174696f6e5f75726c223a22646174613a746578742f68746d8152681b0ed8985cd94d8d0b60ba1b60208201528351615d37816029840160208801614b9a565b61227d60f01b60299290910191820152602b01979650505050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b600081615da957615da961576a565b506000190190565b600060208284031215615dc357600080fd5b81516001600160401b03811115615dd957600080fd5b8201601f81018413615dea57600080fd5b8051615df8614e5382614e1e565b818152856020838501011115615e0d57600080fd5b615185826020830160208601614b9a565b60008251615e30818460208701614b9a565b9190910192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000615e988285615986565b61202360f01b81528351615eb3816002840160208801614b9a565b01600201949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615ef290830184614bbe565b9695505050505050565b600060208284031215615f0e57600080fd5b8151612c9781614b67565b634e487b7160e01b600052603160045260246000fd5b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220553a932b4f55e5f0ac803f0e5f28fa7127d87f742b023076bf4446443e348b6464736f6c63430008130033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000026ad9c64930bf5e057cb895a183436b30ad140f80000000000000000000000003344ab24fb43d3f8330adf66e0c43f5f9490a5c1000000000000000000000000000000000000000000000000000000000000000c4e65787447656e2036353239000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054e45585447000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061032f5760003560e01c80638da5cb5b116101b4578063c87b56dd116100fa578063e943a2c71161009d578063e943a2c7146108c1578063e985e9c5146108f7578063e9b7a8601461090a578063f18332dd1461092d578063f2fde38b14610940578063f35c145214610953578063f6a85dd014610966578063fa92668a1461097957600080fd5b8063c87b56dd146107d4578063cb6d67e0146107e7578063d09502711461081d578063d3322d5314610842578063d374100014610855578063d3d5492814610878578063d9a03e381461089b578063e1fa8089146108ae57600080fd5b8063a22cb46511610162578063a22cb46514610716578063ad24102014610729578063af569fd41461073c578063b390c0ab1461075f578063b4b5b48f14610772578063b88d4fde14610785578063b990296814610798578063bcc405d0146107c157600080fd5b80638da5cb5b1461066b57806392f002331461067c578063945e549b1461068f57806394c14957146106b257806395d89b41146106e85780639a8490f3146106f05780639cac0f1f1461070357600080fd5b80634ab6897c116102795780636fa13531116102275780636fa13531146105c35780636fafdf83146105d657806370a08231146105f6578063715018a61461060957806373b40ae9146106115780637b5dbac51461062457806380f8c8ab1461063757806388c2dd081461065857600080fd5b80634ab6897c146104b35780634f6ccce7146104d35780635c91d74a146104e65780636352211e14610571578063663a3c00146105845780636799a46a1461058d5780636c6aab16146105a057600080fd5b806323b872dd116102e157806323b872dd146103ee5780632a55205a146104015780632ed330f7146104225780632f745c5914610445578063366b0ab21461045857806339143a1d1461046b5780633d2bed8d1461047e57806342842e0e146104a057600080fd5b806301ffc9a71461033457806306fdde031461035c578063074b553914610371578063081812fc14610394578063095ea7b3146103b457806318160ddd146103c95780631aab8d69146103db575b600080fd5b610347610342366004614b7d565b610999565b60405190151581526020015b60405180910390f35b6103646109aa565b6040516103539190614bea565b61034761037f366004614bfd565b60186020526000908152604090205460ff1681565b6103a76103a2366004614bfd565b610a3c565b6040516103539190614c16565b6103c76103c2366004614c41565b610a63565b005b6008545b604051908152602001610353565b6103c76103e9366004614c6b565b610b7d565b6103c76103fc366004614c97565b610d89565b61041461040f366004614cd3565b610dbb565b604051610353929190614cf5565b610347610430366004614bfd565b6000908152601c602052604090205460ff1690565b6103cd610453366004614c41565b610e67565b6103c7610466366004614bfd565b610efd565b6103c7610479366004614d0e565b61113e565b61049161048c366004614bfd565b611341565b60405161035393929190614d5f565b6103c76104ae366004614c97565b6114d2565b6103cd6104c1366004614bfd565b60009081526013602052604090205490565b6103cd6104e1366004614bfd565b6114ed565b6105356104f4366004614bfd565b6000908152600f60205260409020805460018201546002830154600384015460068501546007909501546001600160a01b0394851696939592949193911690565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c001610353565b6103a761057f366004614bfd565b611580565b6103cd600d5481565b6103c761059b366004614ea3565b6115b5565b6103cd6105ae366004614bfd565b6000908152600f602052604090206005015490565b6103646105d1366004614bfd565b61165f565b6103cd6105e4366004614bfd565b60176020526000908152604090205481565b6103cd610604366004614ee9565b61176f565b6103c76117f5565b6103c761061f366004614fb1565b611809565b6103c761063236600461511a565b611b61565b61064a610645366004614bfd565b611ec0565b604051610353929190615160565b6103c761066636600461518e565b611ffa565b600c546001600160a01b03166103a7565b6020546103a7906001600160a01b031681565b6103cd61069d366004614bfd565b6000908152600f602052604090206001015490565b6103cd6106c0366004614c6b565b60009182526016602090815260408084206001600160a01b0393909316845291905290205490565b6103646122cd565b6103c76106fe366004614ea3565b6122dc565b6103c76107113660046151c0565b612457565b6103c76107243660046151fa565b6124a9565b6103c7610737366004615231565b6124b8565b6103cd61074a366004614bfd565b6000908152600f602052604090206002015490565b6103c761076d366004614cd3565b612799565b610364610780366004614bfd565b61285e565b6103c761079336600461530d565b6128f8565b6103a76107a6366004614bfd565b6000908152600f60205260409020546001600160a01b031690565b6103c76107cf366004614bfd565b61292a565b6103646107e2366004614bfd565b612b6c565b6103cd6107f5366004614c6b565b60009182526015602090815260408084206001600160a01b0393909316845291905290205490565b61083061082b366004614bfd565b612e6b565b60405161035396959493929190615388565b6103c761085036600461540a565b6131fd565b610347610863366004614bfd565b60009081526011602052604090205460ff1690565b610347610886366004614bfd565b601d6020526000908152604090205460ff1681565b6103646108a9366004614bfd565b613324565b6103c76108bc36600461548c565b61333d565b6103cd6108cf366004614c6b565b60009182526014602090815260408084206001600160a01b0393909316845291905290205490565b6103476109053660046155d5565b6135c5565b6103cd610918366004614bfd565b6000908152600f602052604090206004015490565b6103cd61093b366004614bfd565b6135f3565b6103c761094e366004614ee9565b61361a565b6103c76109613660046155f1565b613693565b6103c7610974366004615659565b61375b565b6103cd610987366004614bfd565b60009081526012602052604090205490565b60006109a482613966565b92915050565b6060600080546109b99061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546109e59061567e565b8015610a325780601f10610a0757610100808354040283529160200191610a32565b820191906000526020600020905b815481529060010190602001808311610a1557829003601f168201915b5050505050905090565b6000610a478261398b565b506000908152600460205260409020546001600160a01b031690565b6000610a6e82611580565b9050806001600160a01b0316836001600160a01b031603610ae05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610afc5750610afc81336135c5565b610b6e5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610ad7565b610b7883836139b0565b505050565b601e5460405163feb2e23360e01b8152631aab8d6960e01b916001600160a01b03169063feb2e23390610bb690339085906004016156b8565b602060405180830381865afa158015610bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf791906156db565b151560011480610c795750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610c32903390600401614c16565b602060405180830381865afa158015610c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7391906156db565b15156001145b610c955760405162461bcd60e51b8152600401610ad7906156f8565b816001600160a01b0316634cf0c6976040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf791906156db565b1515600114610d485760405162461bcd60e51b815260206004820152601a60248201527f436f6e7472616374206973206e6f742052616e646f6d697a65720000000000006044820152606401610ad7565b506000918252600f60205260409091206007810180546001600160a01b039093166001600160a01b0319938416811790915560089091018054909216179055565b610d94335b82613a1e565b610db05760405162461bcd60e51b8152600401610ad79061571d565b610b78838383613a7d565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610e30575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610e4f906001600160601b031687615780565b610e599190615797565b915196919550909350505050565b6000610e728361176f565b8210610ed45760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ad7565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b601e5460405163feb2e23360e01b8152631b35855960e11b916001600160a01b03169063feb2e23390610f3690339085906004016156b8565b602060405180830381865afa158015610f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7791906156db565b151560011480610ff95750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610fb2903390600401614c16565b602060405180830381865afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff391906156db565b15156001145b6110155760405162461bcd60e51b8152600401610ad7906156f8565b6000828152600f60209081526040918290206006015490549151639067b67760e01b81526004810185905290916001600160a01b031690639067b67790602401602060405180830381865afa158015611072573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109691906157b9565b6110a091906157d2565b42116110e45760405162461bcd60e51b8152602060048201526013602482015272151a5b59481a185cc81b9bdd081c185cdcd959606a1b6044820152606401610ad7565b6000828152600f6020526040902060028101546003909101819055600190611111846402540be400615780565b61111b91906157d2565b61112591906157e5565b6000928352600f60205260409092206005019190915550565b6020546001600160a01b031633146111685760405162461bcd60e51b8152600401610ad7906157f8565b6111728185613a1e565b61118e5760405162461bcd60e51b8152600401610ad79061571d565b6000838152600f60205260409020600201546111ab9060016157d2565b6000848152600f602052604090206002810182905560030154106113005760006111d485611580565b90506111df85613bdc565b6000868152601760205260409020546111f99060016157d2565b600087815260176020908152604080832093909355868252601481528282206001600160a01b0385168352905220546112339060016157d2565b60008581526014602090815260408083206001600160a01b0386168452825280832093909355878252601a90522080546112fa9189918491906112759061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546112a19061567e565b80156112ee5780601f106112c3576101008083540402835291602001916112ee565b820191906000526020600020905b8154815290600101906020018083116112d157829003601f168201915b50505050508787613c6d565b50611339565b60405162461bcd60e51b815260206004820152600e60248201526d14dd5c1c1b1e481c995858da195960921b6044820152606401610ad7565b505050505050565b6000818152600e6020526040812060078101546006820180546060949385939160089091019083906113729061567e565b80601f016020809104026020016040519081016040528092919081815260200182805461139e9061567e565b80156113eb5780601f106113c0576101008083540402835291602001916113eb565b820191906000526020600020905b8154815290600101906020018083116113ce57829003601f168201915b5050505050925080805480602002602001604051908101604052809291908181526020016000905b828210156114bf5783829060005260206000200180546114329061567e565b80601f016020809104026020016040519081016040528092919081815260200182805461145e9061567e565b80156114ab5780601f10611480576101008083540402835291602001916114ab565b820191906000526020600020905b81548152906001019060200180831161148e57829003601f168201915b505050505081526020019060010190611413565b5050505090509250925092509193909250565b610b78838383604051806020016040528060008152506128f8565b60006114f860085490565b821061155b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ad7565b6008828154811061156e5761156e615839565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109a45760405162461bcd60e51b8152600401610ad79061584f565b6000828152600f60205260409020546001600160a01b0316331480156115ea57506000828152601d602052604090205460ff16155b61162a5760405162461bcd60e51b8152602060048201526011602482015270139bdd08185c9d1a5cdd0bd4da59db9959607a1b6044820152606401610ad7565b600082815260196020526040902061164282826158c7565b50506000908152601d60205260409020805460ff19166001179055565b606061166a8261398b565b606060005b6000848152601260209081526040808320548352600e909152902060080154811015611707576000848152601260209081526040808320548352600e90915290206008018054839190839081106116c8576116c8615839565b906000526020600020016040516020016116e39291906159f9565b604051602081830303815290604052915080806116ff90615a17565b91505061166f565b5060008381526013602090815260409091205461172391613d24565b61172c84613ebf565b6000858152601a6020526040902061174386613f51565b84604051602001611758959493929190615a30565b604051602081830303815290604052915050919050565b60006001600160a01b0382166117d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610ad7565b506001600160a01b031660009081526003602052604090205490565b6117fd6140d1565b611807600061412b565b565b601e54604051630cab15dd60e31b81528c916373b40ae960e01b916001600160a01b0390911690636558aee8906118469033908690600401614cf5565b602060405180830381865afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188791906156db565b15156001148061190b5750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e233906118c490339085906004016156b8565b602060405180830381865afa1580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190591906156db565b15156001145b806119885750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611941903390600401614c16565b602060405180830381865afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198291906156db565b15156001145b6119a45760405162461bcd60e51b8152600401610ad7906156f8565b60008d81526010602052604090205460ff16151560011480156119d6575060008d8152601c602052604090205460ff16155b6119f25760405162461bcd60e51b8152600401610ad7906156f8565b83620f424003611ad35760008d8152600e60205260409020611a148d826158c7565b5060008d8152600e60205260409020600101611a308c826158c7565b5060008d8152600e60205260409020600201611a4c8b826158c7565b5060008d8152600e60205260409020600301611a688a826158c7565b5060008d8152600e60205260409020600401611a8489826158c7565b5060008d8152600e60205260409020600601611aa087826158c7565b5060008d8152600e60209081526040909120600781018790558451611acd92600890920191860190614aaa565b50611b52565b83620f423f03611af85760008d8152600e60205260409020600501611acd88826158c7565b82600081518110611b0b57611b0b615839565b6020026020010151600e60008f81526020019081526020016000206008018581548110611b3a57611b3a615839565b906000526020600020019081611b5091906158c7565b505b50505050505050505050505050565b601e54604051630cab15dd60e31b81528691637b5dbac560e01b916001600160a01b0390911690636558aee890611b9e9033908690600401614cf5565b602060405180830381865afa158015611bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdf91906156db565b151560011480611c635750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390611c1c90339085906004016156b8565b602060405180830381865afa158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d91906156db565b15156001145b80611ce05750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611c99903390600401614c16565b602060405180830381865afa158015611cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cda91906156db565b15156001145b611cfc5760405162461bcd60e51b8152600401610ad7906156f8565b60008781526010602052604090205460ff1615156001148015611d2e57506000878152601c602052604090205460ff16155b8015611d3f57506402540be4008411155b611d795760405162461bcd60e51b815260206004820152600b60248201526a195c9c8bd99c99595e995960aa1b6044820152606401610ad7565b6000878152600f60205260408120600301549003611e48576000878152600f6020526040812080546001600160a01b0319166001600160a01b03891617815560018101879055600281019190915560038101859055600601839055611de3876402540be400615780565b6000888152600f6020526040902060040155600184611e07896402540be400615780565b611e1191906157d2565b611e1b91906157e5565b6000888152600f60209081526040808320600501939093556011905220805460ff19166001179055611eb7565b6000878152601d602052604081205460ff1615159003611e9b576000878152600f6020526040902080546001600160a01b0319166001600160a01b03881617815560018101869055600601839055611eb7565b6000878152600f60205260409020600181018690556006018390555b50505050505050565b6000818152601b602052604090208054606091829160018201908290611ee59061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f119061567e565b8015611f5e5780601f10611f3357610100808354040283529160200191611f5e565b820191906000526020600020905b815481529060010190602001808311611f4157829003601f168201915b50505050509150808054611f719061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9d9061567e565b8015611fea5780601f10611fbf57610100808354040283529160200191611fea565b820191906000526020600020905b815481529060010190602001808311611fcd57829003601f168201915b5050505050905091509150915091565b601e5460405163feb2e23360e01b81526311185ba160e31b916001600160a01b03169063feb2e2339061203390339085906004016156b8565b602060405180830381865afa158015612050573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207491906156db565b1515600114806120f65750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906120af903390600401614c16565b602060405180830381865afa1580156120cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f091906156db565b15156001145b6121125760405162461bcd60e51b8152600401610ad7906156f8565b8260ff166001036121de57816001600160a01b0316639068edac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561215b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217f91906156db565b15156001146121bc5760405162461bcd60e51b81526020600482015260096024820152682737ba1020b236b4b760b91b6044820152606401610ad7565b601e80546001600160a01b0384166001600160a01b0319909116179055505050565b8260ff166002036122ab57816001600160a01b031663fb9422ff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224b91906156db565b15156001146122895760405162461bcd60e51b815260206004820152600a6024820152692737ba1026b4b73a32b960b11b6044820152606401610ad7565b602080546001600160a01b0384166001600160a01b0319909116179055505050565b601f80546001600160a01b0384166001600160a01b0319909116179055505050565b6060600180546109b99061567e565b601e5460405163feb2e23360e01b8152639a8490f360e01b916001600160a01b03169063feb2e2339061231590339085906004016156b8565b602060405180830381865afa158015612332573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235691906156db565b1515600114806123d85750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612391903390600401614c16565b602060405180830381865afa1580156123ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d291906156db565b15156001145b6123f45760405162461bcd60e51b8152600401610ad7906156f8565b6000838152601260209081526040808320548352601c90915290205460ff16156124305760405162461bcd60e51b8152600401610ad790615b1c565b6124398361398b565b6000838152601a6020526040902061245183826158c7565b50505050565b6000838152600f60205260409020600701546001600160a01b0316331461247d57600080fd5b6000828152601360205260409020541561249657600080fd5b6000918252601360205260409091205550565b6124b433838361417d565b5050565b601e5460405163feb2e23360e01b8152630569208160e51b916001600160a01b03169063feb2e233906124f190339085906004016156b8565b602060405180830381865afa15801561250e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253291906156db565b1515600114806125b45750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061256d903390600401614c16565b602060405180830381865afa15801561258a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ae91906156db565b15156001145b6125d05760405162461bcd60e51b8152600401610ad7906156f8565b825184511480156125e2575081518351145b6126185760405162461bcd60e51b815260206004820152600760248201526634b73b103632b760c91b6044820152606401610ad7565b60005b845181101561279257601c60006012600088858151811061263e5761263e615839565b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff16151560001515146126945760405162461bcd60e51b8152600401610ad790615b1c565b6126b68582815181106126a9576126a9615839565b602002602001015161398b565b8381815181106126c8576126c8615839565b6020026020010151601b60008784815181106126e6576126e6615839565b6020026020010151815260200190815260200160002060006002811061270e5761270e615839565b019061271a90826158c7565b5082818151811061272d5761272d615839565b6020026020010151601b600087848151811061274b5761274b615839565b6020026020010151815260200190815260200160002060016002811061277357612773615839565b019061277f90826158c7565b508061278a81615a17565b91505061261b565b5050505050565b6127a233610d8e565b6127be5760405162461bcd60e51b8152600401610ad79061571d565b6000828152600f602052604090206004015481108015906127f057506000828152600f60205260409020600501548111155b6128255760405162461bcd60e51b815260206004820152600660248201526534b21032b93960d11b6044820152606401610ad7565b61282e81613bdc565b6000828152601760205260409020546128489060016157d2565b6000928352601760205260409092209190915550565b601a60205260009081526040902080546128779061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546128a39061567e565b80156128f05780601f106128c5576101008083540402835291602001916128f0565b820191906000526020600020905b8154815290600101906020018083116128d357829003601f168201915b505050505081565b6129023383613a1e565b61291e5760405162461bcd60e51b8152600401610ad79061571d565b61245184848484614247565b601e5460405163feb2e23360e01b8152630bcc405d60e41b916001600160a01b03169063feb2e2339061296390339085906004016156b8565b602060405180830381865afa158015612980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a491906156db565b151560011480612a265750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906129df903390600401614c16565b602060405180830381865afa1580156129fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2091906156db565b15156001145b612a425760405162461bcd60e51b8152600401610ad7906156f8565b602054604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aaf91906157b9565b42118015612b285750602054604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2591906157b9565b15155b8015612b47575060008281526011602052604090205460ff1615156001145b612b5057600080fd5b506000908152601c60205260409020805460ff19166001179055565b6060612b778261398b565b6000828152601260209081526040808320548352601890915290205460ff16158015612bb0575060008281526013602052604090205415155b15612c9e576000828152601260209081526040808320548352600e90915281206005018054612bde9061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0a9061567e565b8015612c575780601f10612c2c57610100808354040283529160200191612c57565b820191906000526020600020905b815481529060010190602001808311612c3a57829003601f168201915b505050505090506000815111612c7c5760405180602001604052806000815250612c97565b80612c8684613ebf565b604051602001611758929190615b41565b9392505050565b6000828152601260209081526040808320548352601890915290205460ff16158015612cd65750600082815260136020526040902054155b15612db3576000828152601260209081526040808320548352600e90915281206005018054612d049061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612d309061567e565b8015612d7d5780601f10612d5257610100808354040283529160200191612d7d565b820191906000526020600020905b815481529060010190602001808311612d6057829003601f168201915b505050505090506000815111612da25760405180602001604052806000815250612c97565b806040516020016117589190615b70565b6000828152601260209081526040808320548352600e9091528120612e0390600601612dde8561165f565b604051602001612def929190615b9b565b60405160208183030381529060405261427a565b90506000612e10846143cc565b6000858152601260209081526040808320548352600e8252808320888452601b8352928190209051612e4e9493600201926001830191889101615c38565b60408051601f19818403018152919052949350505050565b919050565b6000818152600e60205260409020805460609182918291829182918291600182019060028301906003840190600485019060058601908690612eac9061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612ed89061567e565b8015612f255780601f10612efa57610100808354040283529160200191612f25565b820191906000526020600020905b815481529060010190602001808311612f0857829003601f168201915b50505050509550848054612f389061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612f649061567e565b8015612fb15780601f10612f8657610100808354040283529160200191612fb1565b820191906000526020600020905b815481529060010190602001808311612f9457829003601f168201915b50505050509450838054612fc49061567e565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff09061567e565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b505050505093508280546130509061567e565b80601f016020809104026020016040519081016040528092919081815260200182805461307c9061567e565b80156130c95780601f1061309e576101008083540402835291602001916130c9565b820191906000526020600020905b8154815290600101906020018083116130ac57829003601f168201915b505050505092508180546130dc9061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546131089061567e565b80156131555780601f1061312a57610100808354040283529160200191613155565b820191906000526020600020905b81548152906001019060200180831161313857829003601f168201915b505050505091508080546131689061567e565b80601f01602080910402602001604051908101604052809291908181526020018280546131949061567e565b80156131e15780601f106131b6576101008083540402835291602001916131e1565b820191906000526020600020905b8154815290600101906020018083116131c457829003601f168201915b5050505050905095509550955095509550955091939550919395565b6020546001600160a01b031633146132275760405162461bcd60e51b8152600401610ad7906157f8565b6000828152600f60205260409020600201546132449060016157d2565b6000838152600f6020526040902060028101829055600301541061130057806001036132c05760008281526015602090815260408083206001600160a01b038a1684529091529020546132989060016157d2565b60008381526015602090815260408083206001600160a01b038b168452909152902055613312565b60008281526014602090815260408083206001600160a01b038a1684529091529020546132ee9060016157d2565b60008381526014602090815260408083206001600160a01b038b1684529091529020555b61331f8786868587613c6d565b611eb7565b601960205260009081526040902080546128779061567e565b601e5460405163feb2e23360e01b815263e1fa808960e01b916001600160a01b03169063feb2e2339061337690339085906004016156b8565b602060405180830381865afa158015613393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b791906156db565b1515600114806134395750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906133f2903390600401614c16565b602060405180830381865afa15801561340f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343391906156db565b15156001145b6134555760405162461bcd60e51b8152600401610ad7906156f8565b600d546000908152600e602052604090206134708b826158c7565b50600d546000908152600e6020526040902060010161348f8a826158c7565b50600d546000908152600e602052604090206002016134ae89826158c7565b50600d546000908152600e602052604090206003016134cd88826158c7565b50600d546000908152600e602052604090206004016134ec87826158c7565b50600d546000908152600e6020526040902060050161350b86826158c7565b50600d546000908152600e6020526040902060060161352a85826158c7565b50600d80546000908152600e6020908152604080832060070187905592548252919020835161356192600890920191850190614aaa565b50600d8054600090815260106020526040808220805460ff19166001179055915491517f5baee347cce9899b119eb4f42984958a6e25dc5b505f4f1ab8f3837120cf241f9190a2600d546135b69060016157d2565b600d5550505050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600081815260176020908152604080832054600f9092528220600201546109a491906157e5565b6136226140d1565b6001600160a01b0381166136875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ad7565b6136908161412b565b50565b6020546001600160a01b031633146136bd5760405162461bcd60e51b8152600401610ad7906157f8565b6000818152600f60205260409020600201546136da9060016157d2565b6000828152600f602052604090206002810182905560030154106113005760008181526016602090815260408083206001600160a01b03881684529091529020546137269060016157d2565b60008281526016602090815260408083206001600160a01b03891684529091529020556137568585858486613c6d565b612792565b601e54604051630cab15dd60e31b81528391630f6a85dd60e41b916001600160a01b0390911690636558aee8906137989033908690600401614cf5565b602060405180830381865afa1580156137b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d991906156db565b15156001148061385d5750601e5460405163feb2e23360e01b81526001600160a01b039091169063feb2e2339061381690339085906004016156b8565b602060405180830381865afa158015613833573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385791906156db565b15156001145b806138da5750601e5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590613893903390600401614c16565b602060405180830381865afa1580156138b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d491906156db565b15156001145b6138f65760405162461bcd60e51b8152600401610ad7906156f8565b60008481526010602052604090205460ff161515600114801561392857506000848152601c602052604090205460ff16155b6139445760405162461bcd60e51b8152600401610ad7906156f8565b5050600091825260186020526040909120805460ff1916911515919091179055565b60006001600160e01b0319821663152a902d60e11b14806109a457506109a482614431565b61399481614456565b6136905760405162461bcd60e51b8152600401610ad79061584f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906139e582611580565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080613a2a83611580565b9050806001600160a01b0316846001600160a01b03161480613a515750613a5181856135c5565b80613a755750836001600160a01b0316613a6a84610a3c565b6001600160a01b0316145b949350505050565b826001600160a01b0316613a9082611580565b6001600160a01b031614613ab65760405162461bcd60e51b8152600401610ad790615d55565b6001600160a01b038216613b185760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ad7565b613b258383836001614473565b826001600160a01b0316613b3882611580565b6001600160a01b031614613b5e5760405162461bcd60e51b8152600401610ad790615d55565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080546000190190559087168086528386208054600101905586865260029094528285208054909216841790915590518493600080516020615fa783398151915291a4505050565b6000613be782611580565b9050613bf7816000846001614473565b613c0082611580565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038516808552600384528285208054600019019055878552600290935281842080549091169055519293508492600080516020615fa7833981519152908390a45050565b6000858152601a60205260409020613c8584826158c7565b506000858152601260205260409020829055613ca1848661459b565b6000828152600f60205260409081902060080154905163bf1b89d360e01b81526004810184905260248101879052604481018390526001600160a01b039091169063bf1b89d390606401600060405180830381600087803b158015613d0557600080fd5b505af1158015613d19573d6000803e3d6000fd5b505050505050505050565b60606000613d33836002615780565b613d3e9060026157d2565b6001600160401b03811115613d5557613d55614dd8565b6040519080825280601f01601f191660200182016040528015613d7f576020820181803683370190505b509050600360fc1b81600081518110613d9a57613d9a615839565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613dc957613dc9615839565b60200101906001600160f81b031916908160001a9053506000613ded846002615780565b613df89060016157d2565b90505b6001811115613e70576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613e2c57613e2c615839565b1a60f81b828281518110613e4257613e42615839565b60200101906001600160f81b031916908160001a90535060049490941c93613e6981615d9a565b9050613dfb565b508315612c975760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ad7565b60606000613ecc836145b5565b60010190506000816001600160401b03811115613eeb57613eeb614dd8565b6040519080825280601f01601f191660200182016040528015613f15576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613f1f57509392505050565b60608060005b601f546000858152601260209081526040808320548352600e90915290819020600701549051632b345e2f60e11b81526001600160a01b0390921691635668bc5e91613fa99160040190815260200190565b602060405180830381865afa158015613fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fea91906157b9565b8110156140bf57601f546000858152601260209081526040808320548352600e9091529081902060070154905163518cb3df60e01b815260048101919091526024810183905283916001600160a01b03169063518cb3df90604401600060405180830381865afa158015614062573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261408a9190810190615db1565b60405160200161409b929190615b41565b604051602081830303815290604052915080806140b790615a17565b915050613f57565b50806040516020016117589190615e1e565b600c546001600160a01b031633146118075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ad7565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036141da5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610ad7565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b614252848484613a7d565b61425e8484848461468d565b6124515760405162461bcd60e51b8152600401610ad790615e3a565b6060815160000361429957505060408051602081019091526000815290565b6000604051806060016040528060408152602001615f6760409139905060006003845160026142c891906157d2565b6142d29190615797565b6142dd906004615780565b6001600160401b038111156142f4576142f4614dd8565b6040519080825280601f01601f19166020018201604052801561431e576020820181803683370190505b509050600182016020820185865187015b8082101561438a576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061432f565b50506003865106600181146143a657600281146143b9576143c1565b603d6001830353603d60028303536143c1565b603d60018303535b509195945050505050565b6000818152601260209081526040808320548352600f909152812060040154606091906143f990846157e5565b6000848152601260209081526040808320548352600e909152902090915061442082613ebf565b604051602001611758929190615e8c565b60006001600160e01b0319821663780e9d6360e01b14806109a457506109a48261478e565b6000908152600260205260409020546001600160a01b0316151590565b60018111156144e25760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610ad7565b816001600160a01b03851661453e5761453981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614561565b836001600160a01b0316856001600160a01b0316146145615761456185826147de565b6001600160a01b038416614578576137568161487b565b846001600160a01b0316846001600160a01b03161461279257612792848261492a565b6124b482826040518060200160405280600081525061496e565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106145f45772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614620576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061463e57662386f26fc10000830492506010015b6305f5e1008310614656576305f5e100830492506008015b612710831061466a57612710830492506004015b6064831061467c576064830492506002015b600a83106109a45760010192915050565b60006001600160a01b0384163b1561478357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906146d1903390899088908890600401615ebf565b6020604051808303816000875af192505050801561470c575060408051601f3d908101601f1916820190925261470991810190615efc565b60015b614769573d80801561473a576040519150601f19603f3d011682016040523d82523d6000602084013e61473f565b606091505b5080516000036147615760405162461bcd60e51b8152600401610ad790615e3a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613a75565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b14806147bf57506001600160e01b03198216635b5e139f60e01b145b806109a457506301ffc9a760e01b6001600160e01b03198316146109a4565b600060016147eb8461176f565b6147f591906157e5565b600083815260076020526040902054909150808214614848576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061488d906001906157e5565b600083815260096020526040812054600880549394509092849081106148b5576148b5615839565b9060005260206000200154905080600883815481106148d6576148d6615839565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061490e5761490e615f19565b6001900381819060005260206000200160009055905550505050565b60006149358361176f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b61497883836149a1565b614985600084848461468d565b610b785760405162461bcd60e51b8152600401610ad790615e3a565b6001600160a01b0382166149f75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ad7565b614a0081614456565b15614a1d5760405162461bcd60e51b8152600401610ad790615f2f565b614a2b600083836001614473565b614a3481614456565b15614a515760405162461bcd60e51b8152600401610ad790615f2f565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020615fa7833981519152908290a45050565b828054828255906000526020600020908101928215614af0579160200282015b82811115614af05782518290614ae090826158c7565b5091602001919060010190614aca565b50614afc929150614b00565b5090565b80821115614afc576000614b148282614b1d565b50600101614b00565b508054614b299061567e565b6000825580601f10614b39575050565b601f01602090049060005260206000209081019061369091905b80821115614afc5760008155600101614b53565b6001600160e01b03198116811461369057600080fd5b600060208284031215614b8f57600080fd5b8135612c9781614b67565b60005b83811015614bb5578181015183820152602001614b9d565b50506000910152565b60008151808452614bd6816020860160208601614b9a565b601f01601f19169290920160200192915050565b602081526000612c976020830184614bbe565b600060208284031215614c0f57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114612e6657600080fd5b60008060408385031215614c5457600080fd5b614c5d83614c2a565b946020939093013593505050565b60008060408385031215614c7e57600080fd5b82359150614c8e60208401614c2a565b90509250929050565b600080600060608486031215614cac57600080fd5b614cb584614c2a565b9250614cc360208501614c2a565b9150604084013590509250925092565b60008060408385031215614ce657600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b60008060008060008060c08789031215614d2757600080fd5b8635955060208701359450604087013593506060870135925060808701359150614d5360a08801614c2a565b90509295509295509295565b606081526000614d726060830186614bbe565b6020858185015283820360408501528185518084528284019150828160051b85010183880160005b83811015614dc857601f19878403018552614db6838351614bbe565b94860194925090850190600101614d9a565b50909a9950505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614e1657614e16614dd8565b604052919050565b60006001600160401b03821115614e3757614e37614dd8565b50601f01601f191660200190565b6000614e58614e5384614e1e565b614dee565b9050828152838383011115614e6c57600080fd5b828260208301376000602084830101529392505050565b600082601f830112614e9457600080fd5b612c9783833560208501614e45565b60008060408385031215614eb657600080fd5b8235915060208301356001600160401b03811115614ed357600080fd5b614edf85828601614e83565b9150509250929050565b600060208284031215614efb57600080fd5b612c9782614c2a565b60006001600160401b03821115614f1d57614f1d614dd8565b5060051b60200190565b600082601f830112614f3857600080fd5b81356020614f48614e5383614f04565b82815260059290921b84018101918181019086841115614f6757600080fd5b8286015b84811015614fa65780356001600160401b03811115614f8a5760008081fd5b614f988986838b0101614e83565b845250918301918301614f6b565b509695505050505050565b60008060008060008060008060008060006101608c8e031215614fd357600080fd5b8b359a506001600160401b038060208e01351115614ff057600080fd5b6150008e60208f01358f01614e83565b9a508060408e0135111561501357600080fd5b6150238e60408f01358f01614e83565b99508060608e0135111561503657600080fd5b6150468e60608f01358f01614e83565b98508060808e0135111561505957600080fd5b6150698e60808f01358f01614e83565b97508060a08e0135111561507c57600080fd5b61508c8e60a08f01358f01614e83565b96508060c08e0135111561509f57600080fd5b6150af8e60c08f01358f01614e83565b95508060e08e013511156150c257600080fd5b6150d28e60e08f01358f01614e83565b94506101008d013593506101208d01359250806101408e013511156150f657600080fd5b506151088d6101408e01358e01614f27565b90509295989b509295989b9093969950565b600080600080600060a0868803121561513257600080fd5b8535945061514260208701614c2a565b94979496505050506040830135926060810135926080909101359150565b6040815260006151736040830185614bbe565b82810360208401526151858185614bbe565b95945050505050565b600080604083850312156151a157600080fd5b823560ff811681146151b257600080fd5b9150614c8e60208401614c2a565b6000806000606084860312156151d557600080fd5b505081359360208301359350604090920135919050565b801515811461369057600080fd5b6000806040838503121561520d57600080fd5b61521683614c2a565b91506020830135615226816151ec565b809150509250929050565b60008060006060848603121561524657600080fd5b83356001600160401b038082111561525d57600080fd5b818601915086601f83011261527157600080fd5b81356020615281614e5383614f04565b82815260059290921b8401810191818101908a8411156152a057600080fd5b948201945b838610156152be578535825294820194908201906152a5565b975050870135925050808211156152d457600080fd5b6152e087838801614f27565b935060408601359150808211156152f657600080fd5b5061530386828701614f27565b9150509250925092565b6000806000806080858703121561532357600080fd5b61532c85614c2a565b935061533a60208601614c2a565b92506040850135915060608501356001600160401b0381111561535c57600080fd5b8501601f8101871361536d57600080fd5b61537c87823560208401614e45565b91505092959194509250565b60c08152600061539b60c0830189614bbe565b82810360208401526153ad8189614bbe565b905082810360408401526153c18188614bbe565b905082810360608401526153d58187614bbe565b905082810360808401526153e98186614bbe565b905082810360a08401526153fd8185614bbe565b9998505050505050505050565b600080600080600080600060e0888a03121561542557600080fd5b8735965061543560208901614c2a565b955061544360408901614c2a565b945060608801356001600160401b0381111561545e57600080fd5b61546a8a828b01614e83565b979a969950949760808101359660a0820135965060c090910135945092505050565b60008060008060008060008060006101208a8c0312156154ab57600080fd5b89356001600160401b03808211156154c257600080fd5b6154ce8d838e01614e83565b9a5060208c01359150808211156154e457600080fd5b6154f08d838e01614e83565b995060408c013591508082111561550657600080fd5b6155128d838e01614e83565b985060608c013591508082111561552857600080fd5b6155348d838e01614e83565b975060808c013591508082111561554a57600080fd5b6155568d838e01614e83565b965060a08c013591508082111561556c57600080fd5b6155788d838e01614e83565b955060c08c013591508082111561558e57600080fd5b61559a8d838e01614e83565b945060e08c013593506101008c01359150808211156155b857600080fd5b506155c58c828d01614f27565b9150509295985092959850929598565b600080604083850312156155e857600080fd5b6151b283614c2a565b600080600080600060a0868803121561560957600080fd5b8535945061561960208701614c2a565b935060408601356001600160401b0381111561563457600080fd5b61564088828901614e83565b9598949750949560608101359550608001359392505050565b6000806040838503121561566c57600080fd5b823591506020830135615226816151ec565b600181811c9082168061569257607f821691505b6020821081036156b257634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b6000602082840312156156ed57600080fd5b8151612c97816151ec565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109a4576109a461576a565b6000826157b457634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156157cb57600080fd5b5051919050565b808201808211156109a4576109a461576a565b818103818111156109a4576109a461576a565b60208082526021908201527f43616c6c6572206973206e6f7420746865204d696e74657220436f6e747261636040820152601d60fa1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b601f821115610b7857600081815260208120601f850160051c810160208610156158a85750805b601f850160051c820191505b81811015611339578281556001016158b4565b81516001600160401b038111156158e0576158e0614dd8565b6158f4816158ee845461567e565b84615881565b602080601f83116001811461592957600084156159115750858301515b600019600386901b1c1916600185901b178555611339565b600085815260208120601f198616915b8281101561595857888601518255948401946001909101908401615939565b50858210156159765787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546159938161567e565b600182811680156159ab57600181146159c0576159ef565b60ff19841687528215158302870194506159ef565b8560005260208060002060005b858110156159e65781548a8201529084019082016159cd565b50505082870194505b5050505092915050565b60008351615a0b818460208801614b9a565b61518581840185615986565b600060018201615a2957615a2961576a565b5060010190565b696c657420686173683d2760b01b815260008651615a5581600a850160208b01614b9a565b6d273b6c657420746f6b656e49643d60901b600a918401918201528651615a83816018840160208b01614b9a565b6f3b6c657420746f6b656e446174613d5b60801b60189290910191820152615aae6028820187615986565b9050605d60f81b8152763b6c657420646570656e64656e63795363726970743d2760481b60018201528451615aea816018840160208901614b9a565b61273b60f01b601892909101918201528351615b0d81601a840160208801614b9a565b01601a01979650505050505050565b6020808252600b908201526a2230ba3090333937bd32b760a91b604082015260600190565b60008351615b53818460208801614b9a565b835190830190615b67818360208801614b9a565b01949350505050565b60008251615b82818460208701614b9a565b6670656e64696e6760c81b920191825250600701919050565b7f3c68746d6c3e3c686561643e3c2f686561643e3c626f64793e3c7363726970748152651039b9319e9160d11b60208201526000615bdc6026830185615986565b72111f1e17b9b1b934b83a1f1e39b1b934b83a1f60691b81528351615c08816013840160208801614b9a565b761e17b9b1b934b83a1f1e17b137b23c9f1e17b43a36b61f60491b60139290910191820152602a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81526332911d1160e11b602082015260008651615c7d816024850160208b01614b9a565b701116113232b9b1b934b83a34b7b7111d1160791b602491840191820152615ca86035820188615986565b6a11161134b6b0b3b2911d1160a91b81529050615cc8600b820187615986565b6f222c2261747472696275746573223a5b60801b81529050615ced6010820186615986565b90507f5d2c22616e696d6174696f6e5f75726c223a22646174613a746578742f68746d8152681b0ed8985cd94d8d0b60ba1b60208201528351615d37816029840160208801614b9a565b61227d60f01b60299290910191820152602b01979650505050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b600081615da957615da961576a565b506000190190565b600060208284031215615dc357600080fd5b81516001600160401b03811115615dd957600080fd5b8201601f81018413615dea57600080fd5b8051615df8614e5382614e1e565b818152856020838501011115615e0d57600080fd5b615185826020830160208601614b9a565b60008251615e30818460208701614b9a565b9190910192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000615e988285615986565b61202360f01b81528351615eb3816002840160208801614b9a565b01600201949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615ef290830184614bbe565b9695505050505050565b600060208284031215615f0e57600080fd5b8151612c9781614b67565b634e487b7160e01b600052603160045260246000fd5b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220553a932b4f55e5f0ac803f0e5f28fa7127d87f742b023076bf4446443e348b6464736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000026ad9c64930bf5e057cb895a183436b30ad140f80000000000000000000000003344ab24fb43d3f8330adf66e0c43f5f9490a5c1000000000000000000000000000000000000000000000000000000000000000c4e65787447656e2036353239000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054e45585447000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): NextGen 6529
Arg [1] : symbol (string): NEXTG
Arg [2] : _adminsContract (address): 0x26AD9C64930bf5e057cB895a183436b30ad140f8
Arg [3] : _dependencyRegistry (address): 0x3344ab24Fb43d3F8330aDF66e0C43F5f9490a5C1

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 00000000000000000000000026ad9c64930bf5e057cb895a183436b30ad140f8
Arg [3] : 0000000000000000000000003344ab24fb43d3f8330adf66e0c43f5f9490a5c1
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 4e65787447656e20363532390000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 4e45585447000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

460:27185:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19107:182;;;;;;:::i;:::-;;:::i;:::-;;;565:14:22;;558:22;540:41;;528:2;513:18;19107:182:18;;;;;;;;2486:100:5;;;:::i;:::-;;;;;;;:::i;2867:48:18:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3998:171:5;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3516:416::-;;;;;;:::i;:::-;;:::i;:::-;;1675:113:6;1763:10;:17;1675:113;;;2324:25:22;;;2312:2;2297:18;1675:113:6;2178:177:22;8424:441:18;;;;;;:::i;:::-;;:::i;4698:301:5:-;;;;;;:::i;:::-;;:::i;2361:429:4:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;21394:137:18:-;;;;;;:::i;:::-;21469:4;21492:31;;;:16;:31;;;;;;;;;21394:137;1343:256:6;;;;;;:::i;:::-;;:::i;17673:618:18:-;;;;;;:::i;:::-;;:::i;11453:1115::-;;;;;;:::i;:::-;;:::i;24570:308::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;5070:151:5:-;;;;;;:::i;:::-;;:::i;25558:122:18:-;;;;;;:::i;:::-;25623:7;25650:21;;;:11;:21;;;;;;;25558:122;1865:233:6;;;;;;:::i;:::-;;:::i;24953:551:18:-;;;;;;:::i;:::-;25038:7;25107:39;;;:24;:39;;;;;:63;;;25172:62;;;25236:67;;;;25305:61;;;;25368:67;;;;25437:58;;;;;-1:-1:-1;;;;;25107:63:18;;;;25172:62;;25236:67;;25305:61;;25437:58;;;24953:551;;;;;-1:-1:-1;;;;;5547:15:22;;;5529:34;;5594:2;5579:18;;5572:34;;;;5622:18;;5615:34;;;;5680:2;5665:18;;5658:34;;;;5723:3;5708:19;;5701:35;5773:15;;;5509:3;5752:19;;5745:44;5478:3;5463:19;24953:551:18;5204:591:22;2196:223:5;;;;;;:::i;:::-;;:::i;586:33:18:-;;;;;;14791:348;;;;;;:::i;:::-;;:::i;22253:172::-;;;;;;:::i;:::-;22327:7;22354:39;;;:24;:39;;;;;:62;;;;22253:172;25752:687;;;;;;:::i;:::-;;:::i;2771:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;1927:207:5;;;;;;:::i;:::-;;:::i;1879:103:19:-;;;:::i;13118:1610:18:-;;;;;;:::i;:::-;;:::i;6411:1953::-;;;;;;:::i;:::-;;:::i;27430:210::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;18446:573::-;;;;;;:::i;:::-;;:::i;1238:87:19:-;1311:6;;-1:-1:-1;;;;;1311:6:19;1238:87;;3595:29:18;;;;;-1:-1:-1;;;;;3595:29:18;;;22744:170;;;;;;:::i;:::-;22816:7;22843:39;;;:24;:39;;;;;:62;;;;22744:170;23527:190;;;;;;:::i;:::-;23632:7;23660:38;;;:23;:38;;;;;;;;-1:-1:-1;;;;;23660:48:18;;;;;;;;;;;;;23527:190;2655:104:5;;;:::i;15603:304:18:-;;;;;;:::i;:::-;;:::i;17190:344::-;;;;;;:::i;:::-;;:::i;4241:155:5:-;;;;;;:::i;:::-;;:::i;15990:649:18:-;;;;;;:::i;:::-;;:::i;22492:172::-;;;;;;:::i;:::-;22561:7;22588:39;;;:24;:39;;;;;:67;;;;22492:172;10918:462;;;;;;:::i;:::-;;:::i;3064:44::-;;;;;;:::i;:::-;;:::i;5292:279:5:-;;;;;;:::i;:::-;;:::i;23773:176:18:-;;;;;;:::i;:::-;23849:7;23877:39;;;:24;:39;;;;;:63;-1:-1:-1;;;;;23877:63:18;;23773:176;16717:368;;;;;;:::i;:::-;;:::i;19341:1604::-;;;;;;:::i;:::-;;:::i;22992:195::-;;;;;;:::i;:::-;23097:7;23125:43;;;:28;:43;;;;;;;;-1:-1:-1;;;;;23125:53:18;;;;;;;;;;;;;22992:195;24008:484;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;9818:1068::-;;;;;;:::i;:::-;;:::i;21810:135::-;;;;;;:::i;:::-;21886:4;21909:28;;;:13;:28;;;;;;;;;21810:135;3404:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2965:52;;;;;;:::i;:::-;;:::i;4915:1341::-;;;;;;:::i;:::-;;:::i;23262:193::-;;;;;;:::i;:::-;23371:7;23399:37;;;:22;:37;;;;;;;;-1:-1:-1;;;;;23399:47:18;;;;;;;;;;;;;23262:193;4467:164:5;;;;;;:::i;:::-;;:::i;22013:172:18:-;;;;;;:::i;:::-;22087:7;22114:39;;;:24;:39;;;;;:62;;;;22013:172;27111:209;;;;;;:::i;:::-;;:::i;2137:201:19:-;;;;;;:::i;:::-;;:::i;8937:816:18:-;;;;;;:::i;:::-;;:::i;15210:330::-;;;;;;:::i;:::-;;:::i;21601:137::-;;;;;;:::i;:::-;21669:7;21696:33;;;:23;:33;;;;;;;21601:137;19107:182;19219:4;19244:36;19268:11;19244:23;:36::i;:::-;19237:43;19107:182;-1:-1:-1;;19107:182:18:o;2486:100:5:-;2540:13;2573:5;2566:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2486:100;:::o;3998:171::-;4074:7;4094:23;4109:7;4094:14;:23::i;:::-;-1:-1:-1;4137:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4137:24:5;;3998:171::o;3516:416::-;3597:13;3613:23;3628:7;3613:14;:23::i;:::-;3597:39;;3661:5;-1:-1:-1;;;;;3655:11:5;:2;-1:-1:-1;;;;;3655:11:5;;3647:57;;;;-1:-1:-1;;;3647:57:5;;20025:2:22;3647:57:5;;;20007:21:22;20064:2;20044:18;;;20037:30;20103:34;20083:18;;;20076:62;-1:-1:-1;;;20154:18:22;;;20147:31;20195:19;;3647:57:5;;;;;;;;;736:10:2;-1:-1:-1;;;;;3739:21:5;;;;:62;;-1:-1:-1;3764:37:5;3781:5;736:10:2;4467:164:5;:::i;3764:37::-;3717:173;;;;-1:-1:-1;;;3717:173:5;;20427:2:22;3717:173:5;;;20409:21:22;20466:2;20446:18;;;20439:30;20505:34;20485:18;;;20478:62;20576:31;20556:18;;;20549:59;20625:19;;3717:173:5;20225:425:22;3717:173:5;3903:21;3912:2;3916:7;3903:8;:21::i;:::-;3586:346;3516:416;;:::o;8424:441:18:-;4282:14;;:59;;-1:-1:-1;;;4282:59:18;;-1:-1:-1;;;8528:27:18;-1:-1:-1;;;;;4282:14:18;;:36;;:59;;4319:10;;8528:27;;4282:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4345:4;4282:67;;:125;;-1:-1:-1;4353:14:18;;:46;;-1:-1:-1;;;4353:46:18;;-1:-1:-1;;;;;4353:14:18;;;;:34;;:46;;4388:10;;4353:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4403:4;4353:54;4282:125;4274:150;;;;-1:-1:-1;;;4274:150:18;;;;;;;:::i;:::-;8588:19:::1;-1:-1:-1::0;;;;;8576:53:18::1;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;8635:4;8576:63;8568:102;;;::::0;-1:-1:-1;;;8568:102:18;;21751:2:22;8568:102:18::1;::::0;::::1;21733:21:22::0;21790:2;21770:18;;;21763:30;21829:28;21809:18;;;21802:56;21875:18;;8568:102:18::1;21549:350:22::0;8568:102:18::1;-1:-1:-1::0;8681:39:18::1;::::0;;;:24:::1;:39;::::0;;;;;:58:::1;::::0;::::1;:80:::0;;-1:-1:-1;;;;;8681:80:18;;::::1;-1:-1:-1::0;;;;;;8681:80:18;;::::1;::::0;::::1;::::0;;;8772:50:::1;::::0;;::::1;:85:::0;;;;::::1;;::::0;;8424:441::o;4698:301:5:-;4859:41;736:10:2;4878:12:5;4892:7;4859:18;:41::i;:::-;4851:99;;;;-1:-1:-1;;;4851:99:5;;;;;;;:::i;:::-;4963:28;4973:4;4979:2;4983:7;4963:9;:28::i;2361:429:4:-;2447:7;2505:26;;;:17;:26;;;;;;;;2476:55;;;;;;;;;-1:-1:-1;;;;;2476:55:4;;;;;-1:-1:-1;;;2476:55:4;;;-1:-1:-1;;;;;2476:55:4;;;;;;;;2447:7;;2544:92;;-1:-1:-1;2595:29:4;;;;;;;;;2605:19;2595:29;-1:-1:-1;;;;;2595:29:4;;;;-1:-1:-1;;;2595:29:4;;-1:-1:-1;;;;;2595:29:4;;;;;2544:92;2685:23;;;;2648:21;;3156:5;;2673:35;;-1:-1:-1;;;;;2673:35:4;:9;:35;:::i;:::-;2672:57;;;;:::i;:::-;2750:16;;;;;-1:-1:-1;2361:429:4;;-1:-1:-1;;;;2361:429:4:o;1343:256:6:-;1440:7;1476:23;1493:5;1476:16;:23::i;:::-;1468:5;:31;1460:87;;;;-1:-1:-1;;;1460:87:6;;23179:2:22;1460:87:6;;;23161:21:22;23218:2;23198:18;;;23191:30;23257:34;23237:18;;;23230:62;-1:-1:-1;;;23308:18:22;;;23301:41;23359:19;;1460:87:6;22977:407:22;1460:87:6;-1:-1:-1;;;;;;1565:19:6;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1343:256::o;17673:618:18:-;4282:14;;:59;;-1:-1:-1;;;4282:59:18;;-1:-1:-1;;;17749:28:18;-1:-1:-1;;;;;4282:14:18;;:36;;:59;;4319:10;;17749:28;;4282:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4345:4;4282:67;;:125;;-1:-1:-1;4353:14:18;;:46;;-1:-1:-1;;;4353:46:18;;-1:-1:-1;;;;;4353:14:18;;;;:34;;:46;;4388:10;;4353:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4403:4;4353:54;4282:125;4274:150;;;;-1:-1:-1;;;4274:150:18;;;;;;;:::i;:::-;17877:39:::1;::::0;;;:24:::1;:39;::::0;;;;;;;;:67:::1;;::::0;17833:14;;17817:57;;-1:-1:-1;;;17817:57:18;;::::1;::::0;::::1;2324:25:22::0;;;17877:67:18;;-1:-1:-1;;;;;17833:14:18::1;::::0;17817:42:::1;::::0;2297:18:22;;17817:57:18::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:127;;;;:::i;:::-;17799:15;:145;17790:178;;;::::0;-1:-1:-1;;;17790:178:18;;23910:2:22;17790:178:18::1;::::0;::::1;23892:21:22::0;23949:2;23929:18;;;23922:30;-1:-1:-1;;;23968:18:22;;;23961:49;24027:18;;17790:178:18::1;23708:343:22::0;17790:178:18::1;18043:39;::::0;;;:24:::1;:39;::::0;;;;:67:::1;::::0;::::1;::::0;17979:61:::1;::::0;;::::1;:131:::0;;;18282:1:::1;::::0;18187:27:::1;18068:13:::0;18203:11:::1;18187:27;:::i;:::-;18186:93;;;;:::i;:::-;:97;;;;:::i;:::-;18121:39;::::0;;;:24:::1;:39;::::0;;;;;:62:::1;;:162:::0;;;;-1:-1:-1;17673:618:18:o;11453:1115::-;11642:14;;-1:-1:-1;;;;;11642:14:18;11628:10;:28;11620:74;;;;-1:-1:-1;;;11620:74:18;;;;;;;:::i;:::-;11713:36;11732:6;11740:8;11713:18;:36::i;:::-;11705:94;;;;-1:-1:-1;;;11705:94:18;;;;;;;:::i;:::-;11884:43;;;;:24;:43;;;;;:71;;;:75;;11958:1;11884:75;:::i;:::-;11810:43;;;;:24;:43;;;;;:71;;;:149;;;11974:65;;;:140;11970:591;;12131:13;12147:17;12155:8;12147:7;:17::i;:::-;12131:33;;12179:15;12185:8;12179:5;:15::i;:::-;12241:29;;;;:10;:29;;;;;;:33;;12273:1;12241:33;:::i;:::-;12209:29;;;;:10;:29;;;;;;;;:65;;;;12340:41;;;:22;:41;;;;;-1:-1:-1;;;;;12340:48:18;;;;;;;;:52;;12391:1;12340:52;:::i;:::-;12289:41;;;;:22;:41;;;;;;;;-1:-1:-1;;;;;12289:48:18;;;;;;;;;:103;;;;12441:19;;;:9;:19;;;12407:85;;;;12423:9;;12331:5;;12441:19;12407:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12462:17;12481:10;12407:15;:85::i;:::-;12116:388;11970:591;;;12525:24;;-1:-1:-1;;;12525:24:18;;24793:2:22;12525:24:18;;;24775:21:22;24832:2;24812:18;;;24805:30;-1:-1:-1;;;24851:18:22;;;24844:44;24905:18;;12525:24:18;24591:338:22;11970:591:18;11453:1115;;;;;;:::o;24570:308::-;24672:7;24716:29;;;:14;:29;;;;;24765:56;;;;24716:47;;;24708:162;;24657:13;;24672:7;24657:13;;24765:56;24823:46;;;;;24716:47;;24708:162;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24570:308;;;;;:::o;5070:151:5:-;5174:39;5191:4;5197:2;5201:7;5174:39;;;;;;;;;;;;:16;:39::i;1865:233:6:-;1940:7;1976:30;1763:10;:17;;1675:113;1976:30;1968:5;:38;1960:95;;;;-1:-1:-1;;;1960:95:6;;25136:2:22;1960:95:6;;;25118:21:22;25175:2;25155:18;;;25148:30;25214:34;25194:18;;;25187:62;-1:-1:-1;;;25265:18:22;;;25258:42;25317:19;;1960:95:6;24934:408:22;1960:95:6;2073:10;2084:5;2073:17;;;;;;;;:::i;:::-;;;;;;;;;2066:24;;1865:233;;;:::o;2196:223:5:-;2268:7;6929:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6929:16:5;;2332:56;;;;-1:-1:-1;;;2332:56:5;;;;;;;:::i;14791:348:18:-;14905:39;;;;:24;:39;;;;;:63;-1:-1:-1;;;;;14905:63:18;14891:10;:77;:117;;;;-1:-1:-1;14972:27:18;;;;:12;:27;;;;;;;;:36;14891:117;14883:147;;;;-1:-1:-1;;;14883:147:18;;26034:2:22;14883:147:18;;;26016:21:22;26073:2;26053:18;;;26046:30;-1:-1:-1;;;26092:18:22;;;26085:47;26149:18;;14883:147:18;25832:341:22;14883:147:18;15041:32;;;;:17;:32;;;;;:45;15076:10;15041:32;:45;:::i;:::-;-1:-1:-1;;15097:27:18;;;;:12;:27;;;;;:34;;-1:-1:-1;;15097:34:18;15127:4;15097:34;;;14791:348::o;25752:687::-;25823:13;25849:23;25864:7;25849:14;:23::i;:::-;25883:24;25923:9;25918:248;25940:48;25955:32;;;:23;:32;;;;;;;;;25940:48;;:14;:48;;;;;:65;;:72;25936:76;;25918:248;;;26083:48;26098:32;;;:23;:32;;;;;;;;;26083:48;;:14;:48;;;;;:65;;:68;;26071:10;;26083:65;26149:1;;26083:68;;;;;;:::i;:::-;;;;;;;;26054:98;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26034:119;;26014:3;;;;;:::i;:::-;;;;25918:248;;;-1:-1:-1;26248:20:18;;;;:11;:20;;;;;;;;;26220:54;;:19;:54::i;:::-;26292:18;:7;:16;:18::i;:::-;26330;;;;:9;:18;;;;;26379:33;26340:7;26379:24;:33::i;:::-;26419:10;26190:240;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26176:255;;;25752:687;;;:::o;1927:207:5:-;1999:7;-1:-1:-1;;;;;2027:19:5;;2019:73;;;;-1:-1:-1;;;2019:73:5;;31714:2:22;2019:73:5;;;31696:21:22;31753:2;31733:18;;;31726:30;31792:34;31772:18;;;31765:62;-1:-1:-1;;;31843:18:22;;;31836:39;31892:19;;2019:73:5;31512:405:22;2019:73:5;-1:-1:-1;;;;;;2110:16:5;;;;;:9;:16;;;;;;;1927:207::o;1879:103:19:-;1124:13;:11;:13::i;:::-;1944:30:::1;1971:1;1944:18;:30::i;:::-;1879:103::o:0;13118:1610:18:-;4630:14;;:64;;-1:-1:-1;;;4630:64:18;;13555:13;;-1:-1:-1;;;13570:34:18;-1:-1:-1;;;;;4630:14:18;;;;:38;;:64;;4669:10;;13555:13;;4630:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;4698:4;4630:72;;:143;;-1:-1:-1;4706:14:18;;:59;;-1:-1:-1;;;4706:59:18;;-1:-1:-1;;;;;4706:14:18;;;;:36;;:59;;4743:10;;4755:9;;4706:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4769:4;4706:67;4630:143;:201;;;-1:-1:-1;4777:14:18;;:46;;-1:-1:-1;;;4777:46:18;;-1:-1:-1;;;;;4777:14:18;;;;:34;;:46;;4812:10;;4777:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4827:4;4777:54;4630:201;4622:225;;;;-1:-1:-1;;;4622:225:18;;;;;;;:::i;:::-;13626:34:::1;::::0;;;:19:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;13625:90:::0;::::1;;;-1:-1:-1::0;13674:31:18::1;::::0;;;:16:::1;:31;::::0;;;;;::::1;;:40;13625:90;13617:114;;;;-1:-1:-1::0;;;13617:114:18::1;;;;;;;:::i;:::-;13747:6;13757:7;13747:17:::0;13743:978:::1;;13781:29;::::0;;;:14:::1;:29;::::0;;;;:65:::1;13828:18:::0;13781:29;:65:::1;:::i;:::-;-1:-1:-1::0;13861:29:18::1;::::0;;;:14:::1;:29;::::0;;;;:46:::1;;:69;13910:20:::0;13861:46;:69:::1;:::i;:::-;-1:-1:-1::0;13945:29:18::1;::::0;;;:14:::1;:29;::::0;;;;:51:::1;;:79;13999:25:::0;13945:51;:79:::1;:::i;:::-;-1:-1:-1::0;14039:29:18::1;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;14089:21:::0;14039:47;:71:::1;:::i;:::-;-1:-1:-1::0;14125:29:18::1;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;14175:21:::0;14125:47;:71:::1;:::i;:::-;-1:-1:-1::0;14211:29:18::1;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;14261:21:::0;14211:47;:71:::1;:::i;:::-;-1:-1:-1::0;14297:29:18::1;::::0;;;:14:::1;:29;::::0;;;;;;;:56:::1;::::0;::::1;:89:::0;;;14401:69;;::::1;::::0;:46:::1;::::0;;::::1;::::0;:69;::::1;::::0;::::1;:::i;:::-;;13743:978;;;14492:6;14502;14492:16:::0;14488:233:::1;;14525:29;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;14575:21:::0;14525:47;:71:::1;:::i;14488:233::-;14686:20;14707:1;14686:23;;;;;;;;:::i;:::-;;;;;;;14629:14;:29;14644:13;14629:29;;;;;;;;;;;:46;;14676:6;14629:54;;;;;;;;:::i;:::-;;;;;;;;:80;;;;;;:::i;:::-;;14488:233;13118:1610:::0;;;;;;;;;;;;;:::o;6411:1953::-;4630:14;;:64;;-1:-1:-1;;;4630:64:18;;6626:13;;-1:-1:-1;;;6641:31:18;-1:-1:-1;;;;;4630:14:18;;;;:38;;:64;;4669:10;;6626:13;;4630:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;4698:4;4630:72;;:143;;-1:-1:-1;4706:14:18;;:59;;-1:-1:-1;;;4706:59:18;;-1:-1:-1;;;;;4706:14:18;;;;:36;;:59;;4743:10;;4755:9;;4706:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4769:4;4706:67;4630:143;:201;;;-1:-1:-1;4777:14:18;;:46;;-1:-1:-1;;;4777:46:18;;-1:-1:-1;;;;;4777:14:18;;;;:34;;:46;;4812:10;;4777:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4827:4;4777:54;4630:201;4622:225;;;;-1:-1:-1;;;4622:225:18;;;;;;;:::i;:::-;6694:34:::1;::::0;;;:19:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;6693:90:::0;::::1;;;-1:-1:-1::0;6742:31:18::1;::::0;;;:16:::1;:31;::::0;;;;;::::1;;:40;6693:90;:133;;;;;6814:11;6788:22;:37;;6693:133;6685:157;;;::::0;-1:-1:-1;;;6685:157:18;;32124:2:22;6685:157:18::1;::::0;::::1;32106:21:22::0;32163:2;32143:18;;;32136:30;-1:-1:-1;;;32182:18:22;;;32175:41;32233:18;;6685:157:18::1;31922:335:22::0;6685:157:18::1;6857:39;::::0;;;:24:::1;:39;::::0;;;;:61:::1;;::::0;:66;;6853:1504:::1;;6940:39;::::0;;;:24:::1;:39;::::0;;;;:90;;-1:-1:-1;;;;;;6940:90:18::1;-1:-1:-1::0;;;;;6940:90:18;::::1;;::::0;;-1:-1:-1;7045:62:18;::::1;:88:::0;;;7148:67:::1;::::0;::::1;:71:::0;;;;7234:61:::1;::::0;::::1;:86:::0;;;7335:67:::1;;:98:::0;;;7514:27:::1;6940:39:::0;7530:11:::1;7514:27;:::i;:::-;7448:39;::::0;;;:24:::1;:39;::::0;;;;:62:::1;;:94:::0;7679:1:::1;7654:22:::0;7623:27:::1;7473:13:::0;7639:11:::1;7623:27;:::i;:::-;7622:54;;;;:::i;:::-;:58;;;;:::i;:::-;7557:39;::::0;;;:24:::1;:39;::::0;;;;;;;:62:::1;;:123:::0;;;;7695:13:::1;:28:::0;;;:35;;-1:-1:-1;;7695:35:18::1;7726:4;7695:35;::::0;;6853:1504:::1;;;7752:27;::::0;;;:12:::1;:27;::::0;;;;;::::1;;:36;;::::0;;7748:609:::1;;7805:39;::::0;;;:24:::1;:39;::::0;;;;:90;;-1:-1:-1;;;;;;7805:90:18::1;-1:-1:-1::0;;;;;7805:90:18;::::1;;::::0;;-1:-1:-1;7910:62:18;::::1;:88:::0;;;8013:67:::1;;:98:::0;;;7748:609:::1;;;8144:39;::::0;;;:24:::1;:39;::::0;;;;:62:::1;::::0;::::1;:88:::0;;;8247:67:::1;;:98:::0;;;7748:609:::1;6411:1953:::0;;;;;;;:::o;27430:210::-;27558:33;;;;:23;:33;;;;;27550:82;;27509:13;;;;27629:1;27595:36;;;27558:33;;27550:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27430:210;;;:::o;18446:573::-;4282:14;;:59;;-1:-1:-1;;;4282:59:18;;-1:-1:-1;;;18534:29:18;-1:-1:-1;;;;;4282:14:18;;:36;;:59;;4319:10;;18534:29;;4282:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4345:4;4282:67;;:125;;-1:-1:-1;4353:14:18;;:46;;-1:-1:-1;;;4353:46:18;;-1:-1:-1;;;;;4353:14:18;;;;:34;;:46;;4388:10;;4353:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4403:4;4353:54;4282:125;4274:150;;;;-1:-1:-1;;;4274:150:18;;;;;;;:::i;:::-;18580:4:::1;:9;;18588:1;18580:9:::0;18576:436:::1;;18629:12;-1:-1:-1::0;;;;;18614:44:18::1;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;18664:4;18614:54;18606:76;;;::::0;-1:-1:-1;;;18606:76:18;;32464:2:22;18606:76:18::1;::::0;::::1;32446:21:22::0;32503:1;32483:18;;;32476:29;-1:-1:-1;;;32521:18:22;;;32514:39;32570:18;;18606:76:18::1;32262:332:22::0;18606:76:18::1;18697:14;:45:::0;;-1:-1:-1;;;;;18697:45:18;::::1;-1:-1:-1::0;;;;;;18697:45:18;;::::1;;::::0;;3586:346:5;3516:416;;:::o;18576:436:18:-:1;18764:4;:9;;18772:1;18764:9:::0;18760:252:::1;;18814:12;-1:-1:-1::0;;;;;18798:46:18::1;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;18850:4;18798:56;18790:79;;;::::0;-1:-1:-1;;;18790:79:18;;32801:2:22;18790:79:18::1;::::0;::::1;32783:21:22::0;32840:2;32820:18;;;32813:30;-1:-1:-1;;;32859:18:22;;;32852:40;32909:18;;18790:79:18::1;32599:334:22::0;18790:79:18::1;18884:14;:29:::0;;-1:-1:-1;;;;;18884:29:18;::::1;-1:-1:-1::0;;;;;;18884:29:18;;::::1;;::::0;;3586:346:5;3516:416;;:::o;18760:252:18:-:1;18946:18;:54:::0;;-1:-1:-1;;;;;18946:54:18;::::1;-1:-1:-1::0;;;;;;18946:54:18;;::::1;;::::0;;18446:573;;;:::o;2655:104:5:-;2711:13;2744:7;2737:14;;;;;:::i;15603:304:18:-;4282:14;;:59;;-1:-1:-1;;;4282:59:18;;-1:-1:-1;;;15698:29:18;-1:-1:-1;;;;;4282:14:18;;:36;;:59;;4319:10;;15698:29;;4282:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4345:4;4282:67;;:125;;-1:-1:-1;4353:14:18;;:46;;-1:-1:-1;;;4353:46:18;;-1:-1:-1;;;;;4353:14:18;;;;:34;;:46;;4388:10;;4353:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4403:4;4353:54;4282:125;4274:150;;;;-1:-1:-1;;;4274:150:18;;;;;;;:::i;:::-;15748:51:::1;15765:33:::0;;;:23:::1;:33;::::0;;;;;;;;15748:51;;:16:::1;:51:::0;;;;;;::::1;;:60;15740:84;;;;-1:-1:-1::0;;;15740:84:18::1;;;;;;;:::i;:::-;15835:24;15850:8;15835:14;:24::i;:::-;15870:19;::::0;;;:9:::1;:19;::::0;;;;:29:::1;15892:7:::0;15870:19;:29:::1;:::i;:::-;;15603:304:::0;;;:::o;17190:344::-;17312:39;;;;:24;:39;;;;;:58;;;-1:-1:-1;;;;;17312:58:18;17298:10;:72;17290:81;;;;;;17390:23;;;;:11;:23;;;;;;:93;17382:102;;;;;;17495:23;;;;:11;:23;;;;;;:31;-1:-1:-1;17190:344:18:o;4241:155:5:-;4336:52;736:10:2;4369:8:5;4379;4336:18;:52::i;:::-;4241:155;;:::o;15990:649:18:-;4282:14;;:59;;-1:-1:-1;;;4282:59:18;;-1:-1:-1;;;16135:39:18;-1:-1:-1;;;;;4282:14:18;;:36;;:59;;4319:10;;16135:39;;4282:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4345:4;4282:67;;:125;;-1:-1:-1;4353:14:18;;:46;;-1:-1:-1;;;4353:46:18;;-1:-1:-1;;;;;4353:14:18;;;;:34;;:46;;4388:10;;4353:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4403:4;4353:54;4282:125;4274:150;;;;-1:-1:-1;;;4274:150:18;;;;;;;:::i;:::-;16215:7:::1;:14;16196:8;:15;:33;16195:77;;;;;16253:11;:18;16235:7;:14;:36;16195:77;16187:98;;;::::0;-1:-1:-1;;;16187:98:18;;33480:2:22;16187:98:18::1;::::0;::::1;33462:21:22::0;33519:1;33499:18;;;33492:29;-1:-1:-1;;;33537:18:22;;;33530:37;33584:18;;16187:98:18::1;33278:330:22::0;16187:98:18::1;16301:9;16296:336;16316:8;:15;16312:1;:19;16296:336;;;16361:16;:54;16378:23;:36;16402:8;16411:1;16402:11;;;;;;;;:::i;:::-;;;;;;;16378:36;;;;;;;;;;;;16361:54;;;;;;;;;;;;;;;;;;;;;:63;;16419:5;16361:63;;;16353:87;;;;-1:-1:-1::0;;;16353:87:18::1;;;;;;;:::i;:::-;16455:27;16470:8;16479:1;16470:11;;;;;;;;:::i;:::-;;;;;;;16455:14;:27::i;:::-;16539:7;16547:1;16539:10;;;;;;;;:::i;:::-;;;;;;;16497:23;:36;16521:8;16530:1;16521:11;;;;;;;;:::i;:::-;;;;;;;16497:36;;;;;;;;;;;16534:1;16497:39;;;;;;;:::i;:::-;;::::0;:52:::1;::::0;:39;:52:::1;:::i;:::-;;16606:11;16618:1;16606:14;;;;;;;;:::i;:::-;;;;;;;16564:23;:36;16588:8;16597:1;16588:11;;;;;;;;:::i;:::-;;;;;;;16564:36;;;;;;;;;;;16601:1;16564:39;;;;;;;:::i;:::-;;::::0;:56:::1;::::0;:39;:56:::1;:::i;:::-;-1:-1:-1::0;16333:3:18;::::1;::::0;::::1;:::i;:::-;;;;16296:336;;;;15990:649:::0;;;;:::o;10918:462::-;10999:42;736:10:2;11018:12:18;656:98:2;10999:42:18;10991:100;;;;-1:-1:-1;;;10991:100:18;;;;;;;:::i;:::-;11124:39;;;;:24;:39;;;;;:62;;;11112:74;;;;;11111:156;;-1:-1:-1;11204:39:18;;;;:24;:39;;;;;:62;;;11192:74;;;11111:156;11102:176;;;;-1:-1:-1;;;11102:176:18;;33815:2:22;11102:176:18;;;33797:21:22;33854:1;33834:18;;;33827:29;-1:-1:-1;;;33872:18:22;;;33865:36;33918:18;;11102:176:18;33613:329:22;11102:176:18;11289:15;11295:8;11289:5;:15::i;:::-;11343:25;;;;:10;:25;;;;;;:29;;11371:1;11343:29;:::i;:::-;11315:25;;;;:10;:25;;;;;;:57;;;;-1:-1:-1;10918:462:18:o;3064:44::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5292:279:5:-;5423:41;736:10:2;5456:7:5;5423:18;:41::i;:::-;5415:99;;;;-1:-1:-1;;;5415:99:5;;;;;;;:::i;:::-;5525:38;5539:4;5545:2;5549:7;5558:4;5525:13;:38::i;16717:368:18:-;4282:14;;:59;;-1:-1:-1;;;4282:59:18;;-1:-1:-1;;;16795:30:18;-1:-1:-1;;;;;4282:14:18;;:36;;:59;;4319:10;;16795:30;;4282:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4345:4;4282:67;;:125;;-1:-1:-1;4353:14:18;;:46;;-1:-1:-1;;;4353:46:18;;-1:-1:-1;;;;;4353:14:18;;;;:34;;:46;;4388:10;;4353:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4403:4;4353:54;4282:125;4274:150;;;;-1:-1:-1;;;4274:150:18;;;;;;;:::i;:::-;16880:14:::1;::::0;16864:57:::1;::::0;-1:-1:-1;;;16864:57:18;;::::1;::::0;::::1;2324:25:22::0;;;-1:-1:-1;;;;;16880:14:18;;::::1;::::0;16864:42:::1;::::0;2297:18:22;;16864:57:18::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16846:15;:75;:141;;;;-1:-1:-1::0;16941:14:18::1;::::0;16925:57:::1;::::0;-1:-1:-1;;;16925:57:18;;::::1;::::0;::::1;2324:25:22::0;;;-1:-1:-1;;;;;16941:14:18;;::::1;::::0;16925:42:::1;::::0;2297:18:22;;16925:57:18::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62:::0;::::1;16846:141;:181;;;;-1:-1:-1::0;16991:28:18::1;::::0;;;:13:::1;:28;::::0;;;;;::::1;;:36;;:28:::0;:36:::1;16846:181;16838:190;;;::::0;::::1;;-1:-1:-1::0;17039:31:18::1;::::0;;;:16:::1;:31;::::0;;;;:38;;-1:-1:-1;;17039:38:18::1;17073:4;17039:38;::::0;;16717:368::o;19341:1604::-;19414:13;19440:23;19455:7;19440:14;:23::i;:::-;19478:49;19494:32;;;:23;:32;;;;;;;;;19478:49;;:15;:49;;;;;;;;:58;;;:152;;-1:-1:-1;19540:20:18;;;;:11;:20;;;;;;:90;;19478:152;19474:1464;;;19647:21;19686:32;;;:23;:32;;;;;;;;;19671:48;;:14;:48;;;;;:66;;19647:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19783:1;19765:7;19759:21;:25;:86;;;;;;;;;;;;;;;;;19811:7;19820:18;:7;:16;:18::i;:::-;19794:45;;;;;;;;;:::i;19759:86::-;19752:93;19341:1604;-1:-1:-1;;;19341:1604:18:o;19474:1464::-;19867:49;19883:32;;;:23;:32;;;;;;;;;19867:49;;:15;:49;;;;;;;;:58;;;:152;;-1:-1:-1;19929:20:18;;;;:11;:20;;;;;;:90;19867:152;19863:1075;;;20036:21;20075:32;;;:23;:32;;;;;;;;;20060:48;;:14;:48;;;;;:66;;20036:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20172:1;20154:7;20148:21;:25;:77;;;;;;;;;;;;;;;;;20200:7;20183:36;;;;;;;;:::i;19863:1075::-;20267:17;20375:32;;;:23;:32;;;;;;;;;20360:48;;:14;:48;;;;;20287:224;;20360:66;;20450:33;20399:7;20450:24;:33::i;:::-;20301:209;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20287:13;:224::i;:::-;20267:244;;20526:18;20613:21;20626:7;20613:12;:21::i;:::-;20659:48;20674:32;;;:23;:32;;;;;;;;;20659:48;;:14;:48;;;;;20748:32;;;:23;:32;;;;;;20554:345;;;;;20659:70;;;20839:1;20806:35;;;20889:3;;20554:345;;:::i;:::-;;;;-1:-1:-1;;20554:345:18;;;;;;;;;;19341:1604;-1:-1:-1;;;;19341:1604:18:o;19863:1075::-;19341:1604;;;:::o;24008:484::-;24191:29;;;;:14;:29;;;;;24183:301;;24083:13;;;;;;;;;;;;24237:46;;;;24285:51;;;;24338:47;;;;24387;;;;24436;;;;24191:29;;24183:301;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24008:484;;;;;;;:::o;9818:1068::-;10020:14;;-1:-1:-1;;;;;10020:14:18;10006:10;:28;9998:74;;;;-1:-1:-1;;;9998:74:18;;;;;;;:::i;:::-;10153:39;;;;:24;:39;;;;;:67;;;:71;;10223:1;10153:71;:::i;:::-;10083:39;;;;:24;:39;;;;;:67;;;:141;;;10239:61;;;:132;10235:644;;10392:5;10401:1;10392:10;10388:334;;10486:43;;;;:28;:43;;;;;;;;-1:-1:-1;;;;;10486:60:18;;;;;;;;;;:64;;10549:1;10486:64;:::i;:::-;10423:43;;;;:28;:43;;;;;;;;-1:-1:-1;;;;;10423:60:18;;;;;;;;;:127;10388:334;;;10648:37;;;;:22;:37;;;;;;;;-1:-1:-1;;;;;10648:54:18;;;;;;;;;;:58;;10705:1;10648:58;:::i;:::-;10591:37;;;;:22;:37;;;;;;;;-1:-1:-1;;;;;10591:54:18;;;;;;;;;:115;10388:334;10736:74;10752:9;10763:7;10772:10;10784:13;10799:10;10736:15;:74::i;:::-;10235:644;;2965:52;;;;;;;;;;;;;;;;:::i;4915:1341::-;4282:14;;:59;;-1:-1:-1;;;4282:59:18;;-1:-1:-1;;;5280:30:18;-1:-1:-1;;;;;4282:14:18;;:36;;:59;;4319:10;;5280:30;;4282:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4345:4;4282:67;;:125;;-1:-1:-1;4353:14:18;;:46;;-1:-1:-1;;;4353:46:18;;-1:-1:-1;;;;;4353:14:18;;;;:34;;:46;;4388:10;;4353:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4403:4;4353:54;4282:125;4274:150;;;;-1:-1:-1;;;4274:150:18;;;;;;;:::i;:::-;5338:18:::1;::::0;5323:34:::1;::::0;;;:14:::1;:34;::::0;;;;:67:::1;5375:15:::0;5323:34;:67:::1;:::i;:::-;-1:-1:-1::0;5416:18:18::1;::::0;5401:34:::1;::::0;;;:14:::1;:34;::::0;;;;:51:::1;;:71;5455:17:::0;5401:51;:71:::1;:::i;:::-;-1:-1:-1::0;5498:18:18::1;::::0;5483:34:::1;::::0;;;:14:::1;:34;::::0;;;;:56:::1;;:81;5542:22:::0;5483:56;:81:::1;:::i;:::-;-1:-1:-1::0;5590:18:18::1;::::0;5575:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5630:18:::0;5575:52;:73:::1;:::i;:::-;-1:-1:-1::0;5674:18:18::1;::::0;5659:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5714:18:::0;5659:52;:73:::1;:::i;:::-;-1:-1:-1::0;5758:18:18::1;::::0;5743:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5798:18:::0;5743:52;:73:::1;:::i;:::-;-1:-1:-1::0;5842:18:18::1;::::0;5827:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5882:18:::0;5827:52;:73:::1;:::i;:::-;-1:-1:-1::0;5926:18:18::1;::::0;;5911:34:::1;::::0;;;:14:::1;:34;::::0;;;;;;;:61:::1;;:91:::0;;;6028:18;;6013:34;;;;;:71;;::::1;::::0;:51:::1;::::0;;::::1;::::0;:71;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;6115:18:18::1;::::0;;6095:39:::1;::::0;;;:19:::1;:39;::::0;;;;;:46;;-1:-1:-1;;6095:46:18::1;6137:4;6095:46;::::0;;6175:18;;6157:37;;::::1;::::0;6095:39;6157:37:::1;6226:18;::::0;:22:::1;::::0;6247:1:::1;6226:22;:::i;:::-;6205:18;:43:::0;-1:-1:-1;;;;;;;;;;4915:1341:18:o;4467:164:5:-;-1:-1:-1;;;;;4588:25:5;;;4564:4;4588:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4467:164::o;27111:209:18:-;27188:7;27286:25;;;:10;:25;;;;;;;;;27216:24;:39;;;;;:67;;;:95;;27286:25;27216:95;:::i;2137:201:19:-;1124:13;:11;:13::i;:::-;-1:-1:-1;;;;;2226:22:19;::::1;2218:73;;;::::0;-1:-1:-1;;;2218:73:19;;38072:2:22;2218:73:19::1;::::0;::::1;38054:21:22::0;38111:2;38091:18;;;38084:30;38150:34;38130:18;;;38123:62;-1:-1:-1;;;38201:18:22;;;38194:36;38247:19;;2218:73:19::1;37870:402:22::0;2218:73:19::1;2302:28;2321:8;2302:18;:28::i;:::-;2137:201:::0;:::o;8937:816:18:-;9110:14;;-1:-1:-1;;;;;9110:14:18;9096:10;:28;9088:74;;;;-1:-1:-1;;;9088:74:18;;;;;;;:::i;:::-;9243:39;;;;:24;:39;;;;;:67;;;:71;;9313:1;9243:71;:::i;:::-;9173:39;;;;:24;:39;;;;;:67;;;:141;;;9329:61;;;:132;9325:421;;9531:38;;;;:23;:38;;;;;;;;-1:-1:-1;;;;;9531:50:18;;;;;;;;;;:54;;9584:1;9531:54;:::i;:::-;9478:38;;;;:23;:38;;;;;;;;-1:-1:-1;;;;;9478:50:18;;;;;;;;;:107;9600:77;9616:9;9517:10;9639;9502:13;9666:10;9600:15;:77::i;:::-;9325:421;;15210:330;4630:14;;:64;;-1:-1:-1;;;4630:64:18;;15306:13;;-1:-1:-1;;;15321:32:18;-1:-1:-1;;;;;4630:14:18;;;;:38;;:64;;4669:10;;15306:13;;4630:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;4698:4;4630:72;;:143;;-1:-1:-1;4706:14:18;;:59;;-1:-1:-1;;;4706:59:18;;-1:-1:-1;;;;;4706:14:18;;;;:36;;:59;;4743:10;;4755:9;;4706:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4769:4;4706:67;4630:143;:201;;;-1:-1:-1;4777:14:18;;:46;;-1:-1:-1;;;4777:46:18;;-1:-1:-1;;;;;4777:14:18;;;;:34;;:46;;4812:10;;4777:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4827:4;4777:54;4630:201;4622:225;;;;-1:-1:-1;;;4622:225:18;;;;;;;:::i;:::-;15376:34:::1;::::0;;;:19:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;15375:90:::0;::::1;;;-1:-1:-1::0;15424:31:18::1;::::0;;;:16:::1;:31;::::0;;;;;::::1;;:40;15375:90;15367:114;;;;-1:-1:-1::0;;;15367:114:18::1;;;;;;;:::i;:::-;-1:-1:-1::0;;15492:30:18::1;::::0;;;:15:::1;:30;::::0;;;;;:40;;-1:-1:-1;;15492:40:18::1;::::0;::::1;;::::0;;;::::1;::::0;;15210:330::o;2091:215:4:-;2193:4;-1:-1:-1;;;;;;2217:41:4;;-1:-1:-1;;;2217:41:4;;:81;;;2262:36;2286:11;2262:23;:36::i;13561:135:5:-;13643:16;13651:7;13643;:16::i;:::-;13635:53;;;;-1:-1:-1;;;13635:53:5;;;;;;;:::i;12874:174::-;12949:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12949:29:5;-1:-1:-1;;;;;12949:29:5;;;;;;;;:24;;13003:23;12949:24;13003:14;:23::i;:::-;-1:-1:-1;;;;;12994:46:5;;;;;;;;;;;12874:174;;:::o;7561:264::-;7654:4;7671:13;7687:23;7702:7;7687:14;:23::i;:::-;7671:39;;7740:5;-1:-1:-1;;;;;7729:16:5;:7;-1:-1:-1;;;;;7729:16:5;;:52;;;;7749:32;7766:5;7773:7;7749:16;:32::i;:::-;7729:87;;;;7809:7;-1:-1:-1;;;;;7785:31:5;:20;7797:7;7785:11;:20::i;:::-;-1:-1:-1;;;;;7785:31:5;;7729:87;7721:96;7561:264;-1:-1:-1;;;;7561:264:5:o;11526:1229::-;11651:4;-1:-1:-1;;;;;11624:31:5;:23;11639:7;11624:14;:23::i;:::-;-1:-1:-1;;;;;11624:31:5;;11616:81;;;;-1:-1:-1;;;11616:81:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;11716:16:5;;11708:65;;;;-1:-1:-1;;;11708:65:5;;38885:2:22;11708:65:5;;;38867:21:22;38924:2;38904:18;;;38897:30;38963:34;38943:18;;;38936:62;-1:-1:-1;;;39014:18:22;;;39007:34;39058:19;;11708:65:5;38683:400:22;11708:65:5;11786:42;11807:4;11813:2;11817:7;11826:1;11786:20;:42::i;:::-;11958:4;-1:-1:-1;;;;;11931:31:5;:23;11946:7;11931:14;:23::i;:::-;-1:-1:-1;;;;;11931:31:5;;11923:81;;;;-1:-1:-1;;;11923:81:5;;;;;;;:::i;:::-;12076:24;;;;:15;:24;;;;;;;;12069:31;;-1:-1:-1;;;;;;12069:31:5;;;;;;-1:-1:-1;;;;;12552:15:5;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;12552:20:5;;;12587:13;;;;;;;;;:18;;12069:31;12587:18;;;12627:16;;;:7;:16;;;;;;:21;;;;;;;;;;12666:27;;12092:7;;-1:-1:-1;;;;;;;;;;;12666:27:5;;3586:346;3516:416;;:::o;10406:783::-;10466:13;10482:23;10497:7;10482:14;:23::i;:::-;10466:39;;10518:51;10539:5;10554:1;10558:7;10567:1;10518:20;:51::i;:::-;10682:23;10697:7;10682:14;:23::i;:::-;10753:24;;;;:15;:24;;;;;;;;10746:31;;-1:-1:-1;;;;;;10746:31:5;;;;;;-1:-1:-1;;;;;10998:16:5;;;;;:9;:16;;;;;:21;;-1:-1:-1;;10998:21:5;;;11048:16;;;:7;:16;;;;;;11041:23;;;;;;;11082:36;10674:31;;-1:-1:-1;10769:7:5;;-1:-1:-1;;;;;;;;;;;11082:36:5;10753:24;;11082:36;4241:155;;:::o;12602:421:18:-;12756:21;;;;:9;:21;;;;;:34;12780:10;12756:21;:34;:::i;:::-;-1:-1:-1;12801:35:18;;;;:23;:35;;;;;:51;;;12863:33;12873:10;12825;12863:9;:33::i;:::-;12907:39;;;;:24;:39;;;;;;;:50;;;:108;;-1:-1:-1;;;12907:108:18;;;;;39290:25:22;;;39331:18;;;39324:34;;;39374:18;;;39367:34;;;-1:-1:-1;;;;;12907:50:18;;;;:69;;39263:18:22;;12907:108:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12602:421;;;;;:::o;1869:447:21:-;1944:13;1970:19;2002:10;2006:6;2002:1;:10;:::i;:::-;:14;;2015:1;2002:14;:::i;:::-;-1:-1:-1;;;;;1992:25:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1992:25:21;;1970:47;;-1:-1:-1;;;2028:6:21;2035:1;2028:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;2028:15:21;;;;;;;;;-1:-1:-1;;;2054:6:21;2061:1;2054:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;2054:15:21;;;;;;;;-1:-1:-1;2085:9:21;2097:10;2101:6;2097:1;:10;:::i;:::-;:14;;2110:1;2097:14;:::i;:::-;2085:26;;2080:131;2117:1;2113;:5;2080:131;;;-1:-1:-1;;;2161:5:21;2169:3;2161:11;2152:21;;;;;;;:::i;:::-;;;;2140:6;2147:1;2140:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;2140:33:21;;;;;;;;-1:-1:-1;2198:1:21;2188:11;;;;;2120:3;;;:::i;:::-;;;2080:131;;;-1:-1:-1;2229:10:21;;2221:55;;;;-1:-1:-1;;;2221:55:21;;39755:2:22;2221:55:21;;;39737:21:22;;;39774:18;;;39767:30;39833:34;39813:18;;;39806:62;39885:18;;2221:55:21;39553:356:22;457:716:21;513:13;564:14;581:17;592:5;581:10;:17::i;:::-;601:1;581:21;564:38;;617:20;651:6;-1:-1:-1;;;;;640:18:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;640:18:21;-1:-1:-1;617:41:21;-1:-1:-1;782:28:21;;;798:2;782:28;839:288;-1:-1:-1;;871:5:21;-1:-1:-1;;;1008:2:21;997:14;;992:30;871:5;979:44;1069:2;1060:11;;;-1:-1:-1;1090:21:21;839:288;1090:21;-1:-1:-1;1148:6:21;457:716;-1:-1:-1;;;457:716:21:o;26505:540:18:-;26577:13;26603:24;26643:9;26638:346;26660:18;;;26719:32;;;:23;:32;;;;;;;;;26704:48;;:14;:48;;;;;;;:75;;;26660:120;;-1:-1:-1;;;26660:120:18;;-1:-1:-1;;;;;26660:18:18;;;;:43;;:120;;;;2324:25:22;;;2312:2;2297:18;;2178:177;26660:120:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26656:1;:124;26638:346;;;26851:18;;;26905:32;;;:23;:32;;;;;;;;;26890:48;;:14;:48;;;;;;;:75;;;26851:118;;-1:-1:-1;;;26851:118:18;;;;;40088:25:22;;;;40129:18;;;40122:34;;;26839:10:18;;-1:-1:-1;;;;;26851:18:18;;:38;;40061:18:22;;26851:118:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26851:118:18;;;;;;;;;;;;:::i;:::-;26822:148;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26802:169;;26782:3;;;;;:::i;:::-;;;;26638:346;;;;27025:10;27008:28;;;;;;;;:::i;1403:132:19:-;1311:6;;-1:-1:-1;;;;;1311:6:19;736:10:2;1467:23:19;1459:68;;;;-1:-1:-1;;;1459:68:19;;41317:2:22;1459:68:19;;;41299:21:22;;;41336:18;;;41329:30;41395:34;41375:18;;;41368:62;41447:18;;1459:68:19;41115:356:22;2498:191:19;2591:6;;;-1:-1:-1;;;;;2608:17:19;;;-1:-1:-1;;;;;;2608:17:19;;;;;;;2641:40;;2591:6;;;2608:17;2591:6;;2641:40;;2572:16;;2641:40;2561:128;2498:191;:::o;13191:281:5:-;13312:8;-1:-1:-1;;;;;13303:17:5;:5;-1:-1:-1;;;;;13303:17:5;;13295:55;;;;-1:-1:-1;;;13295:55:5;;41678:2:22;13295:55:5;;;41660:21:22;41717:2;41697:18;;;41690:30;-1:-1:-1;;;41736:18:22;;;41729:55;41801:18;;13295:55:5;41476:349:22;13295:55:5;-1:-1:-1;;;;;13361:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13361:46:5;;;;;;;;;;13423:41;;540::22;;;13423::5;;513:18:22;13423:41:5;;;;;;;13191:281;;;:::o;6452:270::-;6565:28;6575:4;6581:2;6585:7;6565:9;:28::i;:::-;6612:47;6635:4;6641:2;6645:7;6654:4;6612:22;:47::i;:::-;6604:110;;;;-1:-1:-1;;;6604:110:5;;;;;;;:::i;525:3097:1:-;583:13;820:4;:11;835:1;820:16;816:31;;-1:-1:-1;;838:9:1;;;;;;;;;-1:-1:-1;838:9:1;;;525:3097::o;816:31::-;900:19;922:6;;;;;;;;;;;;;;;;;900:28;;1339:20;1398:1;1379:4;:11;1393:1;1379:15;;;;:::i;:::-;1378:21;;;;:::i;:::-;1373:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;1362:39:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:39:1;;1339:62;;1581:1;1574:5;1570:13;1685:2;1677:6;1673:15;1796:4;1848;1842:11;1836:4;1832:22;1758:1432;1882:6;1873:7;1870:19;1758:1432;;;1988:1;1979:7;1975:15;1964:26;;2027:7;2021:14;2680:4;2672:5;2668:2;2664:14;2660:25;2650:8;2646:40;2640:47;2629:9;2621:67;2734:1;2723:9;2719:17;2706:30;;2826:4;2818:5;2814:2;2810:14;2806:25;2796:8;2792:40;2786:47;2775:9;2767:67;2880:1;2869:9;2865:17;2852:30;;2971:4;2963:5;2960:1;2956:13;2952:24;2942:8;2938:39;2932:46;2921:9;2913:66;3025:1;3014:9;3010:17;2997:30;;3108:4;3101:5;3097:16;3087:8;3083:31;3077:38;3066:9;3058:58;;3162:1;3151:9;3147:17;3134:30;;1758:1432;;;1762:107;;3352:1;3345:4;3339:11;3335:19;3373:1;3368:123;;;;3510:1;3505:73;;;;3328:250;;3368:123;3421:4;3417:1;3406:9;3402:17;3394:32;3471:4;3467:1;3456:9;3452:17;3444:32;3368:123;;3505:73;3558:4;3554:1;3543:9;3539:17;3531:32;3328:250;-1:-1:-1;3608:6:1;;525:3097;-1:-1:-1;;;;;525:3097:1:o;21003:325:18:-;21090:11;21139:32;;;:23;:32;;;;;;;;;21114:58;;:24;:58;;;;;:81;;;21063:13;;21090:11;21104:91;;21163:7;21104:91;:::i;:::-;21237:44;21696:33;;;:23;:33;;;;;;;;;21237:44;;:14;:44;;;;;21090:105;;-1:-1:-1;21304:14:18;21090:105;21304:12;:14::i;:::-;21220:99;;;;;;;;;:::i;1035:224:6:-;1137:4;-1:-1:-1;;;;;;1161:50:6;;-1:-1:-1;;;1161:50:6;;:90;;;1215:36;1239:11;1215:23;:36::i;7266:128:5:-;7331:4;6929:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6929:16:5;7355:31;;;7266:128::o;2172:915:6:-;2439:1;2427:9;:13;2423:222;;;2570:63;;-1:-1:-1;;;2570:63:6;;42987:2:22;2570:63:6;;;42969:21:22;43026:2;43006:18;;;42999:30;43065:34;43045:18;;;43038:62;-1:-1:-1;;;43116:18:22;;;43109:51;43177:19;;2570:63:6;42785:417:22;2423:222:6;2675:12;-1:-1:-1;;;;;2704:18:6;;2700:187;;2739:40;2771:7;3914:10;:17;;3887:24;;;;:15;:24;;;;;:44;;;3942:24;;;;;;;;;;;;3810:164;2739:40;2700:187;;;2809:2;-1:-1:-1;;;;;2801:10:6;:4;-1:-1:-1;;;;;2801:10:6;;2797:90;;2828:47;2861:4;2867:7;2828:32;:47::i;:::-;-1:-1:-1;;;;;2901:16:6;;2897:183;;2934:45;2971:7;2934:36;:45::i;2897:183::-;3007:4;-1:-1:-1;;;;;3001:10:6;:2;-1:-1:-1;;;;;3001:10:6;;2997:83;;3028:40;3056:2;3060:7;3028:27;:40::i;8167:110:5:-;8243:26;8253:2;8257:7;8243:26;;;;;;;;;;;;:9;:26::i;10390:948:17:-;10443:7;;-1:-1:-1;;;10521:17:17;;10517:106;;-1:-1:-1;;;10559:17:17;;;-1:-1:-1;10605:2:17;10595:12;10517:106;10650:8;10641:5;:17;10637:106;;10688:8;10679:17;;;-1:-1:-1;10725:2:17;10715:12;10637:106;10770:8;10761:5;:17;10757:106;;10808:8;10799:17;;;-1:-1:-1;10845:2:17;10835:12;10757:106;10890:7;10881:5;:16;10877:103;;10927:7;10918:16;;;-1:-1:-1;10963:1:17;10953:11;10877:103;11007:7;10998:5;:16;10994:103;;11044:7;11035:16;;;-1:-1:-1;11080:1:17;11070:11;10994:103;11124:7;11115:5;:16;11111:103;;11161:7;11152:16;;;-1:-1:-1;11197:1:17;11187:11;11111:103;11241:7;11232:5;:16;11228:68;;11279:1;11269:11;11324:6;10390:948;-1:-1:-1;;10390:948:17:o;14260:853:5:-;14414:4;-1:-1:-1;;;;;14435:13:5;;1746:19:0;:23;14431:675:5;;14471:71;;-1:-1:-1;;;14471:71:5;;-1:-1:-1;;;;;14471:36:5;;;;;:71;;736:10:2;;14522:4:5;;14528:7;;14537:4;;14471:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14471:71:5;;;;;;;;-1:-1:-1;;14471:71:5;;;;;;;;;;;;:::i;:::-;;;14467:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14712:6;:13;14729:1;14712:18;14708:328;;14755:60;;-1:-1:-1;;;14755:60:5;;;;;;;:::i;14708:328::-;14986:6;14980:13;14971:6;14967:2;14963:15;14956:38;14467:584;-1:-1:-1;;;;;;14593:51:5;-1:-1:-1;;;14593:51:5;;-1:-1:-1;14586:58:5;;14431:675;-1:-1:-1;15090:4:5;14260:853;;;;;;:::o;1558:305::-;1660:4;-1:-1:-1;;;;;;1697:40:5;;-1:-1:-1;;;1697:40:5;;:105;;-1:-1:-1;;;;;;;1754:48:5;;-1:-1:-1;;;1754:48:5;1697:105;:158;;;-1:-1:-1;;;;;;;;;;965:40:3;;;1819:36:5;856:157:3;4601:988:6;4867:22;4917:1;4892:22;4909:4;4892:16;:22::i;:::-;:26;;;;:::i;:::-;4929:18;4950:26;;;:17;:26;;;;;;4867:51;;-1:-1:-1;5083:28:6;;;5079:328;;-1:-1:-1;;;;;5150:18:6;;5128:19;5150:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5201:30;;;;;;:44;;;5318:30;;:17;:30;;;;;:43;;;5079:328;-1:-1:-1;5503:26:6;;;;:17;:26;;;;;;;;5496:33;;;-1:-1:-1;;;;;5547:18:6;;;;;:12;:18;;;;;:34;;;;;;;5540:41;4601:988::o;5884:1079::-;6162:10;:17;6137:22;;6162:21;;6182:1;;6162:21;:::i;:::-;6194:18;6215:24;;;:15;:24;;;;;;6588:10;:26;;6137:46;;-1:-1:-1;6215:24:6;;6137:46;;6588:26;;;;;;:::i;:::-;;;;;;;;;6566:48;;6652:11;6627:10;6638;6627:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6732:28;;;:15;:28;;;;;;;:41;;;6904:24;;;;;6897:31;6939:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5955:1008;;;5884:1079;:::o;3388:221::-;3473:14;3490:20;3507:2;3490:16;:20::i;:::-;-1:-1:-1;;;;;3521:16:6;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3566:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3388:221:6:o;8504:285:5:-;8599:18;8605:2;8609:7;8599:5;:18::i;:::-;8650:53;8681:1;8685:2;8689:7;8698:4;8650:22;:53::i;:::-;8628:153;;;;-1:-1:-1;;;8628:153:5;;;;;;;:::i;9125:942::-;-1:-1:-1;;;;;9205:16:5;;9197:61;;;;-1:-1:-1;;;9197:61:5;;44289:2:22;9197:61:5;;;44271:21:22;;;44308:18;;;44301:30;44367:34;44347:18;;;44340:62;44419:18;;9197:61:5;44087:356:22;9197:61:5;9278:16;9286:7;9278;:16::i;:::-;9277:17;9269:58;;;;-1:-1:-1;;;9269:58:5;;;;;;;:::i;:::-;9340:48;9369:1;9373:2;9377:7;9386:1;9340:20;:48::i;:::-;9487:16;9495:7;9487;:16::i;:::-;9486:17;9478:58;;;;-1:-1:-1;;;9478:58:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;9885:13:5;;;;;;:9;:13;;;;;;;;:18;;9902:1;9885:18;;;9927:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9927:21:5;;;;;9966:33;9935:7;;9885:13;;-1:-1:-1;;;;;;;;;;;9966:33:5;9885:13;;9966:33;4241:155;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:22;-1:-1:-1;;;;;;88:32:22;;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:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:22;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:22;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:22:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:22;;1348:180;-1:-1:-1;1348:180:22:o;1533:203::-;-1:-1:-1;;;;;1697:32:22;;;;1679:51;;1667:2;1652:18;;1533:203::o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:22;;1848:42;;1838:70;;1904:1;1901;1894:12;1919:254;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:22:o;2360:::-;2428:6;2436;2489:2;2477:9;2468:7;2464:23;2460:32;2457:52;;;2505:1;2502;2495:12;2457:52;2541:9;2528:23;2518:33;;2570:38;2604:2;2593:9;2589:18;2570:38;:::i;:::-;2560:48;;2360:254;;;;;:::o;2619:328::-;2696:6;2704;2712;2765:2;2753:9;2744:7;2740:23;2736:32;2733:52;;;2781:1;2778;2771:12;2733:52;2804:29;2823:9;2804:29;:::i;:::-;2794:39;;2852:38;2886:2;2875:9;2871:18;2852:38;:::i;:::-;2842:48;;2937:2;2926:9;2922:18;2909:32;2899:42;;2619:328;;;;;:::o;2952:248::-;3020:6;3028;3081:2;3069:9;3060:7;3056:23;3052:32;3049:52;;;3097:1;3094;3087:12;3049:52;-1:-1:-1;;3120:23:22;;;3190:2;3175:18;;;3162:32;;-1:-1:-1;2952:248:22:o;3205:274::-;-1:-1:-1;;;;;3397:32:22;;;;3379:51;;3461:2;3446:18;;3439:34;3367:2;3352:18;;3205:274::o;3484:529::-;3588:6;3596;3604;3612;3620;3628;3681:3;3669:9;3660:7;3656:23;3652:33;3649:53;;;3698:1;3695;3688:12;3649:53;3734:9;3721:23;3711:33;;3791:2;3780:9;3776:18;3763:32;3753:42;;3842:2;3831:9;3827:18;3814:32;3804:42;;3893:2;3882:9;3878:18;3865:32;3855:42;;3944:3;3933:9;3929:19;3916:33;3906:43;;3968:39;4002:3;3991:9;3987:19;3968:39;:::i;:::-;3958:49;;3484:529;;;;;;;;:::o;4018:999::-;4293:2;4282:9;4275:21;4256:4;4319:45;4360:2;4349:9;4345:18;4337:6;4319:45;:::i;:::-;4383:2;4421:6;4416:2;4405:9;4401:18;4394:34;4476:9;4468:6;4464:22;4459:2;4448:9;4444:18;4437:50;4507:6;4542;4536:13;4573:6;4565;4558:22;4608:2;4600:6;4596:15;4589:22;;4667:2;4657:6;4654:1;4650:14;4642:6;4638:27;4634:36;4705:2;4697:6;4693:15;4726:1;4736:252;4750:6;4747:1;4744:13;4736:252;;;4840:2;4836:7;4827:6;4819;4815:19;4811:33;4806:3;4799:46;4868:40;4901:6;4892;4886:13;4868:40;:::i;:::-;4966:12;;;;4858:50;-1:-1:-1;4931:15:22;;;;4772:1;4765:9;4736:252;;;-1:-1:-1;5005:6:22;;4018:999;-1:-1:-1;;;;;;;;;;4018:999:22:o;5800:127::-;5861:10;5856:3;5852:20;5849:1;5842:31;5892:4;5889:1;5882:15;5916:4;5913:1;5906:15;5932:275;6003:2;5997:9;6068:2;6049:13;;-1:-1:-1;;6045:27:22;6033:40;;-1:-1:-1;;;;;6088:34:22;;6124:22;;;6085:62;6082:88;;;6150:18;;:::i;:::-;6186:2;6179:22;5932:275;;-1:-1:-1;5932:275:22:o;6212:187::-;6261:4;-1:-1:-1;;;;;6286:6:22;6283:30;6280:56;;;6316:18;;:::i;:::-;-1:-1:-1;6382:2:22;6361:15;-1:-1:-1;;6357:29:22;6388:4;6353:40;;6212:187::o;6404:338::-;6469:5;6498:53;6514:36;6543:6;6514:36;:::i;:::-;6498:53;:::i;:::-;6489:62;;6574:6;6567:5;6560:21;6614:3;6605:6;6600:3;6596:16;6593:25;6590:45;;;6631:1;6628;6621:12;6590:45;6680:6;6675:3;6668:4;6661:5;6657:16;6644:43;6734:1;6727:4;6718:6;6711:5;6707:18;6703:29;6696:40;6404:338;;;;;:::o;6747:222::-;6790:5;6843:3;6836:4;6828:6;6824:17;6820:27;6810:55;;6861:1;6858;6851:12;6810:55;6883:80;6959:3;6950:6;6937:20;6930:4;6922:6;6918:17;6883:80;:::i;6974:390::-;7052:6;7060;7113:2;7101:9;7092:7;7088:23;7084:32;7081:52;;;7129:1;7126;7119:12;7081:52;7165:9;7152:23;7142:33;;7226:2;7215:9;7211:18;7198:32;-1:-1:-1;;;;;7245:6:22;7242:30;7239:50;;;7285:1;7282;7275:12;7239:50;7308;7350:7;7341:6;7330:9;7326:22;7308:50;:::i;:::-;7298:60;;;6974:390;;;;;:::o;7369:186::-;7428:6;7481:2;7469:9;7460:7;7456:23;7452:32;7449:52;;;7497:1;7494;7487:12;7449:52;7520:29;7539:9;7520:29;:::i;7560:182::-;7619:4;-1:-1:-1;;;;;7644:6:22;7641:30;7638:56;;;7674:18;;:::i;:::-;-1:-1:-1;7719:1:22;7715:14;7731:4;7711:25;;7560:182::o;7747:887::-;7800:5;7853:3;7846:4;7838:6;7834:17;7830:27;7820:55;;7871:1;7868;7861:12;7820:55;7907:6;7894:20;7933:4;7957:59;7973:42;8012:2;7973:42;:::i;7957:59::-;8050:15;;;8136:1;8132:10;;;;8120:23;;8116:32;;;8081:12;;;;8160:15;;;8157:35;;;8188:1;8185;8178:12;8157:35;8224:2;8216:6;8212:15;8236:369;8252:6;8247:3;8244:15;8236:369;;;8338:3;8325:17;-1:-1:-1;;;;;8361:11:22;8358:35;8355:125;;;8434:1;8463:2;8459;8452:14;8355:125;8505:57;8558:3;8553:2;8539:11;8531:6;8527:24;8523:33;8505:57;:::i;:::-;8493:70;;-1:-1:-1;8583:12:22;;;;8269;;8236:369;;;-1:-1:-1;8623:5:22;7747:887;-1:-1:-1;;;;;;7747:887:22:o;8639:1931::-;8893:6;8901;8909;8917;8925;8933;8941;8949;8957;8965;8973:7;9027:3;9015:9;9006:7;9002:23;8998:33;8995:53;;;9044:1;9041;9034:12;8995:53;9080:9;9067:23;9057:33;;-1:-1:-1;;;;;9176:2:22;9170;9159:9;9155:18;9142:32;9139:40;9136:60;;;9192:1;9189;9182:12;9136:60;9215:76;9283:7;9276:2;9265:9;9261:18;9248:32;9237:9;9233:48;9215:76;:::i;:::-;9205:86;;9340:2;9334;9323:9;9319:18;9306:32;9303:40;9300:60;;;9356:1;9353;9346:12;9300:60;9379:76;9447:7;9440:2;9429:9;9425:18;9412:32;9401:9;9397:48;9379:76;:::i;:::-;9369:86;;9504:2;9498;9487:9;9483:18;9470:32;9467:40;9464:60;;;9520:1;9517;9510:12;9464:60;9543:76;9611:7;9604:2;9593:9;9589:18;9576:32;9565:9;9561:48;9543:76;:::i;:::-;9533:86;;9669:2;9662:3;9651:9;9647:19;9634:33;9631:41;9628:61;;;9685:1;9682;9675:12;9628:61;9708:77;9777:7;9769:3;9758:9;9754:19;9741:33;9730:9;9726:49;9708:77;:::i;:::-;9698:87;;9835:2;9828:3;9817:9;9813:19;9800:33;9797:41;9794:61;;;9851:1;9848;9841:12;9794:61;9874:77;9943:7;9935:3;9924:9;9920:19;9907:33;9896:9;9892:49;9874:77;:::i;:::-;9864:87;;10001:2;9994:3;9983:9;9979:19;9966:33;9963:41;9960:61;;;10017:1;10014;10007:12;9960:61;10040:77;10109:7;10101:3;10090:9;10086:19;10073:33;10062:9;10058:49;10040:77;:::i;:::-;10030:87;;10167:2;10160:3;10149:9;10145:19;10132:33;10129:41;10126:61;;;10183:1;10180;10173:12;10126:61;10206:77;10275:7;10267:3;10256:9;10252:19;10239:33;10228:9;10224:49;10206:77;:::i;:::-;10196:87;;10330:3;10319:9;10315:19;10302:33;10292:43;;10382:3;10371:9;10367:19;10354:33;10344:43;;10437:2;10430:3;10419:9;10415:19;10402:33;10399:41;10396:61;;;10453:1;10450;10443:12;10396:61;;10477:87;10556:7;10548:3;10537:9;10533:19;10520:33;10509:9;10505:49;10477:87;:::i;:::-;10466:98;;8639:1931;;;;;;;;;;;;;;:::o;10575:460::-;10670:6;10678;10686;10694;10702;10755:3;10743:9;10734:7;10730:23;10726:33;10723:53;;;10772:1;10769;10762:12;10723:53;10808:9;10795:23;10785:33;;10837:38;10871:2;10860:9;10856:18;10837:38;:::i;:::-;10575:460;;10827:48;;-1:-1:-1;;;;10922:2:22;10907:18;;10894:32;;10973:2;10958:18;;10945:32;;11024:3;11009:19;;;10996:33;;-1:-1:-1;10575:460:22:o;11040:383::-;11237:2;11226:9;11219:21;11200:4;11263:45;11304:2;11293:9;11289:18;11281:6;11263:45;:::i;:::-;11356:9;11348:6;11344:22;11339:2;11328:9;11324:18;11317:50;11384:33;11410:6;11402;11384:33;:::i;:::-;11376:41;11040:383;-1:-1:-1;;;;;11040:383:22:o;11428:343::-;11494:6;11502;11555:2;11543:9;11534:7;11530:23;11526:32;11523:52;;;11571:1;11568;11561:12;11523:52;11610:9;11597:23;11660:4;11653:5;11649:16;11642:5;11639:27;11629:55;;11680:1;11677;11670:12;11629:55;11703:5;-1:-1:-1;11727:38:22;11761:2;11746:18;;11727:38;:::i;11776:316::-;11853:6;11861;11869;11922:2;11910:9;11901:7;11897:23;11893:32;11890:52;;;11938:1;11935;11928:12;11890:52;-1:-1:-1;;11961:23:22;;;12031:2;12016:18;;12003:32;;-1:-1:-1;12082:2:22;12067:18;;;12054:32;;11776:316;-1:-1:-1;11776:316:22:o;12097:118::-;12183:5;12176:13;12169:21;12162:5;12159:32;12149:60;;12205:1;12202;12195:12;12220:315;12285:6;12293;12346:2;12334:9;12325:7;12321:23;12317:32;12314:52;;;12362:1;12359;12352:12;12314:52;12385:29;12404:9;12385:29;:::i;:::-;12375:39;;12464:2;12453:9;12449:18;12436:32;12477:28;12499:5;12477:28;:::i;:::-;12524:5;12514:15;;;12220:315;;;;;:::o;12540:1383::-;12712:6;12720;12728;12781:2;12769:9;12760:7;12756:23;12752:32;12749:52;;;12797:1;12794;12787:12;12749:52;12837:9;12824:23;-1:-1:-1;;;;;12907:2:22;12899:6;12896:14;12893:34;;;12923:1;12920;12913:12;12893:34;12961:6;12950:9;12946:22;12936:32;;13006:7;12999:4;12995:2;12991:13;12987:27;12977:55;;13028:1;13025;13018:12;12977:55;13064:2;13051:16;13086:4;13110:59;13126:42;13165:2;13126:42;:::i;13110:59::-;13203:15;;;13285:1;13281:10;;;;13273:19;;13269:28;;;13234:12;;;;13309:19;;;13306:39;;;13341:1;13338;13331:12;13306:39;13365:11;;;;13385:142;13401:6;13396:3;13393:15;13385:142;;;13467:17;;13455:30;;13418:12;;;;13505;;;;13385:142;;;13546:5;-1:-1:-1;;13589:18:22;;13576:32;;-1:-1:-1;;13620:16:22;;;13617:36;;;13649:1;13646;13639:12;13617:36;13672:62;13726:7;13715:8;13704:9;13700:24;13672:62;:::i;:::-;13662:72;;13787:2;13776:9;13772:18;13759:32;13743:48;;13816:2;13806:8;13803:16;13800:36;;;13832:1;13829;13822:12;13800:36;;13855:62;13909:7;13898:8;13887:9;13883:24;13855:62;:::i;:::-;13845:72;;;12540:1383;;;;;:::o;13928:667::-;14023:6;14031;14039;14047;14100:3;14088:9;14079:7;14075:23;14071:33;14068:53;;;14117:1;14114;14107:12;14068:53;14140:29;14159:9;14140:29;:::i;:::-;14130:39;;14188:38;14222:2;14211:9;14207:18;14188:38;:::i;:::-;14178:48;;14273:2;14262:9;14258:18;14245:32;14235:42;;14328:2;14317:9;14313:18;14300:32;-1:-1:-1;;;;;14347:6:22;14344:30;14341:50;;;14387:1;14384;14377:12;14341:50;14410:22;;14463:4;14455:13;;14451:27;-1:-1:-1;14441:55:22;;14492:1;14489;14482:12;14441:55;14515:74;14581:7;14576:2;14563:16;14558:2;14554;14550:11;14515:74;:::i;:::-;14505:84;;;13928:667;;;;;;;:::o;14600:1039::-;14989:3;14978:9;14971:22;14952:4;15016:46;15057:3;15046:9;15042:19;15034:6;15016:46;:::i;:::-;15110:9;15102:6;15098:22;15093:2;15082:9;15078:18;15071:50;15144:33;15170:6;15162;15144:33;:::i;:::-;15130:47;;15225:9;15217:6;15213:22;15208:2;15197:9;15193:18;15186:50;15259:33;15285:6;15277;15259:33;:::i;:::-;15245:47;;15340:9;15332:6;15328:22;15323:2;15312:9;15308:18;15301:50;15374:33;15400:6;15392;15374:33;:::i;:::-;15360:47;;15456:9;15448:6;15444:22;15438:3;15427:9;15423:19;15416:51;15490:33;15516:6;15508;15490:33;:::i;:::-;15476:47;;15572:9;15564:6;15560:22;15554:3;15543:9;15539:19;15532:51;15600:33;15626:6;15618;15600:33;:::i;:::-;15592:41;14600:1039;-1:-1:-1;;;;;;;;;14600:1039:22:o;15644:746::-;15767:6;15775;15783;15791;15799;15807;15815;15868:3;15856:9;15847:7;15843:23;15839:33;15836:53;;;15885:1;15882;15875:12;15836:53;15921:9;15908:23;15898:33;;15950:38;15984:2;15973:9;15969:18;15950:38;:::i;:::-;15940:48;;16007:38;16041:2;16030:9;16026:18;16007:38;:::i;:::-;15997:48;;16096:2;16085:9;16081:18;16068:32;-1:-1:-1;;;;;16115:6:22;16112:30;16109:50;;;16155:1;16152;16145:12;16109:50;16178;16220:7;16211:6;16200:9;16196:22;16178:50;:::i;:::-;15644:746;;;;-1:-1:-1;15644:746:22;;16275:3;16260:19;;16247:33;;16327:3;16312:19;;16299:33;;-1:-1:-1;16379:3:22;16364:19;;;16351:33;;-1:-1:-1;15644:746:22;-1:-1:-1;;;15644:746:22:o;16395:1852::-;16631:6;16639;16647;16655;16663;16671;16679;16687;16695;16748:3;16736:9;16727:7;16723:23;16719:33;16716:53;;;16765:1;16762;16755:12;16716:53;16805:9;16792:23;-1:-1:-1;;;;;16875:2:22;16867:6;16864:14;16861:34;;;16891:1;16888;16881:12;16861:34;16914:50;16956:7;16947:6;16936:9;16932:22;16914:50;:::i;:::-;16904:60;;17017:2;17006:9;17002:18;16989:32;16973:48;;17046:2;17036:8;17033:16;17030:36;;;17062:1;17059;17052:12;17030:36;17085:52;17129:7;17118:8;17107:9;17103:24;17085:52;:::i;:::-;17075:62;;17190:2;17179:9;17175:18;17162:32;17146:48;;17219:2;17209:8;17206:16;17203:36;;;17235:1;17232;17225:12;17203:36;17258:52;17302:7;17291:8;17280:9;17276:24;17258:52;:::i;:::-;17248:62;;17363:2;17352:9;17348:18;17335:32;17319:48;;17392:2;17382:8;17379:16;17376:36;;;17408:1;17405;17398:12;17376:36;17431:52;17475:7;17464:8;17453:9;17449:24;17431:52;:::i;:::-;17421:62;;17536:3;17525:9;17521:19;17508:33;17492:49;;17566:2;17556:8;17553:16;17550:36;;;17582:1;17579;17572:12;17550:36;17605:52;17649:7;17638:8;17627:9;17623:24;17605:52;:::i;:::-;17595:62;;17710:3;17699:9;17695:19;17682:33;17666:49;;17740:2;17730:8;17727:16;17724:36;;;17756:1;17753;17746:12;17724:36;17779:52;17823:7;17812:8;17801:9;17797:24;17779:52;:::i;:::-;17769:62;;17884:3;17873:9;17869:19;17856:33;17840:49;;17914:2;17904:8;17901:16;17898:36;;;17930:1;17927;17920:12;17898:36;17953:52;17997:7;17986:8;17975:9;17971:24;17953:52;:::i;:::-;17943:62;;18052:3;18041:9;18037:19;18024:33;18014:43;;18110:3;18099:9;18095:19;18082:33;18066:49;;18140:2;18130:8;18127:16;18124:36;;;18156:1;18153;18146:12;18124:36;;18179:62;18233:7;18222:8;18211:9;18207:24;18179:62;:::i;:::-;18169:72;;;16395:1852;;;;;;;;;;;:::o;18252:260::-;18320:6;18328;18381:2;18369:9;18360:7;18356:23;18352:32;18349:52;;;18397:1;18394;18387:12;18349:52;18420:29;18439:9;18420:29;:::i;18517:602::-;18622:6;18630;18638;18646;18654;18707:3;18695:9;18686:7;18682:23;18678:33;18675:53;;;18724:1;18721;18714:12;18675:53;18760:9;18747:23;18737:33;;18789:38;18823:2;18812:9;18808:18;18789:38;:::i;:::-;18779:48;;18878:2;18867:9;18863:18;18850:32;-1:-1:-1;;;;;18897:6:22;18894:30;18891:50;;;18937:1;18934;18927:12;18891:50;18960;19002:7;18993:6;18982:9;18978:22;18960:50;:::i;:::-;18517:602;;;;-1:-1:-1;18950:60:22;;19057:2;19042:18;;19029:32;;-1:-1:-1;19108:3:22;19093:19;19080:33;;18517:602;-1:-1:-1;;;18517:602:22:o;19124:309::-;19189:6;19197;19250:2;19238:9;19229:7;19225:23;19221:32;19218:52;;;19266:1;19263;19256:12;19218:52;19302:9;19289:23;19279:33;;19362:2;19351:9;19347:18;19334:32;19375:28;19397:5;19375:28;:::i;19438:380::-;19517:1;19513:12;;;;19560;;;19581:61;;19635:4;19627:6;19623:17;19613:27;;19581:61;19688:2;19680:6;19677:14;19657:18;19654:38;19651:161;;19734:10;19729:3;19725:20;19722:1;19715:31;19769:4;19766:1;19759:15;19797:4;19794:1;19787:15;19651:161;;19438:380;;;:::o;20655:299::-;-1:-1:-1;;;;;20845:32:22;;;;20827:51;;-1:-1:-1;;;;;;20914:33:22;20909:2;20894:18;;20887:61;20815:2;20800:18;;20655:299::o;20959:245::-;21026:6;21079:2;21067:9;21058:7;21054:23;21050:32;21047:52;;;21095:1;21092;21085:12;21047:52;21127:9;21121:16;21146:28;21168:5;21146:28;:::i;21209:335::-;21411:2;21393:21;;;21450:2;21430:18;;;21423:30;-1:-1:-1;;;21484:2:22;21469:18;;21462:41;21535:2;21520:18;;21209:335::o;21904:409::-;22106:2;22088:21;;;22145:2;22125:18;;;22118:30;22184:34;22179:2;22164:18;;22157:62;-1:-1:-1;;;22250:2:22;22235:18;;22228:43;22303:3;22288:19;;21904:409::o;22318:127::-;22379:10;22374:3;22370:20;22367:1;22360:31;22410:4;22407:1;22400:15;22434:4;22431:1;22424:15;22450:168;22523:9;;;22554;;22571:15;;;22565:22;;22551:37;22541:71;;22592:18;;:::i;22755:217::-;22795:1;22821;22811:132;;22865:10;22860:3;22856:20;22853:1;22846:31;22900:4;22897:1;22890:15;22928:4;22925:1;22918:15;22811:132;-1:-1:-1;22957:9:22;;22755:217::o;23389:184::-;23459:6;23512:2;23500:9;23491:7;23487:23;23483:32;23480:52;;;23528:1;23525;23518:12;23480:52;-1:-1:-1;23551:16:22;;23389:184;-1:-1:-1;23389:184:22:o;23578:125::-;23643:9;;;23664:10;;;23661:36;;;23677:18;;:::i;24056:128::-;24123:9;;;24144:11;;;24141:37;;;24158:18;;:::i;24189:397::-;24391:2;24373:21;;;24430:2;24410:18;;;24403:30;24469:34;24464:2;24449:18;;24442:62;-1:-1:-1;;;24535:2:22;24520:18;;24513:31;24576:3;24561:19;;24189:397::o;25347:127::-;25408:10;25403:3;25399:20;25396:1;25389:31;25439:4;25436:1;25429:15;25463:4;25460:1;25453:15;25479:348;25681:2;25663:21;;;25720:2;25700:18;;;25693:30;-1:-1:-1;;;25754:2:22;25739:18;;25732:54;25818:2;25803:18;;25479:348::o;26304:545::-;26406:2;26401:3;26398:11;26395:448;;;26442:1;26467:5;26463:2;26456:17;26512:4;26508:2;26498:19;26582:2;26570:10;26566:19;26563:1;26559:27;26553:4;26549:38;26618:4;26606:10;26603:20;26600:47;;;-1:-1:-1;26641:4:22;26600:47;26696:2;26691:3;26687:12;26684:1;26680:20;26674:4;26670:31;26660:41;;26751:82;26769:2;26762:5;26759:13;26751:82;;;26814:17;;;26795:1;26784:13;26751:82;;27025:1352;27151:3;27145:10;-1:-1:-1;;;;;27170:6:22;27167:30;27164:56;;;27200:18;;:::i;:::-;27229:97;27319:6;27279:38;27311:4;27305:11;27279:38;:::i;:::-;27273:4;27229:97;:::i;:::-;27381:4;;27445:2;27434:14;;27462:1;27457:663;;;;28164:1;28181:6;28178:89;;;-1:-1:-1;28233:19:22;;;28227:26;28178:89;-1:-1:-1;;26982:1:22;26978:11;;;26974:24;26970:29;26960:40;27006:1;27002:11;;;26957:57;28280:81;;27427:944;;27457:663;26251:1;26244:14;;;26288:4;26275:18;;-1:-1:-1;;27493:20:22;;;27611:236;27625:7;27622:1;27619:14;27611:236;;;27714:19;;;27708:26;27693:42;;27806:27;;;;27774:1;27762:14;;;;27641:19;;27611:236;;;27615:3;27875:6;27866:7;27863:19;27860:201;;;27936:19;;;27930:26;-1:-1:-1;;28019:1:22;28015:14;;;28031:3;28011:24;28007:37;28003:42;27988:58;27973:74;;27860:201;-1:-1:-1;;;;;28107:1:22;28091:14;;;28087:22;28074:36;;-1:-1:-1;27025:1352:22:o;28382:722::-;28432:3;28473:5;28467:12;28502:36;28528:9;28502:36;:::i;:::-;28557:1;28574:18;;;28601:133;;;;28748:1;28743:355;;;;28567:531;;28601:133;-1:-1:-1;;28634:24:22;;28622:37;;28707:14;;28700:22;28688:35;;28679:45;;;-1:-1:-1;28601:133:22;;28743:355;28774:5;28771:1;28764:16;28803:4;28848:2;28845:1;28835:16;28873:1;28887:165;28901:6;28898:1;28895:13;28887:165;;;28979:14;;28966:11;;;28959:35;29022:16;;;;28916:10;;28887:165;;;28891:3;;;29081:6;29076:3;29072:16;29065:23;;28567:531;;;;;28382:722;;;;:::o;29109:369::-;29285:3;29323:6;29317:13;29339:66;29398:6;29393:3;29386:4;29378:6;29374:17;29339:66;:::i;:::-;29421:51;29464:6;29459:3;29455:16;29447:6;29421:51;:::i;29483:135::-;29522:3;29543:17;;;29540:43;;29563:18;;:::i;:::-;-1:-1:-1;29610:1:22;29599:13;;29483:135::o;29623:1884::-;-1:-1:-1;;;30574:3:22;30567:25;30549:3;30621:6;30615:13;30637:75;30705:6;30700:2;30695:3;30691:12;30684:4;30676:6;30672:17;30637:75;:::i;:::-;-1:-1:-1;;;30771:2:22;30731:16;;;30763:11;;;30756:37;30818:13;;30840:76;30818:13;30902:2;30894:11;;30887:4;30875:17;;30840:76;:::i;:::-;-1:-1:-1;;;30976:2:22;30935:17;;;;30968:11;;;30961:39;31019:46;31061:2;31053:11;;31045:6;31019:46;:::i;:::-;31009:56;;-1:-1:-1;;;31081:2:22;31074:15;-1:-1:-1;;;31113:1:22;31109:2;31105:10;31098:45;31174:6;31168:13;31190:76;31257:8;31252:2;31248;31244:11;31237:4;31229:6;31225:17;31190:76;:::i;:::-;-1:-1:-1;;;31326:2:22;31285:17;;;;31318:11;;;31311:25;31361:13;;31383:76;31361:13;31445:2;31437:11;;31430:4;31418:17;;31383:76;:::i;:::-;31479:17;31498:2;31475:26;;29623:1884;-1:-1:-1;;;;;;;29623:1884:22:o;32938:335::-;33140:2;33122:21;;;33179:2;33159:18;;;33152:30;-1:-1:-1;;;33213:2:22;33198:18;;33191:41;33264:2;33249:18;;32938:335::o;33947:496::-;34126:3;34164:6;34158:13;34180:66;34239:6;34234:3;34227:4;34219:6;34215:17;34180:66;:::i;:::-;34309:13;;34268:16;;;;34331:70;34309:13;34268:16;34378:4;34366:17;;34331:70;:::i;:::-;34417:20;;33947:496;-1:-1:-1;;;;33947:496:22:o;34448:458::-;34680:3;34718:6;34712:13;34734:66;34793:6;34788:3;34781:4;34773:6;34769:17;34734:66;:::i;:::-;-1:-1:-1;;;34822:16:22;;34847:24;;;-1:-1:-1;34898:1:22;34887:13;;34448:458;-1:-1:-1;34448:458:22:o;34911:975::-;35420:34;35408:47;;-1:-1:-1;;;35480:2:22;35471:12;;35464:46;-1:-1:-1;35529:47:22;35572:2;35563:12;;35555:6;35529:47;:::i;:::-;-1:-1:-1;;;35585:62:22;;35670:13;;35692:72;35670:13;35752:2;35744:11;;35739:2;35727:15;;35692:72;:::i;:::-;-1:-1:-1;;;35822:2:22;35783:15;;;;35814:11;;;35807:46;35877:2;35869:11;;34911:975;-1:-1:-1;;;;34911:975:22:o;35891:1974::-;36841:66;36836:3;36829:79;36947:10;36942:3;36938:20;36933:2;36928:3;36924:12;36917:42;36811:3;36988:6;36982:13;37004:73;37070:6;37065:2;37060:3;37056:12;37051:2;37043:6;37039:15;37004:73;:::i;:::-;-1:-1:-1;;;37136:2:22;37096:16;;;37128:11;;;37121:67;37207:46;37249:2;37241:11;;37233:6;37207:46;:::i;:::-;-1:-1:-1;;;37262:46:22;;37197:56;-1:-1:-1;37327:46:22;37369:2;37361:11;;37353:6;37327:46;:::i;:::-;-1:-1:-1;;;37382:56:22;;37317;-1:-1:-1;37457:46:22;37499:2;37491:11;;37483:6;37457:46;:::i;:::-;37447:56;;37523:66;37519:2;37512:78;-1:-1:-1;;;37614:2:22;37610;37606:11;37599:32;37662:6;37656:13;37678:74;37743:8;37738:2;37734;37730:11;37725:2;37717:6;37713:15;37678:74;:::i;:::-;-1:-1:-1;;;37812:2:22;37771:17;;;;37804:11;;;37797:35;37856:2;37848:11;;35891:1974;-1:-1:-1;;;;;;;35891:1974:22:o;38277:401::-;38479:2;38461:21;;;38518:2;38498:18;;;38491:30;38557:34;38552:2;38537:18;;38530:62;-1:-1:-1;;;38623:2:22;38608:18;;38601:35;38668:3;38653:19;;38277:401::o;39412:136::-;39451:3;39479:5;39469:39;;39488:18;;:::i;:::-;-1:-1:-1;;;39524:18:22;;39412:136::o;40167:649::-;40247:6;40300:2;40288:9;40279:7;40275:23;40271:32;40268:52;;;40316:1;40313;40306:12;40268:52;40349:9;40343:16;-1:-1:-1;;;;;40374:6:22;40371:30;40368:50;;;40414:1;40411;40404:12;40368:50;40437:22;;40490:4;40482:13;;40478:27;-1:-1:-1;40468:55:22;;40519:1;40516;40509:12;40468:55;40548:2;40542:9;40573:49;40589:32;40618:2;40589:32;:::i;40573:49::-;40645:2;40638:5;40631:17;40685:7;40680:2;40675;40671;40667:11;40663:20;40660:33;40657:53;;;40706:1;40703;40696:12;40657:53;40719:67;40783:2;40778;40771:5;40767:14;40762:2;40758;40754:11;40719:67;:::i;40821:289::-;40952:3;40990:6;40984:13;41006:66;41065:6;41060:3;41053:4;41045:6;41041:17;41006:66;:::i;:::-;41088:16;;;;;40821:289;-1:-1:-1;;40821:289:22:o;41830:414::-;42032:2;42014:21;;;42071:2;42051:18;;;42044:30;42110:34;42105:2;42090:18;;42083:62;-1:-1:-1;;;42176:2:22;42161:18;;42154:48;42234:3;42219:19;;41830:414::o;42249:531::-;42526:3;42554:38;42588:3;42580:6;42554:38;:::i;:::-;-1:-1:-1;;;42608:2:22;42601:16;42646:6;42640:13;42662:73;42728:6;42724:1;42720:2;42716:10;42709:4;42701:6;42697:17;42662:73;:::i;:::-;42755:15;42772:1;42751:23;;42249:531;-1:-1:-1;;;;42249:531:22:o;43207:489::-;-1:-1:-1;;;;;43476:15:22;;;43458:34;;43528:15;;43523:2;43508:18;;43501:43;43575:2;43560:18;;43553:34;;;43623:3;43618:2;43603:18;;43596:31;;;43401:4;;43644:46;;43670:19;;43662:6;43644:46;:::i;:::-;43636:54;43207:489;-1:-1:-1;;;;;;43207:489:22:o;43701:249::-;43770:6;43823:2;43811:9;43802:7;43798:23;43794:32;43791:52;;;43839:1;43836;43829:12;43791:52;43871:9;43865:16;43890:30;43914:5;43890:30;:::i;43955:127::-;44016:10;44011:3;44007:20;44004:1;43997:31;44047:4;44044:1;44037:15;44071:4;44068:1;44061:15;44448:352;44650:2;44632:21;;;44689:2;44669:18;;;44662:30;44728;44723:2;44708:18;;44701:58;44791:2;44776:18;;44448:352::o

Swarm Source

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