ERC-721
Overview
Max Total Supply
777 Punko
Holders
449
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 PunkoLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PunkoPixel
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT //(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( //(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( //(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( //(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( //(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( //(((((((((((((((((((((((((((((#&&&&&&&&&&&&&&&&&&&&&((((((((((((((((((((((((((((( //(((((((((((((((((((((&&&&&&&&#.....................&&&&&&&&&(((((((((((((((((((( //((((((((((((((((%&&&& ..................................... &&&&(((((((((((((((( //((((((((((((((&&/ ........................................ &&&((((((((((((( //((((((((((((&&....................................................,&&((((((((((( //((((((((((&&.........................................................&&((((((((( //((((((((((&&.........................................................&&((((((((( //((((((((((&&.........................................................&&((((((((( //((((((((((&&.........................................................&&((((((((( //((((((((((&&.........................................................&&((((((((( //((((((((((&&...... ..................................................&&((((((((( //((((((((##&&....,**&&&&((**..........................,**&&&&((**.....&&##((((((( //(((((&&& .&&..&&&&&&&&&&&&&@&#.....................&&@&&&&&&&&&&&&%..&&..&&((((( //(((((&&&. &&..&&&&&&&&&&&&&&&#.....................&&&&&&&&&&&&&&&%..&& .&&((((( //(((((&&&,,&&..&&&&&&&&&&&&&&&#.....................&&&&&&&&&&&&&&&%..&&,,&&((((( //(((((&&&,,&&....(&& &&&&&&........................../&& &&&&&&.....&&,,&&((((( //((((((((@@&&..... .&&&&&&...............................&&&&&&.......&&&&((((((( //((((((((((&&..........................&&&&&..........................&&((((((((( //((((((((((&&.. ......................................................&&((((((((( //((((((((((((&&,,................................................,,*&&((((((((((( //((((((((((((((&&(,,,,,,...................................,,,,,,&&&((((((((((((( //((((((((((((((((%&&&&&&,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,&&&&&&(((((((((((((((( //(((((((((((((((((((((((&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(((((((((((((((((((((( //(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( //(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( //(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( //(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "./ERC721Punko.sol"; contract PunkoPixel is ERC721Punko, Ownable, ReentrancyGuard { address public tokenContract; using SafeERC20 for IERC20; mapping (address => uint256) public walletPunko; mapping(uint256 => uint256) public PunkoTokenUpgrade; string public baseURI; bool public mintPunkolistedEnabled = false; bool public mintPublicPunkoEnabled = false; bytes32 public merkleRoot; uint public freePunko = 1; uint public maxPankoPerTx = 2; uint public maxPerWallet = 2; uint public maxPanko = 777; uint public pankoPrice = 77000000000000000; //0.077 ETH uint public PriceETHpunkoUpgrade = 0; uint public PricePuncoinPunkoUpgrade = 0; constructor() ERC721Punko("Punko Pixel", "Punko",10,777){} function PunkolistedMint(uint256 qty, bytes32[] calldata _merkleProof) external payable { require(mintPunkolistedEnabled , "Punko Pixel: Minting Whitelist Pause"); require(walletPunko[msg.sender] + qty <= maxPerWallet,"Punko Pixel: Max Per Wallet"); require(qty <= maxPankoPerTx, "Punko Pixel: Max Per Transaction"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Punko Pixel: Not in whitelisted"); require(totalSupply() + qty <= maxPanko,"Punko Pixel: Soldout"); walletPunko[msg.sender] += qty; _mint(qty); } function PublicPankoMint(uint256 qty) external payable { require(mintPublicPunkoEnabled , "Punko Pixel: Minting Public Pause"); require(walletPunko[msg.sender] + qty <= maxPerWallet,"Punko Pixel: Max Per Wallet"); require(qty <= maxPankoPerTx, "Punko Pixel: Max Per Transaction"); require(totalSupply() + qty <= maxPanko,"Punko Pixel: Soldout"); _mint(qty); } function Upgrading(uint256 tokenId) external payable{ require(msg.value >= PriceETHpunkoUpgrade ,"Pixelated: Insufficient Eth"); IERC20(tokenContract).safeTransferFrom(msg.sender, address(this), PricePuncoinPunkoUpgrade); PunkoTokenUpgrade[tokenId] = PunkoTokenUpgrade[tokenId]++; } function _mint(uint qty) internal { if(walletPunko[msg.sender] < freePunko) { if(qty < freePunko) qty = freePunko; require(msg.value >= (qty - freePunko) * pankoPrice,"Punko Pixel: Claim Free"); walletPunko[msg.sender] += qty; _safeMint(msg.sender, qty); } else { require(msg.value >= qty * pankoPrice,"Punko Pixel: Normal"); walletPunko[msg.sender] += qty; _safeMint(msg.sender, qty); } } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setMerkleRoot(bytes32 root) public onlyOwner { merkleRoot = root; } function airdropPunko(address to ,uint256 qty) external onlyOwner { _safeMint(to, qty); } function PunkoOwnerMint(uint256 qty) external onlyOwner { _safeMint(msg.sender, qty); } function togglePublicPunkoMinting() external onlyOwner { mintPublicPunkoEnabled = !mintPublicPunkoEnabled ; } function toggleWhitelistPunkoMinting() external onlyOwner { mintPunkolistedEnabled = !mintPunkolistedEnabled ; } function setTokenContract(address _tokenContract) external onlyOwner{ tokenContract = _tokenContract; } function setBaseURI(string calldata baseURI_) external onlyOwner { baseURI = baseURI_; } function setPrice(uint256 price_) external onlyOwner { pankoPrice = price_; } function setmaxPankoPerTx(uint256 maxPankoPerTx_) external onlyOwner { maxPankoPerTx = maxPankoPerTx_; } function setmaxFreePankoPerTx(uint256 freePunko_) external onlyOwner { freePunko = freePunko_; } function setMaxPerWallet(uint256 maxPerWallet_) external onlyOwner { maxPerWallet = maxPerWallet_; } function setmaxPanko(uint256 maxPanko_) external onlyOwner { maxPanko = maxPanko_; } function withdraw() public onlyOwner { payable(msg.sender).transfer(payable(address(this)).balance); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721Punko is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // 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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721Punko: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721Punko: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721Punko: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721Punko: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721Punko: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721Punko: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721Punko: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721Punko: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721Punko: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721Punko.ownerOf(tokenId); require(to != owner, "ERC721Punko: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721Punko: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721Punko: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721Punko: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721Punko: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721Punko: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721Punko: token already minted"); require(quantity <= maxBatchSize, "ERC721Punko: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721Punko: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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 _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721Punko: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721Punko: transfer from incorrect owner" ); require(to != address(0), "ERC721Punko: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721Punko: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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`. */ 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. * * 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` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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); } }
// 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) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"PriceETHpunkoUpgrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PricePuncoinPunkoUpgrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"PublicPankoMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"PunkoOwnerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PunkoTokenUpgrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"PunkolistedMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Upgrading","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"airdropPunko","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freePunko","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPanko","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPankoPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPublicPunkoEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPunkolistedEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pankoPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"maxPerWallet_","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"freePunko_","type":"uint256"}],"name":"setmaxFreePankoPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPanko_","type":"uint256"}],"name":"setmaxPanko","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPankoPerTx_","type":"uint256"}],"name":"setmaxPankoPerTx","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":"togglePublicPunkoMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistPunkoMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletPunko","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000805560006007556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506001601055600260115560026012556103096013556701118f178fb48000601455600060155560006016553480156200007b57600080fd5b506040518060400160405280600b81526020017f50756e6b6f20506978656c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f50756e6b6f000000000000000000000000000000000000000000000000000000815250600a6103096000811162000133576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012a90620003db565b60405180910390fd5b6000821162000179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017090620003b9565b60405180910390fd5b836001908051906020019062000191929190620002bb565b508260029080519060200190620001aa929190620002bb565b508160a08181525050806080818152505050505050620001df620001d3620001ed60201b60201c565b620001f560201b60201c565b600160098190555062000511565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002c9906200040e565b90600052602060002090601f016020900481019282620002ed576000855562000339565b82601f106200030857805160ff191683800117855562000339565b8280016001018555821562000339579182015b82811115620003385782518255916020019190600101906200031b565b5b5090506200034891906200034c565b5090565b5b80821115620003675760008160009055506001016200034d565b5090565b60006200037a602b83620003fd565b9150620003878262000473565b604082019050919050565b6000620003a1603283620003fd565b9150620003ae82620004c2565b604082019050919050565b60006020820190508181036000830152620003d4816200036b565b9050919050565b60006020820190508181036000830152620003f68162000392565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200042757607f821691505b602082108114156200043e576200043d62000444565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f45524337323150756e6b6f3a206d61782062617463682073697a65206d75737460008201527f206265206e6f6e7a65726f000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a20636f6c6c656374696f6e206d7573742068617660008201527f652061206e6f6e7a65726f20737570706c790000000000000000000000000000602082015250565b60805160a051615e736200054260003960008181612dbc01528181612de5015261383c015260005050615e736000f3fe6080604052600436106102e35760003560e01c8063760e6a4e11610190578063bd4cd56b116100dc578063d7224ba011610095578063e268e4d31161006f578063e268e4d314610ae8578063e3bb2a0214610b11578063e985e9c514610b3c578063f2fde38b14610b79576102e3565b8063d7224ba014610a57578063dc33e68114610a82578063ded2568114610abf576102e3565b8063bd4cd56b14610945578063c70bf41114610970578063c87b56dd1461099b578063cdc6dc7e146109d8578063cf93b6b114610a15578063d04af88114610a40576102e3565b806395d89b4111610149578063ad4ee73e11610123578063ad4ee73e146108ae578063b88d4fde146108d7578063bbcd5bbe14610900578063bc224f0714610929576102e3565b806395d89b4114610831578063a22cb4651461085c578063aca3ebf614610885576102e3565b8063760e6a4e146107445780637cb647591461076f5780638da5cb5b1461079857806391b7f5ed146107c3578063922d0af9146107ec578063936e984e14610815576102e3565b80633bafc5931161024f5780634f6ccce7116102085780636352211e116101e25780636352211e146106885780636c0360eb146106c557806370a08231146106f0578063715018a61461072d576102e3565b80634f6ccce7146105f757806355a373d61461063457806355f804b31461065f576102e3565b80633bafc5931461052e5780633ccfd60b146105595780633de909bd14610570578063410446141461058757806342842e0e146105a3578063453c2310146105cc576102e3565b806318160ddd116102a157806318160ddd1461041e57806323b872dd146104495780632aada986146104725780632eb4a7ab1461049d5780632f745c59146104c857806338719a5314610505576102e3565b8062b64888146102e857806301ffc9a71461032557806306fdde0314610362578063081812fc1461038d578063095ea7b3146103ca5780630b5c9878146103f3575b600080fd5b3480156102f457600080fd5b5061030f600480360381019061030a9190614134565b610ba2565b60405161031c9190614f9b565b60405180910390f35b34801561033157600080fd5b5061034c60048036038101906103479190614351565b610bba565b6040516103599190614b23565b60405180910390f35b34801561036e57600080fd5b50610377610d04565b6040516103849190614b59565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af91906143f8565b610d96565b6040516103c19190614a85565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906142b7565b610e1b565b005b3480156103ff57600080fd5b50610408610f34565b6040516104159190614b23565b60405180910390f35b34801561042a57600080fd5b50610433610f47565b6040516104409190614f9b565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906141a1565b610f50565b005b34801561047e57600080fd5b50610487610f60565b6040516104949190614f9b565b60405180910390f35b3480156104a957600080fd5b506104b2610f66565b6040516104bf9190614b3e565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea91906142b7565b610f6c565b6040516104fc9190614f9b565b60405180910390f35b34801561051157600080fd5b5061052c600480360381019061052791906143f8565b61116a565b005b34801561053a57600080fd5b506105436111f0565b6040516105509190614f9b565b60405180910390f35b34801561056557600080fd5b5061056e6111f6565b005b34801561057c57600080fd5b506105856112d2565b005b6105a1600480360381019061059c91906143f8565b61137a565b005b3480156105af57600080fd5b506105ca60048036038101906105c591906141a1565b611452565b005b3480156105d857600080fd5b506105e1611472565b6040516105ee9190614f9b565b60405180910390f35b34801561060357600080fd5b5061061e600480360381019061061991906143f8565b611478565b60405161062b9190614f9b565b60405180910390f35b34801561064057600080fd5b506106496114cb565b6040516106569190614a85565b60405180910390f35b34801561066b57600080fd5b50610686600480360381019061068191906143ab565b6114f1565b005b34801561069457600080fd5b506106af60048036038101906106aa91906143f8565b611583565b6040516106bc9190614a85565b60405180910390f35b3480156106d157600080fd5b506106da611599565b6040516106e79190614b59565b60405180910390f35b3480156106fc57600080fd5b5061071760048036038101906107129190614134565b611627565b6040516107249190614f9b565b60405180910390f35b34801561073957600080fd5b50610742611710565b005b34801561075057600080fd5b50610759611798565b6040516107669190614f9b565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190614324565b61179e565b005b3480156107a457600080fd5b506107ad611824565b6040516107ba9190614a85565b60405180910390f35b3480156107cf57600080fd5b506107ea60048036038101906107e591906143f8565b61184e565b005b3480156107f857600080fd5b50610813600480360381019061080e91906143f8565b6118d4565b005b61082f600480360381019061082a9190614425565b61195d565b005b34801561083d57600080fd5b50610846611bf4565b6040516108539190614b59565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190614277565b611c86565b005b34801561089157600080fd5b506108ac60048036038101906108a791906143f8565b611e07565b005b3480156108ba57600080fd5b506108d560048036038101906108d091906142b7565b611e8d565b005b3480156108e357600080fd5b506108fe60048036038101906108f991906141f4565b611f17565b005b34801561090c57600080fd5b5061092760048036038101906109229190614134565b611f73565b005b610943600480360381019061093e91906143f8565b612033565b005b34801561095157600080fd5b5061095a6121b9565b6040516109679190614f9b565b60405180910390f35b34801561097c57600080fd5b506109856121bf565b6040516109929190614f9b565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd91906143f8565b6121c5565b6040516109cf9190614b59565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa91906143f8565b61226c565b604051610a0c9190614f9b565b60405180910390f35b348015610a2157600080fd5b50610a2a612284565b604051610a379190614f9b565b60405180910390f35b348015610a4c57600080fd5b50610a5561228a565b005b348015610a6357600080fd5b50610a6c612332565b604051610a799190614f9b565b60405180910390f35b348015610a8e57600080fd5b50610aa96004803603810190610aa49190614134565b612338565b604051610ab69190614f9b565b60405180910390f35b348015610acb57600080fd5b50610ae66004803603810190610ae191906143f8565b61234a565b005b348015610af457600080fd5b50610b0f6004803603810190610b0a91906143f8565b6123d0565b005b348015610b1d57600080fd5b50610b26612456565b604051610b339190614b23565b60405180910390f35b348015610b4857600080fd5b50610b636004803603810190610b5e9190614161565b612469565b604051610b709190614b23565b60405180910390f35b348015610b8557600080fd5b50610ba06004803603810190610b9b9190614134565b6124fd565b005b600b6020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c8557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ced57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cfd5750610cfc826125f5565b5b9050919050565b606060018054610d13906152ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3f906152ef565b8015610d8c5780601f10610d6157610100808354040283529160200191610d8c565b820191906000526020600020905b815481529060010190602001808311610d6f57829003601f168201915b5050505050905090565b6000610da18261265f565b610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790614edb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e2682611583565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90614c7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eb661266c565b73ffffffffffffffffffffffffffffffffffffffff161480610ee55750610ee481610edf61266c565b612469565b5b610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90614b9b565b60405180910390fd5b610f2f838383612674565b505050565b600e60009054906101000a900460ff1681565b60008054905090565b610f5b838383612726565b505050565b60145481565b600f5481565b6000610f7783611627565b8210610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf90614d3b565b60405180910390fd5b6000610fc2610f47565b905060008060005b83811015611128576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110bc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111145786841415611105578195505050505050611164565b838061111090615352565b9450505b50808061112090615352565b915050610fca565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90614cdb565b60405180910390fd5b92915050565b61117261266c565b73ffffffffffffffffffffffffffffffffffffffff16611190611824565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90614d9b565b60405180910390fd5b8060138190555050565b60135481565b6111fe61266c565b73ffffffffffffffffffffffffffffffffffffffff1661121c611824565b73ffffffffffffffffffffffffffffffffffffffff1614611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126990614d9b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156112cf573d6000803e3d6000fd5b50565b6112da61266c565b73ffffffffffffffffffffffffffffffffffffffff166112f8611824565b73ffffffffffffffffffffffffffffffffffffffff161461134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590614d9b565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6015543410156113bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b690614efb565b60405180910390fd5b6114103330601654600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612cdf909392919063ffffffff16565b600c6000828152602001908152602001600020600081548092919061143490615352565b91905055600c60008381526020019081526020016000208190555050565b61146d83838360405180602001604052806000815250611f17565b505050565b60125481565b6000611482610f47565b82106114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614d5b565b60405180910390fd5b819050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114f961266c565b73ffffffffffffffffffffffffffffffffffffffff16611517611824565b73ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614d9b565b60405180910390fd5b8181600d919061157e929190613ea8565b505050565b600061158e82612d68565b600001519050919050565b600d80546115a6906152ef565b80601f01602080910402602001604051908101604052809291908181526020018280546115d2906152ef565b801561161f5780601f106115f45761010080835404028352916020019161161f565b820191906000526020600020905b81548152906001019060200180831161160257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614cbb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61171861266c565b73ffffffffffffffffffffffffffffffffffffffff16611736611824565b73ffffffffffffffffffffffffffffffffffffffff161461178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614d9b565b60405180910390fd5b6117966000612f6b565b565b60165481565b6117a661266c565b73ffffffffffffffffffffffffffffffffffffffff166117c4611824565b73ffffffffffffffffffffffffffffffffffffffff161461181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190614d9b565b60405180910390fd5b80600f8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61185661266c565b73ffffffffffffffffffffffffffffffffffffffff16611874611824565b73ffffffffffffffffffffffffffffffffffffffff16146118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614d9b565b60405180910390fd5b8060148190555050565b6118dc61266c565b73ffffffffffffffffffffffffffffffffffffffff166118fa611824565b73ffffffffffffffffffffffffffffffffffffffff1614611950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194790614d9b565b60405180910390fd5b61195a3382613031565b50565b600e60009054906101000a900460ff166119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390614f7b565b60405180910390fd5b60125483600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119fa91906150a0565b1115611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3290614cfb565b60405180910390fd5b601154831115611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7790614ebb565b60405180910390fd5b600033604051602001611a939190614a2f565b604051602081830303815290604052805190602001209050611af9838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f548361304f565b611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90614bbb565b60405180910390fd5b60135484611b44610f47565b611b4e91906150a0565b1115611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690614e7b565b60405180910390fd5b83600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bde91906150a0565b92505081905550611bee84613066565b50505050565b606060028054611c03906152ef565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2f906152ef565b8015611c7c5780601f10611c5157610100808354040283529160200191611c7c565b820191906000526020600020905b815481529060010190602001808311611c5f57829003601f168201915b5050505050905090565b611c8e61266c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614c5b565b60405180910390fd5b8060066000611d0961266c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611db661266c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dfb9190614b23565b60405180910390a35050565b611e0f61266c565b73ffffffffffffffffffffffffffffffffffffffff16611e2d611824565b73ffffffffffffffffffffffffffffffffffffffff1614611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a90614d9b565b60405180910390fd5b8060108190555050565b611e9561266c565b73ffffffffffffffffffffffffffffffffffffffff16611eb3611824565b73ffffffffffffffffffffffffffffffffffffffff1614611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0090614d9b565b60405180910390fd5b611f138282613031565b5050565b611f22848484612726565b611f2e84848484613235565b611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6490614e3b565b60405180910390fd5b50505050565b611f7b61266c565b73ffffffffffffffffffffffffffffffffffffffff16611f99611824565b73ffffffffffffffffffffffffffffffffffffffff1614611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690614d9b565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60019054906101000a900460ff16612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207990614e5b565b60405180910390fd5b60125481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120d091906150a0565b1115612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890614cfb565b60405180910390fd5b601154811115612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90614ebb565b60405180910390fd5b60135481612162610f47565b61216c91906150a0565b11156121ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a490614e7b565b60405180910390fd5b6121b681613066565b50565b60105481565b60155481565b60606121d08261265f565b61220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220690614ddb565b60405180910390fd5b60006122196133cc565b905060008151116122395760405180602001604052806000815250612264565b806122438461345e565b604051602001612254929190614a61565b6040516020818303038152906040525b915050919050565b600c6020528060005260406000206000915090505481565b60115481565b61229261266c565b73ffffffffffffffffffffffffffffffffffffffff166122b0611824565b73ffffffffffffffffffffffffffffffffffffffff1614612306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fd90614d9b565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b60075481565b6000612343826135bf565b9050919050565b61235261266c565b73ffffffffffffffffffffffffffffffffffffffff16612370611824565b73ffffffffffffffffffffffffffffffffffffffff16146123c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bd90614d9b565b60405180910390fd5b8060118190555050565b6123d861266c565b73ffffffffffffffffffffffffffffffffffffffff166123f6611824565b73ffffffffffffffffffffffffffffffffffffffff161461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244390614d9b565b60405180910390fd5b8060128190555050565b600e60019054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61250561266c565b73ffffffffffffffffffffffffffffffffffffffff16612523611824565b73ffffffffffffffffffffffffffffffffffffffff1614612579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257090614d9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e090614c1b565b60405180910390fd5b6125f281612f6b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061273182612d68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661275861266c565b73ffffffffffffffffffffffffffffffffffffffff1614806127b4575061277d61266c565b73ffffffffffffffffffffffffffffffffffffffff1661279c84610d96565b73ffffffffffffffffffffffffffffffffffffffff16145b806127d057506127cf82600001516127ca61266c565b612469565b5b905080612812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280990614b7b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b90614f5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128eb90614dfb565b60405180910390fd5b61290185858560016136a8565b6129116000848460000151612674565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661297f9190615181565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a23919061505a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b2991906150a0565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c6f57612b9f8161265f565b15612c6e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cd786868660016136ae565b505050505050565b612d62846323b872dd60e01b858585604051602401612d0093929190614aa0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506136b4565b50505050565b612d70613f2e565b612d798261265f565b612db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612daf90614dbb565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612e1c5760017f000000000000000000000000000000000000000000000000000000000000000084612e0f91906151b5565b612e1991906150a0565b90505b60008390505b818110612f2a576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f1657809350505050612f66565b508080612f22906152c5565b915050612e22565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90614d7b565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61304b82826040518060200160405280600081525061377b565b5050565b60008261305c8584613c5a565b1490509392505050565b601054600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015613181576010548110156130bf5760105490505b601454601054826130d091906151b5565b6130da9190615127565b34101561311c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311390614c3b565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461316b91906150a0565b9250508190555061317c3382613031565b613232565b6014548161318f9190615127565b3410156131d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c890614bdb565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461322091906150a0565b925050819055506132313382613031565b5b50565b60006132568473ffffffffffffffffffffffffffffffffffffffff16613cb0565b156133bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261327f61266c565b8786866040518563ffffffff1660e01b81526004016132a19493929190614ad7565b602060405180830381600087803b1580156132bb57600080fd5b505af19250505080156132ec57506040513d601f19601f820116820180604052508101906132e9919061437e565b60015b61336f573d806000811461331c576040519150601f19603f3d011682016040523d82523d6000602084013e613321565b606091505b50600081511415613367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335e90614e3b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133c4565b600190505b949350505050565b6060600d80546133db906152ef565b80601f0160208091040260200160405190810160405280929190818152602001828054613407906152ef565b80156134545780601f1061342957610100808354040283529160200191613454565b820191906000526020600020905b81548152906001019060200180831161343757829003601f168201915b5050505050905090565b606060008214156134a6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135ba565b600082905060005b600082146134d85780806134c190615352565b915050600a826134d191906150f6565b91506134ae565b60008167ffffffffffffffff8111156134f4576134f36154ac565b5b6040519080825280601f01601f1916602001820160405280156135265781602001600182028036833780820191505090505b5090505b600085146135b35760018261353f91906151b5565b9150600a8561354e91906153bf565b603061355a91906150a0565b60f81b8183815181106135705761356f61547d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135ac91906150f6565b945061352a565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362790614f3b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b6000613716826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cd39092919063ffffffff16565b9050600081511115613776578080602001905181019061373691906142f7565b613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376c90614f1b565b60405180910390fd5b5b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e890614e1b565b60405180910390fd5b6137fa8161265f565b1561383a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383190614bfb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083111561389d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389490614d1b565b60405180910390fd5b6138aa60008583866136a8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516139a7919061505a565b6fffffffffffffffffffffffffffffffff1681526020018583602001516139ce919061505a565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613c3d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bdd6000888488613235565b613c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1390614e3b565b60405180910390fd5b8180613c2790615352565b9250508080613c3590615352565b915050613b6c565b5080600081905550613c5260008785886136ae565b505050505050565b60008082905060005b8451811015613ca557613c9082868381518110613c8357613c8261547d565b5b6020026020010151613ceb565b91508080613c9d90615352565b915050613c63565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060613ce28484600085613d16565b90509392505050565b6000818310613d0357613cfe8284613e2a565b613d0e565b613d0d8383613e2a565b5b905092915050565b606082471015613d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d5290614c9b565b60405180910390fd5b613d6485613cb0565b613da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9a90614e9b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613dcc9190614a4a565b60006040518083038185875af1925050503d8060008114613e09576040519150601f19603f3d011682016040523d82523d6000602084013e613e0e565b606091505b5091509150613e1e828286613e41565b92505050949350505050565b600082600052816020526040600020905092915050565b60608315613e5157829050613ea1565b600083511115613e645782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e989190614b59565b60405180910390fd5b9392505050565b828054613eb4906152ef565b90600052602060002090601f016020900481019282613ed65760008555613f1d565b82601f10613eef57803560ff1916838001178555613f1d565b82800160010185558215613f1d579182015b82811115613f1c578235825591602001919060010190613f01565b5b509050613f2a9190613f68565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613f81576000816000905550600101613f69565b5090565b6000613f98613f9384614fdb565b614fb6565b905082815260208101848484011115613fb457613fb36154ea565b5b613fbf848285615283565b509392505050565b600081359050613fd681615dca565b92915050565b60008083601f840112613ff257613ff16154e0565b5b8235905067ffffffffffffffff81111561400f5761400e6154db565b5b60208301915083602082028301111561402b5761402a6154e5565b5b9250929050565b60008135905061404181615de1565b92915050565b60008151905061405681615de1565b92915050565b60008135905061406b81615df8565b92915050565b60008135905061408081615e0f565b92915050565b60008151905061409581615e0f565b92915050565b600082601f8301126140b0576140af6154e0565b5b81356140c0848260208601613f85565b91505092915050565b60008083601f8401126140df576140de6154e0565b5b8235905067ffffffffffffffff8111156140fc576140fb6154db565b5b602083019150836001820283011115614118576141176154e5565b5b9250929050565b60008135905061412e81615e26565b92915050565b60006020828403121561414a576141496154f4565b5b600061415884828501613fc7565b91505092915050565b60008060408385031215614178576141776154f4565b5b600061418685828601613fc7565b925050602061419785828601613fc7565b9150509250929050565b6000806000606084860312156141ba576141b96154f4565b5b60006141c886828701613fc7565b93505060206141d986828701613fc7565b92505060406141ea8682870161411f565b9150509250925092565b6000806000806080858703121561420e5761420d6154f4565b5b600061421c87828801613fc7565b945050602061422d87828801613fc7565b935050604061423e8782880161411f565b925050606085013567ffffffffffffffff81111561425f5761425e6154ef565b5b61426b8782880161409b565b91505092959194509250565b6000806040838503121561428e5761428d6154f4565b5b600061429c85828601613fc7565b92505060206142ad85828601614032565b9150509250929050565b600080604083850312156142ce576142cd6154f4565b5b60006142dc85828601613fc7565b92505060206142ed8582860161411f565b9150509250929050565b60006020828403121561430d5761430c6154f4565b5b600061431b84828501614047565b91505092915050565b60006020828403121561433a576143396154f4565b5b60006143488482850161405c565b91505092915050565b600060208284031215614367576143666154f4565b5b600061437584828501614071565b91505092915050565b600060208284031215614394576143936154f4565b5b60006143a284828501614086565b91505092915050565b600080602083850312156143c2576143c16154f4565b5b600083013567ffffffffffffffff8111156143e0576143df6154ef565b5b6143ec858286016140c9565b92509250509250929050565b60006020828403121561440e5761440d6154f4565b5b600061441c8482850161411f565b91505092915050565b60008060006040848603121561443e5761443d6154f4565b5b600061444c8682870161411f565b935050602084013567ffffffffffffffff81111561446d5761446c6154ef565b5b61447986828701613fdc565b92509250509250925092565b61448e816151e9565b82525050565b6144a56144a0826151e9565b61539b565b82525050565b6144b4816151fb565b82525050565b6144c381615207565b82525050565b60006144d48261500c565b6144de8185615022565b93506144ee818560208601615292565b6144f7816154f9565b840191505092915050565b600061450d8261500c565b6145178185615033565b9350614527818560208601615292565b80840191505092915050565b600061453e82615017565b614548818561503e565b9350614558818560208601615292565b614561816154f9565b840191505092915050565b600061457782615017565b614581818561504f565b9350614591818560208601615292565b80840191505092915050565b60006145aa60368361503e565b91506145b582615517565b604082019050919050565b60006145cd603d8361503e565b91506145d882615566565b604082019050919050565b60006145f0601f8361503e565b91506145fb826155b5565b602082019050919050565b600061461360138361503e565b915061461e826155de565b602082019050919050565b600061463660218361503e565b915061464182615607565b604082019050919050565b600061465960268361503e565b915061466482615656565b604082019050919050565b600061467c60178361503e565b9150614687826156a5565b602082019050919050565b600061469f601e8361503e565b91506146aa826156ce565b602082019050919050565b60006146c260268361503e565b91506146cd826156f7565b604082019050919050565b60006146e560268361503e565b91506146f082615746565b604082019050919050565b6000614708602f8361503e565b915061471382615795565b604082019050919050565b600061472b60328361503e565b9150614736826157e4565b604082019050919050565b600061474e601b8361503e565b915061475982615833565b602082019050919050565b600061477160268361503e565b915061477c8261585c565b604082019050919050565b600061479460268361503e565b915061479f826158ab565b604082019050919050565b60006147b760278361503e565b91506147c2826158fa565b604082019050919050565b60006147da60338361503e565b91506147e582615949565b604082019050919050565b60006147fd60208361503e565b915061480882615998565b602082019050919050565b6000614820602e8361503e565b915061482b826159c1565b604082019050919050565b6000614843602f8361503e565b915061484e82615a10565b604082019050919050565b600061486660298361503e565b915061487182615a5f565b604082019050919050565b600061488960258361503e565b915061489482615aae565b604082019050919050565b60006148ac60378361503e565b91506148b782615afd565b604082019050919050565b60006148cf60218361503e565b91506148da82615b4c565b604082019050919050565b60006148f260148361503e565b91506148fd82615b9b565b602082019050919050565b6000614915601d8361503e565b915061492082615bc4565b602082019050919050565b600061493860208361503e565b915061494382615bed565b602082019050919050565b600061495b60318361503e565b915061496682615c16565b604082019050919050565b600061497e601b8361503e565b915061498982615c65565b602082019050919050565b60006149a1602a8361503e565b91506149ac82615c8e565b604082019050919050565b60006149c460358361503e565b91506149cf82615cdd565b604082019050919050565b60006149e7602a8361503e565b91506149f282615d2c565b604082019050919050565b6000614a0a60248361503e565b9150614a1582615d7b565b604082019050919050565b614a2981615279565b82525050565b6000614a3b8284614494565b60148201915081905092915050565b6000614a568284614502565b915081905092915050565b6000614a6d828561456c565b9150614a79828461456c565b91508190509392505050565b6000602082019050614a9a6000830184614485565b92915050565b6000606082019050614ab56000830186614485565b614ac26020830185614485565b614acf6040830184614a20565b949350505050565b6000608082019050614aec6000830187614485565b614af96020830186614485565b614b066040830185614a20565b8181036060830152614b1881846144c9565b905095945050505050565b6000602082019050614b3860008301846144ab565b92915050565b6000602082019050614b5360008301846144ba565b92915050565b60006020820190508181036000830152614b738184614533565b905092915050565b60006020820190508181036000830152614b948161459d565b9050919050565b60006020820190508181036000830152614bb4816145c0565b9050919050565b60006020820190508181036000830152614bd4816145e3565b9050919050565b60006020820190508181036000830152614bf481614606565b9050919050565b60006020820190508181036000830152614c1481614629565b9050919050565b60006020820190508181036000830152614c348161464c565b9050919050565b60006020820190508181036000830152614c548161466f565b9050919050565b60006020820190508181036000830152614c7481614692565b9050919050565b60006020820190508181036000830152614c94816146b5565b9050919050565b60006020820190508181036000830152614cb4816146d8565b9050919050565b60006020820190508181036000830152614cd4816146fb565b9050919050565b60006020820190508181036000830152614cf48161471e565b9050919050565b60006020820190508181036000830152614d1481614741565b9050919050565b60006020820190508181036000830152614d3481614764565b9050919050565b60006020820190508181036000830152614d5481614787565b9050919050565b60006020820190508181036000830152614d74816147aa565b9050919050565b60006020820190508181036000830152614d94816147cd565b9050919050565b60006020820190508181036000830152614db4816147f0565b9050919050565b60006020820190508181036000830152614dd481614813565b9050919050565b60006020820190508181036000830152614df481614836565b9050919050565b60006020820190508181036000830152614e1481614859565b9050919050565b60006020820190508181036000830152614e348161487c565b9050919050565b60006020820190508181036000830152614e548161489f565b9050919050565b60006020820190508181036000830152614e74816148c2565b9050919050565b60006020820190508181036000830152614e94816148e5565b9050919050565b60006020820190508181036000830152614eb481614908565b9050919050565b60006020820190508181036000830152614ed48161492b565b9050919050565b60006020820190508181036000830152614ef48161494e565b9050919050565b60006020820190508181036000830152614f1481614971565b9050919050565b60006020820190508181036000830152614f3481614994565b9050919050565b60006020820190508181036000830152614f54816149b7565b9050919050565b60006020820190508181036000830152614f74816149da565b9050919050565b60006020820190508181036000830152614f94816149fd565b9050919050565b6000602082019050614fb06000830184614a20565b92915050565b6000614fc0614fd1565b9050614fcc8282615321565b919050565b6000604051905090565b600067ffffffffffffffff821115614ff657614ff56154ac565b5b614fff826154f9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150658261523d565b91506150708361523d565b9250826fffffffffffffffffffffffffffffffff03821115615095576150946153f0565b5b828201905092915050565b60006150ab82615279565b91506150b683615279565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150eb576150ea6153f0565b5b828201905092915050565b600061510182615279565b915061510c83615279565b92508261511c5761511b61541f565b5b828204905092915050565b600061513282615279565b915061513d83615279565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615176576151756153f0565b5b828202905092915050565b600061518c8261523d565b91506151978361523d565b9250828210156151aa576151a96153f0565b5b828203905092915050565b60006151c082615279565b91506151cb83615279565b9250828210156151de576151dd6153f0565b5b828203905092915050565b60006151f482615259565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152b0578082015181840152602081019050615295565b838111156152bf576000848401525b50505050565b60006152d082615279565b915060008214156152e4576152e36153f0565b5b600182039050919050565b6000600282049050600182168061530757607f821691505b6020821081141561531b5761531a61544e565b5b50919050565b61532a826154f9565b810181811067ffffffffffffffff82111715615349576153486154ac565b5b80604052505050565b600061535d82615279565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153905761538f6153f0565b5b600182019050919050565b60006153a6826153ad565b9050919050565b60006153b88261550a565b9050919050565b60006153ca82615279565b91506153d583615279565b9250826153e5576153e461541f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45524337323150756e6b6f3a207472616e736665722063616c6c65722069732060008201527f6e6f74206f776e6572206e6f7220617070726f76656400000000000000000000602082015250565b7f45524337323150756e6b6f3a20617070726f76652063616c6c6572206973206e60008201527f6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c000000602082015250565b7f50756e6b6f20506978656c3a204e6f7420696e2077686974656c697374656400600082015250565b7f50756e6b6f20506978656c3a204e6f726d616c00000000000000000000000000600082015250565b7f45524337323150756e6b6f3a20746f6b656e20616c7265616479206d696e746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50756e6b6f20506978656c3a20436c61696d2046726565000000000000000000600082015250565b7f45524337323150756e6b6f3a20617070726f766520746f2063616c6c65720000600082015250565b7f45524337323150756e6b6f3a20617070726f76616c20746f2063757272656e7460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a2062616c616e636520717565727920666f72207460008201527f6865207a65726f20616464726573730000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a20756e61626c6520746f2067657420746f6b656e60008201527f206f66206f776e657220627920696e6465780000000000000000000000000000602082015250565b7f50756e6b6f20506978656c3a204d6178205065722057616c6c65740000000000600082015250565b7f45524337323150756e6b6f3a207175616e7469747920746f206d696e7420746f60008201527f6f20686967680000000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a206f776e657220696e646578206f7574206f662060008201527f626f756e64730000000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a20676c6f62616c20696e646578206f7574206f6660008201527f20626f756e647300000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a20756e61626c6520746f2064657465726d696e6560008201527f20746865206f776e6572206f6620746f6b656e00000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524337323150756e6b6f3a206f776e657220717565727920666f72206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a207472616e7366657220746f20746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a206d696e7420746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a207472616e7366657220746f206e6f6e2045524360008201527f373231526563656976657220696d706c656d656e746572000000000000000000602082015250565b7f50756e6b6f20506978656c3a204d696e74696e67205075626c6963205061757360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f50756e6b6f20506978656c3a20536f6c646f7574000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f50756e6b6f20506978656c3a204d617820506572205472616e73616374696f6e600082015250565b7f45524337323150756e6b6f3a20617070726f76656420717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f506978656c617465643a20496e73756666696369656e74204574680000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a206e756d626572206d696e74656420717565727960008201527f20666f7220746865207a65726f20616464726573730000000000000000000000602082015250565b7f45524337323150756e6b6f3a207472616e736665722066726f6d20696e636f7260008201527f72656374206f776e657200000000000000000000000000000000000000000000602082015250565b7f50756e6b6f20506978656c3a204d696e74696e672057686974656c697374205060008201527f6175736500000000000000000000000000000000000000000000000000000000602082015250565b615dd3816151e9565b8114615dde57600080fd5b50565b615dea816151fb565b8114615df557600080fd5b50565b615e0181615207565b8114615e0c57600080fd5b50565b615e1881615211565b8114615e2357600080fd5b50565b615e2f81615279565b8114615e3a57600080fd5b5056fea2646970667358221220007279335e3d2cf3159f9dd85c4d20274546b09f26e7dca7068e72d94094c82664736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102e35760003560e01c8063760e6a4e11610190578063bd4cd56b116100dc578063d7224ba011610095578063e268e4d31161006f578063e268e4d314610ae8578063e3bb2a0214610b11578063e985e9c514610b3c578063f2fde38b14610b79576102e3565b8063d7224ba014610a57578063dc33e68114610a82578063ded2568114610abf576102e3565b8063bd4cd56b14610945578063c70bf41114610970578063c87b56dd1461099b578063cdc6dc7e146109d8578063cf93b6b114610a15578063d04af88114610a40576102e3565b806395d89b4111610149578063ad4ee73e11610123578063ad4ee73e146108ae578063b88d4fde146108d7578063bbcd5bbe14610900578063bc224f0714610929576102e3565b806395d89b4114610831578063a22cb4651461085c578063aca3ebf614610885576102e3565b8063760e6a4e146107445780637cb647591461076f5780638da5cb5b1461079857806391b7f5ed146107c3578063922d0af9146107ec578063936e984e14610815576102e3565b80633bafc5931161024f5780634f6ccce7116102085780636352211e116101e25780636352211e146106885780636c0360eb146106c557806370a08231146106f0578063715018a61461072d576102e3565b80634f6ccce7146105f757806355a373d61461063457806355f804b31461065f576102e3565b80633bafc5931461052e5780633ccfd60b146105595780633de909bd14610570578063410446141461058757806342842e0e146105a3578063453c2310146105cc576102e3565b806318160ddd116102a157806318160ddd1461041e57806323b872dd146104495780632aada986146104725780632eb4a7ab1461049d5780632f745c59146104c857806338719a5314610505576102e3565b8062b64888146102e857806301ffc9a71461032557806306fdde0314610362578063081812fc1461038d578063095ea7b3146103ca5780630b5c9878146103f3575b600080fd5b3480156102f457600080fd5b5061030f600480360381019061030a9190614134565b610ba2565b60405161031c9190614f9b565b60405180910390f35b34801561033157600080fd5b5061034c60048036038101906103479190614351565b610bba565b6040516103599190614b23565b60405180910390f35b34801561036e57600080fd5b50610377610d04565b6040516103849190614b59565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af91906143f8565b610d96565b6040516103c19190614a85565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906142b7565b610e1b565b005b3480156103ff57600080fd5b50610408610f34565b6040516104159190614b23565b60405180910390f35b34801561042a57600080fd5b50610433610f47565b6040516104409190614f9b565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906141a1565b610f50565b005b34801561047e57600080fd5b50610487610f60565b6040516104949190614f9b565b60405180910390f35b3480156104a957600080fd5b506104b2610f66565b6040516104bf9190614b3e565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea91906142b7565b610f6c565b6040516104fc9190614f9b565b60405180910390f35b34801561051157600080fd5b5061052c600480360381019061052791906143f8565b61116a565b005b34801561053a57600080fd5b506105436111f0565b6040516105509190614f9b565b60405180910390f35b34801561056557600080fd5b5061056e6111f6565b005b34801561057c57600080fd5b506105856112d2565b005b6105a1600480360381019061059c91906143f8565b61137a565b005b3480156105af57600080fd5b506105ca60048036038101906105c591906141a1565b611452565b005b3480156105d857600080fd5b506105e1611472565b6040516105ee9190614f9b565b60405180910390f35b34801561060357600080fd5b5061061e600480360381019061061991906143f8565b611478565b60405161062b9190614f9b565b60405180910390f35b34801561064057600080fd5b506106496114cb565b6040516106569190614a85565b60405180910390f35b34801561066b57600080fd5b50610686600480360381019061068191906143ab565b6114f1565b005b34801561069457600080fd5b506106af60048036038101906106aa91906143f8565b611583565b6040516106bc9190614a85565b60405180910390f35b3480156106d157600080fd5b506106da611599565b6040516106e79190614b59565b60405180910390f35b3480156106fc57600080fd5b5061071760048036038101906107129190614134565b611627565b6040516107249190614f9b565b60405180910390f35b34801561073957600080fd5b50610742611710565b005b34801561075057600080fd5b50610759611798565b6040516107669190614f9b565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190614324565b61179e565b005b3480156107a457600080fd5b506107ad611824565b6040516107ba9190614a85565b60405180910390f35b3480156107cf57600080fd5b506107ea60048036038101906107e591906143f8565b61184e565b005b3480156107f857600080fd5b50610813600480360381019061080e91906143f8565b6118d4565b005b61082f600480360381019061082a9190614425565b61195d565b005b34801561083d57600080fd5b50610846611bf4565b6040516108539190614b59565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190614277565b611c86565b005b34801561089157600080fd5b506108ac60048036038101906108a791906143f8565b611e07565b005b3480156108ba57600080fd5b506108d560048036038101906108d091906142b7565b611e8d565b005b3480156108e357600080fd5b506108fe60048036038101906108f991906141f4565b611f17565b005b34801561090c57600080fd5b5061092760048036038101906109229190614134565b611f73565b005b610943600480360381019061093e91906143f8565b612033565b005b34801561095157600080fd5b5061095a6121b9565b6040516109679190614f9b565b60405180910390f35b34801561097c57600080fd5b506109856121bf565b6040516109929190614f9b565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd91906143f8565b6121c5565b6040516109cf9190614b59565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa91906143f8565b61226c565b604051610a0c9190614f9b565b60405180910390f35b348015610a2157600080fd5b50610a2a612284565b604051610a379190614f9b565b60405180910390f35b348015610a4c57600080fd5b50610a5561228a565b005b348015610a6357600080fd5b50610a6c612332565b604051610a799190614f9b565b60405180910390f35b348015610a8e57600080fd5b50610aa96004803603810190610aa49190614134565b612338565b604051610ab69190614f9b565b60405180910390f35b348015610acb57600080fd5b50610ae66004803603810190610ae191906143f8565b61234a565b005b348015610af457600080fd5b50610b0f6004803603810190610b0a91906143f8565b6123d0565b005b348015610b1d57600080fd5b50610b26612456565b604051610b339190614b23565b60405180910390f35b348015610b4857600080fd5b50610b636004803603810190610b5e9190614161565b612469565b604051610b709190614b23565b60405180910390f35b348015610b8557600080fd5b50610ba06004803603810190610b9b9190614134565b6124fd565b005b600b6020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c8557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ced57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cfd5750610cfc826125f5565b5b9050919050565b606060018054610d13906152ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3f906152ef565b8015610d8c5780601f10610d6157610100808354040283529160200191610d8c565b820191906000526020600020905b815481529060010190602001808311610d6f57829003601f168201915b5050505050905090565b6000610da18261265f565b610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790614edb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e2682611583565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90614c7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eb661266c565b73ffffffffffffffffffffffffffffffffffffffff161480610ee55750610ee481610edf61266c565b612469565b5b610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90614b9b565b60405180910390fd5b610f2f838383612674565b505050565b600e60009054906101000a900460ff1681565b60008054905090565b610f5b838383612726565b505050565b60145481565b600f5481565b6000610f7783611627565b8210610fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faf90614d3b565b60405180910390fd5b6000610fc2610f47565b905060008060005b83811015611128576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110bc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111145786841415611105578195505050505050611164565b838061111090615352565b9450505b50808061112090615352565b915050610fca565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90614cdb565b60405180910390fd5b92915050565b61117261266c565b73ffffffffffffffffffffffffffffffffffffffff16611190611824565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90614d9b565b60405180910390fd5b8060138190555050565b60135481565b6111fe61266c565b73ffffffffffffffffffffffffffffffffffffffff1661121c611824565b73ffffffffffffffffffffffffffffffffffffffff1614611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126990614d9b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156112cf573d6000803e3d6000fd5b50565b6112da61266c565b73ffffffffffffffffffffffffffffffffffffffff166112f8611824565b73ffffffffffffffffffffffffffffffffffffffff161461134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590614d9b565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6015543410156113bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b690614efb565b60405180910390fd5b6114103330601654600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612cdf909392919063ffffffff16565b600c6000828152602001908152602001600020600081548092919061143490615352565b91905055600c60008381526020019081526020016000208190555050565b61146d83838360405180602001604052806000815250611f17565b505050565b60125481565b6000611482610f47565b82106114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614d5b565b60405180910390fd5b819050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114f961266c565b73ffffffffffffffffffffffffffffffffffffffff16611517611824565b73ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614d9b565b60405180910390fd5b8181600d919061157e929190613ea8565b505050565b600061158e82612d68565b600001519050919050565b600d80546115a6906152ef565b80601f01602080910402602001604051908101604052809291908181526020018280546115d2906152ef565b801561161f5780601f106115f45761010080835404028352916020019161161f565b820191906000526020600020905b81548152906001019060200180831161160257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614cbb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61171861266c565b73ffffffffffffffffffffffffffffffffffffffff16611736611824565b73ffffffffffffffffffffffffffffffffffffffff161461178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614d9b565b60405180910390fd5b6117966000612f6b565b565b60165481565b6117a661266c565b73ffffffffffffffffffffffffffffffffffffffff166117c4611824565b73ffffffffffffffffffffffffffffffffffffffff161461181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190614d9b565b60405180910390fd5b80600f8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61185661266c565b73ffffffffffffffffffffffffffffffffffffffff16611874611824565b73ffffffffffffffffffffffffffffffffffffffff16146118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614d9b565b60405180910390fd5b8060148190555050565b6118dc61266c565b73ffffffffffffffffffffffffffffffffffffffff166118fa611824565b73ffffffffffffffffffffffffffffffffffffffff1614611950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194790614d9b565b60405180910390fd5b61195a3382613031565b50565b600e60009054906101000a900460ff166119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390614f7b565b60405180910390fd5b60125483600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119fa91906150a0565b1115611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3290614cfb565b60405180910390fd5b601154831115611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7790614ebb565b60405180910390fd5b600033604051602001611a939190614a2f565b604051602081830303815290604052805190602001209050611af9838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f548361304f565b611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90614bbb565b60405180910390fd5b60135484611b44610f47565b611b4e91906150a0565b1115611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690614e7b565b60405180910390fd5b83600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bde91906150a0565b92505081905550611bee84613066565b50505050565b606060028054611c03906152ef565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2f906152ef565b8015611c7c5780601f10611c5157610100808354040283529160200191611c7c565b820191906000526020600020905b815481529060010190602001808311611c5f57829003601f168201915b5050505050905090565b611c8e61266c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614c5b565b60405180910390fd5b8060066000611d0961266c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611db661266c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dfb9190614b23565b60405180910390a35050565b611e0f61266c565b73ffffffffffffffffffffffffffffffffffffffff16611e2d611824565b73ffffffffffffffffffffffffffffffffffffffff1614611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a90614d9b565b60405180910390fd5b8060108190555050565b611e9561266c565b73ffffffffffffffffffffffffffffffffffffffff16611eb3611824565b73ffffffffffffffffffffffffffffffffffffffff1614611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0090614d9b565b60405180910390fd5b611f138282613031565b5050565b611f22848484612726565b611f2e84848484613235565b611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6490614e3b565b60405180910390fd5b50505050565b611f7b61266c565b73ffffffffffffffffffffffffffffffffffffffff16611f99611824565b73ffffffffffffffffffffffffffffffffffffffff1614611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690614d9b565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60019054906101000a900460ff16612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207990614e5b565b60405180910390fd5b60125481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120d091906150a0565b1115612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890614cfb565b60405180910390fd5b601154811115612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90614ebb565b60405180910390fd5b60135481612162610f47565b61216c91906150a0565b11156121ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a490614e7b565b60405180910390fd5b6121b681613066565b50565b60105481565b60155481565b60606121d08261265f565b61220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220690614ddb565b60405180910390fd5b60006122196133cc565b905060008151116122395760405180602001604052806000815250612264565b806122438461345e565b604051602001612254929190614a61565b6040516020818303038152906040525b915050919050565b600c6020528060005260406000206000915090505481565b60115481565b61229261266c565b73ffffffffffffffffffffffffffffffffffffffff166122b0611824565b73ffffffffffffffffffffffffffffffffffffffff1614612306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fd90614d9b565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b60075481565b6000612343826135bf565b9050919050565b61235261266c565b73ffffffffffffffffffffffffffffffffffffffff16612370611824565b73ffffffffffffffffffffffffffffffffffffffff16146123c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bd90614d9b565b60405180910390fd5b8060118190555050565b6123d861266c565b73ffffffffffffffffffffffffffffffffffffffff166123f6611824565b73ffffffffffffffffffffffffffffffffffffffff161461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244390614d9b565b60405180910390fd5b8060128190555050565b600e60019054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61250561266c565b73ffffffffffffffffffffffffffffffffffffffff16612523611824565b73ffffffffffffffffffffffffffffffffffffffff1614612579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257090614d9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e090614c1b565b60405180910390fd5b6125f281612f6b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061273182612d68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661275861266c565b73ffffffffffffffffffffffffffffffffffffffff1614806127b4575061277d61266c565b73ffffffffffffffffffffffffffffffffffffffff1661279c84610d96565b73ffffffffffffffffffffffffffffffffffffffff16145b806127d057506127cf82600001516127ca61266c565b612469565b5b905080612812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280990614b7b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b90614f5b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128eb90614dfb565b60405180910390fd5b61290185858560016136a8565b6129116000848460000151612674565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661297f9190615181565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a23919061505a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b2991906150a0565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c6f57612b9f8161265f565b15612c6e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cd786868660016136ae565b505050505050565b612d62846323b872dd60e01b858585604051602401612d0093929190614aa0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506136b4565b50505050565b612d70613f2e565b612d798261265f565b612db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612daf90614dbb565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a8310612e1c5760017f000000000000000000000000000000000000000000000000000000000000000a84612e0f91906151b5565b612e1991906150a0565b90505b60008390505b818110612f2a576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f1657809350505050612f66565b508080612f22906152c5565b915050612e22565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90614d7b565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61304b82826040518060200160405280600081525061377b565b5050565b60008261305c8584613c5a565b1490509392505050565b601054600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015613181576010548110156130bf5760105490505b601454601054826130d091906151b5565b6130da9190615127565b34101561311c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311390614c3b565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461316b91906150a0565b9250508190555061317c3382613031565b613232565b6014548161318f9190615127565b3410156131d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c890614bdb565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461322091906150a0565b925050819055506132313382613031565b5b50565b60006132568473ffffffffffffffffffffffffffffffffffffffff16613cb0565b156133bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261327f61266c565b8786866040518563ffffffff1660e01b81526004016132a19493929190614ad7565b602060405180830381600087803b1580156132bb57600080fd5b505af19250505080156132ec57506040513d601f19601f820116820180604052508101906132e9919061437e565b60015b61336f573d806000811461331c576040519150601f19603f3d011682016040523d82523d6000602084013e613321565b606091505b50600081511415613367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335e90614e3b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133c4565b600190505b949350505050565b6060600d80546133db906152ef565b80601f0160208091040260200160405190810160405280929190818152602001828054613407906152ef565b80156134545780601f1061342957610100808354040283529160200191613454565b820191906000526020600020905b81548152906001019060200180831161343757829003601f168201915b5050505050905090565b606060008214156134a6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135ba565b600082905060005b600082146134d85780806134c190615352565b915050600a826134d191906150f6565b91506134ae565b60008167ffffffffffffffff8111156134f4576134f36154ac565b5b6040519080825280601f01601f1916602001820160405280156135265781602001600182028036833780820191505090505b5090505b600085146135b35760018261353f91906151b5565b9150600a8561354e91906153bf565b603061355a91906150a0565b60f81b8183815181106135705761356f61547d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135ac91906150f6565b945061352a565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362790614f3b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b6000613716826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cd39092919063ffffffff16565b9050600081511115613776578080602001905181019061373691906142f7565b613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376c90614f1b565b60405180910390fd5b5b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e890614e1b565b60405180910390fd5b6137fa8161265f565b1561383a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383190614bfb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a83111561389d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389490614d1b565b60405180910390fd5b6138aa60008583866136a8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516139a7919061505a565b6fffffffffffffffffffffffffffffffff1681526020018583602001516139ce919061505a565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613c3d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bdd6000888488613235565b613c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1390614e3b565b60405180910390fd5b8180613c2790615352565b9250508080613c3590615352565b915050613b6c565b5080600081905550613c5260008785886136ae565b505050505050565b60008082905060005b8451811015613ca557613c9082868381518110613c8357613c8261547d565b5b6020026020010151613ceb565b91508080613c9d90615352565b915050613c63565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060613ce28484600085613d16565b90509392505050565b6000818310613d0357613cfe8284613e2a565b613d0e565b613d0d8383613e2a565b5b905092915050565b606082471015613d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d5290614c9b565b60405180910390fd5b613d6485613cb0565b613da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9a90614e9b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613dcc9190614a4a565b60006040518083038185875af1925050503d8060008114613e09576040519150601f19603f3d011682016040523d82523d6000602084013e613e0e565b606091505b5091509150613e1e828286613e41565b92505050949350505050565b600082600052816020526040600020905092915050565b60608315613e5157829050613ea1565b600083511115613e645782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e989190614b59565b60405180910390fd5b9392505050565b828054613eb4906152ef565b90600052602060002090601f016020900481019282613ed65760008555613f1d565b82601f10613eef57803560ff1916838001178555613f1d565b82800160010185558215613f1d579182015b82811115613f1c578235825591602001919060010190613f01565b5b509050613f2a9190613f68565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613f81576000816000905550600101613f69565b5090565b6000613f98613f9384614fdb565b614fb6565b905082815260208101848484011115613fb457613fb36154ea565b5b613fbf848285615283565b509392505050565b600081359050613fd681615dca565b92915050565b60008083601f840112613ff257613ff16154e0565b5b8235905067ffffffffffffffff81111561400f5761400e6154db565b5b60208301915083602082028301111561402b5761402a6154e5565b5b9250929050565b60008135905061404181615de1565b92915050565b60008151905061405681615de1565b92915050565b60008135905061406b81615df8565b92915050565b60008135905061408081615e0f565b92915050565b60008151905061409581615e0f565b92915050565b600082601f8301126140b0576140af6154e0565b5b81356140c0848260208601613f85565b91505092915050565b60008083601f8401126140df576140de6154e0565b5b8235905067ffffffffffffffff8111156140fc576140fb6154db565b5b602083019150836001820283011115614118576141176154e5565b5b9250929050565b60008135905061412e81615e26565b92915050565b60006020828403121561414a576141496154f4565b5b600061415884828501613fc7565b91505092915050565b60008060408385031215614178576141776154f4565b5b600061418685828601613fc7565b925050602061419785828601613fc7565b9150509250929050565b6000806000606084860312156141ba576141b96154f4565b5b60006141c886828701613fc7565b93505060206141d986828701613fc7565b92505060406141ea8682870161411f565b9150509250925092565b6000806000806080858703121561420e5761420d6154f4565b5b600061421c87828801613fc7565b945050602061422d87828801613fc7565b935050604061423e8782880161411f565b925050606085013567ffffffffffffffff81111561425f5761425e6154ef565b5b61426b8782880161409b565b91505092959194509250565b6000806040838503121561428e5761428d6154f4565b5b600061429c85828601613fc7565b92505060206142ad85828601614032565b9150509250929050565b600080604083850312156142ce576142cd6154f4565b5b60006142dc85828601613fc7565b92505060206142ed8582860161411f565b9150509250929050565b60006020828403121561430d5761430c6154f4565b5b600061431b84828501614047565b91505092915050565b60006020828403121561433a576143396154f4565b5b60006143488482850161405c565b91505092915050565b600060208284031215614367576143666154f4565b5b600061437584828501614071565b91505092915050565b600060208284031215614394576143936154f4565b5b60006143a284828501614086565b91505092915050565b600080602083850312156143c2576143c16154f4565b5b600083013567ffffffffffffffff8111156143e0576143df6154ef565b5b6143ec858286016140c9565b92509250509250929050565b60006020828403121561440e5761440d6154f4565b5b600061441c8482850161411f565b91505092915050565b60008060006040848603121561443e5761443d6154f4565b5b600061444c8682870161411f565b935050602084013567ffffffffffffffff81111561446d5761446c6154ef565b5b61447986828701613fdc565b92509250509250925092565b61448e816151e9565b82525050565b6144a56144a0826151e9565b61539b565b82525050565b6144b4816151fb565b82525050565b6144c381615207565b82525050565b60006144d48261500c565b6144de8185615022565b93506144ee818560208601615292565b6144f7816154f9565b840191505092915050565b600061450d8261500c565b6145178185615033565b9350614527818560208601615292565b80840191505092915050565b600061453e82615017565b614548818561503e565b9350614558818560208601615292565b614561816154f9565b840191505092915050565b600061457782615017565b614581818561504f565b9350614591818560208601615292565b80840191505092915050565b60006145aa60368361503e565b91506145b582615517565b604082019050919050565b60006145cd603d8361503e565b91506145d882615566565b604082019050919050565b60006145f0601f8361503e565b91506145fb826155b5565b602082019050919050565b600061461360138361503e565b915061461e826155de565b602082019050919050565b600061463660218361503e565b915061464182615607565b604082019050919050565b600061465960268361503e565b915061466482615656565b604082019050919050565b600061467c60178361503e565b9150614687826156a5565b602082019050919050565b600061469f601e8361503e565b91506146aa826156ce565b602082019050919050565b60006146c260268361503e565b91506146cd826156f7565b604082019050919050565b60006146e560268361503e565b91506146f082615746565b604082019050919050565b6000614708602f8361503e565b915061471382615795565b604082019050919050565b600061472b60328361503e565b9150614736826157e4565b604082019050919050565b600061474e601b8361503e565b915061475982615833565b602082019050919050565b600061477160268361503e565b915061477c8261585c565b604082019050919050565b600061479460268361503e565b915061479f826158ab565b604082019050919050565b60006147b760278361503e565b91506147c2826158fa565b604082019050919050565b60006147da60338361503e565b91506147e582615949565b604082019050919050565b60006147fd60208361503e565b915061480882615998565b602082019050919050565b6000614820602e8361503e565b915061482b826159c1565b604082019050919050565b6000614843602f8361503e565b915061484e82615a10565b604082019050919050565b600061486660298361503e565b915061487182615a5f565b604082019050919050565b600061488960258361503e565b915061489482615aae565b604082019050919050565b60006148ac60378361503e565b91506148b782615afd565b604082019050919050565b60006148cf60218361503e565b91506148da82615b4c565b604082019050919050565b60006148f260148361503e565b91506148fd82615b9b565b602082019050919050565b6000614915601d8361503e565b915061492082615bc4565b602082019050919050565b600061493860208361503e565b915061494382615bed565b602082019050919050565b600061495b60318361503e565b915061496682615c16565b604082019050919050565b600061497e601b8361503e565b915061498982615c65565b602082019050919050565b60006149a1602a8361503e565b91506149ac82615c8e565b604082019050919050565b60006149c460358361503e565b91506149cf82615cdd565b604082019050919050565b60006149e7602a8361503e565b91506149f282615d2c565b604082019050919050565b6000614a0a60248361503e565b9150614a1582615d7b565b604082019050919050565b614a2981615279565b82525050565b6000614a3b8284614494565b60148201915081905092915050565b6000614a568284614502565b915081905092915050565b6000614a6d828561456c565b9150614a79828461456c565b91508190509392505050565b6000602082019050614a9a6000830184614485565b92915050565b6000606082019050614ab56000830186614485565b614ac26020830185614485565b614acf6040830184614a20565b949350505050565b6000608082019050614aec6000830187614485565b614af96020830186614485565b614b066040830185614a20565b8181036060830152614b1881846144c9565b905095945050505050565b6000602082019050614b3860008301846144ab565b92915050565b6000602082019050614b5360008301846144ba565b92915050565b60006020820190508181036000830152614b738184614533565b905092915050565b60006020820190508181036000830152614b948161459d565b9050919050565b60006020820190508181036000830152614bb4816145c0565b9050919050565b60006020820190508181036000830152614bd4816145e3565b9050919050565b60006020820190508181036000830152614bf481614606565b9050919050565b60006020820190508181036000830152614c1481614629565b9050919050565b60006020820190508181036000830152614c348161464c565b9050919050565b60006020820190508181036000830152614c548161466f565b9050919050565b60006020820190508181036000830152614c7481614692565b9050919050565b60006020820190508181036000830152614c94816146b5565b9050919050565b60006020820190508181036000830152614cb4816146d8565b9050919050565b60006020820190508181036000830152614cd4816146fb565b9050919050565b60006020820190508181036000830152614cf48161471e565b9050919050565b60006020820190508181036000830152614d1481614741565b9050919050565b60006020820190508181036000830152614d3481614764565b9050919050565b60006020820190508181036000830152614d5481614787565b9050919050565b60006020820190508181036000830152614d74816147aa565b9050919050565b60006020820190508181036000830152614d94816147cd565b9050919050565b60006020820190508181036000830152614db4816147f0565b9050919050565b60006020820190508181036000830152614dd481614813565b9050919050565b60006020820190508181036000830152614df481614836565b9050919050565b60006020820190508181036000830152614e1481614859565b9050919050565b60006020820190508181036000830152614e348161487c565b9050919050565b60006020820190508181036000830152614e548161489f565b9050919050565b60006020820190508181036000830152614e74816148c2565b9050919050565b60006020820190508181036000830152614e94816148e5565b9050919050565b60006020820190508181036000830152614eb481614908565b9050919050565b60006020820190508181036000830152614ed48161492b565b9050919050565b60006020820190508181036000830152614ef48161494e565b9050919050565b60006020820190508181036000830152614f1481614971565b9050919050565b60006020820190508181036000830152614f3481614994565b9050919050565b60006020820190508181036000830152614f54816149b7565b9050919050565b60006020820190508181036000830152614f74816149da565b9050919050565b60006020820190508181036000830152614f94816149fd565b9050919050565b6000602082019050614fb06000830184614a20565b92915050565b6000614fc0614fd1565b9050614fcc8282615321565b919050565b6000604051905090565b600067ffffffffffffffff821115614ff657614ff56154ac565b5b614fff826154f9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150658261523d565b91506150708361523d565b9250826fffffffffffffffffffffffffffffffff03821115615095576150946153f0565b5b828201905092915050565b60006150ab82615279565b91506150b683615279565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150eb576150ea6153f0565b5b828201905092915050565b600061510182615279565b915061510c83615279565b92508261511c5761511b61541f565b5b828204905092915050565b600061513282615279565b915061513d83615279565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615176576151756153f0565b5b828202905092915050565b600061518c8261523d565b91506151978361523d565b9250828210156151aa576151a96153f0565b5b828203905092915050565b60006151c082615279565b91506151cb83615279565b9250828210156151de576151dd6153f0565b5b828203905092915050565b60006151f482615259565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152b0578082015181840152602081019050615295565b838111156152bf576000848401525b50505050565b60006152d082615279565b915060008214156152e4576152e36153f0565b5b600182039050919050565b6000600282049050600182168061530757607f821691505b6020821081141561531b5761531a61544e565b5b50919050565b61532a826154f9565b810181811067ffffffffffffffff82111715615349576153486154ac565b5b80604052505050565b600061535d82615279565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153905761538f6153f0565b5b600182019050919050565b60006153a6826153ad565b9050919050565b60006153b88261550a565b9050919050565b60006153ca82615279565b91506153d583615279565b9250826153e5576153e461541f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45524337323150756e6b6f3a207472616e736665722063616c6c65722069732060008201527f6e6f74206f776e6572206e6f7220617070726f76656400000000000000000000602082015250565b7f45524337323150756e6b6f3a20617070726f76652063616c6c6572206973206e60008201527f6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c000000602082015250565b7f50756e6b6f20506978656c3a204e6f7420696e2077686974656c697374656400600082015250565b7f50756e6b6f20506978656c3a204e6f726d616c00000000000000000000000000600082015250565b7f45524337323150756e6b6f3a20746f6b656e20616c7265616479206d696e746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50756e6b6f20506978656c3a20436c61696d2046726565000000000000000000600082015250565b7f45524337323150756e6b6f3a20617070726f766520746f2063616c6c65720000600082015250565b7f45524337323150756e6b6f3a20617070726f76616c20746f2063757272656e7460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a2062616c616e636520717565727920666f72207460008201527f6865207a65726f20616464726573730000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a20756e61626c6520746f2067657420746f6b656e60008201527f206f66206f776e657220627920696e6465780000000000000000000000000000602082015250565b7f50756e6b6f20506978656c3a204d6178205065722057616c6c65740000000000600082015250565b7f45524337323150756e6b6f3a207175616e7469747920746f206d696e7420746f60008201527f6f20686967680000000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a206f776e657220696e646578206f7574206f662060008201527f626f756e64730000000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a20676c6f62616c20696e646578206f7574206f6660008201527f20626f756e647300000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a20756e61626c6520746f2064657465726d696e6560008201527f20746865206f776e6572206f6620746f6b656e00000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524337323150756e6b6f3a206f776e657220717565727920666f72206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a207472616e7366657220746f20746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a206d696e7420746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a207472616e7366657220746f206e6f6e2045524360008201527f373231526563656976657220696d706c656d656e746572000000000000000000602082015250565b7f50756e6b6f20506978656c3a204d696e74696e67205075626c6963205061757360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f50756e6b6f20506978656c3a20536f6c646f7574000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f50756e6b6f20506978656c3a204d617820506572205472616e73616374696f6e600082015250565b7f45524337323150756e6b6f3a20617070726f76656420717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f506978656c617465643a20496e73756666696369656e74204574680000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f45524337323150756e6b6f3a206e756d626572206d696e74656420717565727960008201527f20666f7220746865207a65726f20616464726573730000000000000000000000602082015250565b7f45524337323150756e6b6f3a207472616e736665722066726f6d20696e636f7260008201527f72656374206f776e657200000000000000000000000000000000000000000000602082015250565b7f50756e6b6f20506978656c3a204d696e74696e672057686974656c697374205060008201527f6175736500000000000000000000000000000000000000000000000000000000602082015250565b615dd3816151e9565b8114615dde57600080fd5b50565b615dea816151fb565b8114615df557600080fd5b50565b615e0181615207565b8114615e0c57600080fd5b50565b615e1881615211565b8114615e2357600080fd5b50565b615e2f81615279565b8114615e3a57600080fd5b5056fea2646970667358221220007279335e3d2cf3159f9dd85c4d20274546b09f26e7dca7068e72d94094c82664736f6c63430008070033
Deployed Bytecode Sourcemap
3094:4482:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3232:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4275:370:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6017:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7554:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7105:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3375:43:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2824:94:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8412:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3645:42:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3475:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3459:752:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7349:98:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3612:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7455:116;;;;;;;;;;;;;:::i;:::-;;6514:127;;;;;;;;;;;;;:::i;:::-;;4956:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8617:157:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3577:28:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2987:181:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3164:28:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6774:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5840:118:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3345:21:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4701:215:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;3749:40:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6056:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6884:91:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6270:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3864:662;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6172:98:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7826:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7109:110:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6154:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8837:315:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6649:117:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4534:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3507:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3706:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6333:394:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3286:52:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3539:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6384:124;;;;;;;;;;;;;:::i;:::-;;13284:43:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5819:113:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6983:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7227:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3425:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8167:186:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3232:47:16;;;;;;;;;;;;;;;;;:::o;4275:370:15:-;4402:4;4447:25;4432:40;;;:11;:40;;;;:99;;;;4498:33;4483:48;;;:11;:48;;;;4432:99;:160;;;;4557:35;4542:50;;;:11;:50;;;;4432:160;:207;;;;4603:36;4627:11;4603:23;:36::i;:::-;4432:207;4418:221;;4275:370;;;:::o;6017:94::-;6071:13;6100:5;6093:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6017:94;:::o;7554:208::-;7622:7;7646:16;7654:7;7646;:16::i;:::-;7638:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;7732:15;:24;7748:7;7732:24;;;;;;;;;;;;;;;;;;;;;7725:31;;7554:208;;;:::o;7105:391::-;7174:13;7190:28;7210:7;7190:19;:28::i;:::-;7174:44;;7239:5;7233:11;;:2;:11;;;;7225:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;7328:5;7312:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;7337:37;7354:5;7361:12;:10;:12::i;:::-;7337:16;:37::i;:::-;7312:62;7296:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;7462:28;7471:2;7475:7;7484:5;7462:8;:28::i;:::-;7167:329;7105:391;;:::o;3375:43:16:-;;;;;;;;;;;;;:::o;2824:94:15:-;2877:7;2900:12;;2893:19;;2824:94;:::o;8412:142::-;8520:28;8530:4;8536:2;8540:7;8520:9;:28::i;:::-;8412:142;;;:::o;3645:42:16:-;;;;:::o;3475:25::-;;;;:::o;3459:752:15:-;3568:7;3603:16;3613:5;3603:9;:16::i;:::-;3595:5;:24;3587:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3669:22;3694:13;:11;:13::i;:::-;3669:38;;3714:19;3744:25;3794:9;3789:350;3813:14;3809:1;:18;3789:350;;;3843:31;3877:11;:14;3889:1;3877:14;;;;;;;;;;;3843:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3930:1;3904:28;;:9;:14;;;:28;;;3900:89;;3965:9;:14;;;3945:34;;3900:89;4022:5;4001:26;;:17;:26;;;3997:135;;;4059:5;4044:11;:20;4040:59;;;4086:1;4079:8;;;;;;;;;4040:59;4109:13;;;;;:::i;:::-;;;;3997:135;3834:305;3829:3;;;;;:::i;:::-;;;;3789:350;;;;4145:60;;;;;;;;;;:::i;:::-;;;;;;;;3459:752;;;;;:::o;7349:98:16:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7430:9:16::1;7419:8;:20;;;;7349:98:::0;:::o;3612:26::-;;;;:::o;7455:116::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7511:10:16::1;7503:28;;:60;7548:4;7532:30;;;7503:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7455:116::o:0;6514:127::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6610:22:16::1;;;;;;;;;;;6609:23;6583:22;;:49;;;;;;;;;;;;;;;;;;6514:127::o:0;4956:314::-;5040:20;;5027:9;:33;;5019:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5103:91;5142:10;5162:4;5169:24;;5110:13;;;;;;;;;;;5103:38;;;;:91;;;;;;:::i;:::-;5234:17;:26;5252:7;5234:26;;;;;;;;;;;;:28;;;;;;;;;:::i;:::-;;;;;5205:17;:26;5223:7;5205:26;;;;;;;;;;;:57;;;;4956:314;:::o;8617:157:15:-;8729:39;8746:4;8752:2;8756:7;8729:39;;;;;;;;;;;;:16;:39::i;:::-;8617:157;;;:::o;3577:28:16:-;;;;:::o;2987:181:15:-;3054:7;3086:13;:11;:13::i;:::-;3078:5;:21;3070:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3157:5;3150:12;;2987:181;;;:::o;3164:28:16:-;;;;;;;;;;;;;:::o;6774:102::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6860:8:16::1;;6850:7;:18;;;;;;;:::i;:::-;;6774:102:::0;;:::o;5840:118:15:-;5904:7;5927:20;5939:7;5927:11;:20::i;:::-;:25;;;5920:32;;5840:118;;;:::o;3345:21:16:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4701:215:15:-;4765:7;4806:1;4789:19;;:5;:19;;;;4781:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;4882:12;:19;4895:5;4882:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4874:36;;4867:43;;4701:215;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;3749:40:16:-;;;;:::o;6056:90::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6134:4:16::1;6121:10;:17;;;;6056:90:::0;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;6884:91:16:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6961:6:16::1;6948:10;:19;;;;6884:91:::0;:::o;6270:106::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6342:26:16::1;6352:10;6364:3;6342:9;:26::i;:::-;6270:106:::0;:::o;3864:662::-;3977:22;;;;;;;;;;;3969:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4093:12;;4086:3;4060:11;:23;4072:10;4060:23;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:45;;4052:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;4162:13;;4155:3;:20;;4147:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;4223:12;4265:10;4248:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;4238:39;;;;;;4223:54;;4296:50;4315:12;;4296:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4329:10;;4341:4;4296:18;:50::i;:::-;4288:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;4424:8;;4417:3;4401:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:31;;4393:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4494:3;4467:11;:23;4479:10;4467:23;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;4508:10;4514:3;4508:5;:10::i;:::-;3957:569;3864:662;;;:::o;6172:98:15:-;6228:13;6257:7;6250:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6172:98;:::o;7826:278::-;7929:12;:10;:12::i;:::-;7917:24;;:8;:24;;;;7909:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;8030:8;7985:18;:32;8004:12;:10;:12::i;:::-;7985:32;;;;;;;;;;;;;;;:42;8018:8;7985:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;8079:8;8050:48;;8065:12;:10;:12::i;:::-;8050:48;;;8089:8;8050:48;;;;;;:::i;:::-;;;;;;;;7826:278;;:::o;7109:110:16:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7201:10:16::1;7189:9;:22;;;;7109:110:::0;:::o;6154:108::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6236:18:16::1;6246:2;6250:3;6236:9;:18::i;:::-;6154:108:::0;;:::o;8837:315:15:-;8974:28;8984:4;8990:2;8994:7;8974:9;:28::i;:::-;9025:48;9048:4;9054:2;9058:7;9067:5;9025:22;:48::i;:::-;9009:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;8837:315;;;;:::o;6649:117:16:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6744:14:16::1;6728:13;;:30;;;;;;;;;;;;;;;;;;6649:117:::0;:::o;4534:414::-;4613:22;;;;;;;;;;;4605:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4726:12;;4719:3;4693:11;:23;4705:10;4693:23;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:45;;4685:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:13;;4788:3;:20;;4780:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;4887:8;;4880:3;4864:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:31;;4856:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4930:10;4936:3;4930:5;:10::i;:::-;4534:414;:::o;3507:25::-;;;;:::o;3706:36::-;;;;:::o;6333:394:15:-;6431:13;6472:16;6480:7;6472;:16::i;:::-;6456:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:21;6586:10;:8;:10::i;:::-;6562:34;;6641:1;6623:7;6617:21;:25;:104;;;;;;;;;;;;;;;;;6678:7;6687:18;:7;:16;:18::i;:::-;6661:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6617:104;6603:118;;;6333:394;;;:::o;3286:52:16:-;;;;;;;;;;;;;;;;;:::o;3539:29::-;;;;:::o;6384:124::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6477:22:16::1;;;;;;;;;;;6476:23;6450:22;;:49;;;;;;;;;;;;;;;;;;6384:124::o:0;13284:43:15:-;;;;:::o;5819:113:16:-;5877:7;5904:20;5918:5;5904:13;:20::i;:::-;5897:27;;5819:113;;;:::o;6983:118::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7079:14:16::1;7063:13;:30;;;;6983:118:::0;:::o;7227:114::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7320:13:16::1;7305:12;:28;;;;7227:114:::0;:::o;3425:43::-;;;;;;;;;;;;;:::o;8167:186:15:-;8289:4;8312:18;:25;8331:5;8312:25;;;;;;;;;;;;;;;:35;8338:8;8312:35;;;;;;;;;;;;;;;;;;;;;;;;;8305:42;;8167:186;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;829:155:13:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;9391:105:15:-;9448:4;9478:12;;9468:7;:22;9461:29;;9391:105;;;:::o;640:96:10:-;693:7;719:10;712:17;;640:96;:::o;13106:172:15:-;13230:2;13203:15;:24;13219:7;13203:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;13264:7;13260:2;13244:28;;13253:5;13244:28;;;;;;;;;;;;13106:172;;;:::o;11459:1541::-;11556:35;11594:20;11606:7;11594:11;:20::i;:::-;11556:58;;11623:22;11665:13;:18;;;11649:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;11718:12;:10;:12::i;:::-;11694:36;;:20;11706:7;11694:11;:20::i;:::-;:36;;;11649:81;:142;;;;11741:50;11758:13;:18;;;11778:12;:10;:12::i;:::-;11741:16;:50::i;:::-;11649:142;11623:169;;11817:17;11801:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;11953:4;11931:26;;:13;:18;;;:26;;;11915:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;12046:1;12032:16;;:2;:16;;;;12024:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12103:43;12125:4;12131:2;12135:7;12144:1;12103:21;:43::i;:::-;12203:49;12220:1;12224:7;12233:13;:18;;;12203:8;:49::i;:::-;12291:1;12261:12;:18;12274:4;12261:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12327:1;12299:12;:16;12312:2;12299:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12358:43;;;;;;;;12373:2;12358:43;;;;;;12384:15;12358:43;;;;;12335:11;:20;12347:7;12335:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12629:19;12661:1;12651:7;:11;;;;:::i;:::-;12629:33;;12714:1;12673:43;;:11;:24;12685:11;12673:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;12669:236;;;12731:20;12739:11;12731:7;:20::i;:::-;12727:171;;;12791:97;;;;;;;;12818:13;:18;;;12791:97;;;;;;12849:13;:28;;;12791:97;;;;;12764:11;:24;12776:11;12764:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12727:171;12669:236;12937:7;12933:2;12918:27;;12927:4;12918:27;;;;;;;;;;;;12952:42;12973:4;12979:2;12983:7;12992:1;12952:20;:42::i;:::-;11549:1451;;;11459:1541;;;:::o;974:241:4:-;1112:96;1132:5;1162:27;;;1191:4;1197:2;1201:5;1139:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;:::-;974:241;;;;:::o;5172:614:15:-;5248:21;;:::i;:::-;5289:16;5297:7;5289;:16::i;:::-;5281:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;5365:26;5413:12;5402:7;:23;5398:93;;5482:1;5467:12;5457:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;5436:47;;5398:93;5504:12;5519:7;5504:22;;5499:212;5536:18;5528:4;:26;5499:212;;5573:31;5607:11;:17;5619:4;5607:17;;;;;;;;;;;5573:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5663:1;5637:28;;:9;:14;;;:28;;;5633:71;;5685:9;5678:16;;;;;;;5633:71;5564:147;5556:6;;;;;:::i;:::-;;;;5499:212;;;;5719:61;;;;;;;;;;:::i;:::-;;;;;;;;5172:614;;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;9502:98:15:-;9567:27;9577:2;9581:8;9567:27;;;;;;;;;;;;:9;:27::i;:::-;9502:98;;:::o;1153:184:12:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;5278:533:16:-;5352:9;;5326:11;:23;5338:10;5326:23;;;;;;;;;;;;;;;;:35;5323:481;;;5396:9;;5390:3;:15;5387:35;;;5413:9;;5407:15;;5387:35;5477:10;;5464:9;;5458:3;:15;;;;:::i;:::-;5457:30;;;;:::i;:::-;5444:9;:43;;5436:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5555:3;5528:11;:23;5540:10;5528:23;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;5572:26;5582:10;5594:3;5572:9;:26::i;:::-;5323:481;;;5675:10;;5669:3;:16;;;;:::i;:::-;5656:9;:29;;5648:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5749:3;5722:11;:23;5734:10;5722:23;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;5766:26;5776:10;5788:3;5766:9;:26::i;:::-;5323:481;5278:533;:::o;14821:694:15:-;14958:4;14975:15;:2;:13;;;:15::i;:::-;14971:539;;;15030:2;15014:36;;;15051:12;:10;:12::i;:::-;15065:4;15071:7;15080:5;15014:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15001:468;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15262:1;15245:6;:13;:18;15241:219;;;15278:65;;;;;;;;;;:::i;:::-;;;;;;;;15241:219;15428:6;15422:13;15413:6;15409:2;15405:15;15398:38;15001:468;15146:45;;;15136:55;;;:6;:55;;;;15129:62;;;;;14971:539;15498:4;15491:11;;14821:694;;;;;;;:::o;5940:108:16:-;6000:13;6033:7;6026:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5940:108;:::o;392:703:11:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;4922:244:15:-;4983:7;5032:1;5015:19;;:5;:19;;;;4999:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;5127:12;:19;5140:5;5127:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;5119:41;;5112:48;;4922:244;;;:::o;15977:141::-;;;;;:::o;16504:140::-;;;;;:::o;3747:706:4:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4166:95;;4295:1;4275:10;:17;:21;4271:176;;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;4271:176;3817:636;3747:706;;:::o;9939:1288:15:-;10044:20;10067:12;;10044:35;;10108:1;10094:16;;:2;:16;;;;10086:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;10289:21;10297:12;10289:7;:21::i;:::-;10288:22;10280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10375:12;10363:8;:24;;10355:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;10439:61;10469:1;10473:2;10477:12;10491:8;10439:21;:61::i;:::-;10509:30;10542:12;:16;10555:2;10542:16;;;;;;;;;;;;;;;10509:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10584:119;;;;;;;;10634:8;10604:11;:19;;;:39;;;;:::i;:::-;10584:119;;;;;;10687:8;10652:11;:24;;;:44;;;;:::i;:::-;10584:119;;;;;10565:12;:16;10578:2;10565:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10738:43;;;;;;;;10753:2;10738:43;;;;;;10764:15;10738:43;;;;;10710:11;:25;10722:12;10710:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10790:20;10813:12;10790:35;;10839:9;10834:285;10858:8;10854:1;:12;10834:285;;;10912:12;10908:2;10887:38;;10904:1;10887:38;;;;;;;;;;;;10952:59;10983:1;10987:2;10991:12;11005:5;10952:22;:59::i;:::-;10934:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;11097:14;;;;;:::i;:::-;;;;10868:3;;;;;:::i;:::-;;;;10834:285;;;;11142:12;11127;:27;;;;11161:60;11190:1;11194:2;11198:12;11212:8;11161:20;:60::i;:::-;10037:1190;;;9939:1288;;;:::o;1991:290:12:-;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;1175:320:9:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;3861:223::-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;;3861:223;;;;;:::o;8054:147:12:-;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;4948:499:9:-;5113:12;5170:5;5145:21;:30;;5137:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5236:18;5247:6;5236:10;:18::i;:::-;5228:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5300:12;5314:23;5341:6;:11;;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;;;;4948:499;;;;;;:::o;8207:261:12:-;8275:13;8379:1;8373:4;8366:15;8407:1;8401:4;8394:15;8447:4;8441;8431:21;8422:30;;8207:261;;;;:::o;7561:742:9:-;7707:12;7735:7;7731:566;;;7765:10;7758:17;;;;7731:566;7896:1;7876:10;:17;:21;7872:415;;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;7872:415;8259:12;8252:20;;;;;;;;;;;:::i;:::-;;;;;;;;7561:742;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:17:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1352:5;1383:6;1377:13;1368:22;;1399:30;1423:5;1399:30;:::i;:::-;1298:137;;;;:::o;1441:139::-;1487:5;1525:6;1512:20;1503:29;;1541:33;1568:5;1541:33;:::i;:::-;1441:139;;;;:::o;1586:137::-;1631:5;1669:6;1656:20;1647:29;;1685:32;1711:5;1685:32;:::i;:::-;1586:137;;;;:::o;1729:141::-;1785:5;1816:6;1810:13;1801:22;;1832:32;1858:5;1832:32;:::i;:::-;1729:141;;;;:::o;1889:338::-;1944:5;1993:3;1986:4;1978:6;1974:17;1970:27;1960:122;;2001:79;;:::i;:::-;1960:122;2118:6;2105:20;2143:78;2217:3;2209:6;2202:4;2194:6;2190:17;2143:78;:::i;:::-;2134:87;;1950:277;1889:338;;;;:::o;2247:553::-;2305:8;2315:6;2365:3;2358:4;2350:6;2346:17;2342:27;2332:122;;2373:79;;:::i;:::-;2332:122;2486:6;2473:20;2463:30;;2516:18;2508:6;2505:30;2502:117;;;2538:79;;:::i;:::-;2502:117;2652:4;2644:6;2640:17;2628:29;;2706:3;2698:4;2690:6;2686:17;2676:8;2672:32;2669:41;2666:128;;;2713:79;;:::i;:::-;2666:128;2247:553;;;;;:::o;2806:139::-;2852:5;2890:6;2877:20;2868:29;;2906:33;2933:5;2906:33;:::i;:::-;2806:139;;;;:::o;2951:329::-;3010:6;3059:2;3047:9;3038:7;3034:23;3030:32;3027:119;;;3065:79;;:::i;:::-;3027:119;3185:1;3210:53;3255:7;3246:6;3235:9;3231:22;3210:53;:::i;:::-;3200:63;;3156:117;2951:329;;;;:::o;3286:474::-;3354:6;3362;3411:2;3399:9;3390:7;3386:23;3382:32;3379:119;;;3417:79;;:::i;:::-;3379:119;3537:1;3562:53;3607:7;3598:6;3587:9;3583:22;3562:53;:::i;:::-;3552:63;;3508:117;3664:2;3690:53;3735:7;3726:6;3715:9;3711:22;3690:53;:::i;:::-;3680:63;;3635:118;3286:474;;;;;:::o;3766:619::-;3843:6;3851;3859;3908:2;3896:9;3887:7;3883:23;3879:32;3876:119;;;3914:79;;:::i;:::-;3876:119;4034:1;4059:53;4104:7;4095:6;4084:9;4080:22;4059:53;:::i;:::-;4049:63;;4005:117;4161:2;4187:53;4232:7;4223:6;4212:9;4208:22;4187:53;:::i;:::-;4177:63;;4132:118;4289:2;4315:53;4360:7;4351:6;4340:9;4336:22;4315:53;:::i;:::-;4305:63;;4260:118;3766:619;;;;;:::o;4391:943::-;4486:6;4494;4502;4510;4559:3;4547:9;4538:7;4534:23;4530:33;4527:120;;;4566:79;;:::i;:::-;4527:120;4686:1;4711:53;4756:7;4747:6;4736:9;4732:22;4711:53;:::i;:::-;4701:63;;4657:117;4813:2;4839:53;4884:7;4875:6;4864:9;4860:22;4839:53;:::i;:::-;4829:63;;4784:118;4941:2;4967:53;5012:7;5003:6;4992:9;4988:22;4967:53;:::i;:::-;4957:63;;4912:118;5097:2;5086:9;5082:18;5069:32;5128:18;5120:6;5117:30;5114:117;;;5150:79;;:::i;:::-;5114:117;5255:62;5309:7;5300:6;5289:9;5285:22;5255:62;:::i;:::-;5245:72;;5040:287;4391:943;;;;;;;:::o;5340:468::-;5405:6;5413;5462:2;5450:9;5441:7;5437:23;5433:32;5430:119;;;5468:79;;:::i;:::-;5430:119;5588:1;5613:53;5658:7;5649:6;5638:9;5634:22;5613:53;:::i;:::-;5603:63;;5559:117;5715:2;5741:50;5783:7;5774:6;5763:9;5759:22;5741:50;:::i;:::-;5731:60;;5686:115;5340:468;;;;;:::o;5814:474::-;5882:6;5890;5939:2;5927:9;5918:7;5914:23;5910:32;5907:119;;;5945:79;;:::i;:::-;5907:119;6065:1;6090:53;6135:7;6126:6;6115:9;6111:22;6090:53;:::i;:::-;6080:63;;6036:117;6192:2;6218:53;6263:7;6254:6;6243:9;6239:22;6218:53;:::i;:::-;6208:63;;6163:118;5814:474;;;;;:::o;6294:345::-;6361:6;6410:2;6398:9;6389:7;6385:23;6381:32;6378:119;;;6416:79;;:::i;:::-;6378:119;6536:1;6561:61;6614:7;6605:6;6594:9;6590:22;6561:61;:::i;:::-;6551:71;;6507:125;6294:345;;;;:::o;6645:329::-;6704:6;6753:2;6741:9;6732:7;6728:23;6724:32;6721:119;;;6759:79;;:::i;:::-;6721:119;6879:1;6904:53;6949:7;6940:6;6929:9;6925:22;6904:53;:::i;:::-;6894:63;;6850:117;6645:329;;;;:::o;6980:327::-;7038:6;7087:2;7075:9;7066:7;7062:23;7058:32;7055:119;;;7093:79;;:::i;:::-;7055:119;7213:1;7238:52;7282:7;7273:6;7262:9;7258:22;7238:52;:::i;:::-;7228:62;;7184:116;6980:327;;;;:::o;7313:349::-;7382:6;7431:2;7419:9;7410:7;7406:23;7402:32;7399:119;;;7437:79;;:::i;:::-;7399:119;7557:1;7582:63;7637:7;7628:6;7617:9;7613:22;7582:63;:::i;:::-;7572:73;;7528:127;7313:349;;;;:::o;7668:529::-;7739:6;7747;7796:2;7784:9;7775:7;7771:23;7767:32;7764:119;;;7802:79;;:::i;:::-;7764:119;7950:1;7939:9;7935:17;7922:31;7980:18;7972:6;7969:30;7966:117;;;8002:79;;:::i;:::-;7966:117;8115:65;8172:7;8163:6;8152:9;8148:22;8115:65;:::i;:::-;8097:83;;;;7893:297;7668:529;;;;;:::o;8203:329::-;8262:6;8311:2;8299:9;8290:7;8286:23;8282:32;8279:119;;;8317:79;;:::i;:::-;8279:119;8437:1;8462:53;8507:7;8498:6;8487:9;8483:22;8462:53;:::i;:::-;8452:63;;8408:117;8203:329;;;;:::o;8538:704::-;8633:6;8641;8649;8698:2;8686:9;8677:7;8673:23;8669:32;8666:119;;;8704:79;;:::i;:::-;8666:119;8824:1;8849:53;8894:7;8885:6;8874:9;8870:22;8849:53;:::i;:::-;8839:63;;8795:117;8979:2;8968:9;8964:18;8951:32;9010:18;9002:6;8999:30;8996:117;;;9032:79;;:::i;:::-;8996:117;9145:80;9217:7;9208:6;9197:9;9193:22;9145:80;:::i;:::-;9127:98;;;;8922:313;8538:704;;;;;:::o;9248:118::-;9335:24;9353:5;9335:24;:::i;:::-;9330:3;9323:37;9248:118;;:::o;9372:157::-;9477:45;9497:24;9515:5;9497:24;:::i;:::-;9477:45;:::i;:::-;9472:3;9465:58;9372:157;;:::o;9535:109::-;9616:21;9631:5;9616:21;:::i;:::-;9611:3;9604:34;9535:109;;:::o;9650:118::-;9737:24;9755:5;9737:24;:::i;:::-;9732:3;9725:37;9650:118;;:::o;9774:360::-;9860:3;9888:38;9920:5;9888:38;:::i;:::-;9942:70;10005:6;10000:3;9942:70;:::i;:::-;9935:77;;10021:52;10066:6;10061:3;10054:4;10047:5;10043:16;10021:52;:::i;:::-;10098:29;10120:6;10098:29;:::i;:::-;10093:3;10089:39;10082:46;;9864:270;9774:360;;;;:::o;10140:373::-;10244:3;10272:38;10304:5;10272:38;:::i;:::-;10326:88;10407:6;10402:3;10326:88;:::i;:::-;10319:95;;10423:52;10468:6;10463:3;10456:4;10449:5;10445:16;10423:52;:::i;:::-;10500:6;10495:3;10491:16;10484:23;;10248:265;10140:373;;;;:::o;10519:364::-;10607:3;10635:39;10668:5;10635:39;:::i;:::-;10690:71;10754:6;10749:3;10690:71;:::i;:::-;10683:78;;10770:52;10815:6;10810:3;10803:4;10796:5;10792:16;10770:52;:::i;:::-;10847:29;10869:6;10847:29;:::i;:::-;10842:3;10838:39;10831:46;;10611:272;10519:364;;;;:::o;10889:377::-;10995:3;11023:39;11056:5;11023:39;:::i;:::-;11078:89;11160:6;11155:3;11078:89;:::i;:::-;11071:96;;11176:52;11221:6;11216:3;11209:4;11202:5;11198:16;11176:52;:::i;:::-;11253:6;11248:3;11244:16;11237:23;;10999:267;10889:377;;;;:::o;11272:366::-;11414:3;11435:67;11499:2;11494:3;11435:67;:::i;:::-;11428:74;;11511:93;11600:3;11511:93;:::i;:::-;11629:2;11624:3;11620:12;11613:19;;11272:366;;;:::o;11644:::-;11786:3;11807:67;11871:2;11866:3;11807:67;:::i;:::-;11800:74;;11883:93;11972:3;11883:93;:::i;:::-;12001:2;11996:3;11992:12;11985:19;;11644:366;;;:::o;12016:::-;12158:3;12179:67;12243:2;12238:3;12179:67;:::i;:::-;12172:74;;12255:93;12344:3;12255:93;:::i;:::-;12373:2;12368:3;12364:12;12357:19;;12016:366;;;:::o;12388:::-;12530:3;12551:67;12615:2;12610:3;12551:67;:::i;:::-;12544:74;;12627:93;12716:3;12627:93;:::i;:::-;12745:2;12740:3;12736:12;12729:19;;12388:366;;;:::o;12760:::-;12902:3;12923:67;12987:2;12982:3;12923:67;:::i;:::-;12916:74;;12999:93;13088:3;12999:93;:::i;:::-;13117:2;13112:3;13108:12;13101:19;;12760:366;;;:::o;13132:::-;13274:3;13295:67;13359:2;13354:3;13295:67;:::i;:::-;13288:74;;13371:93;13460:3;13371:93;:::i;:::-;13489:2;13484:3;13480:12;13473:19;;13132:366;;;:::o;13504:::-;13646:3;13667:67;13731:2;13726:3;13667:67;:::i;:::-;13660:74;;13743:93;13832:3;13743:93;:::i;:::-;13861:2;13856:3;13852:12;13845:19;;13504:366;;;:::o;13876:::-;14018:3;14039:67;14103:2;14098:3;14039:67;:::i;:::-;14032:74;;14115:93;14204:3;14115:93;:::i;:::-;14233:2;14228:3;14224:12;14217:19;;13876:366;;;:::o;14248:::-;14390:3;14411:67;14475:2;14470:3;14411:67;:::i;:::-;14404:74;;14487:93;14576:3;14487:93;:::i;:::-;14605:2;14600:3;14596:12;14589:19;;14248:366;;;:::o;14620:::-;14762:3;14783:67;14847:2;14842:3;14783:67;:::i;:::-;14776:74;;14859:93;14948:3;14859:93;:::i;:::-;14977:2;14972:3;14968:12;14961:19;;14620:366;;;:::o;14992:::-;15134:3;15155:67;15219:2;15214:3;15155:67;:::i;:::-;15148:74;;15231:93;15320:3;15231:93;:::i;:::-;15349:2;15344:3;15340:12;15333:19;;14992:366;;;:::o;15364:::-;15506:3;15527:67;15591:2;15586:3;15527:67;:::i;:::-;15520:74;;15603:93;15692:3;15603:93;:::i;:::-;15721:2;15716:3;15712:12;15705:19;;15364:366;;;:::o;15736:::-;15878:3;15899:67;15963:2;15958:3;15899:67;:::i;:::-;15892:74;;15975:93;16064:3;15975:93;:::i;:::-;16093:2;16088:3;16084:12;16077:19;;15736:366;;;:::o;16108:::-;16250:3;16271:67;16335:2;16330:3;16271:67;:::i;:::-;16264:74;;16347:93;16436:3;16347:93;:::i;:::-;16465:2;16460:3;16456:12;16449:19;;16108:366;;;:::o;16480:::-;16622:3;16643:67;16707:2;16702:3;16643:67;:::i;:::-;16636:74;;16719:93;16808:3;16719:93;:::i;:::-;16837:2;16832:3;16828:12;16821:19;;16480:366;;;:::o;16852:::-;16994:3;17015:67;17079:2;17074:3;17015:67;:::i;:::-;17008:74;;17091:93;17180:3;17091:93;:::i;:::-;17209:2;17204:3;17200:12;17193:19;;16852:366;;;:::o;17224:::-;17366:3;17387:67;17451:2;17446:3;17387:67;:::i;:::-;17380:74;;17463:93;17552:3;17463:93;:::i;:::-;17581:2;17576:3;17572:12;17565:19;;17224:366;;;:::o;17596:::-;17738:3;17759:67;17823:2;17818:3;17759:67;:::i;:::-;17752:74;;17835:93;17924:3;17835:93;:::i;:::-;17953:2;17948:3;17944:12;17937:19;;17596:366;;;:::o;17968:::-;18110:3;18131:67;18195:2;18190:3;18131:67;:::i;:::-;18124:74;;18207:93;18296:3;18207:93;:::i;:::-;18325:2;18320:3;18316:12;18309:19;;17968:366;;;:::o;18340:::-;18482:3;18503:67;18567:2;18562:3;18503:67;:::i;:::-;18496:74;;18579:93;18668:3;18579:93;:::i;:::-;18697:2;18692:3;18688:12;18681:19;;18340:366;;;:::o;18712:::-;18854:3;18875:67;18939:2;18934:3;18875:67;:::i;:::-;18868:74;;18951:93;19040:3;18951:93;:::i;:::-;19069:2;19064:3;19060:12;19053:19;;18712:366;;;:::o;19084:::-;19226:3;19247:67;19311:2;19306:3;19247:67;:::i;:::-;19240:74;;19323:93;19412:3;19323:93;:::i;:::-;19441:2;19436:3;19432:12;19425:19;;19084:366;;;:::o;19456:::-;19598:3;19619:67;19683:2;19678:3;19619:67;:::i;:::-;19612:74;;19695:93;19784:3;19695:93;:::i;:::-;19813:2;19808:3;19804:12;19797:19;;19456:366;;;:::o;19828:::-;19970:3;19991:67;20055:2;20050:3;19991:67;:::i;:::-;19984:74;;20067:93;20156:3;20067:93;:::i;:::-;20185:2;20180:3;20176:12;20169:19;;19828:366;;;:::o;20200:::-;20342:3;20363:67;20427:2;20422:3;20363:67;:::i;:::-;20356:74;;20439:93;20528:3;20439:93;:::i;:::-;20557:2;20552:3;20548:12;20541:19;;20200:366;;;:::o;20572:::-;20714:3;20735:67;20799:2;20794:3;20735:67;:::i;:::-;20728:74;;20811:93;20900:3;20811:93;:::i;:::-;20929:2;20924:3;20920:12;20913:19;;20572:366;;;:::o;20944:::-;21086:3;21107:67;21171:2;21166:3;21107:67;:::i;:::-;21100:74;;21183:93;21272:3;21183:93;:::i;:::-;21301:2;21296:3;21292:12;21285:19;;20944:366;;;:::o;21316:::-;21458:3;21479:67;21543:2;21538:3;21479:67;:::i;:::-;21472:74;;21555:93;21644:3;21555:93;:::i;:::-;21673:2;21668:3;21664:12;21657:19;;21316:366;;;:::o;21688:::-;21830:3;21851:67;21915:2;21910:3;21851:67;:::i;:::-;21844:74;;21927:93;22016:3;21927:93;:::i;:::-;22045:2;22040:3;22036:12;22029:19;;21688:366;;;:::o;22060:::-;22202:3;22223:67;22287:2;22282:3;22223:67;:::i;:::-;22216:74;;22299:93;22388:3;22299:93;:::i;:::-;22417:2;22412:3;22408:12;22401:19;;22060:366;;;:::o;22432:::-;22574:3;22595:67;22659:2;22654:3;22595:67;:::i;:::-;22588:74;;22671:93;22760:3;22671:93;:::i;:::-;22789:2;22784:3;22780:12;22773:19;;22432:366;;;:::o;22804:::-;22946:3;22967:67;23031:2;23026:3;22967:67;:::i;:::-;22960:74;;23043:93;23132:3;23043:93;:::i;:::-;23161:2;23156:3;23152:12;23145:19;;22804:366;;;:::o;23176:::-;23318:3;23339:67;23403:2;23398:3;23339:67;:::i;:::-;23332:74;;23415:93;23504:3;23415:93;:::i;:::-;23533:2;23528:3;23524:12;23517:19;;23176:366;;;:::o;23548:118::-;23635:24;23653:5;23635:24;:::i;:::-;23630:3;23623:37;23548:118;;:::o;23672:256::-;23784:3;23799:75;23870:3;23861:6;23799:75;:::i;:::-;23899:2;23894:3;23890:12;23883:19;;23919:3;23912:10;;23672:256;;;;:::o;23934:271::-;24064:3;24086:93;24175:3;24166:6;24086:93;:::i;:::-;24079:100;;24196:3;24189:10;;23934:271;;;;:::o;24211:435::-;24391:3;24413:95;24504:3;24495:6;24413:95;:::i;:::-;24406:102;;24525:95;24616:3;24607:6;24525:95;:::i;:::-;24518:102;;24637:3;24630:10;;24211:435;;;;;:::o;24652:222::-;24745:4;24783:2;24772:9;24768:18;24760:26;;24796:71;24864:1;24853:9;24849:17;24840:6;24796:71;:::i;:::-;24652:222;;;;:::o;24880:442::-;25029:4;25067:2;25056:9;25052:18;25044:26;;25080:71;25148:1;25137:9;25133:17;25124:6;25080:71;:::i;:::-;25161:72;25229:2;25218:9;25214:18;25205:6;25161:72;:::i;:::-;25243;25311:2;25300:9;25296:18;25287:6;25243:72;:::i;:::-;24880:442;;;;;;:::o;25328:640::-;25523:4;25561:3;25550:9;25546:19;25538:27;;25575:71;25643:1;25632:9;25628:17;25619:6;25575:71;:::i;:::-;25656:72;25724:2;25713:9;25709:18;25700:6;25656:72;:::i;:::-;25738;25806:2;25795:9;25791:18;25782:6;25738:72;:::i;:::-;25857:9;25851:4;25847:20;25842:2;25831:9;25827:18;25820:48;25885:76;25956:4;25947:6;25885:76;:::i;:::-;25877:84;;25328:640;;;;;;;:::o;25974:210::-;26061:4;26099:2;26088:9;26084:18;26076:26;;26112:65;26174:1;26163:9;26159:17;26150:6;26112:65;:::i;:::-;25974:210;;;;:::o;26190:222::-;26283:4;26321:2;26310:9;26306:18;26298:26;;26334:71;26402:1;26391:9;26387:17;26378:6;26334:71;:::i;:::-;26190:222;;;;:::o;26418:313::-;26531:4;26569:2;26558:9;26554:18;26546:26;;26618:9;26612:4;26608:20;26604:1;26593:9;26589:17;26582:47;26646:78;26719:4;26710:6;26646:78;:::i;:::-;26638:86;;26418:313;;;;:::o;26737:419::-;26903:4;26941:2;26930:9;26926:18;26918:26;;26990:9;26984:4;26980:20;26976:1;26965:9;26961:17;26954:47;27018:131;27144:4;27018:131;:::i;:::-;27010:139;;26737:419;;;:::o;27162:::-;27328:4;27366:2;27355:9;27351:18;27343:26;;27415:9;27409:4;27405:20;27401:1;27390:9;27386:17;27379:47;27443:131;27569:4;27443:131;:::i;:::-;27435:139;;27162:419;;;:::o;27587:::-;27753:4;27791:2;27780:9;27776:18;27768:26;;27840:9;27834:4;27830:20;27826:1;27815:9;27811:17;27804:47;27868:131;27994:4;27868:131;:::i;:::-;27860:139;;27587:419;;;:::o;28012:::-;28178:4;28216:2;28205:9;28201:18;28193:26;;28265:9;28259:4;28255:20;28251:1;28240:9;28236:17;28229:47;28293:131;28419:4;28293:131;:::i;:::-;28285:139;;28012:419;;;:::o;28437:::-;28603:4;28641:2;28630:9;28626:18;28618:26;;28690:9;28684:4;28680:20;28676:1;28665:9;28661:17;28654:47;28718:131;28844:4;28718:131;:::i;:::-;28710:139;;28437:419;;;:::o;28862:::-;29028:4;29066:2;29055:9;29051:18;29043:26;;29115:9;29109:4;29105:20;29101:1;29090:9;29086:17;29079:47;29143:131;29269:4;29143:131;:::i;:::-;29135:139;;28862:419;;;:::o;29287:::-;29453:4;29491:2;29480:9;29476:18;29468:26;;29540:9;29534:4;29530:20;29526:1;29515:9;29511:17;29504:47;29568:131;29694:4;29568:131;:::i;:::-;29560:139;;29287:419;;;:::o;29712:::-;29878:4;29916:2;29905:9;29901:18;29893:26;;29965:9;29959:4;29955:20;29951:1;29940:9;29936:17;29929:47;29993:131;30119:4;29993:131;:::i;:::-;29985:139;;29712:419;;;:::o;30137:::-;30303:4;30341:2;30330:9;30326:18;30318:26;;30390:9;30384:4;30380:20;30376:1;30365:9;30361:17;30354:47;30418:131;30544:4;30418:131;:::i;:::-;30410:139;;30137:419;;;:::o;30562:::-;30728:4;30766:2;30755:9;30751:18;30743:26;;30815:9;30809:4;30805:20;30801:1;30790:9;30786:17;30779:47;30843:131;30969:4;30843:131;:::i;:::-;30835:139;;30562:419;;;:::o;30987:::-;31153:4;31191:2;31180:9;31176:18;31168:26;;31240:9;31234:4;31230:20;31226:1;31215:9;31211:17;31204:47;31268:131;31394:4;31268:131;:::i;:::-;31260:139;;30987:419;;;:::o;31412:::-;31578:4;31616:2;31605:9;31601:18;31593:26;;31665:9;31659:4;31655:20;31651:1;31640:9;31636:17;31629:47;31693:131;31819:4;31693:131;:::i;:::-;31685:139;;31412:419;;;:::o;31837:::-;32003:4;32041:2;32030:9;32026:18;32018:26;;32090:9;32084:4;32080:20;32076:1;32065:9;32061:17;32054:47;32118:131;32244:4;32118:131;:::i;:::-;32110:139;;31837:419;;;:::o;32262:::-;32428:4;32466:2;32455:9;32451:18;32443:26;;32515:9;32509:4;32505:20;32501:1;32490:9;32486:17;32479:47;32543:131;32669:4;32543:131;:::i;:::-;32535:139;;32262:419;;;:::o;32687:::-;32853:4;32891:2;32880:9;32876:18;32868:26;;32940:9;32934:4;32930:20;32926:1;32915:9;32911:17;32904:47;32968:131;33094:4;32968:131;:::i;:::-;32960:139;;32687:419;;;:::o;33112:::-;33278:4;33316:2;33305:9;33301:18;33293:26;;33365:9;33359:4;33355:20;33351:1;33340:9;33336:17;33329:47;33393:131;33519:4;33393:131;:::i;:::-;33385:139;;33112:419;;;:::o;33537:::-;33703:4;33741:2;33730:9;33726:18;33718:26;;33790:9;33784:4;33780:20;33776:1;33765:9;33761:17;33754:47;33818:131;33944:4;33818:131;:::i;:::-;33810:139;;33537:419;;;:::o;33962:::-;34128:4;34166:2;34155:9;34151:18;34143:26;;34215:9;34209:4;34205:20;34201:1;34190:9;34186:17;34179:47;34243:131;34369:4;34243:131;:::i;:::-;34235:139;;33962:419;;;:::o;34387:::-;34553:4;34591:2;34580:9;34576:18;34568:26;;34640:9;34634:4;34630:20;34626:1;34615:9;34611:17;34604:47;34668:131;34794:4;34668:131;:::i;:::-;34660:139;;34387:419;;;:::o;34812:::-;34978:4;35016:2;35005:9;35001:18;34993:26;;35065:9;35059:4;35055:20;35051:1;35040:9;35036:17;35029:47;35093:131;35219:4;35093:131;:::i;:::-;35085:139;;34812:419;;;:::o;35237:::-;35403:4;35441:2;35430:9;35426:18;35418:26;;35490:9;35484:4;35480:20;35476:1;35465:9;35461:17;35454:47;35518:131;35644:4;35518:131;:::i;:::-;35510:139;;35237:419;;;:::o;35662:::-;35828:4;35866:2;35855:9;35851:18;35843:26;;35915:9;35909:4;35905:20;35901:1;35890:9;35886:17;35879:47;35943:131;36069:4;35943:131;:::i;:::-;35935:139;;35662:419;;;:::o;36087:::-;36253:4;36291:2;36280:9;36276:18;36268:26;;36340:9;36334:4;36330:20;36326:1;36315:9;36311:17;36304:47;36368:131;36494:4;36368:131;:::i;:::-;36360:139;;36087:419;;;:::o;36512:::-;36678:4;36716:2;36705:9;36701:18;36693:26;;36765:9;36759:4;36755:20;36751:1;36740:9;36736:17;36729:47;36793:131;36919:4;36793:131;:::i;:::-;36785:139;;36512:419;;;:::o;36937:::-;37103:4;37141:2;37130:9;37126:18;37118:26;;37190:9;37184:4;37180:20;37176:1;37165:9;37161:17;37154:47;37218:131;37344:4;37218:131;:::i;:::-;37210:139;;36937:419;;;:::o;37362:::-;37528:4;37566:2;37555:9;37551:18;37543:26;;37615:9;37609:4;37605:20;37601:1;37590:9;37586:17;37579:47;37643:131;37769:4;37643:131;:::i;:::-;37635:139;;37362:419;;;:::o;37787:::-;37953:4;37991:2;37980:9;37976:18;37968:26;;38040:9;38034:4;38030:20;38026:1;38015:9;38011:17;38004:47;38068:131;38194:4;38068:131;:::i;:::-;38060:139;;37787:419;;;:::o;38212:::-;38378:4;38416:2;38405:9;38401:18;38393:26;;38465:9;38459:4;38455:20;38451:1;38440:9;38436:17;38429:47;38493:131;38619:4;38493:131;:::i;:::-;38485:139;;38212:419;;;:::o;38637:::-;38803:4;38841:2;38830:9;38826:18;38818:26;;38890:9;38884:4;38880:20;38876:1;38865:9;38861:17;38854:47;38918:131;39044:4;38918:131;:::i;:::-;38910:139;;38637:419;;;:::o;39062:::-;39228:4;39266:2;39255:9;39251:18;39243:26;;39315:9;39309:4;39305:20;39301:1;39290:9;39286:17;39279:47;39343:131;39469:4;39343:131;:::i;:::-;39335:139;;39062:419;;;:::o;39487:::-;39653:4;39691:2;39680:9;39676:18;39668:26;;39740:9;39734:4;39730:20;39726:1;39715:9;39711:17;39704:47;39768:131;39894:4;39768:131;:::i;:::-;39760:139;;39487:419;;;:::o;39912:::-;40078:4;40116:2;40105:9;40101:18;40093:26;;40165:9;40159:4;40155:20;40151:1;40140:9;40136:17;40129:47;40193:131;40319:4;40193:131;:::i;:::-;40185:139;;39912:419;;;:::o;40337:::-;40503:4;40541:2;40530:9;40526:18;40518:26;;40590:9;40584:4;40580:20;40576:1;40565:9;40561:17;40554:47;40618:131;40744:4;40618:131;:::i;:::-;40610:139;;40337:419;;;:::o;40762:222::-;40855:4;40893:2;40882:9;40878:18;40870:26;;40906:71;40974:1;40963:9;40959:17;40950:6;40906:71;:::i;:::-;40762:222;;;;:::o;40990:129::-;41024:6;41051:20;;:::i;:::-;41041:30;;41080:33;41108:4;41100:6;41080:33;:::i;:::-;40990:129;;;:::o;41125:75::-;41158:6;41191:2;41185:9;41175:19;;41125:75;:::o;41206:307::-;41267:4;41357:18;41349:6;41346:30;41343:56;;;41379:18;;:::i;:::-;41343:56;41417:29;41439:6;41417:29;:::i;:::-;41409:37;;41501:4;41495;41491:15;41483:23;;41206:307;;;:::o;41519:98::-;41570:6;41604:5;41598:12;41588:22;;41519:98;;;:::o;41623:99::-;41675:6;41709:5;41703:12;41693:22;;41623:99;;;:::o;41728:168::-;41811:11;41845:6;41840:3;41833:19;41885:4;41880:3;41876:14;41861:29;;41728:168;;;;:::o;41902:147::-;42003:11;42040:3;42025:18;;41902:147;;;;:::o;42055:169::-;42139:11;42173:6;42168:3;42161:19;42213:4;42208:3;42204:14;42189:29;;42055:169;;;;:::o;42230:148::-;42332:11;42369:3;42354:18;;42230:148;;;;:::o;42384:273::-;42424:3;42443:20;42461:1;42443:20;:::i;:::-;42438:25;;42477:20;42495:1;42477:20;:::i;:::-;42472:25;;42599:1;42563:34;42559:42;42556:1;42553:49;42550:75;;;42605:18;;:::i;:::-;42550:75;42649:1;42646;42642:9;42635:16;;42384:273;;;;:::o;42663:305::-;42703:3;42722:20;42740:1;42722:20;:::i;:::-;42717:25;;42756:20;42774:1;42756:20;:::i;:::-;42751:25;;42910:1;42842:66;42838:74;42835:1;42832:81;42829:107;;;42916:18;;:::i;:::-;42829:107;42960:1;42957;42953:9;42946:16;;42663:305;;;;:::o;42974:185::-;43014:1;43031:20;43049:1;43031:20;:::i;:::-;43026:25;;43065:20;43083:1;43065:20;:::i;:::-;43060:25;;43104:1;43094:35;;43109:18;;:::i;:::-;43094:35;43151:1;43148;43144:9;43139:14;;42974:185;;;;:::o;43165:348::-;43205:7;43228:20;43246:1;43228:20;:::i;:::-;43223:25;;43262:20;43280:1;43262:20;:::i;:::-;43257:25;;43450:1;43382:66;43378:74;43375:1;43372:81;43367:1;43360:9;43353:17;43349:105;43346:131;;;43457:18;;:::i;:::-;43346:131;43505:1;43502;43498:9;43487:20;;43165:348;;;;:::o;43519:191::-;43559:4;43579:20;43597:1;43579:20;:::i;:::-;43574:25;;43613:20;43631:1;43613:20;:::i;:::-;43608:25;;43652:1;43649;43646:8;43643:34;;;43657:18;;:::i;:::-;43643:34;43702:1;43699;43695:9;43687:17;;43519:191;;;;:::o;43716:::-;43756:4;43776:20;43794:1;43776:20;:::i;:::-;43771:25;;43810:20;43828:1;43810:20;:::i;:::-;43805:25;;43849:1;43846;43843:8;43840:34;;;43854:18;;:::i;:::-;43840:34;43899:1;43896;43892:9;43884:17;;43716:191;;;;:::o;43913:96::-;43950:7;43979:24;43997:5;43979:24;:::i;:::-;43968:35;;43913:96;;;:::o;44015:90::-;44049:7;44092:5;44085:13;44078:21;44067:32;;44015:90;;;:::o;44111:77::-;44148:7;44177:5;44166:16;;44111:77;;;:::o;44194:149::-;44230:7;44270:66;44263:5;44259:78;44248:89;;44194:149;;;:::o;44349:118::-;44386:7;44426:34;44419:5;44415:46;44404:57;;44349:118;;;:::o;44473:126::-;44510:7;44550:42;44543:5;44539:54;44528:65;;44473:126;;;:::o;44605:77::-;44642:7;44671:5;44660:16;;44605:77;;;:::o;44688:154::-;44772:6;44767:3;44762;44749:30;44834:1;44825:6;44820:3;44816:16;44809:27;44688:154;;;:::o;44848:307::-;44916:1;44926:113;44940:6;44937:1;44934:13;44926:113;;;45025:1;45020:3;45016:11;45010:18;45006:1;45001:3;44997:11;44990:39;44962:2;44959:1;44955:10;44950:15;;44926:113;;;45057:6;45054:1;45051:13;45048:101;;;45137:1;45128:6;45123:3;45119:16;45112:27;45048:101;44897:258;44848:307;;;:::o;45161:171::-;45200:3;45223:24;45241:5;45223:24;:::i;:::-;45214:33;;45269:4;45262:5;45259:15;45256:41;;;45277:18;;:::i;:::-;45256:41;45324:1;45317:5;45313:13;45306:20;;45161:171;;;:::o;45338:320::-;45382:6;45419:1;45413:4;45409:12;45399:22;;45466:1;45460:4;45456:12;45487:18;45477:81;;45543:4;45535:6;45531:17;45521:27;;45477:81;45605:2;45597:6;45594:14;45574:18;45571:38;45568:84;;;45624:18;;:::i;:::-;45568:84;45389:269;45338:320;;;:::o;45664:281::-;45747:27;45769:4;45747:27;:::i;:::-;45739:6;45735:40;45877:6;45865:10;45862:22;45841:18;45829:10;45826:34;45823:62;45820:88;;;45888:18;;:::i;:::-;45820:88;45928:10;45924:2;45917:22;45707:238;45664:281;;:::o;45951:233::-;45990:3;46013:24;46031:5;46013:24;:::i;:::-;46004:33;;46059:66;46052:5;46049:77;46046:103;;;46129:18;;:::i;:::-;46046:103;46176:1;46169:5;46165:13;46158:20;;45951:233;;;:::o;46190:100::-;46229:7;46258:26;46278:5;46258:26;:::i;:::-;46247:37;;46190:100;;;:::o;46296:94::-;46335:7;46364:20;46378:5;46364:20;:::i;:::-;46353:31;;46296:94;;;:::o;46396:176::-;46428:1;46445:20;46463:1;46445:20;:::i;:::-;46440:25;;46479:20;46497:1;46479:20;:::i;:::-;46474:25;;46518:1;46508:35;;46523:18;;:::i;:::-;46508:35;46564:1;46561;46557:9;46552:14;;46396:176;;;;:::o;46578:180::-;46626:77;46623:1;46616:88;46723:4;46720:1;46713:15;46747:4;46744:1;46737:15;46764:180;46812:77;46809:1;46802:88;46909:4;46906:1;46899:15;46933:4;46930:1;46923:15;46950:180;46998:77;46995:1;46988:88;47095:4;47092:1;47085:15;47119:4;47116:1;47109:15;47136:180;47184:77;47181:1;47174:88;47281:4;47278:1;47271:15;47305:4;47302:1;47295:15;47322:180;47370:77;47367:1;47360:88;47467:4;47464:1;47457:15;47491:4;47488:1;47481:15;47508:117;47617:1;47614;47607:12;47631:117;47740:1;47737;47730:12;47754:117;47863:1;47860;47853:12;47877:117;47986:1;47983;47976:12;48000:117;48109:1;48106;48099:12;48123:117;48232:1;48229;48222:12;48246:102;48287:6;48338:2;48334:7;48329:2;48322:5;48318:14;48314:28;48304:38;;48246:102;;;:::o;48354:94::-;48387:8;48435:5;48431:2;48427:14;48406:35;;48354:94;;;:::o;48454:241::-;48594:34;48590:1;48582:6;48578:14;48571:58;48663:24;48658:2;48650:6;48646:15;48639:49;48454:241;:::o;48701:248::-;48841:34;48837:1;48829:6;48825:14;48818:58;48910:31;48905:2;48897:6;48893:15;48886:56;48701:248;:::o;48955:181::-;49095:33;49091:1;49083:6;49079:14;49072:57;48955:181;:::o;49142:169::-;49282:21;49278:1;49270:6;49266:14;49259:45;49142:169;:::o;49317:220::-;49457:34;49453:1;49445:6;49441:14;49434:58;49526:3;49521:2;49513:6;49509:15;49502:28;49317:220;:::o;49543:225::-;49683:34;49679:1;49671:6;49667:14;49660:58;49752:8;49747:2;49739:6;49735:15;49728:33;49543:225;:::o;49774:173::-;49914:25;49910:1;49902:6;49898:14;49891:49;49774:173;:::o;49953:180::-;50093:32;50089:1;50081:6;50077:14;50070:56;49953:180;:::o;50139:225::-;50279:34;50275:1;50267:6;50263:14;50256:58;50348:8;50343:2;50335:6;50331:15;50324:33;50139:225;:::o;50370:::-;50510:34;50506:1;50498:6;50494:14;50487:58;50579:8;50574:2;50566:6;50562:15;50555:33;50370:225;:::o;50601:234::-;50741:34;50737:1;50729:6;50725:14;50718:58;50810:17;50805:2;50797:6;50793:15;50786:42;50601:234;:::o;50841:237::-;50981:34;50977:1;50969:6;50965:14;50958:58;51050:20;51045:2;51037:6;51033:15;51026:45;50841:237;:::o;51084:177::-;51224:29;51220:1;51212:6;51208:14;51201:53;51084:177;:::o;51267:225::-;51407:34;51403:1;51395:6;51391:14;51384:58;51476:8;51471:2;51463:6;51459:15;51452:33;51267:225;:::o;51498:::-;51638:34;51634:1;51626:6;51622:14;51615:58;51707:8;51702:2;51694:6;51690:15;51683:33;51498:225;:::o;51729:226::-;51869:34;51865:1;51857:6;51853:14;51846:58;51938:9;51933:2;51925:6;51921:15;51914:34;51729:226;:::o;51961:238::-;52101:34;52097:1;52089:6;52085:14;52078:58;52170:21;52165:2;52157:6;52153:15;52146:46;51961:238;:::o;52205:182::-;52345:34;52341:1;52333:6;52329:14;52322:58;52205:182;:::o;52393:233::-;52533:34;52529:1;52521:6;52517:14;52510:58;52602:16;52597:2;52589:6;52585:15;52578:41;52393:233;:::o;52632:234::-;52772:34;52768:1;52760:6;52756:14;52749:58;52841:17;52836:2;52828:6;52824:15;52817:42;52632:234;:::o;52872:228::-;53012:34;53008:1;53000:6;52996:14;52989:58;53081:11;53076:2;53068:6;53064:15;53057:36;52872:228;:::o;53106:224::-;53246:34;53242:1;53234:6;53230:14;53223:58;53315:7;53310:2;53302:6;53298:15;53291:32;53106:224;:::o;53336:242::-;53476:34;53472:1;53464:6;53460:14;53453:58;53545:25;53540:2;53532:6;53528:15;53521:50;53336:242;:::o;53584:220::-;53724:34;53720:1;53712:6;53708:14;53701:58;53793:3;53788:2;53780:6;53776:15;53769:28;53584:220;:::o;53810:170::-;53950:22;53946:1;53938:6;53934:14;53927:46;53810:170;:::o;53986:179::-;54126:31;54122:1;54114:6;54110:14;54103:55;53986:179;:::o;54171:182::-;54311:34;54307:1;54299:6;54295:14;54288:58;54171:182;:::o;54359:236::-;54499:34;54495:1;54487:6;54483:14;54476:58;54568:19;54563:2;54555:6;54551:15;54544:44;54359:236;:::o;54601:177::-;54741:29;54737:1;54729:6;54725:14;54718:53;54601:177;:::o;54784:229::-;54924:34;54920:1;54912:6;54908:14;54901:58;54993:12;54988:2;54980:6;54976:15;54969:37;54784:229;:::o;55019:240::-;55159:34;55155:1;55147:6;55143:14;55136:58;55228:23;55223:2;55215:6;55211:15;55204:48;55019:240;:::o;55265:229::-;55405:34;55401:1;55393:6;55389:14;55382:58;55474:12;55469:2;55461:6;55457:15;55450:37;55265:229;:::o;55500:223::-;55640:34;55636:1;55628:6;55624:14;55617:58;55709:6;55704:2;55696:6;55692:15;55685:31;55500:223;:::o;55729:122::-;55802:24;55820:5;55802:24;:::i;:::-;55795:5;55792:35;55782:63;;55841:1;55838;55831:12;55782:63;55729:122;:::o;55857:116::-;55927:21;55942:5;55927:21;:::i;:::-;55920:5;55917:32;55907:60;;55963:1;55960;55953:12;55907:60;55857:116;:::o;55979:122::-;56052:24;56070:5;56052:24;:::i;:::-;56045:5;56042:35;56032:63;;56091:1;56088;56081:12;56032:63;55979:122;:::o;56107:120::-;56179:23;56196:5;56179:23;:::i;:::-;56172:5;56169:34;56159:62;;56217:1;56214;56207:12;56159:62;56107:120;:::o;56233:122::-;56306:24;56324:5;56306:24;:::i;:::-;56299:5;56296:35;56286:63;;56345:1;56342;56335:12;56286:63;56233:122;:::o
Swarm Source
ipfs://007279335e3d2cf3159f9dd85c4d20274546b09f26e7dca7068e72d94094c826
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.