ETH Price: $2,724.30 (+12.46%)
 

Overview

TokenID

2385

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
SlothRoobOfficial

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 6 of 6: SlothRoobOfficial.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "./ERC721A.sol";
import "./MerkleProof.sol";
import "./Ownable.sol";

contract SlothRoobOfficial is ERC721A, Ownable {
  
  uint256 public mintPrice = 0.03 ether;
  uint256 public presalePrice = 0.02 ether;

  uint256 private reserveAtATime = 100;
  uint256 private reservedCount = 0;
  uint256 private maxReserveCount = 100;

  bytes32 public merkleRoot;
                              
  string _baseTokenURI;

  bool public isActive = false;
  bool public isPresaleActive = false;

  uint256 public MAX_SUPPLY = 5353;
  uint256 public maximumAllowedTokensPerPurchase = 5;
  uint256 public maximumAllowedTokensPerWallet = 10;
  uint256 public presaleMaximumTokensPerWallet = 5;

  constructor(string memory baseURI) ERC721A("Sloth Roob Official", "SRO") {
    setBaseURI(baseURI);
  }

  modifier saleIsOpen {
    require(totalSupply() <= MAX_SUPPLY, "Sale has ended.");
    _;
  }

  modifier onlyAuthorized() {
    require(owner() == msg.sender);
    _;
  }

  modifier isValidMerkleProof(bytes32[] calldata merkleProof) {
        require(
            MerkleProof.verify(
                merkleProof,
                merkleRoot,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist in list"
        );
      _;
  }

  function setMerkleRootHash(bytes32 _rootHash) public onlyAuthorized {
    merkleRoot = _rootHash;
  }

  function setMaximumAllowedTokens(uint256 _count) public onlyAuthorized {
    maximumAllowedTokensPerPurchase = _count;
  }

  function setMaximumAllowedTokensPerWallet(uint256 _count) public onlyAuthorized {
    maximumAllowedTokensPerWallet = _count;
  }

  function setPresaleMaximumTokensPerWallet(uint256 maxMint) external  onlyAuthorized {
    presaleMaximumTokensPerWallet = maxMint;
  }

  function setMaxMintSupply(uint256 maxMintSupply) external  onlyAuthorized {
    MAX_SUPPLY = maxMintSupply;
  }

  function setReserveAtATime(uint256 val) public onlyAuthorized {
    reserveAtATime = val;
  }

  function setMaxReserve(uint256 val) public onlyAuthorized {
    maxReserveCount = val;
  }

  function setPrice(uint256 _price) public onlyAuthorized {
    mintPrice = _price;
  }

  function setPresalePrice(uint256 _preslaePrice) public onlyAuthorized {
    presalePrice = _preslaePrice;
  }

  function toggleSaleStatus() public onlyAuthorized {
    isActive = !isActive;
  }

  function togglePresaleStatus() external onlyAuthorized {
    isPresaleActive = !isPresaleActive;
  }

  function setBaseURI(string memory baseURI) public onlyAuthorized {
    _baseTokenURI = baseURI;
  }


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

  function reserveNft() public onlyAuthorized {
    require(reservedCount <= maxReserveCount, "Max Reserves taken already!");

    _safeMint(msg.sender, reserveAtATime);
    reservedCount += reserveAtATime;
    
  }

  function batchAirdrop(uint256 _count, address[] calldata addresses) external onlyAuthorized {
    uint256 supply = totalSupply();

    require(supply + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(supply <= MAX_SUPPLY, "Total supply spent.");

    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add a null address");

      _safeMint(addresses[i], _count);

    }
  }

  function airdrop(uint256 _count, address _address) external onlyAuthorized {
    uint256 supply = totalSupply();

    require(supply + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(supply <= MAX_SUPPLY, "Total supply spent.");

    _safeMint(_address, _count);
  }

  function mint(uint256 _count) public payable saleIsOpen {
    uint256 mintIndex = totalSupply();

    require(isActive, "Sale is not active currently.");
    require(mintIndex + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(balanceOf(msg.sender) + _count <= maximumAllowedTokensPerWallet, "Max holding cap reached.");
    require( _count <= maximumAllowedTokensPerPurchase, "Exceeds maximum allowed tokens");
    require(msg.value >= mintPrice * _count, "Insufficient ETH amount sent.");

    _safeMint(msg.sender, _count);
    
  }

  function preSaleMint(bytes32[] calldata _merkleProof, uint256 _count) public payable isValidMerkleProof(_merkleProof) saleIsOpen {
    uint256 mintIndex = totalSupply();

    require(isPresaleActive, "Presale is not active");
    require(mintIndex < MAX_SUPPLY, "All tokens have been minted");
    require(balanceOf(msg.sender) + _count <= presaleMaximumTokensPerWallet, "Cannot purchase this many tokens");
    require(msg.value >= presalePrice * _count, "Insuffient ETH amount sent.");

    _safeMint(msg.sender, _count);
  }

  function withdraw() external onlyAuthorized {
    uint balance = address(this).balance;
    payable(owner()).transfer(balance);
  }
}

File 1 of 6: 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 2 of 6: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // 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;

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

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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-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 {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

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

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

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

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred.
     * This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred.
     * This includes minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 3 of 6: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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);

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 4 of 6: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"airdrop","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":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"batchAirdrop","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":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleMaximumTokensPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintSupply","type":"uint256"}],"name":"setMaxMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_rootHash","type":"bytes32"}],"name":"setMerkleRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"setPresaleMaximumTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preslaePrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setReserveAtATime","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":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052666a94d74f43000060095566470de4df820000600a556064600b556000600c556064600d556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506114e96011556005601255600a60135560056014553480156200008157600080fd5b5060405162004463380380620044638339818101604052810190620000a7919062000543565b6040518060400160405280601381526020017f536c6f746820526f6f62204f6666696369616c000000000000000000000000008152506040518060400160405280600381526020017f53524f000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200012b929190620002f6565b50806003908051906020019062000144929190620002f6565b50620001556200019560201b60201c565b60008190555050506200017d620001716200019a60201b60201c565b620001a260201b60201c565b6200018e816200026860201b60201c565b50620005f9565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff166200028f620002cc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002b057600080fd5b80600f9080519060200190620002c8929190620002f6565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200030490620005c3565b90600052602060002090601f01602090048101928262000328576000855562000374565b82601f106200034357805160ff191683800117855562000374565b8280016001018555821562000374579182015b828111156200037357825182559160200191906001019062000356565b5b50905062000383919062000387565b5090565b5b80821115620003a257600081600090555060010162000388565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200040f82620003c4565b810181811067ffffffffffffffff82111715620004315762000430620003d5565b5b80604052505050565b600062000446620003a6565b905062000454828262000404565b919050565b600067ffffffffffffffff821115620004775762000476620003d5565b5b6200048282620003c4565b9050602081019050919050565b60005b83811015620004af57808201518184015260208101905062000492565b83811115620004bf576000848401525b50505050565b6000620004dc620004d68462000459565b6200043a565b905082815260208101848484011115620004fb57620004fa620003bf565b5b620005088482856200048f565b509392505050565b600082601f830112620005285762000527620003ba565b5b81516200053a848260208601620004c5565b91505092915050565b6000602082840312156200055c576200055b620003b0565b5b600082015167ffffffffffffffff8111156200057d576200057c620003b5565b5b6200058b8482850162000510565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005dc57607f821691505b60208210811415620005f357620005f262000594565b5b50919050565b613e5a80620006096000396000f3fe6080604052600436106102665760003560e01c8063715018a611610144578063a0712d68116100b6578063cadf88181161007a578063cadf881814610889578063e985e9c5146108b4578063ea6eb836146108f1578063f2fde38b1461091a578063f6c9d9e314610943578063fb7e6ccb1461096c57610266565b8063a0712d68146107b5578063a22cb465146107d1578063b88d4fde146107fa578063bc63f02e14610823578063c87b56dd1461084c57610266565b80637f525323116101085780637f525323146106b95780638da5cb5b146106e257806391b7f5ed1461070d57806395d89b41146107365780639a3bf728146107615780639ba411b11461078c57610266565b8063715018a61461062f57806371e3500c146106465780637389fbb71461065d57806378179976146106865780637bffb4ce146106a257610266565b806332cb6b0c116101dd57806355f804b3116101a157806355f804b31461050d57806356a87caa1461053657806360d938dc1461055f5780636352211e1461058a5780636817c76c146105c757806370a08231146105f257610266565b806332cb6b0c146104505780633549345e1461047b5780633ccfd60b146104a457806342842e0e146104bb5780634dfea627146104e457610266565b8063095ea7b31161022f578063095ea7b31461035257806318160ddd1461037b57806322f3e2d4146103a657806323b872dd146103d157806327aebfbe146103fa5780632eb4a7ab1461042557610266565b80620e7fa81461026b57806301ffc9a714610296578063049c5c49146102d357806306fdde03146102ea578063081812fc14610315575b600080fd5b34801561027757600080fd5b50610280610995565b60405161028d9190612b09565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190612b90565b61099b565b6040516102ca9190612bd8565b60405180910390f35b3480156102df57600080fd5b506102e8610a2d565b005b3480156102f657600080fd5b506102ff610a98565b60405161030c9190612c8c565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190612cda565b610b2a565b6040516103499190612d48565b60405180910390f35b34801561035e57600080fd5b5061037960048036038101906103749190612d8f565b610ba6565b005b34801561038757600080fd5b50610390610ce7565b60405161039d9190612b09565b60405180910390f35b3480156103b257600080fd5b506103bb610cfe565b6040516103c89190612bd8565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190612dcf565b610d11565b005b34801561040657600080fd5b5061040f611036565b60405161041c9190612b09565b60405180910390f35b34801561043157600080fd5b5061043a61103c565b6040516104479190612e3b565b60405180910390f35b34801561045c57600080fd5b50610465611042565b6040516104729190612b09565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190612cda565b611048565b005b3480156104b057600080fd5b506104b9611091565b005b3480156104c757600080fd5b506104e260048036038101906104dd9190612dcf565b611126565b005b3480156104f057600080fd5b5061050b60048036038101906105069190612cda565b611146565b005b34801561051957600080fd5b50610534600480360381019061052f9190612f8b565b61118f565b005b34801561054257600080fd5b5061055d60048036038101906105589190612cda565b6111e8565b005b34801561056b57600080fd5b50610574611231565b6040516105819190612bd8565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612cda565b611244565b6040516105be9190612d48565b60405180910390f35b3480156105d357600080fd5b506105dc611256565b6040516105e99190612b09565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190612fd4565b61125c565b6040516106269190612b09565b60405180910390f35b34801561063b57600080fd5b50610644611315565b005b34801561065257600080fd5b5061065b611329565b005b34801561066957600080fd5b50610684600480360381019061067f9190612cda565b6113d8565b005b6106a0600480360381019061069b9190613061565b611421565b005b3480156106ae57600080fd5b506106b761167b565b005b3480156106c557600080fd5b506106e060048036038101906106db9190612cda565b6116e6565b005b3480156106ee57600080fd5b506106f761172f565b6040516107049190612d48565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190612cda565b611759565b005b34801561074257600080fd5b5061074b6117a2565b6040516107589190612c8c565b60405180910390f35b34801561076d57600080fd5b50610776611834565b6040516107839190612b09565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae91906130ed565b61183a565b005b6107cf60048036038101906107ca9190612cda565b611883565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613146565b611a75565b005b34801561080657600080fd5b50610821600480360381019061081c9190613227565b611bed565b005b34801561082f57600080fd5b5061084a600480360381019061084591906132aa565b611c60565b005b34801561085857600080fd5b50610873600480360381019061086e9190612cda565b611d4f565b6040516108809190612c8c565b60405180910390f35b34801561089557600080fd5b5061089e611dee565b6040516108ab9190612b09565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d691906132ea565b611df4565b6040516108e89190612bd8565b60405180910390f35b3480156108fd57600080fd5b5061091860048036038101906109139190612cda565b611e88565b005b34801561092657600080fd5b50610941600480360381019061093c9190612fd4565b611ed1565b005b34801561094f57600080fd5b5061096a60048036038101906109659190612cda565b611f55565b005b34801561097857600080fd5b50610993600480360381019061098e9190613380565b611f9e565b005b600a5481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a265750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16610a4c61172f565b73ffffffffffffffffffffffffffffffffffffffff1614610a6c57600080fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b606060028054610aa79061340f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad39061340f565b8015610b205780601f10610af557610100808354040283529160200191610b20565b820191906000526020600020905b815481529060010190602001808311610b0357829003601f168201915b5050505050905090565b6000610b358261216e565b610b6b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb182611244565b90508073ffffffffffffffffffffffffffffffffffffffff16610bd26121cd565b73ffffffffffffffffffffffffffffffffffffffff1614610c3557610bfe81610bf96121cd565b611df4565b610c34576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610cf16121d5565b6001546000540303905090565b601060009054906101000a900460ff1681565b6000610d1c826121da565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d83576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d8f846122a8565b91509150610da58187610da06121cd565b6122ca565b610df157610dba86610db56121cd565b611df4565b610df0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e58576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e65868686600161230e565b8015610e7057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f3e85610f1a888887612314565b7c02000000000000000000000000000000000000000000000000000000001761233c565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610fc6576000600185019050600060046000838152602001908152602001600020541415610fc4576000548114610fc3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461102e8686866001612367565b505050505050565b60145481565b600e5481565b60115481565b3373ffffffffffffffffffffffffffffffffffffffff1661106761172f565b73ffffffffffffffffffffffffffffffffffffffff161461108757600080fd5b80600a8190555050565b3373ffffffffffffffffffffffffffffffffffffffff166110b061172f565b73ffffffffffffffffffffffffffffffffffffffff16146110d057600080fd5b60004790506110dd61172f565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611122573d6000803e3d6000fd5b5050565b61114183838360405180602001604052806000815250611bed565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661116561172f565b73ffffffffffffffffffffffffffffffffffffffff161461118557600080fd5b8060128190555050565b3373ffffffffffffffffffffffffffffffffffffffff166111ae61172f565b73ffffffffffffffffffffffffffffffffffffffff16146111ce57600080fd5b80600f90805190602001906111e4929190612a4d565b5050565b3373ffffffffffffffffffffffffffffffffffffffff1661120761172f565b73ffffffffffffffffffffffffffffffffffffffff161461122757600080fd5b80600d8190555050565b601060019054906101000a900460ff1681565b600061124f826121da565b9050919050565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61131d61236d565b61132760006123eb565b565b3373ffffffffffffffffffffffffffffffffffffffff1661134861172f565b73ffffffffffffffffffffffffffffffffffffffff161461136857600080fd5b600d54600c5411156113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a69061348d565b60405180910390fd5b6113bb33600b546124b1565b600b54600c60008282546113cf91906134dc565b92505081905550565b3373ffffffffffffffffffffffffffffffffffffffff166113f761172f565b73ffffffffffffffffffffffffffffffffffffffff161461141757600080fd5b8060118190555050565b8282611497828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e543360405160200161147c919061357a565b604051602081830303815290604052805190602001206124cf565b6114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd906135e1565b60405180910390fd5b6011546114e1610ce7565b1115611522576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115199061364d565b60405180910390fd5b600061152c610ce7565b9050601060019054906101000a900460ff1661157d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611574906136b9565b60405180910390fd5b60115481106115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b890613725565b60405180910390fd5b601454846115ce3361125c565b6115d891906134dc565b1115611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161090613791565b60405180910390fd5b83600a5461162791906137b1565b341015611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090613857565b60405180910390fd5b61167333856124b1565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1661169a61172f565b73ffffffffffffffffffffffffffffffffffffffff16146116ba57600080fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff1661170561172f565b73ffffffffffffffffffffffffffffffffffffffff161461172557600080fd5b8060148190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1661177861172f565b73ffffffffffffffffffffffffffffffffffffffff161461179857600080fd5b8060098190555050565b6060600380546117b19061340f565b80601f01602080910402602001604051908101604052809291908181526020018280546117dd9061340f565b801561182a5780601f106117ff5761010080835404028352916020019161182a565b820191906000526020600020905b81548152906001019060200180831161180d57829003601f168201915b5050505050905090565b60125481565b3373ffffffffffffffffffffffffffffffffffffffff1661185961172f565b73ffffffffffffffffffffffffffffffffffffffff161461187957600080fd5b80600e8190555050565b60115461188e610ce7565b11156118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c69061364d565b60405180910390fd5b60006118d9610ce7565b9050601060009054906101000a900460ff1661192a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611921906138c3565b60405180910390fd5b601154828261193991906134dc565b111561197a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119719061392f565b60405180910390fd5b601354826119873361125c565b61199191906134dc565b11156119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c99061399b565b60405180910390fd5b601254821115611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90613a07565b60405180910390fd5b81600954611a2591906137b1565b341015611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90613a73565b60405180910390fd5b611a7133836124b1565b5050565b611a7d6121cd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ae2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611aef6121cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b9c6121cd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611be19190612bd8565b60405180910390a35050565b611bf8848484610d11565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c5a57611c23848484846124e6565b611c59576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16611c7f61172f565b73ffffffffffffffffffffffffffffffffffffffff1614611c9f57600080fd5b6000611ca9610ce7565b90506011548382611cba91906134dc565b1115611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf29061392f565b60405180910390fd5b601154811115611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3790613adf565b60405180910390fd5b611d4a82846124b1565b505050565b6060611d5a8261216e565b611d90576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611d9a612637565b9050600081511415611dbb5760405180602001604052806000815250611de6565b80611dc5846126c9565b604051602001611dd6929190613b3b565b6040516020818303038152906040525b915050919050565b60135481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16611ea761172f565b73ffffffffffffffffffffffffffffffffffffffff1614611ec757600080fd5b8060138190555050565b611ed961236d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4090613bd1565b60405180910390fd5b611f52816123eb565b50565b3373ffffffffffffffffffffffffffffffffffffffff16611f7461172f565b73ffffffffffffffffffffffffffffffffffffffff1614611f9457600080fd5b80600b8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16611fbd61172f565b73ffffffffffffffffffffffffffffffffffffffff1614611fdd57600080fd5b6000611fe7610ce7565b90506011548482611ff891906134dc565b1115612039576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120309061392f565b60405180910390fd5b60115481111561207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590613adf565b60405180910390fd5b60005b8383905081101561216757600073ffffffffffffffffffffffffffffffffffffffff168484838181106120b7576120b6613bf1565b5b90506020020160208101906120cc9190612fd4565b73ffffffffffffffffffffffffffffffffffffffff161415612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90613c6c565b60405180910390fd5b61215484848381811061213957612138613bf1565b5b905060200201602081019061214e9190612fd4565b866124b1565b808061215f90613c8c565b915050612081565b5050505050565b6000816121796121d5565b11158015612188575060005482105b80156121c6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806121e96121d5565b11612271576000548110156122705760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561226e575b6000811415612264576004600083600190039350838152602001908152602001600020549050612239565b80925050506122a3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861232b868684612723565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61237561272c565b73ffffffffffffffffffffffffffffffffffffffff1661239361172f565b73ffffffffffffffffffffffffffffffffffffffff16146123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090613d21565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124cb828260405180602001604052806000815250612734565b5050565b6000826124dc85846127d1565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261250c6121cd565b8786866040518563ffffffff1660e01b815260040161252e9493929190613d96565b6020604051808303816000875af192505050801561256a57506040513d601f19601f820116820180604052508101906125679190613df7565b60015b6125e4573d806000811461259a576040519150601f19603f3d011682016040523d82523d6000602084013e61259f565b606091505b506000815114156125dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546126469061340f565b80601f01602080910402602001604051908101604052809291908181526020018280546126729061340f565b80156126bf5780601f10612694576101008083540402835291602001916126bf565b820191906000526020600020905b8154815290600101906020018083116126a257829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561270f57600183039250600a81066030018353600a810490506126ef565b508181036020830392508083525050919050565b60009392505050565b600033905090565b61273e8383612827565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127cc57600080549050600083820390505b61277e60008683806001019450866124e6565b6127b4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061276b5781600054146127c957600080fd5b50505b505050565b60008082905060005b845181101561281c57612807828683815181106127fa576127f9613bf1565b5b60200260200101516129fb565b9150808061281490613c8c565b9150506127da565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612894576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156128cf576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128dc600084838561230e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612953836129446000866000612314565b61294d85612a26565b1761233c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612977578060008190555050506129f66000848385612367565b505050565b6000818310612a1357612a0e8284612a36565b612a1e565b612a1d8383612a36565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612a599061340f565b90600052602060002090601f016020900481019282612a7b5760008555612ac2565b82601f10612a9457805160ff1916838001178555612ac2565b82800160010185558215612ac2579182015b82811115612ac1578251825591602001919060010190612aa6565b5b509050612acf9190612ad3565b5090565b5b80821115612aec576000816000905550600101612ad4565b5090565b6000819050919050565b612b0381612af0565b82525050565b6000602082019050612b1e6000830184612afa565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6d81612b38565b8114612b7857600080fd5b50565b600081359050612b8a81612b64565b92915050565b600060208284031215612ba657612ba5612b2e565b5b6000612bb484828501612b7b565b91505092915050565b60008115159050919050565b612bd281612bbd565b82525050565b6000602082019050612bed6000830184612bc9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c2d578082015181840152602081019050612c12565b83811115612c3c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c5e82612bf3565b612c688185612bfe565b9350612c78818560208601612c0f565b612c8181612c42565b840191505092915050565b60006020820190508181036000830152612ca68184612c53565b905092915050565b612cb781612af0565b8114612cc257600080fd5b50565b600081359050612cd481612cae565b92915050565b600060208284031215612cf057612cef612b2e565b5b6000612cfe84828501612cc5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d3282612d07565b9050919050565b612d4281612d27565b82525050565b6000602082019050612d5d6000830184612d39565b92915050565b612d6c81612d27565b8114612d7757600080fd5b50565b600081359050612d8981612d63565b92915050565b60008060408385031215612da657612da5612b2e565b5b6000612db485828601612d7a565b9250506020612dc585828601612cc5565b9150509250929050565b600080600060608486031215612de857612de7612b2e565b5b6000612df686828701612d7a565b9350506020612e0786828701612d7a565b9250506040612e1886828701612cc5565b9150509250925092565b6000819050919050565b612e3581612e22565b82525050565b6000602082019050612e506000830184612e2c565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e9882612c42565b810181811067ffffffffffffffff82111715612eb757612eb6612e60565b5b80604052505050565b6000612eca612b24565b9050612ed68282612e8f565b919050565b600067ffffffffffffffff821115612ef657612ef5612e60565b5b612eff82612c42565b9050602081019050919050565b82818337600083830152505050565b6000612f2e612f2984612edb565b612ec0565b905082815260208101848484011115612f4a57612f49612e5b565b5b612f55848285612f0c565b509392505050565b600082601f830112612f7257612f71612e56565b5b8135612f82848260208601612f1b565b91505092915050565b600060208284031215612fa157612fa0612b2e565b5b600082013567ffffffffffffffff811115612fbf57612fbe612b33565b5b612fcb84828501612f5d565b91505092915050565b600060208284031215612fea57612fe9612b2e565b5b6000612ff884828501612d7a565b91505092915050565b600080fd5b600080fd5b60008083601f84011261302157613020612e56565b5b8235905067ffffffffffffffff81111561303e5761303d613001565b5b60208301915083602082028301111561305a57613059613006565b5b9250929050565b60008060006040848603121561307a57613079612b2e565b5b600084013567ffffffffffffffff81111561309857613097612b33565b5b6130a48682870161300b565b935093505060206130b786828701612cc5565b9150509250925092565b6130ca81612e22565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b60006020828403121561310357613102612b2e565b5b6000613111848285016130d8565b91505092915050565b61312381612bbd565b811461312e57600080fd5b50565b6000813590506131408161311a565b92915050565b6000806040838503121561315d5761315c612b2e565b5b600061316b85828601612d7a565b925050602061317c85828601613131565b9150509250929050565b600067ffffffffffffffff8211156131a1576131a0612e60565b5b6131aa82612c42565b9050602081019050919050565b60006131ca6131c584613186565b612ec0565b9050828152602081018484840111156131e6576131e5612e5b565b5b6131f1848285612f0c565b509392505050565b600082601f83011261320e5761320d612e56565b5b813561321e8482602086016131b7565b91505092915050565b6000806000806080858703121561324157613240612b2e565b5b600061324f87828801612d7a565b945050602061326087828801612d7a565b935050604061327187828801612cc5565b925050606085013567ffffffffffffffff81111561329257613291612b33565b5b61329e878288016131f9565b91505092959194509250565b600080604083850312156132c1576132c0612b2e565b5b60006132cf85828601612cc5565b92505060206132e085828601612d7a565b9150509250929050565b6000806040838503121561330157613300612b2e565b5b600061330f85828601612d7a565b925050602061332085828601612d7a565b9150509250929050565b60008083601f8401126133405761333f612e56565b5b8235905067ffffffffffffffff81111561335d5761335c613001565b5b60208301915083602082028301111561337957613378613006565b5b9250929050565b60008060006040848603121561339957613398612b2e565b5b60006133a786828701612cc5565b935050602084013567ffffffffffffffff8111156133c8576133c7612b33565b5b6133d48682870161332a565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061342757607f821691505b6020821081141561343b5761343a6133e0565b5b50919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b6000613477601b83612bfe565b915061348282613441565b602082019050919050565b600060208201905081810360008301526134a68161346a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134e782612af0565b91506134f283612af0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613527576135266134ad565b5b828201905092915050565b60008160601b9050919050565b600061354a82613532565b9050919050565b600061355c8261353f565b9050919050565b61357461356f82612d27565b613551565b82525050565b60006135868284613563565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b60006135cb601e83612bfe565b91506135d682613595565b602082019050919050565b600060208201905081810360008301526135fa816135be565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000613637600f83612bfe565b915061364282613601565b602082019050919050565b600060208201905081810360008301526136668161362a565b9050919050565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b60006136a3601583612bfe565b91506136ae8261366d565b602082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b600061370f601b83612bfe565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b600061377b602083612bfe565b915061378682613745565b602082019050919050565b600060208201905081810360008301526137aa8161376e565b9050919050565b60006137bc82612af0565b91506137c783612af0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613800576137ff6134ad565b5b828202905092915050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b6000613841601b83612bfe565b915061384c8261380b565b602082019050919050565b6000602082019050818103600083015261387081613834565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b60006138ad601d83612bfe565b91506138b882613877565b602082019050919050565b600060208201905081810360008301526138dc816138a0565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b6000613919601683612bfe565b9150613924826138e3565b602082019050919050565b600060208201905081810360008301526139488161390c565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b6000613985601883612bfe565b91506139908261394f565b602082019050919050565b600060208201905081810360008301526139b481613978565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b60006139f1601e83612bfe565b91506139fc826139bb565b602082019050919050565b60006020820190508181036000830152613a20816139e4565b9050919050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b6000613a5d601d83612bfe565b9150613a6882613a27565b602082019050919050565b60006020820190508181036000830152613a8c81613a50565b9050919050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b6000613ac9601383612bfe565b9150613ad482613a93565b602082019050919050565b60006020820190508181036000830152613af881613abc565b9050919050565b600081905092915050565b6000613b1582612bf3565b613b1f8185613aff565b9350613b2f818560208601612c0f565b80840191505092915050565b6000613b478285613b0a565b9150613b538284613b0a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bbb602683612bfe565b9150613bc682613b5f565b604082019050919050565b60006020820190508181036000830152613bea81613bae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b6000613c56601883612bfe565b9150613c6182613c20565b602082019050919050565b60006020820190508181036000830152613c8581613c49565b9050919050565b6000613c9782612af0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cca57613cc96134ad565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d0b602083612bfe565b9150613d1682613cd5565b602082019050919050565b60006020820190508181036000830152613d3a81613cfe565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613d6882613d41565b613d728185613d4c565b9350613d82818560208601612c0f565b613d8b81612c42565b840191505092915050565b6000608082019050613dab6000830187612d39565b613db86020830186612d39565b613dc56040830185612afa565b8181036060830152613dd78184613d5d565b905095945050505050565b600081519050613df181612b64565b92915050565b600060208284031215613e0d57613e0c612b2e565b5b6000613e1b84828501613de2565b9150509291505056fea26469706673582212206ecbf4f179c269f82737835caf2d9dbd5aac41d9f801e5acfacbc530960f7e6164736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102665760003560e01c8063715018a611610144578063a0712d68116100b6578063cadf88181161007a578063cadf881814610889578063e985e9c5146108b4578063ea6eb836146108f1578063f2fde38b1461091a578063f6c9d9e314610943578063fb7e6ccb1461096c57610266565b8063a0712d68146107b5578063a22cb465146107d1578063b88d4fde146107fa578063bc63f02e14610823578063c87b56dd1461084c57610266565b80637f525323116101085780637f525323146106b95780638da5cb5b146106e257806391b7f5ed1461070d57806395d89b41146107365780639a3bf728146107615780639ba411b11461078c57610266565b8063715018a61461062f57806371e3500c146106465780637389fbb71461065d57806378179976146106865780637bffb4ce146106a257610266565b806332cb6b0c116101dd57806355f804b3116101a157806355f804b31461050d57806356a87caa1461053657806360d938dc1461055f5780636352211e1461058a5780636817c76c146105c757806370a08231146105f257610266565b806332cb6b0c146104505780633549345e1461047b5780633ccfd60b146104a457806342842e0e146104bb5780634dfea627146104e457610266565b8063095ea7b31161022f578063095ea7b31461035257806318160ddd1461037b57806322f3e2d4146103a657806323b872dd146103d157806327aebfbe146103fa5780632eb4a7ab1461042557610266565b80620e7fa81461026b57806301ffc9a714610296578063049c5c49146102d357806306fdde03146102ea578063081812fc14610315575b600080fd5b34801561027757600080fd5b50610280610995565b60405161028d9190612b09565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190612b90565b61099b565b6040516102ca9190612bd8565b60405180910390f35b3480156102df57600080fd5b506102e8610a2d565b005b3480156102f657600080fd5b506102ff610a98565b60405161030c9190612c8c565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190612cda565b610b2a565b6040516103499190612d48565b60405180910390f35b34801561035e57600080fd5b5061037960048036038101906103749190612d8f565b610ba6565b005b34801561038757600080fd5b50610390610ce7565b60405161039d9190612b09565b60405180910390f35b3480156103b257600080fd5b506103bb610cfe565b6040516103c89190612bd8565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190612dcf565b610d11565b005b34801561040657600080fd5b5061040f611036565b60405161041c9190612b09565b60405180910390f35b34801561043157600080fd5b5061043a61103c565b6040516104479190612e3b565b60405180910390f35b34801561045c57600080fd5b50610465611042565b6040516104729190612b09565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190612cda565b611048565b005b3480156104b057600080fd5b506104b9611091565b005b3480156104c757600080fd5b506104e260048036038101906104dd9190612dcf565b611126565b005b3480156104f057600080fd5b5061050b60048036038101906105069190612cda565b611146565b005b34801561051957600080fd5b50610534600480360381019061052f9190612f8b565b61118f565b005b34801561054257600080fd5b5061055d60048036038101906105589190612cda565b6111e8565b005b34801561056b57600080fd5b50610574611231565b6040516105819190612bd8565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612cda565b611244565b6040516105be9190612d48565b60405180910390f35b3480156105d357600080fd5b506105dc611256565b6040516105e99190612b09565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190612fd4565b61125c565b6040516106269190612b09565b60405180910390f35b34801561063b57600080fd5b50610644611315565b005b34801561065257600080fd5b5061065b611329565b005b34801561066957600080fd5b50610684600480360381019061067f9190612cda565b6113d8565b005b6106a0600480360381019061069b9190613061565b611421565b005b3480156106ae57600080fd5b506106b761167b565b005b3480156106c557600080fd5b506106e060048036038101906106db9190612cda565b6116e6565b005b3480156106ee57600080fd5b506106f761172f565b6040516107049190612d48565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190612cda565b611759565b005b34801561074257600080fd5b5061074b6117a2565b6040516107589190612c8c565b60405180910390f35b34801561076d57600080fd5b50610776611834565b6040516107839190612b09565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae91906130ed565b61183a565b005b6107cf60048036038101906107ca9190612cda565b611883565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613146565b611a75565b005b34801561080657600080fd5b50610821600480360381019061081c9190613227565b611bed565b005b34801561082f57600080fd5b5061084a600480360381019061084591906132aa565b611c60565b005b34801561085857600080fd5b50610873600480360381019061086e9190612cda565b611d4f565b6040516108809190612c8c565b60405180910390f35b34801561089557600080fd5b5061089e611dee565b6040516108ab9190612b09565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d691906132ea565b611df4565b6040516108e89190612bd8565b60405180910390f35b3480156108fd57600080fd5b5061091860048036038101906109139190612cda565b611e88565b005b34801561092657600080fd5b50610941600480360381019061093c9190612fd4565b611ed1565b005b34801561094f57600080fd5b5061096a60048036038101906109659190612cda565b611f55565b005b34801561097857600080fd5b50610993600480360381019061098e9190613380565b611f9e565b005b600a5481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a265750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16610a4c61172f565b73ffffffffffffffffffffffffffffffffffffffff1614610a6c57600080fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b606060028054610aa79061340f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad39061340f565b8015610b205780601f10610af557610100808354040283529160200191610b20565b820191906000526020600020905b815481529060010190602001808311610b0357829003601f168201915b5050505050905090565b6000610b358261216e565b610b6b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb182611244565b90508073ffffffffffffffffffffffffffffffffffffffff16610bd26121cd565b73ffffffffffffffffffffffffffffffffffffffff1614610c3557610bfe81610bf96121cd565b611df4565b610c34576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610cf16121d5565b6001546000540303905090565b601060009054906101000a900460ff1681565b6000610d1c826121da565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d83576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d8f846122a8565b91509150610da58187610da06121cd565b6122ca565b610df157610dba86610db56121cd565b611df4565b610df0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e58576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e65868686600161230e565b8015610e7057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f3e85610f1a888887612314565b7c02000000000000000000000000000000000000000000000000000000001761233c565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610fc6576000600185019050600060046000838152602001908152602001600020541415610fc4576000548114610fc3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461102e8686866001612367565b505050505050565b60145481565b600e5481565b60115481565b3373ffffffffffffffffffffffffffffffffffffffff1661106761172f565b73ffffffffffffffffffffffffffffffffffffffff161461108757600080fd5b80600a8190555050565b3373ffffffffffffffffffffffffffffffffffffffff166110b061172f565b73ffffffffffffffffffffffffffffffffffffffff16146110d057600080fd5b60004790506110dd61172f565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611122573d6000803e3d6000fd5b5050565b61114183838360405180602001604052806000815250611bed565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661116561172f565b73ffffffffffffffffffffffffffffffffffffffff161461118557600080fd5b8060128190555050565b3373ffffffffffffffffffffffffffffffffffffffff166111ae61172f565b73ffffffffffffffffffffffffffffffffffffffff16146111ce57600080fd5b80600f90805190602001906111e4929190612a4d565b5050565b3373ffffffffffffffffffffffffffffffffffffffff1661120761172f565b73ffffffffffffffffffffffffffffffffffffffff161461122757600080fd5b80600d8190555050565b601060019054906101000a900460ff1681565b600061124f826121da565b9050919050565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61131d61236d565b61132760006123eb565b565b3373ffffffffffffffffffffffffffffffffffffffff1661134861172f565b73ffffffffffffffffffffffffffffffffffffffff161461136857600080fd5b600d54600c5411156113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a69061348d565b60405180910390fd5b6113bb33600b546124b1565b600b54600c60008282546113cf91906134dc565b92505081905550565b3373ffffffffffffffffffffffffffffffffffffffff166113f761172f565b73ffffffffffffffffffffffffffffffffffffffff161461141757600080fd5b8060118190555050565b8282611497828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e543360405160200161147c919061357a565b604051602081830303815290604052805190602001206124cf565b6114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd906135e1565b60405180910390fd5b6011546114e1610ce7565b1115611522576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115199061364d565b60405180910390fd5b600061152c610ce7565b9050601060019054906101000a900460ff1661157d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611574906136b9565b60405180910390fd5b60115481106115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b890613725565b60405180910390fd5b601454846115ce3361125c565b6115d891906134dc565b1115611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161090613791565b60405180910390fd5b83600a5461162791906137b1565b341015611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090613857565b60405180910390fd5b61167333856124b1565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1661169a61172f565b73ffffffffffffffffffffffffffffffffffffffff16146116ba57600080fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff1661170561172f565b73ffffffffffffffffffffffffffffffffffffffff161461172557600080fd5b8060148190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1661177861172f565b73ffffffffffffffffffffffffffffffffffffffff161461179857600080fd5b8060098190555050565b6060600380546117b19061340f565b80601f01602080910402602001604051908101604052809291908181526020018280546117dd9061340f565b801561182a5780601f106117ff5761010080835404028352916020019161182a565b820191906000526020600020905b81548152906001019060200180831161180d57829003601f168201915b5050505050905090565b60125481565b3373ffffffffffffffffffffffffffffffffffffffff1661185961172f565b73ffffffffffffffffffffffffffffffffffffffff161461187957600080fd5b80600e8190555050565b60115461188e610ce7565b11156118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c69061364d565b60405180910390fd5b60006118d9610ce7565b9050601060009054906101000a900460ff1661192a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611921906138c3565b60405180910390fd5b601154828261193991906134dc565b111561197a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119719061392f565b60405180910390fd5b601354826119873361125c565b61199191906134dc565b11156119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c99061399b565b60405180910390fd5b601254821115611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90613a07565b60405180910390fd5b81600954611a2591906137b1565b341015611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90613a73565b60405180910390fd5b611a7133836124b1565b5050565b611a7d6121cd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ae2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611aef6121cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b9c6121cd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611be19190612bd8565b60405180910390a35050565b611bf8848484610d11565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c5a57611c23848484846124e6565b611c59576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16611c7f61172f565b73ffffffffffffffffffffffffffffffffffffffff1614611c9f57600080fd5b6000611ca9610ce7565b90506011548382611cba91906134dc565b1115611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf29061392f565b60405180910390fd5b601154811115611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3790613adf565b60405180910390fd5b611d4a82846124b1565b505050565b6060611d5a8261216e565b611d90576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611d9a612637565b9050600081511415611dbb5760405180602001604052806000815250611de6565b80611dc5846126c9565b604051602001611dd6929190613b3b565b6040516020818303038152906040525b915050919050565b60135481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16611ea761172f565b73ffffffffffffffffffffffffffffffffffffffff1614611ec757600080fd5b8060138190555050565b611ed961236d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4090613bd1565b60405180910390fd5b611f52816123eb565b50565b3373ffffffffffffffffffffffffffffffffffffffff16611f7461172f565b73ffffffffffffffffffffffffffffffffffffffff1614611f9457600080fd5b80600b8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16611fbd61172f565b73ffffffffffffffffffffffffffffffffffffffff1614611fdd57600080fd5b6000611fe7610ce7565b90506011548482611ff891906134dc565b1115612039576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120309061392f565b60405180910390fd5b60115481111561207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590613adf565b60405180910390fd5b60005b8383905081101561216757600073ffffffffffffffffffffffffffffffffffffffff168484838181106120b7576120b6613bf1565b5b90506020020160208101906120cc9190612fd4565b73ffffffffffffffffffffffffffffffffffffffff161415612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90613c6c565b60405180910390fd5b61215484848381811061213957612138613bf1565b5b905060200201602081019061214e9190612fd4565b866124b1565b808061215f90613c8c565b915050612081565b5050505050565b6000816121796121d5565b11158015612188575060005482105b80156121c6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806121e96121d5565b11612271576000548110156122705760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561226e575b6000811415612264576004600083600190039350838152602001908152602001600020549050612239565b80925050506122a3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861232b868684612723565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61237561272c565b73ffffffffffffffffffffffffffffffffffffffff1661239361172f565b73ffffffffffffffffffffffffffffffffffffffff16146123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090613d21565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124cb828260405180602001604052806000815250612734565b5050565b6000826124dc85846127d1565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261250c6121cd565b8786866040518563ffffffff1660e01b815260040161252e9493929190613d96565b6020604051808303816000875af192505050801561256a57506040513d601f19601f820116820180604052508101906125679190613df7565b60015b6125e4573d806000811461259a576040519150601f19603f3d011682016040523d82523d6000602084013e61259f565b606091505b506000815114156125dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546126469061340f565b80601f01602080910402602001604051908101604052809291908181526020018280546126729061340f565b80156126bf5780601f10612694576101008083540402835291602001916126bf565b820191906000526020600020905b8154815290600101906020018083116126a257829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561270f57600183039250600a81066030018353600a810490506126ef565b508181036020830392508083525050919050565b60009392505050565b600033905090565b61273e8383612827565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127cc57600080549050600083820390505b61277e60008683806001019450866124e6565b6127b4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061276b5781600054146127c957600080fd5b50505b505050565b60008082905060005b845181101561281c57612807828683815181106127fa576127f9613bf1565b5b60200260200101516129fb565b9150808061281490613c8c565b9150506127da565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612894576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156128cf576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128dc600084838561230e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612953836129446000866000612314565b61294d85612a26565b1761233c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612977578060008190555050506129f66000848385612367565b505050565b6000818310612a1357612a0e8284612a36565b612a1e565b612a1d8383612a36565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612a599061340f565b90600052602060002090601f016020900481019282612a7b5760008555612ac2565b82601f10612a9457805160ff1916838001178555612ac2565b82800160010185558215612ac2579182015b82811115612ac1578251825591602001919060010190612aa6565b5b509050612acf9190612ad3565b5090565b5b80821115612aec576000816000905550600101612ad4565b5090565b6000819050919050565b612b0381612af0565b82525050565b6000602082019050612b1e6000830184612afa565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6d81612b38565b8114612b7857600080fd5b50565b600081359050612b8a81612b64565b92915050565b600060208284031215612ba657612ba5612b2e565b5b6000612bb484828501612b7b565b91505092915050565b60008115159050919050565b612bd281612bbd565b82525050565b6000602082019050612bed6000830184612bc9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c2d578082015181840152602081019050612c12565b83811115612c3c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c5e82612bf3565b612c688185612bfe565b9350612c78818560208601612c0f565b612c8181612c42565b840191505092915050565b60006020820190508181036000830152612ca68184612c53565b905092915050565b612cb781612af0565b8114612cc257600080fd5b50565b600081359050612cd481612cae565b92915050565b600060208284031215612cf057612cef612b2e565b5b6000612cfe84828501612cc5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d3282612d07565b9050919050565b612d4281612d27565b82525050565b6000602082019050612d5d6000830184612d39565b92915050565b612d6c81612d27565b8114612d7757600080fd5b50565b600081359050612d8981612d63565b92915050565b60008060408385031215612da657612da5612b2e565b5b6000612db485828601612d7a565b9250506020612dc585828601612cc5565b9150509250929050565b600080600060608486031215612de857612de7612b2e565b5b6000612df686828701612d7a565b9350506020612e0786828701612d7a565b9250506040612e1886828701612cc5565b9150509250925092565b6000819050919050565b612e3581612e22565b82525050565b6000602082019050612e506000830184612e2c565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e9882612c42565b810181811067ffffffffffffffff82111715612eb757612eb6612e60565b5b80604052505050565b6000612eca612b24565b9050612ed68282612e8f565b919050565b600067ffffffffffffffff821115612ef657612ef5612e60565b5b612eff82612c42565b9050602081019050919050565b82818337600083830152505050565b6000612f2e612f2984612edb565b612ec0565b905082815260208101848484011115612f4a57612f49612e5b565b5b612f55848285612f0c565b509392505050565b600082601f830112612f7257612f71612e56565b5b8135612f82848260208601612f1b565b91505092915050565b600060208284031215612fa157612fa0612b2e565b5b600082013567ffffffffffffffff811115612fbf57612fbe612b33565b5b612fcb84828501612f5d565b91505092915050565b600060208284031215612fea57612fe9612b2e565b5b6000612ff884828501612d7a565b91505092915050565b600080fd5b600080fd5b60008083601f84011261302157613020612e56565b5b8235905067ffffffffffffffff81111561303e5761303d613001565b5b60208301915083602082028301111561305a57613059613006565b5b9250929050565b60008060006040848603121561307a57613079612b2e565b5b600084013567ffffffffffffffff81111561309857613097612b33565b5b6130a48682870161300b565b935093505060206130b786828701612cc5565b9150509250925092565b6130ca81612e22565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b60006020828403121561310357613102612b2e565b5b6000613111848285016130d8565b91505092915050565b61312381612bbd565b811461312e57600080fd5b50565b6000813590506131408161311a565b92915050565b6000806040838503121561315d5761315c612b2e565b5b600061316b85828601612d7a565b925050602061317c85828601613131565b9150509250929050565b600067ffffffffffffffff8211156131a1576131a0612e60565b5b6131aa82612c42565b9050602081019050919050565b60006131ca6131c584613186565b612ec0565b9050828152602081018484840111156131e6576131e5612e5b565b5b6131f1848285612f0c565b509392505050565b600082601f83011261320e5761320d612e56565b5b813561321e8482602086016131b7565b91505092915050565b6000806000806080858703121561324157613240612b2e565b5b600061324f87828801612d7a565b945050602061326087828801612d7a565b935050604061327187828801612cc5565b925050606085013567ffffffffffffffff81111561329257613291612b33565b5b61329e878288016131f9565b91505092959194509250565b600080604083850312156132c1576132c0612b2e565b5b60006132cf85828601612cc5565b92505060206132e085828601612d7a565b9150509250929050565b6000806040838503121561330157613300612b2e565b5b600061330f85828601612d7a565b925050602061332085828601612d7a565b9150509250929050565b60008083601f8401126133405761333f612e56565b5b8235905067ffffffffffffffff81111561335d5761335c613001565b5b60208301915083602082028301111561337957613378613006565b5b9250929050565b60008060006040848603121561339957613398612b2e565b5b60006133a786828701612cc5565b935050602084013567ffffffffffffffff8111156133c8576133c7612b33565b5b6133d48682870161332a565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061342757607f821691505b6020821081141561343b5761343a6133e0565b5b50919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b6000613477601b83612bfe565b915061348282613441565b602082019050919050565b600060208201905081810360008301526134a68161346a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134e782612af0565b91506134f283612af0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613527576135266134ad565b5b828201905092915050565b60008160601b9050919050565b600061354a82613532565b9050919050565b600061355c8261353f565b9050919050565b61357461356f82612d27565b613551565b82525050565b60006135868284613563565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b60006135cb601e83612bfe565b91506135d682613595565b602082019050919050565b600060208201905081810360008301526135fa816135be565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000613637600f83612bfe565b915061364282613601565b602082019050919050565b600060208201905081810360008301526136668161362a565b9050919050565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b60006136a3601583612bfe565b91506136ae8261366d565b602082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b600061370f601b83612bfe565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b600061377b602083612bfe565b915061378682613745565b602082019050919050565b600060208201905081810360008301526137aa8161376e565b9050919050565b60006137bc82612af0565b91506137c783612af0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613800576137ff6134ad565b5b828202905092915050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b6000613841601b83612bfe565b915061384c8261380b565b602082019050919050565b6000602082019050818103600083015261387081613834565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b60006138ad601d83612bfe565b91506138b882613877565b602082019050919050565b600060208201905081810360008301526138dc816138a0565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b6000613919601683612bfe565b9150613924826138e3565b602082019050919050565b600060208201905081810360008301526139488161390c565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b6000613985601883612bfe565b91506139908261394f565b602082019050919050565b600060208201905081810360008301526139b481613978565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b60006139f1601e83612bfe565b91506139fc826139bb565b602082019050919050565b60006020820190508181036000830152613a20816139e4565b9050919050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b6000613a5d601d83612bfe565b9150613a6882613a27565b602082019050919050565b60006020820190508181036000830152613a8c81613a50565b9050919050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b6000613ac9601383612bfe565b9150613ad482613a93565b602082019050919050565b60006020820190508181036000830152613af881613abc565b9050919050565b600081905092915050565b6000613b1582612bf3565b613b1f8185613aff565b9350613b2f818560208601612c0f565b80840191505092915050565b6000613b478285613b0a565b9150613b538284613b0a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bbb602683612bfe565b9150613bc682613b5f565b604082019050919050565b60006020820190508181036000830152613bea81613bae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b6000613c56601883612bfe565b9150613c6182613c20565b602082019050919050565b60006020820190508181036000830152613c8581613c49565b9050919050565b6000613c9782612af0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cca57613cc96134ad565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d0b602083612bfe565b9150613d1682613cd5565b602082019050919050565b60006020820190508181036000830152613d3a81613cfe565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613d6882613d41565b613d728185613d4c565b9350613d82818560208601612c0f565b613d8b81612c42565b840191505092915050565b6000608082019050613dab6000830187612d39565b613db86020830186612d39565b613dc56040830185612afa565b8181036060830152613dd78184613d5d565b905095945050505050565b600081519050613df181612b64565b92915050565b600060208284031215613e0d57613e0c612b2e565b5b6000613e1b84828501613de2565b9150509291505056fea26469706673582212206ecbf4f179c269f82737835caf2d9dbd5aac41d9f801e5acfacbc530960f7e6164736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

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


Deployed Bytecode Sourcemap

142:4930:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;240:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5653:607:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2440:83:5;;;;;;;;;;;;;:::i;:::-;;11161:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13048:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12611:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4736:309;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;499:28:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22055:2739:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;720:48:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;410:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;574:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2323:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4935:134;;;;;;;;;;;;;:::i;:::-;;13912:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1503:124:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2637:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2132:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;532:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10957:142:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;198:37:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6319:221:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:4;;;;;;;;;;;;;:::i;:::-;;2860:219:5;;;;;;;;;;;;;:::i;:::-;;1912:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4393:536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2529:102;;;;;;;;;;;;;:::i;:::-;;1770:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2230:87:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11323:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;611:50:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1394:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3829:558;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13315:303:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14157:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3537:286:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11491:313:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;666:49:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13684:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1633:131:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2031:95:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3085:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;240:40;;;;:::o;5653:607:1:-;5738:4;6048:10;6033:25;;:11;:25;;;;:101;;;;6124:10;6109:25;;:11;:25;;;;6033:101;:177;;;;6200:10;6185:25;;:11;:25;;;;6033:177;6014:196;;5653:607;;;:::o;2440:83:5:-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;2509:8:::1;;;;;;;;;;;2508:9;2497:8;;:20;;;;;;;;;;;;;;;;;;2440:83::o:0;11161:98:1:-;11215:13;11247:5;11240:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11161:98;:::o;13048:200::-;13116:7;13140:16;13148:7;13140;:16::i;:::-;13135:64;;13165:34;;;;;;;;;;;;;;13135:64;13217:15;:24;13233:7;13217:24;;;;;;;;;;;;;;;;;;;;;13210:31;;13048:200;;;:::o;12611:376::-;12683:13;12699:16;12707:7;12699;:16::i;:::-;12683:32;;12753:5;12730:28;;:19;:17;:19::i;:::-;:28;;;12726:172;;12777:44;12794:5;12801:19;:17;:19::i;:::-;12777:16;:44::i;:::-;12772:126;;12848:35;;;;;;;;;;;;;;12772:126;12726:172;12935:2;12908:15;:24;12924:7;12908:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12972:7;12968:2;12952:28;;12961:5;12952:28;;;;;;;;;;;;12673:314;12611:376;;:::o;4736:309::-;4789:7;5013:15;:13;:15::i;:::-;4998:12;;4982:13;;:28;:46;4975:53;;4736:309;:::o;499:28:5:-;;;;;;;;;;;;;:::o;22055:2739:1:-;22184:27;22214;22233:7;22214:18;:27::i;:::-;22184:57;;22297:4;22256:45;;22272:19;22256:45;;;22252:86;;22310:28;;;;;;;;;;;;;;22252:86;22350:27;22379:23;22406:28;22426:7;22406:19;:28::i;:::-;22349:85;;;;22531:62;22550:15;22567:4;22573:19;:17;:19::i;:::-;22531:18;:62::i;:::-;22526:173;;22612:43;22629:4;22635:19;:17;:19::i;:::-;22612:16;:43::i;:::-;22607:92;;22664:35;;;;;;;;;;;;;;22607:92;22526:173;22728:1;22714:16;;:2;:16;;;22710:52;;;22739:23;;;;;;;;;;;;;;22710:52;22773:43;22795:4;22801:2;22805:7;22814:1;22773:21;:43::i;:::-;22905:15;22902:157;;;23043:1;23022:19;23015:30;22902:157;23429:18;:24;23448:4;23429:24;;;;;;;;;;;;;;;;23427:26;;;;;;;;;;;;23497:18;:22;23516:2;23497:22;;;;;;;;;;;;;;;;23495:24;;;;;;;;;;;23812:142;23848:2;23895:45;23910:4;23916:2;23920:19;23895:14;:45::i;:::-;2046:8;23868:72;23812:18;:142::i;:::-;23783:17;:26;23801:7;23783:26;;;;;;;;;;;:171;;;;24121:1;2046:8;24071:19;:46;:51;24067:616;;;24142:19;24174:1;24164:7;:11;24142:33;;24329:1;24295:17;:30;24313:11;24295:30;;;;;;;;;;;;:35;24291:378;;;24431:13;;24416:11;:28;24412:239;;24609:19;24576:17;:30;24594:11;24576:30;;;;;;;;;;;:52;;;;24412:239;24291:378;24124:559;24067:616;24727:7;24723:2;24708:27;;24717:4;24708:27;;;;;;;;;;;;24745:42;24766:4;24772:2;24776:7;24785:1;24745:20;:42::i;:::-;22174:2620;;;22055:2739;;;:::o;720:48:5:-;;;;:::o;410:25::-;;;;:::o;574:32::-;;;;:::o;2323:111::-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;2415:13:::1;2400:12;:28;;;;2323:111:::0;:::o;4935:134::-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;4986:12:::1;5001:21;4986:36;;5037:7;:5;:7::i;:::-;5029:25;;:34;5055:7;5029:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4979:90;4935:134::o:0;13912:179:1:-;14045:39;14062:4;14068:2;14072:7;14045:39;;;;;;;;;;;;:16;:39::i;:::-;13912:179;;;:::o;1503:124:5:-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;1615:6:::1;1581:31;:40;;;;1503:124:::0;:::o;2637:101::-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;2725:7:::1;2709:13;:23;;;;;;;;;;;;:::i;:::-;;2637:101:::0;:::o;2132:92::-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;2215:3:::1;2197:15;:21;;;;2132:92:::0;:::o;532:35::-;;;;;;;;;;;;;:::o;10957:142:1:-;11021:7;11063:27;11082:7;11063:18;:27::i;:::-;11040:52;;10957:142;;;:::o;198:37:5:-;;;;:::o;6319:221:1:-;6383:7;6423:1;6406:19;;:5;:19;;;6402:60;;;6434:28;;;;;;;;;;;;;;6402:60;1022:13;6479:18;:25;6498:5;6479:25;;;;;;;;;;;;;;;;:54;6472:61;;6319:221;;;:::o;1824:101:4:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;2860:219:5:-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;2936:15:::1;;2919:13;;:32;;2911:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;2992:37;3002:10;3014:14;;2992:9;:37::i;:::-;3053:14;;3036:13;;:31;;;;;;;:::i;:::-;;;;;;;;2860:219::o:0;1912:113::-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;2006:13:::1;1993:10;:26;;;;1912:113:::0;:::o;4393:536::-;4497:12;;1164:150;1201:11;;1164:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1231:10;;1287;1270:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;1260:39;;;;;;1164:18;:150::i;:::-;1142:230;;;;;;;;;;;;:::i;:::-;;;;;;;;;938:10:::1;;921:13;:11;:13::i;:::-;:27;;913:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;4529:17:::2;4549:13;:11;:13::i;:::-;4529:33;;4579:15;;;;;;;;;;;4571:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;4647:10;;4635:9;:22;4627:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4738:29;;4728:6;4704:21;4714:10;4704:9;:21::i;:::-;:30;;;;:::i;:::-;:63;;4696:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;4847:6;4832:12;;:21;;;;:::i;:::-;4819:9;:34;;4811:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;4894:29;4904:10;4916:6;4894:9;:29::i;:::-;4522:407;4393:536:::0;;;;;:::o;2529:102::-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;2610:15:::1;;;;;;;;;;;2609:16;2591:15;;:34;;;;;;;;;;;;;;;;;;2529:102::o:0;1770:136::-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;1893:7:::1;1861:29;:39;;;;1770:136:::0;:::o;1194:85:4:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2230:87:5:-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;2305:6:::1;2293:9;:18;;;;2230:87:::0;:::o;11323:102:1:-;11379:13;11411:7;11404:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11323:102;:::o;611:50:5:-;;;;:::o;1394:103::-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;1482:9:::1;1469:10;:22;;;;1394:103:::0;:::o;3829:558::-;938:10;;921:13;:11;:13::i;:::-;:27;;913:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3892:17:::1;3912:13;:11;:13::i;:::-;3892:33;;3942:8;;;;;;;;;;;3934:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;4021:10;;4011:6;3999:9;:18;;;;:::i;:::-;:32;;3991:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;4107:29;;4097:6;4073:21;4083:10;4073:9;:21::i;:::-;:30;;;;:::i;:::-;:63;;4065:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4191:31;;4181:6;:41;;4172:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;4297:6;4285:9;;:18;;;;:::i;:::-;4272:9;:31;;4264:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4346:29;4356:10;4368:6;4346:9;:29::i;:::-;3885:502;3829:558:::0;:::o;13315:303:1:-;13425:19;:17;:19::i;:::-;13413:31;;:8;:31;;;13409:61;;;13453:17;;;;;;;;;;;;;;13409:61;13533:8;13481:18;:39;13500:19;:17;:19::i;:::-;13481:39;;;;;;;;;;;;;;;:49;13521:8;13481:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;13592:8;13556:55;;13571:19;:17;:19::i;:::-;13556:55;;;13602:8;13556:55;;;;;;:::i;:::-;;;;;;;;13315:303;;:::o;14157:388::-;14318:31;14331:4;14337:2;14341:7;14318:12;:31::i;:::-;14381:1;14363:2;:14;;;:19;14359:180;;14401:56;14432:4;14438:2;14442:7;14451:5;14401:30;:56::i;:::-;14396:143;;14484:40;;;;;;;;;;;;;;14396:143;14359:180;14157:388;;;;:::o;3537:286:5:-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;3619:14:::1;3636:13;:11;:13::i;:::-;3619:30;;3685:10;;3675:6;3666;:15;;;;:::i;:::-;:29;;3658:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:10;;3737:6;:20;;3729:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3790:27;3800:8;3810:6;3790:9;:27::i;:::-;3612:211;3537:286:::0;;:::o;11491:313:1:-;11564:13;11594:16;11602:7;11594;:16::i;:::-;11589:59;;11619:29;;;;;;;;;;;;;;11589:59;11659:21;11683:10;:8;:10::i;:::-;11659:34;;11735:1;11716:7;11710:21;:26;;:87;;;;;;;;;;;;;;;;;11763:7;11772:18;11782:7;11772:9;:18::i;:::-;11746:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11710:87;11703:94;;;11491:313;;;:::o;666:49:5:-;;;;:::o;13684:162:1:-;13781:4;13804:18;:25;13823:5;13804:25;;;;;;;;;;;;;;;:35;13830:8;13804:35;;;;;;;;;;;;;;;;;;;;;;;;;13797:42;;13684:162;;;;:::o;1633:131:5:-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;1752:6:::1;1720:29;:38;;;;1633:131:::0;:::o;2074:198:4:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;;;2154:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;2031:95:5:-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;2117:3:::1;2100:14;:20;;;;2031:95:::0;:::o;3085:446::-;1040:10;1029:21;;:7;:5;:7::i;:::-;:21;;;1021:30;;;;;;3184:14:::1;3201:13;:11;:13::i;:::-;3184:30;;3250:10;;3240:6;3231;:15;;;;:::i;:::-;:29;;3223:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;3312:10;;3302:6;:20;;3294:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3360:9;3355:171;3379:9;;:16;;3375:1;:20;3355:171;;;3443:1;3419:26;;:9;;3429:1;3419:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;3411:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3485:31;3495:9;;3505:1;3495:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;3509:6;3485:9;:31::i;:::-;3397:3;;;;;:::i;:::-;;;;3355:171;;;;3177:354;3085:446:::0;;;:::o;14791:268:1:-;14848:4;14902:7;14883:15;:13;:15::i;:::-;:26;;:65;;;;;14935:13;;14925:7;:23;14883:65;:150;;;;;15032:1;1774:8;14985:17;:26;15003:7;14985:26;;;;;;;;;;;;:43;:48;14883:150;14864:169;;14791:268;;;:::o;32874:103::-;32934:7;32960:10;32953:17;;32874:103;:::o;4276:90::-;4332:7;4276:90;:::o;7949:1105::-;8016:7;8035:12;8050:7;8035:22;;8115:4;8096:15;:13;:15::i;:::-;:23;8092:898;;8148:13;;8141:4;:20;8137:853;;;8185:14;8202:17;:23;8220:4;8202:23;;;;;;;;;;;;8185:40;;8316:1;1774:8;8289:6;:23;:28;8285:687;;;8800:111;8817:1;8807:6;:11;8800:111;;;8859:17;:25;8877:6;;;;;;;8859:25;;;;;;;;;;;;8850:34;;8800:111;;;8943:6;8936:13;;;;;;8285:687;8163:827;8137:853;8092:898;9016:31;;;;;;;;;;;;;;7949:1105;;;;:::o;20436:637::-;20528:27;20557:23;20596:53;20652:15;20596:71;;20834:7;20828:4;20821:21;20868:22;20862:4;20855:36;20943:4;20937;20927:21;20904:44;;21037:19;21031:26;21012:45;;20774:293;20436:637;;;:::o;21181:632::-;21319:11;21478:15;21472:4;21468:26;21460:34;;21635:15;21624:9;21620:31;21607:44;;21780:15;21769:9;21766:30;21759:4;21748:9;21745:19;21742:55;21732:65;;21181:632;;;;;:::o;31742:154::-;;;;;:::o;30099:302::-;30230:7;30249:16;2166:3;30275:19;:40;;30249:67;;2166:3;30341:31;30352:4;30358:2;30362:9;30341:10;:31::i;:::-;30333:40;;:61;;30326:68;;;30099:302;;;;;:::o;10460:440::-;10540:14;10705:15;10698:5;10694:27;10685:36;;10877:5;10863:11;10839:22;10835:40;10832:51;10825:5;10822:62;10812:72;;10460:440;;;;:::o;32537:153::-;;;;;:::o;1352:130:4:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;2426:187::-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;15138:102:1:-;15206:27;15216:2;15220:8;15206:27;;;;;;;;;;;;:9;:27::i;:::-;15138:102;;:::o;1153:184:3:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;28649:697:1:-;28807:4;28852:2;28827:45;;;28873:19;:17;:19::i;:::-;28894:4;28900:7;28909:5;28827:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28823:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29122:1;29105:6;:13;:18;29101:229;;;29150:40;;;;;;;;;;;;;;29101:229;29290:6;29284:13;29275:6;29271:2;29267:15;29260:38;28823:517;28993:54;;;28983:64;;;:6;:64;;;;28976:71;;;28649:697;;;;;;:::o;2746:108:5:-;2806:13;2835;2828:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2746:108;:::o;33078:1920:1:-;33135:17;33548:3;33541:4;33535:11;33531:21;33524:28;;33637:3;33631:4;33624:17;33740:3;34188:5;34316:1;34311:3;34307:11;34300:18;;34451:2;34445:4;34441:13;34437:2;34433:22;34428:3;34420:36;34491:2;34485:4;34481:13;34473:21;;34082:682;34509:4;34082:682;;;34695:1;34690:3;34686:11;34679:18;;34745:2;34739:4;34735:13;34731:2;34727:22;34722:3;34714:36;34602:2;34596:4;34592:13;34584:21;;34082:682;;;34086:422;34801:3;34796;34792:13;34914:2;34909:3;34905:12;34898:19;;34975:6;34970:3;34963:19;33173:1819;;33078:1920;;;:::o;30961:143::-;31094:6;30961:143;;;;;:::o;640:96:0:-;693:7;719:10;712:17;;640:96;:::o;15641:661:1:-;15759:19;15765:2;15769:8;15759:5;:19::i;:::-;15835:1;15817:2;:14;;;:19;15813:473;;15856:11;15870:13;;15856:27;;15901:13;15923:8;15917:3;:14;15901:30;;15949:229;15979:62;16018:1;16022:2;16026:7;;;;;;16035:5;15979:30;:62::i;:::-;15974:165;;16076:40;;;;;;;;;;;;;;15974:165;16173:3;16165:5;:11;15949:229;;16258:3;16241:13;;:20;16237:34;;16263:8;;;16237:34;15838:448;;15813:473;15641:661;;;:::o;1991:290:3:-;2074:7;2093:20;2116:4;2093:27;;2135:9;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;;2202:9;:33::i;:::-;2187:48;;2168:3;;;;;:::i;:::-;;;;2130:116;;;;2262:12;2255:19;;;1991:290;;;;:::o;16563:1492:1:-;16627:20;16650:13;;16627:36;;16691:1;16677:16;;:2;:16;;;16673:48;;;16702:19;;;;;;;;;;;;;;16673:48;16747:1;16735:8;:13;16731:44;;;16757:18;;;;;;;;;;;;;;16731:44;16786:61;16816:1;16820:2;16824:12;16838:8;16786:21;:61::i;:::-;17318:1;1156:2;17289:1;:25;;17288:31;17276:8;:44;17250:18;:22;17269:2;17250:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;17590:136;17626:2;17679:33;17702:1;17706:2;17710:1;17679:14;:33::i;:::-;17646:30;17667:8;17646:20;:30::i;:::-;:66;17590:18;:136::i;:::-;17556:17;:31;17574:12;17556:31;;;;;;;;;;;:170;;;;17741:15;17759:12;17741:30;;17785:11;17814:8;17799:12;:23;17785:37;;17836:99;17887:9;;;;;;17883:2;17862:35;;17879:1;17862:35;;;;;;;;;;;;17930:3;17920:7;:13;17836:99;;17965:3;17949:13;:19;;;;17030:949;;17988:60;18017:1;18021:2;18025:12;18039:8;17988:20;:60::i;:::-;16617:1438;16563:1492;;:::o;8054:147:3:-;8117:7;8147:1;8143;:5;:51;;8174:20;8189:1;8192;8174:14;:20::i;:::-;8143:51;;;8151:20;8166:1;8169;8151:14;:20::i;:::-;8143:51;8136:58;;8054:147;;;;:::o;12238:316:1:-;12308:14;12535:1;12525:8;12522:15;12497:23;12493:45;12483:55;;12238:316;;;:::o;8207:261:3:-;8275:13;8379:1;8373:4;8366:15;8407:1;8401:4;8394:15;8447:4;8441;8431:21;8422:30;;8207:261;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:6:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:117::-;6459:1;6456;6449:12;6473:117;6582:1;6579;6572:12;6596:180;6644:77;6641:1;6634:88;6741:4;6738:1;6731:15;6765:4;6762:1;6755:15;6782:281;6865:27;6887:4;6865:27;:::i;:::-;6857:6;6853:40;6995:6;6983:10;6980:22;6959:18;6947:10;6944:34;6941:62;6938:88;;;7006:18;;:::i;:::-;6938:88;7046:10;7042:2;7035:22;6825:238;6782:281;;:::o;7069:129::-;7103:6;7130:20;;:::i;:::-;7120:30;;7159:33;7187:4;7179:6;7159:33;:::i;:::-;7069:129;;;:::o;7204:308::-;7266:4;7356:18;7348:6;7345:30;7342:56;;;7378:18;;:::i;:::-;7342:56;7416:29;7438:6;7416:29;:::i;:::-;7408:37;;7500:4;7494;7490:15;7482:23;;7204:308;;;:::o;7518:154::-;7602:6;7597:3;7592;7579:30;7664:1;7655:6;7650:3;7646:16;7639:27;7518:154;;;:::o;7678:412::-;7756:5;7781:66;7797:49;7839:6;7797:49;:::i;:::-;7781:66;:::i;:::-;7772:75;;7870:6;7863:5;7856:21;7908:4;7901:5;7897:16;7946:3;7937:6;7932:3;7928:16;7925:25;7922:112;;;7953:79;;:::i;:::-;7922:112;8043:41;8077:6;8072:3;8067;8043:41;:::i;:::-;7762:328;7678:412;;;;;:::o;8110:340::-;8166:5;8215:3;8208:4;8200:6;8196:17;8192:27;8182:122;;8223:79;;:::i;:::-;8182:122;8340:6;8327:20;8365:79;8440:3;8432:6;8425:4;8417:6;8413:17;8365:79;:::i;:::-;8356:88;;8172:278;8110:340;;;;:::o;8456:509::-;8525:6;8574:2;8562:9;8553:7;8549:23;8545:32;8542:119;;;8580:79;;:::i;:::-;8542:119;8728:1;8717:9;8713:17;8700:31;8758:18;8750:6;8747:30;8744:117;;;8780:79;;:::i;:::-;8744:117;8885:63;8940:7;8931:6;8920:9;8916:22;8885:63;:::i;:::-;8875:73;;8671:287;8456:509;;;;:::o;8971:329::-;9030:6;9079:2;9067:9;9058:7;9054:23;9050:32;9047:119;;;9085:79;;:::i;:::-;9047:119;9205:1;9230:53;9275:7;9266:6;9255:9;9251:22;9230:53;:::i;:::-;9220:63;;9176:117;8971:329;;;;:::o;9306:117::-;9415:1;9412;9405:12;9429:117;9538:1;9535;9528:12;9569:568;9642:8;9652:6;9702:3;9695:4;9687:6;9683:17;9679:27;9669:122;;9710:79;;:::i;:::-;9669:122;9823:6;9810:20;9800:30;;9853:18;9845:6;9842:30;9839:117;;;9875:79;;:::i;:::-;9839:117;9989:4;9981:6;9977:17;9965:29;;10043:3;10035:4;10027:6;10023:17;10013:8;10009:32;10006:41;10003:128;;;10050:79;;:::i;:::-;10003:128;9569:568;;;;;:::o;10143:704::-;10238:6;10246;10254;10303:2;10291:9;10282:7;10278:23;10274:32;10271:119;;;10309:79;;:::i;:::-;10271:119;10457:1;10446:9;10442:17;10429:31;10487:18;10479:6;10476:30;10473:117;;;10509:79;;:::i;:::-;10473:117;10622:80;10694:7;10685:6;10674:9;10670:22;10622:80;:::i;:::-;10604:98;;;;10400:312;10751:2;10777:53;10822:7;10813:6;10802:9;10798:22;10777:53;:::i;:::-;10767:63;;10722:118;10143:704;;;;;:::o;10853:122::-;10926:24;10944:5;10926:24;:::i;:::-;10919:5;10916:35;10906:63;;10965:1;10962;10955:12;10906:63;10853:122;:::o;10981:139::-;11027:5;11065:6;11052:20;11043:29;;11081:33;11108:5;11081:33;:::i;:::-;10981:139;;;;:::o;11126:329::-;11185:6;11234:2;11222:9;11213:7;11209:23;11205:32;11202:119;;;11240:79;;:::i;:::-;11202:119;11360:1;11385:53;11430:7;11421:6;11410:9;11406:22;11385:53;:::i;:::-;11375:63;;11331:117;11126:329;;;;:::o;11461:116::-;11531:21;11546:5;11531:21;:::i;:::-;11524:5;11521:32;11511:60;;11567:1;11564;11557:12;11511:60;11461:116;:::o;11583:133::-;11626:5;11664:6;11651:20;11642:29;;11680:30;11704:5;11680:30;:::i;:::-;11583:133;;;;:::o;11722:468::-;11787:6;11795;11844:2;11832:9;11823:7;11819:23;11815:32;11812:119;;;11850:79;;:::i;:::-;11812:119;11970:1;11995:53;12040:7;12031:6;12020:9;12016:22;11995:53;:::i;:::-;11985:63;;11941:117;12097:2;12123:50;12165:7;12156:6;12145:9;12141:22;12123:50;:::i;:::-;12113:60;;12068:115;11722:468;;;;;:::o;12196:307::-;12257:4;12347:18;12339:6;12336:30;12333:56;;;12369:18;;:::i;:::-;12333:56;12407:29;12429:6;12407:29;:::i;:::-;12399:37;;12491:4;12485;12481:15;12473:23;;12196:307;;;:::o;12509:410::-;12586:5;12611:65;12627:48;12668:6;12627:48;:::i;:::-;12611:65;:::i;:::-;12602:74;;12699:6;12692:5;12685:21;12737:4;12730:5;12726:16;12775:3;12766:6;12761:3;12757:16;12754:25;12751:112;;;12782:79;;:::i;:::-;12751:112;12872:41;12906:6;12901:3;12896;12872:41;:::i;:::-;12592:327;12509:410;;;;;:::o;12938:338::-;12993:5;13042:3;13035:4;13027:6;13023:17;13019:27;13009:122;;13050:79;;:::i;:::-;13009:122;13167:6;13154:20;13192:78;13266:3;13258:6;13251:4;13243:6;13239:17;13192:78;:::i;:::-;13183:87;;12999:277;12938:338;;;;:::o;13282:943::-;13377:6;13385;13393;13401;13450:3;13438:9;13429:7;13425:23;13421:33;13418:120;;;13457:79;;:::i;:::-;13418:120;13577:1;13602:53;13647:7;13638:6;13627:9;13623:22;13602:53;:::i;:::-;13592:63;;13548:117;13704:2;13730:53;13775:7;13766:6;13755:9;13751:22;13730:53;:::i;:::-;13720:63;;13675:118;13832:2;13858:53;13903:7;13894:6;13883:9;13879:22;13858:53;:::i;:::-;13848:63;;13803:118;13988:2;13977:9;13973:18;13960:32;14019:18;14011:6;14008:30;14005:117;;;14041:79;;:::i;:::-;14005:117;14146:62;14200:7;14191:6;14180:9;14176:22;14146:62;:::i;:::-;14136:72;;13931:287;13282:943;;;;;;;:::o;14231:474::-;14299:6;14307;14356:2;14344:9;14335:7;14331:23;14327:32;14324:119;;;14362:79;;:::i;:::-;14324:119;14482:1;14507:53;14552:7;14543:6;14532:9;14528:22;14507:53;:::i;:::-;14497:63;;14453:117;14609:2;14635:53;14680:7;14671:6;14660:9;14656:22;14635:53;:::i;:::-;14625:63;;14580:118;14231:474;;;;;:::o;14711:::-;14779:6;14787;14836:2;14824:9;14815:7;14811:23;14807:32;14804:119;;;14842:79;;:::i;:::-;14804:119;14962:1;14987:53;15032:7;15023:6;15012:9;15008:22;14987:53;:::i;:::-;14977:63;;14933:117;15089:2;15115:53;15160:7;15151:6;15140:9;15136:22;15115:53;:::i;:::-;15105:63;;15060:118;14711:474;;;;;:::o;15208:568::-;15281:8;15291:6;15341:3;15334:4;15326:6;15322:17;15318:27;15308:122;;15349:79;;:::i;:::-;15308:122;15462:6;15449:20;15439:30;;15492:18;15484:6;15481:30;15478:117;;;15514:79;;:::i;:::-;15478:117;15628:4;15620:6;15616:17;15604:29;;15682:3;15674:4;15666:6;15662:17;15652:8;15648:32;15645:41;15642:128;;;15689:79;;:::i;:::-;15642:128;15208:568;;;;;:::o;15782:704::-;15877:6;15885;15893;15942:2;15930:9;15921:7;15917:23;15913:32;15910:119;;;15948:79;;:::i;:::-;15910:119;16068:1;16093:53;16138:7;16129:6;16118:9;16114:22;16093:53;:::i;:::-;16083:63;;16039:117;16223:2;16212:9;16208:18;16195:32;16254:18;16246:6;16243:30;16240:117;;;16276:79;;:::i;:::-;16240:117;16389:80;16461:7;16452:6;16441:9;16437:22;16389:80;:::i;:::-;16371:98;;;;16166:313;15782:704;;;;;:::o;16492:180::-;16540:77;16537:1;16530:88;16637:4;16634:1;16627:15;16661:4;16658:1;16651:15;16678:320;16722:6;16759:1;16753:4;16749:12;16739:22;;16806:1;16800:4;16796:12;16827:18;16817:81;;16883:4;16875:6;16871:17;16861:27;;16817:81;16945:2;16937:6;16934:14;16914:18;16911:38;16908:84;;;16964:18;;:::i;:::-;16908:84;16729:269;16678:320;;;:::o;17004:177::-;17144:29;17140:1;17132:6;17128:14;17121:53;17004:177;:::o;17187:366::-;17329:3;17350:67;17414:2;17409:3;17350:67;:::i;:::-;17343:74;;17426:93;17515:3;17426:93;:::i;:::-;17544:2;17539:3;17535:12;17528:19;;17187:366;;;:::o;17559:419::-;17725:4;17763:2;17752:9;17748:18;17740:26;;17812:9;17806:4;17802:20;17798:1;17787:9;17783:17;17776:47;17840:131;17966:4;17840:131;:::i;:::-;17832:139;;17559:419;;;:::o;17984:180::-;18032:77;18029:1;18022:88;18129:4;18126:1;18119:15;18153:4;18150:1;18143:15;18170:305;18210:3;18229:20;18247:1;18229:20;:::i;:::-;18224:25;;18263:20;18281:1;18263:20;:::i;:::-;18258:25;;18417:1;18349:66;18345:74;18342:1;18339:81;18336:107;;;18423:18;;:::i;:::-;18336:107;18467:1;18464;18460:9;18453:16;;18170:305;;;;:::o;18481:94::-;18514:8;18562:5;18558:2;18554:14;18533:35;;18481:94;;;:::o;18581:::-;18620:7;18649:20;18663:5;18649:20;:::i;:::-;18638:31;;18581:94;;;:::o;18681:100::-;18720:7;18749:26;18769:5;18749:26;:::i;:::-;18738:37;;18681:100;;;:::o;18787:157::-;18892:45;18912:24;18930:5;18912:24;:::i;:::-;18892:45;:::i;:::-;18887:3;18880:58;18787:157;;:::o;18950:256::-;19062:3;19077:75;19148:3;19139:6;19077:75;:::i;:::-;19177:2;19172:3;19168:12;19161:19;;19197:3;19190:10;;18950:256;;;;:::o;19212:180::-;19352:32;19348:1;19340:6;19336:14;19329:56;19212:180;:::o;19398:366::-;19540:3;19561:67;19625:2;19620:3;19561:67;:::i;:::-;19554:74;;19637:93;19726:3;19637:93;:::i;:::-;19755:2;19750:3;19746:12;19739:19;;19398:366;;;:::o;19770:419::-;19936:4;19974:2;19963:9;19959:18;19951:26;;20023:9;20017:4;20013:20;20009:1;19998:9;19994:17;19987:47;20051:131;20177:4;20051:131;:::i;:::-;20043:139;;19770:419;;;:::o;20195:165::-;20335:17;20331:1;20323:6;20319:14;20312:41;20195:165;:::o;20366:366::-;20508:3;20529:67;20593:2;20588:3;20529:67;:::i;:::-;20522:74;;20605:93;20694:3;20605:93;:::i;:::-;20723:2;20718:3;20714:12;20707:19;;20366:366;;;:::o;20738:419::-;20904:4;20942:2;20931:9;20927:18;20919:26;;20991:9;20985:4;20981:20;20977:1;20966:9;20962:17;20955:47;21019:131;21145:4;21019:131;:::i;:::-;21011:139;;20738:419;;;:::o;21163:171::-;21303:23;21299:1;21291:6;21287:14;21280:47;21163:171;:::o;21340:366::-;21482:3;21503:67;21567:2;21562:3;21503:67;:::i;:::-;21496:74;;21579:93;21668:3;21579:93;:::i;:::-;21697:2;21692:3;21688:12;21681:19;;21340:366;;;:::o;21712:419::-;21878:4;21916:2;21905:9;21901:18;21893:26;;21965:9;21959:4;21955:20;21951:1;21940:9;21936:17;21929:47;21993:131;22119:4;21993:131;:::i;:::-;21985:139;;21712:419;;;:::o;22137:177::-;22277:29;22273:1;22265:6;22261:14;22254:53;22137:177;:::o;22320:366::-;22462:3;22483:67;22547:2;22542:3;22483:67;:::i;:::-;22476:74;;22559:93;22648:3;22559:93;:::i;:::-;22677:2;22672:3;22668:12;22661:19;;22320:366;;;:::o;22692:419::-;22858:4;22896:2;22885:9;22881:18;22873:26;;22945:9;22939:4;22935:20;22931:1;22920:9;22916:17;22909:47;22973:131;23099:4;22973:131;:::i;:::-;22965:139;;22692:419;;;:::o;23117:182::-;23257:34;23253:1;23245:6;23241:14;23234:58;23117:182;:::o;23305:366::-;23447:3;23468:67;23532:2;23527:3;23468:67;:::i;:::-;23461:74;;23544:93;23633:3;23544:93;:::i;:::-;23662:2;23657:3;23653:12;23646:19;;23305:366;;;:::o;23677:419::-;23843:4;23881:2;23870:9;23866:18;23858:26;;23930:9;23924:4;23920:20;23916:1;23905:9;23901:17;23894:47;23958:131;24084:4;23958:131;:::i;:::-;23950:139;;23677:419;;;:::o;24102:348::-;24142:7;24165:20;24183:1;24165:20;:::i;:::-;24160:25;;24199:20;24217:1;24199:20;:::i;:::-;24194:25;;24387:1;24319:66;24315:74;24312:1;24309:81;24304:1;24297:9;24290:17;24286:105;24283:131;;;24394:18;;:::i;:::-;24283:131;24442:1;24439;24435:9;24424:20;;24102:348;;;;:::o;24456:177::-;24596:29;24592:1;24584:6;24580:14;24573:53;24456:177;:::o;24639:366::-;24781:3;24802:67;24866:2;24861:3;24802:67;:::i;:::-;24795:74;;24878:93;24967:3;24878:93;:::i;:::-;24996:2;24991:3;24987:12;24980:19;;24639:366;;;:::o;25011:419::-;25177:4;25215:2;25204:9;25200:18;25192:26;;25264:9;25258:4;25254:20;25250:1;25239:9;25235:17;25228:47;25292:131;25418:4;25292:131;:::i;:::-;25284:139;;25011:419;;;:::o;25436:179::-;25576:31;25572:1;25564:6;25560:14;25553:55;25436:179;:::o;25621:366::-;25763:3;25784:67;25848:2;25843:3;25784:67;:::i;:::-;25777:74;;25860:93;25949:3;25860:93;:::i;:::-;25978:2;25973:3;25969:12;25962:19;;25621:366;;;:::o;25993:419::-;26159:4;26197:2;26186:9;26182:18;26174:26;;26246:9;26240:4;26236:20;26232:1;26221:9;26217:17;26210:47;26274:131;26400:4;26274:131;:::i;:::-;26266:139;;25993:419;;;:::o;26418:172::-;26558:24;26554:1;26546:6;26542:14;26535:48;26418:172;:::o;26596:366::-;26738:3;26759:67;26823:2;26818:3;26759:67;:::i;:::-;26752:74;;26835:93;26924:3;26835:93;:::i;:::-;26953:2;26948:3;26944:12;26937:19;;26596:366;;;:::o;26968:419::-;27134:4;27172:2;27161:9;27157:18;27149:26;;27221:9;27215:4;27211:20;27207:1;27196:9;27192:17;27185:47;27249:131;27375:4;27249:131;:::i;:::-;27241:139;;26968:419;;;:::o;27393:174::-;27533:26;27529:1;27521:6;27517:14;27510:50;27393:174;:::o;27573:366::-;27715:3;27736:67;27800:2;27795:3;27736:67;:::i;:::-;27729:74;;27812:93;27901:3;27812:93;:::i;:::-;27930:2;27925:3;27921:12;27914:19;;27573:366;;;:::o;27945:419::-;28111:4;28149:2;28138:9;28134:18;28126:26;;28198:9;28192:4;28188:20;28184:1;28173:9;28169:17;28162:47;28226:131;28352:4;28226:131;:::i;:::-;28218:139;;27945:419;;;:::o;28370:180::-;28510:32;28506:1;28498:6;28494:14;28487:56;28370:180;:::o;28556:366::-;28698:3;28719:67;28783:2;28778:3;28719:67;:::i;:::-;28712:74;;28795:93;28884:3;28795:93;:::i;:::-;28913:2;28908:3;28904:12;28897:19;;28556:366;;;:::o;28928:419::-;29094:4;29132:2;29121:9;29117:18;29109:26;;29181:9;29175:4;29171:20;29167:1;29156:9;29152:17;29145:47;29209:131;29335:4;29209:131;:::i;:::-;29201:139;;28928:419;;;:::o;29353:179::-;29493:31;29489:1;29481:6;29477:14;29470:55;29353:179;:::o;29538:366::-;29680:3;29701:67;29765:2;29760:3;29701:67;:::i;:::-;29694:74;;29777:93;29866:3;29777:93;:::i;:::-;29895:2;29890:3;29886:12;29879:19;;29538:366;;;:::o;29910:419::-;30076:4;30114:2;30103:9;30099:18;30091:26;;30163:9;30157:4;30153:20;30149:1;30138:9;30134:17;30127:47;30191:131;30317:4;30191:131;:::i;:::-;30183:139;;29910:419;;;:::o;30335:169::-;30475:21;30471:1;30463:6;30459:14;30452:45;30335:169;:::o;30510:366::-;30652:3;30673:67;30737:2;30732:3;30673:67;:::i;:::-;30666:74;;30749:93;30838:3;30749:93;:::i;:::-;30867:2;30862:3;30858:12;30851:19;;30510:366;;;:::o;30882:419::-;31048:4;31086:2;31075:9;31071:18;31063:26;;31135:9;31129:4;31125:20;31121:1;31110:9;31106:17;31099:47;31163:131;31289:4;31163:131;:::i;:::-;31155:139;;30882:419;;;:::o;31307:148::-;31409:11;31446:3;31431:18;;31307:148;;;;:::o;31461:377::-;31567:3;31595:39;31628:5;31595:39;:::i;:::-;31650:89;31732:6;31727:3;31650:89;:::i;:::-;31643:96;;31748:52;31793:6;31788:3;31781:4;31774:5;31770:16;31748:52;:::i;:::-;31825:6;31820:3;31816:16;31809:23;;31571:267;31461:377;;;;:::o;31844:435::-;32024:3;32046:95;32137:3;32128:6;32046:95;:::i;:::-;32039:102;;32158:95;32249:3;32240:6;32158:95;:::i;:::-;32151:102;;32270:3;32263:10;;31844:435;;;;;:::o;32285:225::-;32425:34;32421:1;32413:6;32409:14;32402:58;32494:8;32489:2;32481:6;32477:15;32470:33;32285:225;:::o;32516:366::-;32658:3;32679:67;32743:2;32738:3;32679:67;:::i;:::-;32672:74;;32755:93;32844:3;32755:93;:::i;:::-;32873:2;32868:3;32864:12;32857:19;;32516:366;;;:::o;32888:419::-;33054:4;33092:2;33081:9;33077:18;33069:26;;33141:9;33135:4;33131:20;33127:1;33116:9;33112:17;33105:47;33169:131;33295:4;33169:131;:::i;:::-;33161:139;;32888:419;;;:::o;33313:180::-;33361:77;33358:1;33351:88;33458:4;33455:1;33448:15;33482:4;33479:1;33472:15;33499:174;33639:26;33635:1;33627:6;33623:14;33616:50;33499:174;:::o;33679:366::-;33821:3;33842:67;33906:2;33901:3;33842:67;:::i;:::-;33835:74;;33918:93;34007:3;33918:93;:::i;:::-;34036:2;34031:3;34027:12;34020:19;;33679:366;;;:::o;34051:419::-;34217:4;34255:2;34244:9;34240:18;34232:26;;34304:9;34298:4;34294:20;34290:1;34279:9;34275:17;34268:47;34332:131;34458:4;34332:131;:::i;:::-;34324:139;;34051:419;;;:::o;34476:233::-;34515:3;34538:24;34556:5;34538:24;:::i;:::-;34529:33;;34584:66;34577:5;34574:77;34571:103;;;34654:18;;:::i;:::-;34571:103;34701:1;34694:5;34690:13;34683:20;;34476:233;;;:::o;34715:182::-;34855:34;34851:1;34843:6;34839:14;34832:58;34715:182;:::o;34903:366::-;35045:3;35066:67;35130:2;35125:3;35066:67;:::i;:::-;35059:74;;35142:93;35231:3;35142:93;:::i;:::-;35260:2;35255:3;35251:12;35244:19;;34903:366;;;:::o;35275:419::-;35441:4;35479:2;35468:9;35464:18;35456:26;;35528:9;35522:4;35518:20;35514:1;35503:9;35499:17;35492:47;35556:131;35682:4;35556:131;:::i;:::-;35548:139;;35275:419;;;:::o;35700:98::-;35751:6;35785:5;35779:12;35769:22;;35700:98;;;:::o;35804:168::-;35887:11;35921:6;35916:3;35909:19;35961:4;35956:3;35952:14;35937:29;;35804:168;;;;:::o;35978:360::-;36064:3;36092:38;36124:5;36092:38;:::i;:::-;36146:70;36209:6;36204:3;36146:70;:::i;:::-;36139:77;;36225:52;36270:6;36265:3;36258:4;36251:5;36247:16;36225:52;:::i;:::-;36302:29;36324:6;36302:29;:::i;:::-;36297:3;36293:39;36286:46;;36068:270;35978:360;;;;:::o;36344:640::-;36539:4;36577:3;36566:9;36562:19;36554:27;;36591:71;36659:1;36648:9;36644:17;36635:6;36591:71;:::i;:::-;36672:72;36740:2;36729:9;36725:18;36716:6;36672:72;:::i;:::-;36754;36822:2;36811:9;36807:18;36798:6;36754:72;:::i;:::-;36873:9;36867:4;36863:20;36858:2;36847:9;36843:18;36836:48;36901:76;36972:4;36963:6;36901:76;:::i;:::-;36893:84;;36344:640;;;;;;;:::o;36990:141::-;37046:5;37077:6;37071:13;37062:22;;37093:32;37119:5;37093:32;:::i;:::-;36990:141;;;;:::o;37137:349::-;37206:6;37255:2;37243:9;37234:7;37230:23;37226:32;37223:119;;;37261:79;;:::i;:::-;37223:119;37381:1;37406:63;37461:7;37452:6;37441:9;37437:22;37406:63;:::i;:::-;37396:73;;37352:127;37137:349;;;;:::o

Swarm Source

ipfs://6ecbf4f179c269f82737835caf2d9dbd5aac41d9f801e5acfacbc530960f7e61
Loading...
Loading
Loading...
Loading
[ 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.