ERC-721
Overview
Max Total Supply
371 YWhales
Holders
141
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
8 YWhalesLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
yWhales
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./ERC721Enumerable.sol"; import "./Ownable.sol"; import "./SafeMath.sol"; import "./Strings.sol"; contract OwnableDelegateProxy {} contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } } /** * @title ERC721Tradable * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality. * if (network === 'rinkeby') { proxyRegistryAddress = "0xF57B2c51dED3A29e6891aba85459d600256Cf317"; } else { proxyRegistryAddress = "0xa5409ec958C83C3f309868babACA7c86DCB077c1"; } */ contract yWhales is ContextMixin, ERC721Enumerable, Ownable { using SafeMath for uint256; address proxyRegistryAddress; string public baseURI; bool public saleActive; mapping(address => bool) whitelist; uint256 public whitelistedNumber = 0; //track who has OG whales mapping(address => bool) ogWhalesList; // holds the Whales struct Whale { string name; uint256 quantity; // total uint256 unsoldQty; uint price; // in wei .2 ether = 0.2ETH uint256 whaleId; bool transferable; bool saleable; } mapping (uint256 => Whale) public Whales; uint256 public WhalesStructs; //Tokens[tokenId] = whaleId mapping (uint256 => uint256) public Tokens; constructor() ERC721('YWhales Crystal Whales', "YWhales") { setBaseURI("https://one.ywhales.com/tokens/"); proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1; saleActive = false; WhalesStructs = 0; addWhale('The YPO Whale', 999, 0, false, true); addWhale('The Nick', 50, .2 ether, true, true); addWhale('FOMO', 50, .2 ether, true, true); addWhale('Stephan', 50, .2 ether, true, true); addWhale('Gummy', 5, .2 ether, true, true); addWhale('Archie', 50, .2 ether, true, true); addWhale('Tupac', 5, .2 ether, true, true); addWhale('Bombay', 50, .2 ether, true, true); addWhale('Rare Pepe', 25, .2 ether, true, true); addWhale('The Rock', 50, .2 ether, true, true); addWhale('Ruby', 50, .2 ether, true, true); addWhale('Krug Rose', 50, .2 ether, true, true); addWhale('Lemon Drop', 50, .2 ether, true, true); addWhale('Chilli', 50, .2 ether, true, true); addWhale('Nehi', 50, .2 ether, true, true); addWhale('Rick', 50, .2 ether, true, true); addWhale('Solana', 50, .2 ether, true, true); addWhale('DeFi', 50, .2 ether, true, true); addWhale('Oz', 50, .2 ether, true, true); addWhale('Fendi', 50, .2 ether, true, true); addWhale('Hermes', 50, .2 ether, true, true); addWhale('Dolce', 50, .2 ether, true, true); addWhale('Bvlgari', 50, .2 ether, true, true); addWhale('DeFi Degen', 50, .2 ether, true, true); addWhale('Angra', 50, .2 ether, true, true); addWhale('The 68', 50, .2 ether, true, true); addWhale('Tamarillo', 50, .2 ether, true, true); addWhale('Barbara', 50, .2 ether, true, true); addWhale('David', 25, .2 ether, true, true); addWhale('Penny', 50, .2 ether, true, true); addWhale('Yin', 50, .2 ether, true, true); addWhale('Yang', 50, .2 ether, true, true); addWhale('Labyrinth', 50, .2 ether, true, true); addWhale('Bling', 50, .2 ether, true, true); addWhale('Mordor', 50, .2 ether, true, true); addWhale('Krakatoa', 50, .2 ether, true, true); addWhale('Topaz', 50, .2 ether, true, true); addWhale('Kat', 1, 1 ether, true, true); addWhale('Cassia', 50, .2 ether, true, true); addWhale('Euro', 50, .2 ether, true, true); addWhale('Iridium', 50, .2 ether, true, true); addWhale('Obsidian', 50, .2 ether, true, true); addWhale('Blue Check', 50, .2 ether, true, true); addWhale('Agean', 50, .2 ether, true, true); addWhale('Barney', 50, .2 ether, true, true); addWhale('Graphine', 50, .2 ether, true, true); addWhale('Honey Baked', 50, .2 ether, true, true); addWhale('The Thing', 50, .2 ether, true, true); addWhale('The J', 50, .2 ether, true, true); addWhale('Stealth', 50, .2 ether, true, true); addWhale('Chewy', 50, .2 ether, true, true); addWhale('Purple Haze', 50, .2 ether, true, true); addWhale('Fruity Pebbles', 50, .2 ether, true, true); addWhale('The Man', 50, .2 ether, true, true); addWhale('The Yeti', 50, .2 ether, true, true); addWhale('Oasis', 50, .2 ether, true, true); addWhale('Oasis', 50, .2 ether, true, true); addWhale('People Eater', 100, .2 ether, true, false); addWhale('Burt', 100, .2 ether, true, false); addWhale('Titan', 100, .2 ether, true, false); addWhale('Rosey', 100, .2 ether, true, false); addWhale('Dreamsicle', 100, .2 ether, true, false); addWhale('Brunnera', 100, .2 ether, true, false); addWhale('Hypatia', 100, .2 ether, true, false); } function tokenURI(uint256 tokenId) public view override returns (string memory) { // baseURI + whaleId + .json require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(Tokens[tokenId]), '.json')) : ""; } // owner can add a new type of Whale function addWhale(string memory name, uint256 quantity, uint price, bool transferable, bool saleable) public onlyOwner { Whale memory whale = Whale(name, quantity, quantity, price, WhalesStructs.add(1), transferable, saleable); Whales[WhalesStructs.add(1)] = whale; WhalesStructs++; } // adding burning but onlOwner function burn(uint256 tokenId) public onlyOwner { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } // owner can add a new type of Whale function editWhale(string memory name, uint256 quantity, uint price, bool transferable, uint256 whaleId, bool saleable) public onlyOwner { //Whale memory whale = Whale(name, quantity, quanity, price, whaleId, transferable); uint soldQty = Whales[whaleId].quantity.sub(Whales[whaleId].unsoldQty); require(quantity >= soldQty, 'New quantity must be equal to or greater than quantity already sold.'); Whales[whaleId].name = name; Whales[whaleId].price = price; Whales[whaleId].transferable = transferable; Whales[whaleId].saleable = saleable; Whales[whaleId].unsoldQty = quantity.sub(soldQty); Whales[whaleId].quantity = quantity; } function withdraw() public onlyOwner { // withdraw logic require(payable(msg.sender).send(address(this).balance)); } function setBaseURI(string memory _newURI) public onlyOwner { baseURI = _newURI; } function whitelistAddress(address[] calldata _add) public onlyOwner { for (uint i = 0; i < _add.length; i++) { whitelist[_add[i]] = true; whitelistedNumber++; } } function transferFrom(address from, address to, uint256 tokenId) public override { //whaleId 1 is OG and not transferable require(Tokens[tokenId] > 1, 'Whale type not transferable.'); require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override { //whaleId 1 is OG and not transferable require(Tokens[tokenId] > 1, 'Whale type not transferable.'); safeTransferFrom(from, to, tokenId, ""); } // mint 6 random whales function mint6() public payable { require(whitelist[msg.sender], "Not whitelisted."); require(saleActive==true, "Sale is paused."); require(msg.value >= 1 ether, 'Ether value is below 1ETH price'); uint j = 0; for (uint i = 2; i < WhalesStructs; i++) { if (Whales[i].saleable == true && Whales[i].unsoldQty > 0) { uint nextId = totalSupply().add(1); _mint(msg.sender, nextId); Tokens[nextId] = i; Whales[i].unsoldQty = Whales[i].unsoldQty.sub(1); j++; } if (j==6) { break; } } } /* public mint */ function mint(uint256 quantity, uint whaleId) public payable { // mint whaleId; make sure quantity is avail // decrement qty avail require(whitelist[msg.sender], "Not whitelisted."); require(saleActive==true, "Sale is paused."); require(Whales[whaleId].whaleId > 0, "Collection does not exist."); require(msg.value >= Whales[whaleId].price.mul(quantity), 'Ether value is below price'); require(Whales[whaleId].saleable == true, 'Not for sale.'); require(Whales[whaleId].unsoldQty.sub(quantity) >= 0, 'Quantity requested exceeds available quantity for sale.'); require(whaleId > 1 || !ogWhalesList[msg.sender], 'You already own an OG Whale.'); for (uint i = 0; i < quantity; i++) { // what is next tokenId uint nextId = totalSupply().add(1); // _mint(to, id, qty, data) _mint(msg.sender, nextId); Tokens[nextId] = whaleId; // reduce avail for sale Whales[whaleId].unsoldQty = Whales[whaleId].unsoldQty.sub(1); } //if whaleId = 1 (OG), whitelist if (whaleId==1 && !whitelist[msg.sender]) { whitelist[msg.sender] = true; whitelistedNumber++; ogWhalesList[msg.sender] = true; } } /* owner giveaway */ function giveaway(uint256 quantity, uint256 whaleId, address to) onlyOwner public { // owner can send any whale to any address without payable require(saleActive==true, "Sale is paused."); require(Whales[whaleId].whaleId > 0, "Collection does not exist."); require(Whales[whaleId].unsoldQty.sub(quantity) >= 0, 'Quantity requested exceeds available quantity for sale.'); for (uint i = 0; i < quantity; i++) { // what is next tokenId uint nextId = totalSupply().add(1); // _mint(to, id, qty, data) _mint(to, nextId); // update Cards struct Tokens[nextId] = whaleId; // reduce avail for sale Whales[whaleId].unsoldQty = Whales[whaleId].unsoldQty.sub(1); // OG whale? whitelist if (whaleId==1 && !whitelist[to]){ whitelist[to] = true; whitelistedNumber++; ogWhalesList[to] = true; } } } function toggleSaleActive() public virtual onlyOwner { // owner can turn sale on/off saleActive = !saleActive; } /** * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) override public view returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return super.isApprovedForAll(owner, operator); } /** * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea. */ function _msgSender() internal override view returns (address sender) { return ContextMixin.msgSender(); } } // @busymichael.eth
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (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 v4.3.2 (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 v4.3.2 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { 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 virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (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 tokenId); /** * @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.3.2 (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 v4.3.2 (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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 v4.3.2 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.3.2 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @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); } }
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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Whales","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"unsoldQty","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"whaleId","type":"uint256"},{"internalType":"bool","name":"transferable","type":"bool"},{"internalType":"bool","name":"saleable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhalesStructs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"transferable","type":"bool"},{"internalType":"bool","name":"saleable","type":"bool"}],"name":"addWhale","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"transferable","type":"bool"},{"internalType":"uint256","name":"whaleId","type":"uint256"},{"internalType":"bool","name":"saleable","type":"bool"}],"name":"editWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"whaleId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"whaleId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint6","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_newURI","type":"string"}],"name":"setBaseURI","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":"toggleSaleActive","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":[{"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":"_add","type":"address[]"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistedNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600f553480156200001657600080fd5b506040518060400160405280601681526020017f595768616c6573204372797374616c205768616c6573000000000000000000008152506040518060400160405280600781526020017f595768616c65730000000000000000000000000000000000000000000000000081525081600090805190602001906200009b92919062001ae0565b508060019080519060200190620000b492919062001ae0565b505050620000d7620000cb6200169c60201b60201c565b620016b860201b60201c565b6200011d6040518060400160405280601f81526020017f68747470733a2f2f6f6e652e797768616c65732e636f6d2f746f6b656e732f008152506200177e60201b60201c565b73a5409ec958c83c3f309868babaca7c86dcb077c1600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60006101000a81548160ff0219169083151502179055506000601281905550620001e36040518060400160405280600d81526020017f5468652059504f205768616c65000000000000000000000000000000000000008152506103e760008060016200182960201b60201c565b620002376040518060400160405280600881526020017f546865204e69636b00000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200028b6040518060400160405280600481526020017f464f4d4f0000000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620002df6040518060400160405280600781526020017f5374657068616e0000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620003336040518060400160405280600581526020017f47756d6d7900000000000000000000000000000000000000000000000000000081525060056702c68af0bb1400006001806200182960201b60201c565b620003876040518060400160405280600681526020017f417263686965000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620003db6040518060400160405280600581526020017f547570616300000000000000000000000000000000000000000000000000000081525060056702c68af0bb1400006001806200182960201b60201c565b6200042f6040518060400160405280600681526020017f426f6d626179000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620004836040518060400160405280600981526020017f526172652050657065000000000000000000000000000000000000000000000081525060196702c68af0bb1400006001806200182960201b60201c565b620004d76040518060400160405280600881526020017f54686520526f636b00000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200052b6040518060400160405280600481526020017f527562790000000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200057f6040518060400160405280600981526020017f4b72756720526f7365000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620005d36040518060400160405280600a81526020017f4c656d6f6e2044726f700000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620006276040518060400160405280600681526020017f4368696c6c69000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200067b6040518060400160405280600481526020017f4e6568690000000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620006cf6040518060400160405280600481526020017f5269636b0000000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620007236040518060400160405280600681526020017f536f6c616e61000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620007776040518060400160405280600481526020017f446546690000000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620007cb6040518060400160405280600281526020017f4f7a00000000000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200081f6040518060400160405280600581526020017f46656e646900000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620008736040518060400160405280600681526020017f4865726d6573000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620008c76040518060400160405280600581526020017f446f6c636500000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200091b6040518060400160405280600781526020017f42766c676172690000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200096f6040518060400160405280600a81526020017f4465466920446567656e0000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620009c36040518060400160405280600581526020017f416e67726100000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000a176040518060400160405280600681526020017f546865203638000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000a6b6040518060400160405280600981526020017f54616d6172696c6c6f000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000abf6040518060400160405280600781526020017f426172626172610000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000b136040518060400160405280600581526020017f446176696400000000000000000000000000000000000000000000000000000081525060196702c68af0bb1400006001806200182960201b60201c565b62000b676040518060400160405280600581526020017f50656e6e7900000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000bbb6040518060400160405280600381526020017f59696e000000000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000c0f6040518060400160405280600481526020017f59616e670000000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000c636040518060400160405280600981526020017f4c61627972696e7468000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000cb76040518060400160405280600581526020017f426c696e6700000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000d0b6040518060400160405280600681526020017f4d6f72646f72000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000d5f6040518060400160405280600881526020017f4b72616b61746f6100000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000db36040518060400160405280600581526020017f546f70617a00000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000e076040518060400160405280600381526020017f4b617400000000000000000000000000000000000000000000000000000000008152506001670de0b6b3a76400006001806200182960201b60201c565b62000e5b6040518060400160405280600681526020017f436173736961000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000eaf6040518060400160405280600481526020017f4575726f0000000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000f036040518060400160405280600781526020017f4972696469756d0000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000f576040518060400160405280600881526020017f4f6273696469616e00000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000fab6040518060400160405280600a81526020017f426c756520436865636b0000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b62000fff6040518060400160405280600581526020017f416765616e00000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620010536040518060400160405280600681526020017f4261726e6579000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620010a76040518060400160405280600881526020017f4772617068696e6500000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620010fb6040518060400160405280600b81526020017f486f6e65792042616b656400000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200114f6040518060400160405280600981526020017f546865205468696e67000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620011a36040518060400160405280600581526020017f546865204a00000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620011f76040518060400160405280600781526020017f537465616c74680000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200124b6040518060400160405280600581526020017f436865777900000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200129f6040518060400160405280600b81526020017f507572706c652048617a6500000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620012f36040518060400160405280600e81526020017f46727569747920506562626c657300000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620013476040518060400160405280600781526020017f546865204d616e0000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b6200139b6040518060400160405280600881526020017f546865205965746900000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620013ef6040518060400160405280600581526020017f4f6173697300000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620014436040518060400160405280600581526020017f4f6173697300000000000000000000000000000000000000000000000000000081525060326702c68af0bb1400006001806200182960201b60201c565b620014986040518060400160405280600c81526020017f50656f706c65204561746572000000000000000000000000000000000000000081525060646702c68af0bb140000600160006200182960201b60201c565b620014ed6040518060400160405280600481526020017f427572740000000000000000000000000000000000000000000000000000000081525060646702c68af0bb140000600160006200182960201b60201c565b620015426040518060400160405280600581526020017f546974616e00000000000000000000000000000000000000000000000000000081525060646702c68af0bb140000600160006200182960201b60201c565b620015976040518060400160405280600581526020017f526f73657900000000000000000000000000000000000000000000000000000081525060646702c68af0bb140000600160006200182960201b60201c565b620015ec6040518060400160405280600a81526020017f447265616d7369636c650000000000000000000000000000000000000000000081525060646702c68af0bb140000600160006200182960201b60201c565b620016416040518060400160405280600881526020017f4272756e6e65726100000000000000000000000000000000000000000000000081525060646702c68af0bb140000600160006200182960201b60201c565b620016966040518060400160405280600781526020017f487970617469610000000000000000000000000000000000000000000000000081525060646702c68af0bb140000600160006200182960201b60201c565b62001d5c565b6000620016b3620019eb60201b620026d21760201c565b905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200178e6200169c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620017b462001a9e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200180d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620018049062001bb7565b60405180910390fd5b80600c90805190602001906200182592919062001ae0565b5050565b620018396200169c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200185f62001a9e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620018b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620018af9062001bb7565b60405180910390fd5b60006040518060e00160405280878152602001868152602001868152602001858152602001620018fa600160125462001ac860201b620027831790919060201c565b815260200184151581526020018315158152509050806011600062001931600160125462001ac860201b620027831790919060201c565b815260200190815260200160002060008201518160000190805190602001906200195d92919062001ae0565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555090505060126000815480929190620019de9062001c87565b9190505550505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141562001a9757600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505062001a9b565b3390505b90565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000818362001ad8919062001bea565b905092915050565b82805462001aee9062001c51565b90600052602060002090601f01602090048101928262001b12576000855562001b5e565b82601f1062001b2d57805160ff191683800117855562001b5e565b8280016001018555821562001b5e579182015b8281111562001b5d57825182559160200191906001019062001b40565b5b50905062001b6d919062001b71565b5090565b5b8082111562001b8c57600081600090555060010162001b72565b5090565b600062001b9f60208362001bd9565b915062001bac8262001d33565b602082019050919050565b6000602082019050818103600083015262001bd28162001b90565b9050919050565b600082825260208201905092915050565b600062001bf78262001c47565b915062001c048362001c47565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001c3c5762001c3b62001cd5565b5b828201905092915050565b6000819050919050565b6000600282049050600182168062001c6a57607f821691505b6020821081141562001c815762001c8062001d04565b5b50919050565b600062001c948262001c47565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562001cca5762001cc962001cd5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6159548062001d6c6000396000f3fe6080604052600436106102045760003560e01c806360e5f61611610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd1461072b578063dee3e5a314610768578063e985e9c514610791578063f2fde38b146107ce578063fa10a81a146107f757610204565b8063a22cb46514610685578063b31d61b0146106ae578063b88d4fde146106d7578063c61a6ed81461070057610204565b806370a08231116100e757806370a082311461059e578063715018a6146105db5780638da5cb5b146105f2578063953c81331461061d57806395d89b411461065a57610204565b806360e5f616146104e25780636352211e1461050b57806368428a1b146105485780636c0360eb1461057357610204565b80632f745c591161019b57806342966c681161016a57806342966c681461040657806342a3ad581461042f5780634b8fd9e6146104725780634f6ccce71461047c57806355f804b3146104b957610204565b80632f745c59146103725780633100a535146103af5780633ccfd60b146103c657806342842e0e146103dd57610204565b806318160ddd116101d757806318160ddd146102d75780631b2ef1ca1461030257806323b872dd1461031e57806325413cde1461034757610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613f12565b610820565b60405161023d91906147e1565b60405180910390f35b34801561025257600080fd5b5061025b61089a565b60405161026891906147fc565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190614122565b61092c565b6040516102a5919061477a565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613e85565b6109b1565b005b3480156102e357600080fd5b506102ec610ac9565b6040516102f99190614c34565b60405180910390f35b61031c6004803603810190610317919061414f565b610ad6565b005b34801561032a57600080fd5b5061034560048036038101906103409190613d6f565b610fbb565b005b34801561035357600080fd5b5061035c611071565b6040516103699190614c34565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613e85565b611077565b6040516103a69190614c34565b60405180910390f35b3480156103bb57600080fd5b506103c461111c565b005b3480156103d257600080fd5b506103db6111c4565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190613d6f565b611280565b005b34801561041257600080fd5b5061042d60048036038101906104289190614122565b6112f6565b005b34801561043b57600080fd5b5061045660048036038101906104519190614122565b6113ce565b604051610469979695949392919061481e565b60405180910390f35b61047a6114b2565b005b34801561048857600080fd5b506104a3600480360381019061049e9190614122565b6116fd565b6040516104b09190614c34565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190613f99565b61176e565b005b3480156104ee57600080fd5b506105096004803603810190610504919061418f565b611804565b005b34801561051757600080fd5b50610532600480360381019061052d9190614122565b611b6d565b60405161053f919061477a565b60405180910390f35b34801561055457600080fd5b5061055d611c1f565b60405161056a91906147e1565b60405180910390f35b34801561057f57600080fd5b50610588611c32565b60405161059591906147fc565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c09190613d02565b611cc0565b6040516105d29190614c34565b60405180910390f35b3480156105e757600080fd5b506105f0611d78565b005b3480156105fe57600080fd5b50610607611e00565b604051610614919061477a565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f9190614122565b611e2a565b6040516106519190614c34565b60405180910390f35b34801561066657600080fd5b5061066f611e42565b60405161067c91906147fc565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a79190613e45565b611ed4565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190613ec5565b611eea565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190613dc2565b612023565b005b34801561070c57600080fd5b50610715612085565b6040516107229190614c34565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190614122565b61208b565b60405161075f91906147fc565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a9190614079565b612146565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613d2f565b61233b565b6040516107c591906147e1565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f09190613d02565b61243d565b005b34801561080357600080fd5b5061081e60048036038101906108199190613fe2565b612535565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610893575061089282612799565b5b9050919050565b6060600080546108a990614f0b565b80601f01602080910402602001604051908101604052809291908181526020018280546108d590614f0b565b80156109225780601f106108f757610100808354040283529160200191610922565b820191906000526020600020905b81548152906001019060200180831161090557829003601f168201915b5050505050905090565b60006109378261287b565b610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096d90614ab4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bc82611b6d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490614b94565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4c6128e7565b73ffffffffffffffffffffffffffffffffffffffff161480610a7b5750610a7a81610a756128e7565b61233b565b5b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab1906149f4565b60405180910390fd5b610ac483836128f6565b505050565b6000600880549050905090565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990614bd4565b60405180910390fd5b60011515600d60009054906101000a900460ff16151514610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf906149d4565b60405180910390fd5b6000601160008381526020019081526020016000206004015411610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890614af4565b60405180910390fd5b610c3a8260116000848152602001908152602001600020600301546129af90919063ffffffff16565b341015610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390614954565b60405180910390fd5b600115156011600083815260200190815260200160002060050160019054906101000a900460ff16151514610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd90614a94565b60405180910390fd5b6000610d118360116000858152602001908152602001600020600201546129c590919063ffffffff16565b1015610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4990614894565b60405180910390fd5b6001811180610dab5750601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190614934565b60405180910390fd5b60005b82811015610e8e576000610e126001610e04610ac9565b61278390919063ffffffff16565b9050610e1e33826129db565b826013600083815260200190815260200160002081905550610e60600160116000868152602001908152602001600020600201546129c590919063ffffffff16565b6011600085815260200190815260200160002060020181905550508080610e8690614f6e565b915050610ded565b50600181148015610ee95750600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610fb7576001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f6000815480929190610f5990614f6e565b91905055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5050565b6001601360008381526020019081526020016000205411611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890614b14565b60405180910390fd5b61102261101c6128e7565b82612ba9565b611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890614bb4565b60405180910390fd5b61106c838383612c87565b505050565b600f5481565b600061108283611cc0565b82106110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ba906148b4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6111246128e7565b73ffffffffffffffffffffffffffffffffffffffff16611142611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614ad4565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6111cc6128e7565b73ffffffffffffffffffffffffffffffffffffffff166111ea611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123790614ad4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061127e57600080fd5b565b60016013600083815260200190815260200160002054116112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90614b14565b60405180910390fd5b6112f183838360405180602001604052806000815250612023565b505050565b6112fe6128e7565b73ffffffffffffffffffffffffffffffffffffffff1661131c611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990614ad4565b60405180910390fd5b61138361137d6128e7565b82612ba9565b6113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614c14565b60405180910390fd5b6113cb81612ee3565b50565b60116020528060005260406000206000915090508060000180546113f190614f0b565b80601f016020809104026020016040519081016040528092919081815260200182805461141d90614f0b565b801561146a5780601f1061143f5761010080835404028352916020019161146a565b820191906000526020600020905b81548152906001019060200180831161144d57829003601f168201915b5050505050908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16905087565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590614bd4565b60405180910390fd5b60011515600d60009054906101000a900460ff16151514611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b906149d4565b60405180910390fd5b670de0b6b3a76400003410156115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690614b74565b60405180910390fd5b600080600290505b6012548110156116f957600115156011600083815260200190815260200160002060050160019054906101000a900460ff16151514801561163e575060006011600083815260200190815260200160002060020154115b156116d85760006116606001611652610ac9565b61278390919063ffffffff16565b905061166c33826129db565b8160136000838152602001908152602001600020819055506116ae600160116000858152602001908152602001600020600201546129c590919063ffffffff16565b601160008481526020019081526020016000206002018190555082806116d390614f6e565b935050505b60068214156116e6576116f9565b80806116f190614f6e565b9150506115e7565b5050565b6000611707610ac9565b8210611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90614bf4565b60405180910390fd5b6008828154811061175c5761175b6150a4565b5b90600052602060002001549050919050565b6117766128e7565b73ffffffffffffffffffffffffffffffffffffffff16611794611e00565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190614ad4565b60405180910390fd5b80600c9080519060200190611800929190613aab565b5050565b61180c6128e7565b73ffffffffffffffffffffffffffffffffffffffff1661182a611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790614ad4565b60405180910390fd5b60011515600d60009054906101000a900460ff161515146118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd906149d4565b60405180910390fd5b600060116000848152602001908152602001600020600401541161192f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192690614af4565b60405180910390fd5b600061195a8460116000868152602001908152602001600020600201546129c590919063ffffffff16565b101561199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290614894565b60405180910390fd5b60005b83811015611b675760006119c360016119b5610ac9565b61278390919063ffffffff16565b90506119cf83826129db565b836013600083815260200190815260200160002081905550611a11600160116000878152602001908152602001600020600201546129c590919063ffffffff16565b6011600086815260200190815260200160002060020181905550600184148015611a855750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611b53576001600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f6000815480929190611af590614f6e565b91905055506001601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b508080611b5f90614f6e565b91505061199e565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d90614a34565b60405180910390fd5b80915050919050565b600d60009054906101000a900460ff1681565b600c8054611c3f90614f0b565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6b90614f0b565b8015611cb85780601f10611c8d57610100808354040283529160200191611cb8565b820191906000526020600020905b815481529060010190602001808311611c9b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614a14565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d806128e7565b73ffffffffffffffffffffffffffffffffffffffff16611d9e611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb90614ad4565b60405180910390fd5b611dfe6000612ff4565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60136020528060005260406000206000915090505481565b606060018054611e5190614f0b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7d90614f0b565b8015611eca5780601f10611e9f57610100808354040283529160200191611eca565b820191906000526020600020905b815481529060010190602001808311611ead57829003601f168201915b5050505050905090565b611ee6611edf6128e7565b83836130ba565b5050565b611ef26128e7565b73ffffffffffffffffffffffffffffffffffffffff16611f10611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d90614ad4565b60405180910390fd5b60005b8282905081101561201e576001600e6000858585818110611f8d57611f8c6150a4565b5b9050602002016020810190611fa29190613d02565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f600081548092919061200690614f6e565b9190505550808061201690614f6e565b915050611f69565b505050565b61203461202e6128e7565b83612ba9565b612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206a90614bb4565b60405180910390fd5b61207f84848484613227565b50505050565b60125481565b60606120968261287b565b6120d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cc90614b54565b60405180910390fd5b6000600c80546120e490614f0b565b905011612100576040518060200160405280600081525061213f565b600c61211e6013600085815260200190815260200160002054613283565b60405160200161212f92919061474b565b6040516020818303038152906040525b9050919050565b61214e6128e7565b73ffffffffffffffffffffffffffffffffffffffff1661216c611e00565b73ffffffffffffffffffffffffffffffffffffffff16146121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990614ad4565b60405180910390fd5b6000612203601160008581526020019081526020016000206002015460116000868152602001908152602001600020600101546129c590919063ffffffff16565b905080861015612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223f90614a74565b60405180910390fd5b86601160008581526020019081526020016000206000019080519060200190612272929190613aab565b50846011600085815260200190815260200160002060030181905550836011600085815260200190815260200160002060050160006101000a81548160ff021916908315150217905550816011600085815260200190815260200160002060050160016101000a81548160ff0219169083151502179055506122fd81876129c590919063ffffffff16565b601160008581526020019081526020016000206002018190555085601160008581526020019081526020016000206001018190555050505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016123b3919061477a565b60206040518083038186803b1580156123cb57600080fd5b505afa1580156123df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124039190613f6c565b73ffffffffffffffffffffffffffffffffffffffff161415612429576001915050612437565b61243384846133e4565b9150505b92915050565b6124456128e7565b73ffffffffffffffffffffffffffffffffffffffff16612463611e00565b73ffffffffffffffffffffffffffffffffffffffff16146124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b090614ad4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612520906148f4565b60405180910390fd5b61253281612ff4565b50565b61253d6128e7565b73ffffffffffffffffffffffffffffffffffffffff1661255b611e00565b73ffffffffffffffffffffffffffffffffffffffff16146125b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a890614ad4565b60405180910390fd5b60006040518060e001604052808781526020018681526020018681526020018581526020016125ec600160125461278390919063ffffffff16565b815260200184151581526020018315158152509050806011600061261c600160125461278390919063ffffffff16565b81526020019081526020016000206000820151816000019080519060200190612646929190613aab565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff021916908315150217905550905050601260008154809291906126c590614f6e565b9190505550505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561277c57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050612780565b3390505b90565b600081836127919190614d2e565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061286457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612874575061287382613478565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006128f16126d2565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661296983611b6d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081836129bd9190614db5565b905092915050565b600081836129d39190614e0f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4290614a54565b60405180910390fd5b612a548161287b565b15612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b90614914565b60405180910390fd5b612aa0600083836134e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af09190614d2e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612bb48261287b565b612bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bea906149b4565b60405180910390fd5b6000612bfe83611b6d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c6d57508373ffffffffffffffffffffffffffffffffffffffff16612c558461092c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c7e5750612c7d818561233b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ca782611b6d565b73ffffffffffffffffffffffffffffffffffffffff1614612cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf490614b34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6490614974565b60405180910390fd5b612d788383836134e2565b612d836000826128f6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dd39190614e0f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2a9190614d2e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612eee82611b6d565b9050612efc816000846134e2565b612f076000836128f6565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f579190614e0f565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312090614994565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161321a91906147e1565b60405180910390a3505050565b613232848484612c87565b61323e848484846135f6565b61327d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613274906148d4565b60405180910390fd5b50505050565b606060008214156132cb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133df565b600082905060005b600082146132fd5780806132e690614f6e565b915050600a826132f69190614d84565b91506132d3565b60008167ffffffffffffffff811115613319576133186150d3565b5b6040519080825280601f01601f19166020018201604052801561334b5781602001600182028036833780820191505090505b5090505b600085146133d8576001826133649190614e0f565b9150600a856133739190614fb7565b603061337f9190614d2e565b60f81b818381518110613395576133946150a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133d19190614d84565b945061334f565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134ed83838361378d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135305761352b81613792565b61356f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461356e5761356d83826137db565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135b2576135ad81613948565b6135f1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135f0576135ef8282613a19565b5b5b505050565b60006136178473ffffffffffffffffffffffffffffffffffffffff16613a98565b15613780578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136406128e7565b8786866040518563ffffffff1660e01b81526004016136629493929190614795565b602060405180830381600087803b15801561367c57600080fd5b505af19250505080156136ad57506040513d601f19601f820116820180604052508101906136aa9190613f3f565b60015b613730573d80600081146136dd576040519150601f19603f3d011682016040523d82523d6000602084013e6136e2565b606091505b50600081511415613728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371f906148d4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613785565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137e884611cc0565b6137f29190614e0f565b90506000600760008481526020019081526020016000205490508181146138d7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061395c9190614e0f565b905060006009600084815260200190815260200160002054905060006008838154811061398c5761398b6150a4565b5b9060005260206000200154905080600883815481106139ae576139ad6150a4565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139fd576139fc615075565b5b6001900381819060005260206000200160009055905550505050565b6000613a2483611cc0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613ab790614f0b565b90600052602060002090601f016020900481019282613ad95760008555613b20565b82601f10613af257805160ff1916838001178555613b20565b82800160010185558215613b20579182015b82811115613b1f578251825591602001919060010190613b04565b5b509050613b2d9190613b31565b5090565b5b80821115613b4a576000816000905550600101613b32565b5090565b6000613b61613b5c84614c74565b614c4f565b905082815260208101848484011115613b7d57613b7c615111565b5b613b88848285614ec9565b509392505050565b6000613ba3613b9e84614ca5565b614c4f565b905082815260208101848484011115613bbf57613bbe615111565b5b613bca848285614ec9565b509392505050565b600081359050613be1816158ab565b92915050565b60008083601f840112613bfd57613bfc615107565b5b8235905067ffffffffffffffff811115613c1a57613c19615102565b5b602083019150836020820283011115613c3657613c3561510c565b5b9250929050565b600081359050613c4c816158c2565b92915050565b600081359050613c61816158d9565b92915050565b600081519050613c76816158d9565b92915050565b600082601f830112613c9157613c90615107565b5b8135613ca1848260208601613b4e565b91505092915050565b600081519050613cb9816158f0565b92915050565b600082601f830112613cd457613cd3615107565b5b8135613ce4848260208601613b90565b91505092915050565b600081359050613cfc81615907565b92915050565b600060208284031215613d1857613d1761511b565b5b6000613d2684828501613bd2565b91505092915050565b60008060408385031215613d4657613d4561511b565b5b6000613d5485828601613bd2565b9250506020613d6585828601613bd2565b9150509250929050565b600080600060608486031215613d8857613d8761511b565b5b6000613d9686828701613bd2565b9350506020613da786828701613bd2565b9250506040613db886828701613ced565b9150509250925092565b60008060008060808587031215613ddc57613ddb61511b565b5b6000613dea87828801613bd2565b9450506020613dfb87828801613bd2565b9350506040613e0c87828801613ced565b925050606085013567ffffffffffffffff811115613e2d57613e2c615116565b5b613e3987828801613c7c565b91505092959194509250565b60008060408385031215613e5c57613e5b61511b565b5b6000613e6a85828601613bd2565b9250506020613e7b85828601613c3d565b9150509250929050565b60008060408385031215613e9c57613e9b61511b565b5b6000613eaa85828601613bd2565b9250506020613ebb85828601613ced565b9150509250929050565b60008060208385031215613edc57613edb61511b565b5b600083013567ffffffffffffffff811115613efa57613ef9615116565b5b613f0685828601613be7565b92509250509250929050565b600060208284031215613f2857613f2761511b565b5b6000613f3684828501613c52565b91505092915050565b600060208284031215613f5557613f5461511b565b5b6000613f6384828501613c67565b91505092915050565b600060208284031215613f8257613f8161511b565b5b6000613f9084828501613caa565b91505092915050565b600060208284031215613faf57613fae61511b565b5b600082013567ffffffffffffffff811115613fcd57613fcc615116565b5b613fd984828501613cbf565b91505092915050565b600080600080600060a08688031215613ffe57613ffd61511b565b5b600086013567ffffffffffffffff81111561401c5761401b615116565b5b61402888828901613cbf565b955050602061403988828901613ced565b945050604061404a88828901613ced565b935050606061405b88828901613c3d565b925050608061406c88828901613c3d565b9150509295509295909350565b60008060008060008060c087890312156140965761409561511b565b5b600087013567ffffffffffffffff8111156140b4576140b3615116565b5b6140c089828a01613cbf565b96505060206140d189828a01613ced565b95505060406140e289828a01613ced565b94505060606140f389828a01613c3d565b935050608061410489828a01613ced565b92505060a061411589828a01613c3d565b9150509295509295509295565b6000602082840312156141385761413761511b565b5b600061414684828501613ced565b91505092915050565b600080604083850312156141665761416561511b565b5b600061417485828601613ced565b925050602061418585828601613ced565b9150509250929050565b6000806000606084860312156141a8576141a761511b565b5b60006141b686828701613ced565b93505060206141c786828701613ced565b92505060406141d886828701613bd2565b9150509250925092565b6141eb81614e43565b82525050565b6141fa81614e55565b82525050565b600061420b82614ceb565b6142158185614d01565b9350614225818560208601614ed8565b61422e81615120565b840191505092915050565b600061424482614cf6565b61424e8185614d12565b935061425e818560208601614ed8565b61426781615120565b840191505092915050565b600061427d82614cf6565b6142878185614d23565b9350614297818560208601614ed8565b80840191505092915050565b600081546142b081614f0b565b6142ba8186614d23565b945060018216600081146142d557600181146142e657614319565b60ff19831686528186019350614319565b6142ef85614cd6565b60005b83811015614311578154818901526001820191506020810190506142f2565b838801955050505b50505092915050565b600061432f603783614d12565b915061433a82615131565b604082019050919050565b6000614352602b83614d12565b915061435d82615180565b604082019050919050565b6000614375603283614d12565b9150614380826151cf565b604082019050919050565b6000614398602683614d12565b91506143a38261521e565b604082019050919050565b60006143bb601c83614d12565b91506143c68261526d565b602082019050919050565b60006143de601c83614d12565b91506143e982615296565b602082019050919050565b6000614401601a83614d12565b915061440c826152bf565b602082019050919050565b6000614424602483614d12565b915061442f826152e8565b604082019050919050565b6000614447601983614d12565b915061445282615337565b602082019050919050565b600061446a602c83614d12565b915061447582615360565b604082019050919050565b600061448d600f83614d12565b9150614498826153af565b602082019050919050565b60006144b0603883614d12565b91506144bb826153d8565b604082019050919050565b60006144d3602a83614d12565b91506144de82615427565b604082019050919050565b60006144f6602983614d12565b915061450182615476565b604082019050919050565b6000614519602083614d12565b9150614524826154c5565b602082019050919050565b600061453c604483614d12565b9150614547826154ee565b606082019050919050565b600061455f600d83614d12565b915061456a82615563565b602082019050919050565b6000614582602c83614d12565b915061458d8261558c565b604082019050919050565b60006145a5600583614d23565b91506145b0826155db565b600582019050919050565b60006145c8602083614d12565b91506145d382615604565b602082019050919050565b60006145eb601a83614d12565b91506145f68261562d565b602082019050919050565b600061460e601c83614d12565b915061461982615656565b602082019050919050565b6000614631602983614d12565b915061463c8261567f565b604082019050919050565b6000614654602f83614d12565b915061465f826156ce565b604082019050919050565b6000614677601f83614d12565b91506146828261571d565b602082019050919050565b600061469a602183614d12565b91506146a582615746565b604082019050919050565b60006146bd603183614d12565b91506146c882615795565b604082019050919050565b60006146e0601083614d12565b91506146eb826157e4565b602082019050919050565b6000614703602c83614d12565b915061470e8261580d565b604082019050919050565b6000614726603083614d12565b91506147318261585c565b604082019050919050565b61474581614ebf565b82525050565b600061475782856142a3565b91506147638284614272565b915061476e82614598565b91508190509392505050565b600060208201905061478f60008301846141e2565b92915050565b60006080820190506147aa60008301876141e2565b6147b760208301866141e2565b6147c4604083018561473c565b81810360608301526147d68184614200565b905095945050505050565b60006020820190506147f660008301846141f1565b92915050565b600060208201905081810360008301526148168184614239565b905092915050565b600060e0820190508181036000830152614838818a614239565b9050614847602083018961473c565b614854604083018861473c565b614861606083018761473c565b61486e608083018661473c565b61487b60a08301856141f1565b61488860c08301846141f1565b98975050505050505050565b600060208201905081810360008301526148ad81614322565b9050919050565b600060208201905081810360008301526148cd81614345565b9050919050565b600060208201905081810360008301526148ed81614368565b9050919050565b6000602082019050818103600083015261490d8161438b565b9050919050565b6000602082019050818103600083015261492d816143ae565b9050919050565b6000602082019050818103600083015261494d816143d1565b9050919050565b6000602082019050818103600083015261496d816143f4565b9050919050565b6000602082019050818103600083015261498d81614417565b9050919050565b600060208201905081810360008301526149ad8161443a565b9050919050565b600060208201905081810360008301526149cd8161445d565b9050919050565b600060208201905081810360008301526149ed81614480565b9050919050565b60006020820190508181036000830152614a0d816144a3565b9050919050565b60006020820190508181036000830152614a2d816144c6565b9050919050565b60006020820190508181036000830152614a4d816144e9565b9050919050565b60006020820190508181036000830152614a6d8161450c565b9050919050565b60006020820190508181036000830152614a8d8161452f565b9050919050565b60006020820190508181036000830152614aad81614552565b9050919050565b60006020820190508181036000830152614acd81614575565b9050919050565b60006020820190508181036000830152614aed816145bb565b9050919050565b60006020820190508181036000830152614b0d816145de565b9050919050565b60006020820190508181036000830152614b2d81614601565b9050919050565b60006020820190508181036000830152614b4d81614624565b9050919050565b60006020820190508181036000830152614b6d81614647565b9050919050565b60006020820190508181036000830152614b8d8161466a565b9050919050565b60006020820190508181036000830152614bad8161468d565b9050919050565b60006020820190508181036000830152614bcd816146b0565b9050919050565b60006020820190508181036000830152614bed816146d3565b9050919050565b60006020820190508181036000830152614c0d816146f6565b9050919050565b60006020820190508181036000830152614c2d81614719565b9050919050565b6000602082019050614c49600083018461473c565b92915050565b6000614c59614c6a565b9050614c658282614f3d565b919050565b6000604051905090565b600067ffffffffffffffff821115614c8f57614c8e6150d3565b5b614c9882615120565b9050602081019050919050565b600067ffffffffffffffff821115614cc057614cbf6150d3565b5b614cc982615120565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d3982614ebf565b9150614d4483614ebf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d7957614d78614fe8565b5b828201905092915050565b6000614d8f82614ebf565b9150614d9a83614ebf565b925082614daa57614da9615017565b5b828204905092915050565b6000614dc082614ebf565b9150614dcb83614ebf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e0457614e03614fe8565b5b828202905092915050565b6000614e1a82614ebf565b9150614e2583614ebf565b925082821015614e3857614e37614fe8565b5b828203905092915050565b6000614e4e82614e9f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614e9882614e43565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ef6578082015181840152602081019050614edb565b83811115614f05576000848401525b50505050565b60006002820490506001821680614f2357607f821691505b60208210811415614f3757614f36615046565b5b50919050565b614f4682615120565b810181811067ffffffffffffffff82111715614f6557614f646150d3565b5b80604052505050565b6000614f7982614ebf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fac57614fab614fe8565b5b600182019050919050565b6000614fc282614ebf565b9150614fcd83614ebf565b925082614fdd57614fdc615017565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5175616e7469747920726571756573746564206578636565647320617661696c60008201527f61626c65207175616e7469747920666f722073616c652e000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f7520616c7265616479206f776e20616e204f47205768616c652e00000000600082015250565b7f45746865722076616c75652069732062656c6f77207072696365000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53616c65206973207061757365642e0000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6577207175616e74697479206d75737420626520657175616c20746f206f7260008201527f2067726561746572207468616e207175616e7469747920616c7265616479207360208201527f6f6c642e00000000000000000000000000000000000000000000000000000000604082015250565b7f4e6f7420666f722073616c652e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6c6c656374696f6e20646f6573206e6f742065786973742e000000000000600082015250565b7f5768616c652074797065206e6f74207472616e7366657261626c652e00000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45746865722076616c75652069732062656c6f77203145544820707269636500600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465642e00000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6158b481614e43565b81146158bf57600080fd5b50565b6158cb81614e55565b81146158d657600080fd5b50565b6158e281614e61565b81146158ed57600080fd5b50565b6158f981614e8d565b811461590457600080fd5b50565b61591081614ebf565b811461591b57600080fd5b5056fea264697066735822122017b5e52b3fbb21de6f5c62a6e1c86f1112c61488def0107f0592e0a3dbe28f9664736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102045760003560e01c806360e5f61611610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd1461072b578063dee3e5a314610768578063e985e9c514610791578063f2fde38b146107ce578063fa10a81a146107f757610204565b8063a22cb46514610685578063b31d61b0146106ae578063b88d4fde146106d7578063c61a6ed81461070057610204565b806370a08231116100e757806370a082311461059e578063715018a6146105db5780638da5cb5b146105f2578063953c81331461061d57806395d89b411461065a57610204565b806360e5f616146104e25780636352211e1461050b57806368428a1b146105485780636c0360eb1461057357610204565b80632f745c591161019b57806342966c681161016a57806342966c681461040657806342a3ad581461042f5780634b8fd9e6146104725780634f6ccce71461047c57806355f804b3146104b957610204565b80632f745c59146103725780633100a535146103af5780633ccfd60b146103c657806342842e0e146103dd57610204565b806318160ddd116101d757806318160ddd146102d75780631b2ef1ca1461030257806323b872dd1461031e57806325413cde1461034757610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613f12565b610820565b60405161023d91906147e1565b60405180910390f35b34801561025257600080fd5b5061025b61089a565b60405161026891906147fc565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190614122565b61092c565b6040516102a5919061477a565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613e85565b6109b1565b005b3480156102e357600080fd5b506102ec610ac9565b6040516102f99190614c34565b60405180910390f35b61031c6004803603810190610317919061414f565b610ad6565b005b34801561032a57600080fd5b5061034560048036038101906103409190613d6f565b610fbb565b005b34801561035357600080fd5b5061035c611071565b6040516103699190614c34565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613e85565b611077565b6040516103a69190614c34565b60405180910390f35b3480156103bb57600080fd5b506103c461111c565b005b3480156103d257600080fd5b506103db6111c4565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190613d6f565b611280565b005b34801561041257600080fd5b5061042d60048036038101906104289190614122565b6112f6565b005b34801561043b57600080fd5b5061045660048036038101906104519190614122565b6113ce565b604051610469979695949392919061481e565b60405180910390f35b61047a6114b2565b005b34801561048857600080fd5b506104a3600480360381019061049e9190614122565b6116fd565b6040516104b09190614c34565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190613f99565b61176e565b005b3480156104ee57600080fd5b506105096004803603810190610504919061418f565b611804565b005b34801561051757600080fd5b50610532600480360381019061052d9190614122565b611b6d565b60405161053f919061477a565b60405180910390f35b34801561055457600080fd5b5061055d611c1f565b60405161056a91906147e1565b60405180910390f35b34801561057f57600080fd5b50610588611c32565b60405161059591906147fc565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c09190613d02565b611cc0565b6040516105d29190614c34565b60405180910390f35b3480156105e757600080fd5b506105f0611d78565b005b3480156105fe57600080fd5b50610607611e00565b604051610614919061477a565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f9190614122565b611e2a565b6040516106519190614c34565b60405180910390f35b34801561066657600080fd5b5061066f611e42565b60405161067c91906147fc565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a79190613e45565b611ed4565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190613ec5565b611eea565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190613dc2565b612023565b005b34801561070c57600080fd5b50610715612085565b6040516107229190614c34565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190614122565b61208b565b60405161075f91906147fc565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a9190614079565b612146565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613d2f565b61233b565b6040516107c591906147e1565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f09190613d02565b61243d565b005b34801561080357600080fd5b5061081e60048036038101906108199190613fe2565b612535565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610893575061089282612799565b5b9050919050565b6060600080546108a990614f0b565b80601f01602080910402602001604051908101604052809291908181526020018280546108d590614f0b565b80156109225780601f106108f757610100808354040283529160200191610922565b820191906000526020600020905b81548152906001019060200180831161090557829003601f168201915b5050505050905090565b60006109378261287b565b610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096d90614ab4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bc82611b6d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490614b94565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4c6128e7565b73ffffffffffffffffffffffffffffffffffffffff161480610a7b5750610a7a81610a756128e7565b61233b565b5b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab1906149f4565b60405180910390fd5b610ac483836128f6565b505050565b6000600880549050905090565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990614bd4565b60405180910390fd5b60011515600d60009054906101000a900460ff16151514610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf906149d4565b60405180910390fd5b6000601160008381526020019081526020016000206004015411610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890614af4565b60405180910390fd5b610c3a8260116000848152602001908152602001600020600301546129af90919063ffffffff16565b341015610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390614954565b60405180910390fd5b600115156011600083815260200190815260200160002060050160019054906101000a900460ff16151514610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd90614a94565b60405180910390fd5b6000610d118360116000858152602001908152602001600020600201546129c590919063ffffffff16565b1015610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4990614894565b60405180910390fd5b6001811180610dab5750601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190614934565b60405180910390fd5b60005b82811015610e8e576000610e126001610e04610ac9565b61278390919063ffffffff16565b9050610e1e33826129db565b826013600083815260200190815260200160002081905550610e60600160116000868152602001908152602001600020600201546129c590919063ffffffff16565b6011600085815260200190815260200160002060020181905550508080610e8690614f6e565b915050610ded565b50600181148015610ee95750600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610fb7576001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f6000815480929190610f5990614f6e565b91905055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5050565b6001601360008381526020019081526020016000205411611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890614b14565b60405180910390fd5b61102261101c6128e7565b82612ba9565b611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890614bb4565b60405180910390fd5b61106c838383612c87565b505050565b600f5481565b600061108283611cc0565b82106110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ba906148b4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6111246128e7565b73ffffffffffffffffffffffffffffffffffffffff16611142611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614ad4565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6111cc6128e7565b73ffffffffffffffffffffffffffffffffffffffff166111ea611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123790614ad4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061127e57600080fd5b565b60016013600083815260200190815260200160002054116112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90614b14565b60405180910390fd5b6112f183838360405180602001604052806000815250612023565b505050565b6112fe6128e7565b73ffffffffffffffffffffffffffffffffffffffff1661131c611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990614ad4565b60405180910390fd5b61138361137d6128e7565b82612ba9565b6113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614c14565b60405180910390fd5b6113cb81612ee3565b50565b60116020528060005260406000206000915090508060000180546113f190614f0b565b80601f016020809104026020016040519081016040528092919081815260200182805461141d90614f0b565b801561146a5780601f1061143f5761010080835404028352916020019161146a565b820191906000526020600020905b81548152906001019060200180831161144d57829003601f168201915b5050505050908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16905087565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590614bd4565b60405180910390fd5b60011515600d60009054906101000a900460ff16151514611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b906149d4565b60405180910390fd5b670de0b6b3a76400003410156115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690614b74565b60405180910390fd5b600080600290505b6012548110156116f957600115156011600083815260200190815260200160002060050160019054906101000a900460ff16151514801561163e575060006011600083815260200190815260200160002060020154115b156116d85760006116606001611652610ac9565b61278390919063ffffffff16565b905061166c33826129db565b8160136000838152602001908152602001600020819055506116ae600160116000858152602001908152602001600020600201546129c590919063ffffffff16565b601160008481526020019081526020016000206002018190555082806116d390614f6e565b935050505b60068214156116e6576116f9565b80806116f190614f6e565b9150506115e7565b5050565b6000611707610ac9565b8210611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90614bf4565b60405180910390fd5b6008828154811061175c5761175b6150a4565b5b90600052602060002001549050919050565b6117766128e7565b73ffffffffffffffffffffffffffffffffffffffff16611794611e00565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190614ad4565b60405180910390fd5b80600c9080519060200190611800929190613aab565b5050565b61180c6128e7565b73ffffffffffffffffffffffffffffffffffffffff1661182a611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790614ad4565b60405180910390fd5b60011515600d60009054906101000a900460ff161515146118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd906149d4565b60405180910390fd5b600060116000848152602001908152602001600020600401541161192f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192690614af4565b60405180910390fd5b600061195a8460116000868152602001908152602001600020600201546129c590919063ffffffff16565b101561199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290614894565b60405180910390fd5b60005b83811015611b675760006119c360016119b5610ac9565b61278390919063ffffffff16565b90506119cf83826129db565b836013600083815260200190815260200160002081905550611a11600160116000878152602001908152602001600020600201546129c590919063ffffffff16565b6011600086815260200190815260200160002060020181905550600184148015611a855750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611b53576001600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f6000815480929190611af590614f6e565b91905055506001601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b508080611b5f90614f6e565b91505061199e565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d90614a34565b60405180910390fd5b80915050919050565b600d60009054906101000a900460ff1681565b600c8054611c3f90614f0b565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6b90614f0b565b8015611cb85780601f10611c8d57610100808354040283529160200191611cb8565b820191906000526020600020905b815481529060010190602001808311611c9b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614a14565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d806128e7565b73ffffffffffffffffffffffffffffffffffffffff16611d9e611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb90614ad4565b60405180910390fd5b611dfe6000612ff4565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60136020528060005260406000206000915090505481565b606060018054611e5190614f0b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7d90614f0b565b8015611eca5780601f10611e9f57610100808354040283529160200191611eca565b820191906000526020600020905b815481529060010190602001808311611ead57829003601f168201915b5050505050905090565b611ee6611edf6128e7565b83836130ba565b5050565b611ef26128e7565b73ffffffffffffffffffffffffffffffffffffffff16611f10611e00565b73ffffffffffffffffffffffffffffffffffffffff1614611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d90614ad4565b60405180910390fd5b60005b8282905081101561201e576001600e6000858585818110611f8d57611f8c6150a4565b5b9050602002016020810190611fa29190613d02565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f600081548092919061200690614f6e565b9190505550808061201690614f6e565b915050611f69565b505050565b61203461202e6128e7565b83612ba9565b612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206a90614bb4565b60405180910390fd5b61207f84848484613227565b50505050565b60125481565b60606120968261287b565b6120d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cc90614b54565b60405180910390fd5b6000600c80546120e490614f0b565b905011612100576040518060200160405280600081525061213f565b600c61211e6013600085815260200190815260200160002054613283565b60405160200161212f92919061474b565b6040516020818303038152906040525b9050919050565b61214e6128e7565b73ffffffffffffffffffffffffffffffffffffffff1661216c611e00565b73ffffffffffffffffffffffffffffffffffffffff16146121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990614ad4565b60405180910390fd5b6000612203601160008581526020019081526020016000206002015460116000868152602001908152602001600020600101546129c590919063ffffffff16565b905080861015612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223f90614a74565b60405180910390fd5b86601160008581526020019081526020016000206000019080519060200190612272929190613aab565b50846011600085815260200190815260200160002060030181905550836011600085815260200190815260200160002060050160006101000a81548160ff021916908315150217905550816011600085815260200190815260200160002060050160016101000a81548160ff0219169083151502179055506122fd81876129c590919063ffffffff16565b601160008581526020019081526020016000206002018190555085601160008581526020019081526020016000206001018190555050505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016123b3919061477a565b60206040518083038186803b1580156123cb57600080fd5b505afa1580156123df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124039190613f6c565b73ffffffffffffffffffffffffffffffffffffffff161415612429576001915050612437565b61243384846133e4565b9150505b92915050565b6124456128e7565b73ffffffffffffffffffffffffffffffffffffffff16612463611e00565b73ffffffffffffffffffffffffffffffffffffffff16146124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b090614ad4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612520906148f4565b60405180910390fd5b61253281612ff4565b50565b61253d6128e7565b73ffffffffffffffffffffffffffffffffffffffff1661255b611e00565b73ffffffffffffffffffffffffffffffffffffffff16146125b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a890614ad4565b60405180910390fd5b60006040518060e001604052808781526020018681526020018681526020018581526020016125ec600160125461278390919063ffffffff16565b815260200184151581526020018315158152509050806011600061261c600160125461278390919063ffffffff16565b81526020019081526020016000206000820151816000019080519060200190612646929190613aab565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff021916908315150217905550905050601260008154809291906126c590614f6e565b9190505550505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561277c57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050612780565b3390505b90565b600081836127919190614d2e565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061286457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612874575061287382613478565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006128f16126d2565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661296983611b6d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081836129bd9190614db5565b905092915050565b600081836129d39190614e0f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4290614a54565b60405180910390fd5b612a548161287b565b15612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b90614914565b60405180910390fd5b612aa0600083836134e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af09190614d2e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612bb48261287b565b612bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bea906149b4565b60405180910390fd5b6000612bfe83611b6d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c6d57508373ffffffffffffffffffffffffffffffffffffffff16612c558461092c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c7e5750612c7d818561233b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ca782611b6d565b73ffffffffffffffffffffffffffffffffffffffff1614612cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf490614b34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6490614974565b60405180910390fd5b612d788383836134e2565b612d836000826128f6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dd39190614e0f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e2a9190614d2e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612eee82611b6d565b9050612efc816000846134e2565b612f076000836128f6565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f579190614e0f565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312090614994565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161321a91906147e1565b60405180910390a3505050565b613232848484612c87565b61323e848484846135f6565b61327d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613274906148d4565b60405180910390fd5b50505050565b606060008214156132cb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133df565b600082905060005b600082146132fd5780806132e690614f6e565b915050600a826132f69190614d84565b91506132d3565b60008167ffffffffffffffff811115613319576133186150d3565b5b6040519080825280601f01601f19166020018201604052801561334b5781602001600182028036833780820191505090505b5090505b600085146133d8576001826133649190614e0f565b9150600a856133739190614fb7565b603061337f9190614d2e565b60f81b818381518110613395576133946150a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133d19190614d84565b945061334f565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134ed83838361378d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135305761352b81613792565b61356f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461356e5761356d83826137db565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135b2576135ad81613948565b6135f1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135f0576135ef8282613a19565b5b5b505050565b60006136178473ffffffffffffffffffffffffffffffffffffffff16613a98565b15613780578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136406128e7565b8786866040518563ffffffff1660e01b81526004016136629493929190614795565b602060405180830381600087803b15801561367c57600080fd5b505af19250505080156136ad57506040513d601f19601f820116820180604052508101906136aa9190613f3f565b60015b613730573d80600081146136dd576040519150601f19603f3d011682016040523d82523d6000602084013e6136e2565b606091505b50600081511415613728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371f906148d4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613785565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137e884611cc0565b6137f29190614e0f565b90506000600760008481526020019081526020016000205490508181146138d7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061395c9190614e0f565b905060006009600084815260200190815260200160002054905060006008838154811061398c5761398b6150a4565b5b9060005260206000200154905080600883815481106139ae576139ad6150a4565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139fd576139fc615075565b5b6001900381819060005260206000200160009055905550505050565b6000613a2483611cc0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613ab790614f0b565b90600052602060002090601f016020900481019282613ad95760008555613b20565b82601f10613af257805160ff1916838001178555613b20565b82800160010185558215613b20579182015b82811115613b1f578251825591602001919060010190613b04565b5b509050613b2d9190613b31565b5090565b5b80821115613b4a576000816000905550600101613b32565b5090565b6000613b61613b5c84614c74565b614c4f565b905082815260208101848484011115613b7d57613b7c615111565b5b613b88848285614ec9565b509392505050565b6000613ba3613b9e84614ca5565b614c4f565b905082815260208101848484011115613bbf57613bbe615111565b5b613bca848285614ec9565b509392505050565b600081359050613be1816158ab565b92915050565b60008083601f840112613bfd57613bfc615107565b5b8235905067ffffffffffffffff811115613c1a57613c19615102565b5b602083019150836020820283011115613c3657613c3561510c565b5b9250929050565b600081359050613c4c816158c2565b92915050565b600081359050613c61816158d9565b92915050565b600081519050613c76816158d9565b92915050565b600082601f830112613c9157613c90615107565b5b8135613ca1848260208601613b4e565b91505092915050565b600081519050613cb9816158f0565b92915050565b600082601f830112613cd457613cd3615107565b5b8135613ce4848260208601613b90565b91505092915050565b600081359050613cfc81615907565b92915050565b600060208284031215613d1857613d1761511b565b5b6000613d2684828501613bd2565b91505092915050565b60008060408385031215613d4657613d4561511b565b5b6000613d5485828601613bd2565b9250506020613d6585828601613bd2565b9150509250929050565b600080600060608486031215613d8857613d8761511b565b5b6000613d9686828701613bd2565b9350506020613da786828701613bd2565b9250506040613db886828701613ced565b9150509250925092565b60008060008060808587031215613ddc57613ddb61511b565b5b6000613dea87828801613bd2565b9450506020613dfb87828801613bd2565b9350506040613e0c87828801613ced565b925050606085013567ffffffffffffffff811115613e2d57613e2c615116565b5b613e3987828801613c7c565b91505092959194509250565b60008060408385031215613e5c57613e5b61511b565b5b6000613e6a85828601613bd2565b9250506020613e7b85828601613c3d565b9150509250929050565b60008060408385031215613e9c57613e9b61511b565b5b6000613eaa85828601613bd2565b9250506020613ebb85828601613ced565b9150509250929050565b60008060208385031215613edc57613edb61511b565b5b600083013567ffffffffffffffff811115613efa57613ef9615116565b5b613f0685828601613be7565b92509250509250929050565b600060208284031215613f2857613f2761511b565b5b6000613f3684828501613c52565b91505092915050565b600060208284031215613f5557613f5461511b565b5b6000613f6384828501613c67565b91505092915050565b600060208284031215613f8257613f8161511b565b5b6000613f9084828501613caa565b91505092915050565b600060208284031215613faf57613fae61511b565b5b600082013567ffffffffffffffff811115613fcd57613fcc615116565b5b613fd984828501613cbf565b91505092915050565b600080600080600060a08688031215613ffe57613ffd61511b565b5b600086013567ffffffffffffffff81111561401c5761401b615116565b5b61402888828901613cbf565b955050602061403988828901613ced565b945050604061404a88828901613ced565b935050606061405b88828901613c3d565b925050608061406c88828901613c3d565b9150509295509295909350565b60008060008060008060c087890312156140965761409561511b565b5b600087013567ffffffffffffffff8111156140b4576140b3615116565b5b6140c089828a01613cbf565b96505060206140d189828a01613ced565b95505060406140e289828a01613ced565b94505060606140f389828a01613c3d565b935050608061410489828a01613ced565b92505060a061411589828a01613c3d565b9150509295509295509295565b6000602082840312156141385761413761511b565b5b600061414684828501613ced565b91505092915050565b600080604083850312156141665761416561511b565b5b600061417485828601613ced565b925050602061418585828601613ced565b9150509250929050565b6000806000606084860312156141a8576141a761511b565b5b60006141b686828701613ced565b93505060206141c786828701613ced565b92505060406141d886828701613bd2565b9150509250925092565b6141eb81614e43565b82525050565b6141fa81614e55565b82525050565b600061420b82614ceb565b6142158185614d01565b9350614225818560208601614ed8565b61422e81615120565b840191505092915050565b600061424482614cf6565b61424e8185614d12565b935061425e818560208601614ed8565b61426781615120565b840191505092915050565b600061427d82614cf6565b6142878185614d23565b9350614297818560208601614ed8565b80840191505092915050565b600081546142b081614f0b565b6142ba8186614d23565b945060018216600081146142d557600181146142e657614319565b60ff19831686528186019350614319565b6142ef85614cd6565b60005b83811015614311578154818901526001820191506020810190506142f2565b838801955050505b50505092915050565b600061432f603783614d12565b915061433a82615131565b604082019050919050565b6000614352602b83614d12565b915061435d82615180565b604082019050919050565b6000614375603283614d12565b9150614380826151cf565b604082019050919050565b6000614398602683614d12565b91506143a38261521e565b604082019050919050565b60006143bb601c83614d12565b91506143c68261526d565b602082019050919050565b60006143de601c83614d12565b91506143e982615296565b602082019050919050565b6000614401601a83614d12565b915061440c826152bf565b602082019050919050565b6000614424602483614d12565b915061442f826152e8565b604082019050919050565b6000614447601983614d12565b915061445282615337565b602082019050919050565b600061446a602c83614d12565b915061447582615360565b604082019050919050565b600061448d600f83614d12565b9150614498826153af565b602082019050919050565b60006144b0603883614d12565b91506144bb826153d8565b604082019050919050565b60006144d3602a83614d12565b91506144de82615427565b604082019050919050565b60006144f6602983614d12565b915061450182615476565b604082019050919050565b6000614519602083614d12565b9150614524826154c5565b602082019050919050565b600061453c604483614d12565b9150614547826154ee565b606082019050919050565b600061455f600d83614d12565b915061456a82615563565b602082019050919050565b6000614582602c83614d12565b915061458d8261558c565b604082019050919050565b60006145a5600583614d23565b91506145b0826155db565b600582019050919050565b60006145c8602083614d12565b91506145d382615604565b602082019050919050565b60006145eb601a83614d12565b91506145f68261562d565b602082019050919050565b600061460e601c83614d12565b915061461982615656565b602082019050919050565b6000614631602983614d12565b915061463c8261567f565b604082019050919050565b6000614654602f83614d12565b915061465f826156ce565b604082019050919050565b6000614677601f83614d12565b91506146828261571d565b602082019050919050565b600061469a602183614d12565b91506146a582615746565b604082019050919050565b60006146bd603183614d12565b91506146c882615795565b604082019050919050565b60006146e0601083614d12565b91506146eb826157e4565b602082019050919050565b6000614703602c83614d12565b915061470e8261580d565b604082019050919050565b6000614726603083614d12565b91506147318261585c565b604082019050919050565b61474581614ebf565b82525050565b600061475782856142a3565b91506147638284614272565b915061476e82614598565b91508190509392505050565b600060208201905061478f60008301846141e2565b92915050565b60006080820190506147aa60008301876141e2565b6147b760208301866141e2565b6147c4604083018561473c565b81810360608301526147d68184614200565b905095945050505050565b60006020820190506147f660008301846141f1565b92915050565b600060208201905081810360008301526148168184614239565b905092915050565b600060e0820190508181036000830152614838818a614239565b9050614847602083018961473c565b614854604083018861473c565b614861606083018761473c565b61486e608083018661473c565b61487b60a08301856141f1565b61488860c08301846141f1565b98975050505050505050565b600060208201905081810360008301526148ad81614322565b9050919050565b600060208201905081810360008301526148cd81614345565b9050919050565b600060208201905081810360008301526148ed81614368565b9050919050565b6000602082019050818103600083015261490d8161438b565b9050919050565b6000602082019050818103600083015261492d816143ae565b9050919050565b6000602082019050818103600083015261494d816143d1565b9050919050565b6000602082019050818103600083015261496d816143f4565b9050919050565b6000602082019050818103600083015261498d81614417565b9050919050565b600060208201905081810360008301526149ad8161443a565b9050919050565b600060208201905081810360008301526149cd8161445d565b9050919050565b600060208201905081810360008301526149ed81614480565b9050919050565b60006020820190508181036000830152614a0d816144a3565b9050919050565b60006020820190508181036000830152614a2d816144c6565b9050919050565b60006020820190508181036000830152614a4d816144e9565b9050919050565b60006020820190508181036000830152614a6d8161450c565b9050919050565b60006020820190508181036000830152614a8d8161452f565b9050919050565b60006020820190508181036000830152614aad81614552565b9050919050565b60006020820190508181036000830152614acd81614575565b9050919050565b60006020820190508181036000830152614aed816145bb565b9050919050565b60006020820190508181036000830152614b0d816145de565b9050919050565b60006020820190508181036000830152614b2d81614601565b9050919050565b60006020820190508181036000830152614b4d81614624565b9050919050565b60006020820190508181036000830152614b6d81614647565b9050919050565b60006020820190508181036000830152614b8d8161466a565b9050919050565b60006020820190508181036000830152614bad8161468d565b9050919050565b60006020820190508181036000830152614bcd816146b0565b9050919050565b60006020820190508181036000830152614bed816146d3565b9050919050565b60006020820190508181036000830152614c0d816146f6565b9050919050565b60006020820190508181036000830152614c2d81614719565b9050919050565b6000602082019050614c49600083018461473c565b92915050565b6000614c59614c6a565b9050614c658282614f3d565b919050565b6000604051905090565b600067ffffffffffffffff821115614c8f57614c8e6150d3565b5b614c9882615120565b9050602081019050919050565b600067ffffffffffffffff821115614cc057614cbf6150d3565b5b614cc982615120565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d3982614ebf565b9150614d4483614ebf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d7957614d78614fe8565b5b828201905092915050565b6000614d8f82614ebf565b9150614d9a83614ebf565b925082614daa57614da9615017565b5b828204905092915050565b6000614dc082614ebf565b9150614dcb83614ebf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e0457614e03614fe8565b5b828202905092915050565b6000614e1a82614ebf565b9150614e2583614ebf565b925082821015614e3857614e37614fe8565b5b828203905092915050565b6000614e4e82614e9f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614e9882614e43565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ef6578082015181840152602081019050614edb565b83811115614f05576000848401525b50505050565b60006002820490506001821680614f2357607f821691505b60208210811415614f3757614f36615046565b5b50919050565b614f4682615120565b810181811067ffffffffffffffff82111715614f6557614f646150d3565b5b80604052505050565b6000614f7982614ebf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fac57614fab614fe8565b5b600182019050919050565b6000614fc282614ebf565b9150614fcd83614ebf565b925082614fdd57614fdc615017565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5175616e7469747920726571756573746564206578636565647320617661696c60008201527f61626c65207175616e7469747920666f722073616c652e000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f7520616c7265616479206f776e20616e204f47205768616c652e00000000600082015250565b7f45746865722076616c75652069732062656c6f77207072696365000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53616c65206973207061757365642e0000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6577207175616e74697479206d75737420626520657175616c20746f206f7260008201527f2067726561746572207468616e207175616e7469747920616c7265616479207360208201527f6f6c642e00000000000000000000000000000000000000000000000000000000604082015250565b7f4e6f7420666f722073616c652e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6c6c656374696f6e20646f6573206e6f742065786973742e000000000000600082015250565b7f5768616c652074797065206e6f74207472616e7366657261626c652e00000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45746865722076616c75652069732062656c6f77203145544820707269636500600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f742077686974656c69737465642e00000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6158b481614e43565b81146158bf57600080fd5b50565b6158cb81614e55565b81146158d657600080fd5b50565b6158e281614e61565b81146158ed57600080fd5b50565b6158f981614e8d565b811461590457600080fd5b50565b61591081614ebf565b811461591b57600080fd5b5056fea264697066735822122017b5e52b3fbb21de6f5c62a6e1c86f1112c61488def0107f0592e0a3dbe28f9664736f6c63430008070033
Deployed Bytecode Sourcemap
1315:11546:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;989:222:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2408:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3919:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1614:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9359:1368:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7997:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1548:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1290:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11866:132:13;;;;;;;;;;;;;:::i;:::-;;7542:136;;;;;;;;;;;;;:::i;:::-;;8359:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6590:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1915:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;8652:674;;;:::i;:::-;;1797:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7685:94:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10771:1080;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2111:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1475:22:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1448:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1849:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:10;;;;;;;;;;;;;:::i;:::-;;1029:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2028:42:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2570:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4203:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7785:206:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5287:320:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1961:28:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5848:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6829:707;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12134:432;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6236:312:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;989:222:4;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;2408:98:3:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4105:15;:24;4121:7;4105:24;;;;;;;;;;;;;;;;;;;;;4098:31;;3919:217;;;:::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3691:5;3675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3700:37;3717:5;3724:12;:10;:12::i;:::-;3700:16;:37::i;:::-;3675:62;3654:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;1614:111:4:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;9359:1368:13:-;9525:9;:21;9535:10;9525:21;;;;;;;;;;;;;;;;;;;;;;;;;9517:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;9597:4;9585:16;;:10;;;;;;;;;;;:16;;;9577:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;9665:1;9639:6;:15;9646:7;9639:15;;;;;;;;;;;:23;;;:27;9631:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;9728:35;9754:8;9728:6;:15;9735:7;9728:15;;;;;;;;;;;:21;;;:25;;:35;;;;:::i;:::-;9715:9;:48;;9707:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;9840:4;9812:32;;:6;:15;9819:7;9812:15;;;;;;;;;;;:24;;;;;;;;;;;;:32;;;9804:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9923:1;9880:39;9910:8;9880:6;:15;9887:7;9880:15;;;;;;;;;;;:25;;;:29;;:39;;;;:::i;:::-;:44;;9872:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;10012:1;10002:7;:11;:40;;;;10018:12;:24;10031:10;10018:24;;;;;;;;;;;;;;;;;;;;;;;;;10017:25;10002:40;9994:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10099:6;10094:386;10115:8;10111:1;:12;10094:386;;;10180:11;10194:20;10212:1;10194:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;10180:34;;10281:25;10287:10;10299:6;10281:5;:25::i;:::-;10350:7;10333:6;:14;10340:6;10333:14;;;;;;;;;;;:24;;;;10437:32;10467:1;10437:6;:15;10444:7;10437:15;;;;;;;;;;;:25;;;:29;;:32;;;;:::i;:::-;10409:6;:15;10416:7;10409:15;;;;;;;;;;;:25;;:60;;;;10130:350;10125:3;;;;;:::i;:::-;;;;10094:386;;;;10552:1;10543:7;:10;:36;;;;;10558:9;:21;10568:10;10558:21;;;;;;;;;;;;;;;;;;;;;;;;;10557:22;10543:36;10539:173;;;10619:4;10595:9;:21;10605:10;10595:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;10637:17;;:19;;;;;;;;;:::i;:::-;;;;;;10697:4;10670:12;:24;10683:10;10670:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;10539:173;9359:1368;;:::o;7997:356::-;8161:1;8143:6;:15;8150:7;8143:15;;;;;;;;;;;;:19;8135:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8213:41;8232:12;:10;:12::i;:::-;8246:7;8213:18;:41::i;:::-;8205:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;8318:28;8328:4;8334:2;8338:7;8318:9;:28::i;:::-;7997:356;;;:::o;1548:36::-;;;;:::o;1290:253:4:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;11866:132:13:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11981:10:13::1;;;;;;;;;;;11980:11;11967:10;;:24;;;;;;;;;;;;;;;;;;11866:132::o:0;7542:136::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7631:10:13::1;7623:24;;:47;7648:21;7623:47;;;;;;;;;;;;;;;;;;;;;;;7615:56;;;::::0;::::1;;7542:136::o:0;8359:259::-;8527:1;8509:6;:15;8516:7;8509:15;;;;;;;;;;;;:19;8501:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8571:39;8588:4;8594:2;8598:7;8571:39;;;;;;;;;;;;:16;:39::i;:::-;8359:259;;;:::o;6590:191::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6656:41:13::1;6675:12;:10;:12::i;:::-;6689:7;6656:18;:41::i;:::-;6648:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;6760:14;6766:7;6760:5;:14::i;:::-;6590:191:::0;:::o;1915:40::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8652:674::-;8702:9;:21;8712:10;8702:21;;;;;;;;;;;;;;;;;;;;;;;;;8694:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;8774:4;8762:16;;:10;;;;;;;;;;;:16;;;8754:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;8829:7;8816:9;:20;;8808:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;8882:6;8907;8916:1;8907:10;;8902:418;8923:13;;8919:1;:17;8902:418;;;8983:4;8961:26;;:6;:9;8968:1;8961:9;;;;;;;;;;;:18;;;;;;;;;;;;:26;;;:53;;;;;9013:1;8991:6;:9;8998:1;8991:9;;;;;;;;;;;:19;;;:23;8961:53;8957:292;;;9034:11;9048:20;9066:1;9048:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;9034:34;;9086:25;9092:10;9104:6;9086:5;:25::i;:::-;9146:1;9129:6;:14;9136:6;9129:14;;;;;;;;;;;:18;;;;9187:26;9211:1;9187:6;:9;9194:1;9187:9;;;;;;;;;;;:19;;;:23;;:26;;;;:::i;:::-;9165:6;:9;9172:1;9165:9;;;;;;;;;;;:19;;:48;;;;9231:3;;;;;:::i;:::-;;;;9016:233;8957:292;9269:1;9266;:4;9262:48;;;9290:5;;9262:48;8938:3;;;;;:::i;:::-;;;;8902:418;;;;8684:642;8652:674::o;1797:230:4:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;;1996:24;;1797:230;;;:::o;7685:94:13:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7765:7:13::1;7755;:17;;;;;;;;;;;;:::i;:::-;;7685:94:::0;:::o;10771:1080::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10951:4:13::1;10939:16;;:10;;;;;;;;;;;:16;;;10931:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;11019:1;10993:6;:15;11000:7;10993:15;;;;;;;;;;;:23;;;:27;10985:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;11112:1;11069:39;11099:8;11069:6;:15;11076:7;11069:15;;;;;;;;;;;:25;;;:29;;:39;;;;:::i;:::-;:44;;11061:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;11197:6;11192:638;11213:8;11209:1;:12;11192:638;;;11278:11;11292:20;11310:1;11292:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;11278:34;;11379:17;11385:2;11389:6;11379:5;:17::i;:::-;11475:7;11458:6;:14;11465:6;11458:14;;;;;;;;;;;:24;;;;11562:32;11592:1;11562:6;:15;11569:7;11562:15;;;;;;;;;;;:25;;;:29;;:32;;;;:::i;:::-;11534:6;:15;11541:7;11534:15;;;;;;;;;;;:25;;:60;;;;11669:1;11660:7;:10;:28;;;;;11675:9;:13;11685:2;11675:13;;;;;;;;;;;;;;;;;;;;;;;;;11674:14;11660:28;11656:164;;;11723:4;11707:9;:13;11717:2;11707:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;11745:17;;:19;;;;;;;;;:::i;:::-;;;;;;11801:4;11782:12;:16;11795:2;11782:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;11656:164;11228:602;11223:3;;;;;:::i;:::-;;;;11192:638;;;;10771:1080:::0;;;:::o;2111:235:3:-;2183:7;2202:13;2218:7;:16;2226:7;2218:16;;;;;;;;;;;;;;;;;;;;;2202:32;;2269:1;2252:19;;:5;:19;;;;2244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2334:5;2327:12;;;2111:235;;;:::o;1475:22:13:-;;;;;;;;;;;;;:::o;1448:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1849:205:3:-;1921:7;1965:1;1948:19;;:5;:19;;;;1940:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:9;:16;2041:5;2031:16;;;;;;;;;;;;;;;;2024:23;;1849:205;;;:::o;1661:101:10:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1029:85::-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;2028:42:13:-;;;;;;;;;;;;;;;;;:::o;2570:102:3:-;2626:13;2658:7;2651:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2570:102;:::o;4203:153::-;4297:52;4316:12;:10;:12::i;:::-;4330:8;4340;4297:18;:52::i;:::-;4203:153;;:::o;7785:206:13:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7868:6:13::1;7863:122;7884:4;;:11;;7880:1;:15;7863:122;;;7937:4;7916:9;:18;7926:4;;7931:1;7926:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;7916:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;7955:17;;:19;;;;;;;;;:::i;:::-;;;;;;7897:3;;;;;:::i;:::-;;;;7863:122;;;;7785:206:::0;;:::o;5287:320:3:-;5456:41;5475:12;:10;:12::i;:::-;5489:7;5456:18;:41::i;:::-;5448:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;1961:28:13:-;;;;:::o;5848:337::-;5913:13;5983:16;5991:7;5983;:16::i;:::-;5975:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;6092:1;6074:7;6068:21;;;;;:::i;:::-;;;:25;:110;;;;;;;;;;;;;;;;;6120:7;6129:33;6146:6;:15;6153:7;6146:15;;;;;;;;;;;;6129:16;:33::i;:::-;6103:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6068:110;6061:117;;5848:337;;;:::o;6829:707::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7070:12:13::1;7085:55;7114:6;:15;7121:7;7114:15;;;;;;;;;;;:25;;;7085:6;:15;7092:7;7085:15;;;;;;;;;;;:24;;;:28;;:55;;;;:::i;:::-;7070:70;;7170:7;7158:8;:19;;7150:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;7283:4;7260:6;:15;7267:7;7260:15;;;;;;;;;;;:20;;:27;;;;;;;;;;;;:::i;:::-;;7321:5;7297:6;:15;7304:7;7297:15;;;;;;;;;;;:21;;:29;;;;7367:12;7336:6;:15;7343:7;7336:15;;;;;;;;;;;:28;;;:43;;;;;;;;;;;;;;;;;;7416:8;7389:6;:15;7396:7;7389:15;;;;;;;;;;;:24;;;:35;;;;;;;;;;;;;;;;;;7462:21;7475:7;7462:8;:12;;:21;;;;:::i;:::-;7434:6;:15;7441:7;7434:15;;;;;;;;;;;:25;;:49;;;;7520:8;7493:6;:15;7500:7;7493:15;;;;;;;;;;;:24;;:35;;;;6966:570;6829:707:::0;;;;;;:::o;12134:432::-;12255:4;12337:27;12381:20;;;;;;;;;;;12337:65;;12457:8;12416:49;;12424:13;:21;;;12446:5;12424:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12416:49;;;12412:91;;;12488:4;12481:11;;;;;12412:91;12520:39;12543:5;12550:8;12520:22;:39::i;:::-;12513:46;;;12134:432;;;;;:::o;1911:198:10:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;6236:312:13:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6365:18:13::1;6386:84;;;;;;;;6392:4;6386:84;;;;6398:8;6386:84;;;;6408:8;6386:84;;;;6418:5;6386:84;;;;6425:20;6443:1;6425:13;;:17;;:20;;;;:::i;:::-;6386:84;;;;6447:12;6386:84;;;;;;6461:8;6386:84;;;;::::0;6365:105:::1;;6511:5;6480:6;:28;6487:20;6505:1;6487:13;;:17;;:20;;;;:::i;:::-;6480:28;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6526:13;;:15;;;;;;;;;:::i;:::-;;;;;;6355:193;6236:312:::0;;;;;:::o;350:631::-;418:22;482:4;460:27;;:10;:27;;;456:496;;;503:18;524:8;;503:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;546:13;562:8;;:15;;546:31;;809:42;780:5;773;769:17;763:24;738:131;728:141;;600:283;;456:496;;;930:10;913:28;;456:496;350:631;:::o;2741:96:11:-;2799:7;2829:1;2825;:5;;;;:::i;:::-;2818:12;;2741:96;;;;:::o;1490:300:3:-;1592:4;1642:25;1627:40;;;:11;:40;;;;:104;;;;1698:33;1683:48;;;:11;:48;;;;1627:104;:156;;;;1747:36;1771:11;1747:23;:36::i;:::-;1627:156;1608:175;;1490:300;;;:::o;7079:125::-;7144:4;7195:1;7167:30;;:7;:16;7175:7;7167:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7160:37;;7079:125;;;:::o;12705:154:13:-;12791:14;12828:24;:22;:24::i;:::-;12821:31;;12705:154;:::o;10930:171:3:-;11031:2;11004:15;:24;11020:7;11004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11086:7;11082:2;11048:46;;11057:23;11072:7;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;3451:96:11:-;3509:7;3539:1;3535;:5;;;;:::i;:::-;3528:12;;3451:96;;;;:::o;3108:::-;3166:7;3196:1;3192;:5;;;;:::i;:::-;3185:12;;3108:96;;;;:::o;8998:372:3:-;9091:1;9077:16;;:2;:16;;;;9069:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;9282:1;9265:9;:13;9275:2;9265:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9312:2;9293:7;:16;9301:7;9293:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9355:7;9351:2;9330:33;;9347:1;9330:33;;;;;;;;;;;;8998:372;;:::o;7362:344::-;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7611:87;7603:96;;;7362:344;;;;:::o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10495:1;10481:16;;:2;:16;;;;10473:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10709:1;10690:9;:15;10700:4;10690:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10737:1;10720:9;:13;10730:2;10720:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10767:2;10748:7;:16;10756:7;10748:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10804:7;10800:2;10785:27;;10794:4;10785:27;;;;;;;;;;;;10259:560;;;:::o;9587:348::-;9646:13;9662:23;9677:7;9662:14;:23::i;:::-;9646:39;;9696:48;9717:5;9732:1;9736:7;9696:20;:48::i;:::-;9782:29;9799:1;9803:7;9782:8;:29::i;:::-;9842:1;9822:9;:16;9832:5;9822:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9860:7;:16;9868:7;9860:16;;;;;;;;;;;;9853:23;;;;;;;;;;;9920:7;9916:1;9892:36;;9901:5;9892:36;;;;;;;;;;;;9636:299;9587:348;:::o;2263:187:10:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;11236:307:3:-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11472:8;11434:18;:25;11453:5;11434:25;;;;;;;;;;;;;;;:35;11460:8;11434:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11517:8;11495:41;;11510:5;11495:41;;;11527:8;11495:41;;;;;;:::i;:::-;;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:307;;;;:::o;328:703:12:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;4422:162:3:-;4519:4;4542:18;:25;4561:5;4542:25;;;;;;;;;;;;;;;:35;4568:8;4542:35;;;;;;;;;;;;;;;;;;;;;;;;;4535:42;;4422:162;;;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2623:572:4:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;12096:778:3:-;12246:4;12266:15;:2;:13;;;:15::i;:::-;12262:606;;;12317:2;12301:36;;;12338:12;:10;:12::i;:::-;12352:4;12358:7;12367:5;12301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12557:1;12540:6;:13;:18;12536:266;;;12582:60;;;;;;;;;;:::i;:::-;;;;;;;;12536:266;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12433:41;;;12423:51;;;:6;:51;;;;12416:58;;;;;12262:606;12853:4;12846:11;;12096:778;;;;;;;:::o;13430:122::-;;;;:::o;3901:161:4:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5183:289;5149:323;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4760:889;;4679:970;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;:::i;:::-;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3563:143;3489:217;;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:14:-;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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2363:201::-;2449:5;2480:6;2474:13;2465:22;;2496:62;2552:5;2496:62;:::i;:::-;2363:201;;;;:::o;2584:340::-;2640:5;2689:3;2682:4;2674:6;2670:17;2666:27;2656:122;;2697:79;;:::i;:::-;2656:122;2814:6;2801:20;2839:79;2914:3;2906:6;2899:4;2891:6;2887:17;2839:79;:::i;:::-;2830:88;;2646:278;2584:340;;;;:::o;2930:139::-;2976:5;3014:6;3001:20;2992:29;;3030:33;3057:5;3030:33;:::i;:::-;2930:139;;;;:::o;3075:329::-;3134:6;3183:2;3171:9;3162:7;3158:23;3154:32;3151:119;;;3189:79;;:::i;:::-;3151:119;3309:1;3334:53;3379:7;3370:6;3359:9;3355:22;3334:53;:::i;:::-;3324:63;;3280:117;3075:329;;;;:::o;3410:474::-;3478:6;3486;3535:2;3523:9;3514:7;3510:23;3506:32;3503:119;;;3541:79;;:::i;:::-;3503:119;3661:1;3686:53;3731:7;3722:6;3711:9;3707:22;3686:53;:::i;:::-;3676:63;;3632:117;3788:2;3814:53;3859:7;3850:6;3839:9;3835:22;3814:53;:::i;:::-;3804:63;;3759:118;3410:474;;;;;:::o;3890:619::-;3967:6;3975;3983;4032:2;4020:9;4011:7;4007:23;4003:32;4000:119;;;4038:79;;:::i;:::-;4000:119;4158:1;4183:53;4228:7;4219:6;4208:9;4204:22;4183:53;:::i;:::-;4173:63;;4129:117;4285:2;4311:53;4356:7;4347:6;4336:9;4332:22;4311:53;:::i;:::-;4301:63;;4256:118;4413:2;4439:53;4484:7;4475:6;4464:9;4460:22;4439:53;:::i;:::-;4429:63;;4384:118;3890:619;;;;;:::o;4515:943::-;4610:6;4618;4626;4634;4683:3;4671:9;4662:7;4658:23;4654:33;4651:120;;;4690:79;;:::i;:::-;4651:120;4810:1;4835:53;4880:7;4871:6;4860:9;4856:22;4835:53;:::i;:::-;4825:63;;4781:117;4937:2;4963:53;5008:7;4999:6;4988:9;4984:22;4963:53;:::i;:::-;4953:63;;4908:118;5065:2;5091:53;5136:7;5127:6;5116:9;5112:22;5091:53;:::i;:::-;5081:63;;5036:118;5221:2;5210:9;5206:18;5193:32;5252:18;5244:6;5241:30;5238:117;;;5274:79;;:::i;:::-;5238:117;5379:62;5433:7;5424:6;5413:9;5409:22;5379:62;:::i;:::-;5369:72;;5164:287;4515:943;;;;;;;:::o;5464:468::-;5529:6;5537;5586:2;5574:9;5565:7;5561:23;5557:32;5554:119;;;5592:79;;:::i;:::-;5554:119;5712:1;5737:53;5782:7;5773:6;5762:9;5758:22;5737:53;:::i;:::-;5727:63;;5683:117;5839:2;5865:50;5907:7;5898:6;5887:9;5883:22;5865:50;:::i;:::-;5855:60;;5810:115;5464:468;;;;;:::o;5938:474::-;6006:6;6014;6063:2;6051:9;6042:7;6038:23;6034:32;6031:119;;;6069:79;;:::i;:::-;6031:119;6189:1;6214:53;6259:7;6250:6;6239:9;6235:22;6214:53;:::i;:::-;6204:63;;6160:117;6316:2;6342:53;6387:7;6378:6;6367:9;6363:22;6342:53;:::i;:::-;6332:63;;6287:118;5938:474;;;;;:::o;6418:559::-;6504:6;6512;6561:2;6549:9;6540:7;6536:23;6532:32;6529:119;;;6567:79;;:::i;:::-;6529:119;6715:1;6704:9;6700:17;6687:31;6745:18;6737:6;6734:30;6731:117;;;6767:79;;:::i;:::-;6731:117;6880:80;6952:7;6943:6;6932:9;6928:22;6880:80;:::i;:::-;6862:98;;;;6658:312;6418:559;;;;;:::o;6983:327::-;7041:6;7090:2;7078:9;7069:7;7065:23;7061:32;7058:119;;;7096:79;;:::i;:::-;7058:119;7216:1;7241:52;7285:7;7276:6;7265:9;7261:22;7241:52;:::i;:::-;7231:62;;7187:116;6983:327;;;;:::o;7316:349::-;7385:6;7434:2;7422:9;7413:7;7409:23;7405:32;7402:119;;;7440:79;;:::i;:::-;7402:119;7560:1;7585:63;7640:7;7631:6;7620:9;7616:22;7585:63;:::i;:::-;7575:73;;7531:127;7316:349;;;;:::o;7671:409::-;7770:6;7819:2;7807:9;7798:7;7794:23;7790:32;7787:119;;;7825:79;;:::i;:::-;7787:119;7945:1;7970:93;8055:7;8046:6;8035:9;8031:22;7970:93;:::i;:::-;7960:103;;7916:157;7671:409;;;;:::o;8086:509::-;8155:6;8204:2;8192:9;8183:7;8179:23;8175:32;8172:119;;;8210:79;;:::i;:::-;8172:119;8358:1;8347:9;8343:17;8330:31;8388:18;8380:6;8377:30;8374:117;;;8410:79;;:::i;:::-;8374:117;8515:63;8570:7;8561:6;8550:9;8546:22;8515:63;:::i;:::-;8505:73;;8301:287;8086:509;;;;:::o;8601:1079::-;8700:6;8708;8716;8724;8732;8781:3;8769:9;8760:7;8756:23;8752:33;8749:120;;;8788:79;;:::i;:::-;8749:120;8936:1;8925:9;8921:17;8908:31;8966:18;8958:6;8955:30;8952:117;;;8988:79;;:::i;:::-;8952:117;9093:63;9148:7;9139:6;9128:9;9124:22;9093:63;:::i;:::-;9083:73;;8879:287;9205:2;9231:53;9276:7;9267:6;9256:9;9252:22;9231:53;:::i;:::-;9221:63;;9176:118;9333:2;9359:53;9404:7;9395:6;9384:9;9380:22;9359:53;:::i;:::-;9349:63;;9304:118;9461:2;9487:50;9529:7;9520:6;9509:9;9505:22;9487:50;:::i;:::-;9477:60;;9432:115;9586:3;9613:50;9655:7;9646:6;9635:9;9631:22;9613:50;:::i;:::-;9603:60;;9557:116;8601:1079;;;;;;;;:::o;9686:1225::-;9794:6;9802;9810;9818;9826;9834;9883:3;9871:9;9862:7;9858:23;9854:33;9851:120;;;9890:79;;:::i;:::-;9851:120;10038:1;10027:9;10023:17;10010:31;10068:18;10060:6;10057:30;10054:117;;;10090:79;;:::i;:::-;10054:117;10195:63;10250:7;10241:6;10230:9;10226:22;10195:63;:::i;:::-;10185:73;;9981:287;10307:2;10333:53;10378:7;10369:6;10358:9;10354:22;10333:53;:::i;:::-;10323:63;;10278:118;10435:2;10461:53;10506:7;10497:6;10486:9;10482:22;10461:53;:::i;:::-;10451:63;;10406:118;10563:2;10589:50;10631:7;10622:6;10611:9;10607:22;10589:50;:::i;:::-;10579:60;;10534:115;10688:3;10715:53;10760:7;10751:6;10740:9;10736:22;10715:53;:::i;:::-;10705:63;;10659:119;10817:3;10844:50;10886:7;10877:6;10866:9;10862:22;10844:50;:::i;:::-;10834:60;;10788:116;9686:1225;;;;;;;;:::o;10917:329::-;10976:6;11025:2;11013:9;11004:7;11000:23;10996:32;10993:119;;;11031:79;;:::i;:::-;10993:119;11151:1;11176:53;11221:7;11212:6;11201:9;11197:22;11176:53;:::i;:::-;11166:63;;11122:117;10917:329;;;;:::o;11252:474::-;11320:6;11328;11377:2;11365:9;11356:7;11352:23;11348:32;11345:119;;;11383:79;;:::i;:::-;11345:119;11503:1;11528:53;11573:7;11564:6;11553:9;11549:22;11528:53;:::i;:::-;11518:63;;11474:117;11630:2;11656:53;11701:7;11692:6;11681:9;11677:22;11656:53;:::i;:::-;11646:63;;11601:118;11252:474;;;;;:::o;11732:619::-;11809:6;11817;11825;11874:2;11862:9;11853:7;11849:23;11845:32;11842:119;;;11880:79;;:::i;:::-;11842:119;12000:1;12025:53;12070:7;12061:6;12050:9;12046:22;12025:53;:::i;:::-;12015:63;;11971:117;12127:2;12153:53;12198:7;12189:6;12178:9;12174:22;12153:53;:::i;:::-;12143:63;;12098:118;12255:2;12281:53;12326:7;12317:6;12306:9;12302:22;12281:53;:::i;:::-;12271:63;;12226:118;11732:619;;;;;:::o;12357:118::-;12444:24;12462:5;12444:24;:::i;:::-;12439:3;12432:37;12357:118;;:::o;12481:109::-;12562:21;12577:5;12562:21;:::i;:::-;12557:3;12550:34;12481:109;;:::o;12596:360::-;12682:3;12710:38;12742:5;12710:38;:::i;:::-;12764:70;12827:6;12822:3;12764:70;:::i;:::-;12757:77;;12843:52;12888:6;12883:3;12876:4;12869:5;12865:16;12843:52;:::i;:::-;12920:29;12942:6;12920:29;:::i;:::-;12915:3;12911:39;12904:46;;12686:270;12596:360;;;;:::o;12962:364::-;13050:3;13078:39;13111:5;13078:39;:::i;:::-;13133:71;13197:6;13192:3;13133:71;:::i;:::-;13126:78;;13213:52;13258:6;13253:3;13246:4;13239:5;13235:16;13213:52;:::i;:::-;13290:29;13312:6;13290:29;:::i;:::-;13285:3;13281:39;13274:46;;13054:272;12962:364;;;;:::o;13332:377::-;13438:3;13466:39;13499:5;13466:39;:::i;:::-;13521:89;13603:6;13598:3;13521:89;:::i;:::-;13514:96;;13619:52;13664:6;13659:3;13652:4;13645:5;13641:16;13619:52;:::i;:::-;13696:6;13691:3;13687:16;13680:23;;13442:267;13332:377;;;;:::o;13739:845::-;13842:3;13879:5;13873:12;13908:36;13934:9;13908:36;:::i;:::-;13960:89;14042:6;14037:3;13960:89;:::i;:::-;13953:96;;14080:1;14069:9;14065:17;14096:1;14091:137;;;;14242:1;14237:341;;;;14058:520;;14091:137;14175:4;14171:9;14160;14156:25;14151:3;14144:38;14211:6;14206:3;14202:16;14195:23;;14091:137;;14237:341;14304:38;14336:5;14304:38;:::i;:::-;14364:1;14378:154;14392:6;14389:1;14386:13;14378:154;;;14466:7;14460:14;14456:1;14451:3;14447:11;14440:35;14516:1;14507:7;14503:15;14492:26;;14414:4;14411:1;14407:12;14402:17;;14378:154;;;14561:6;14556:3;14552:16;14545:23;;14244:334;;14058:520;;13846:738;;13739:845;;;;:::o;14590:366::-;14732:3;14753:67;14817:2;14812:3;14753:67;:::i;:::-;14746:74;;14829:93;14918:3;14829:93;:::i;:::-;14947:2;14942:3;14938:12;14931:19;;14590:366;;;:::o;14962:::-;15104:3;15125:67;15189:2;15184:3;15125:67;:::i;:::-;15118:74;;15201:93;15290:3;15201:93;:::i;:::-;15319:2;15314:3;15310:12;15303:19;;14962:366;;;:::o;15334:::-;15476:3;15497:67;15561:2;15556:3;15497:67;:::i;:::-;15490:74;;15573:93;15662:3;15573:93;:::i;:::-;15691:2;15686:3;15682:12;15675:19;;15334:366;;;:::o;15706:::-;15848:3;15869:67;15933:2;15928:3;15869:67;:::i;:::-;15862:74;;15945:93;16034:3;15945:93;:::i;:::-;16063:2;16058:3;16054:12;16047:19;;15706:366;;;:::o;16078:::-;16220:3;16241:67;16305:2;16300:3;16241:67;:::i;:::-;16234:74;;16317:93;16406:3;16317:93;:::i;:::-;16435:2;16430:3;16426:12;16419:19;;16078:366;;;:::o;16450:::-;16592:3;16613:67;16677:2;16672:3;16613:67;:::i;:::-;16606:74;;16689:93;16778:3;16689:93;:::i;:::-;16807:2;16802:3;16798:12;16791:19;;16450:366;;;:::o;16822:::-;16964:3;16985:67;17049:2;17044:3;16985:67;:::i;:::-;16978:74;;17061:93;17150:3;17061:93;:::i;:::-;17179:2;17174:3;17170:12;17163:19;;16822:366;;;:::o;17194:::-;17336:3;17357:67;17421:2;17416:3;17357:67;:::i;:::-;17350:74;;17433:93;17522:3;17433:93;:::i;:::-;17551:2;17546:3;17542:12;17535:19;;17194:366;;;:::o;17566:::-;17708:3;17729:67;17793:2;17788:3;17729:67;:::i;:::-;17722:74;;17805:93;17894:3;17805:93;:::i;:::-;17923:2;17918:3;17914:12;17907:19;;17566:366;;;:::o;17938:::-;18080:3;18101:67;18165:2;18160:3;18101:67;:::i;:::-;18094:74;;18177:93;18266:3;18177:93;:::i;:::-;18295:2;18290:3;18286:12;18279:19;;17938:366;;;:::o;18310:::-;18452:3;18473:67;18537:2;18532:3;18473:67;:::i;:::-;18466:74;;18549:93;18638:3;18549:93;:::i;:::-;18667:2;18662:3;18658:12;18651:19;;18310:366;;;:::o;18682:::-;18824:3;18845:67;18909:2;18904:3;18845:67;:::i;:::-;18838:74;;18921:93;19010:3;18921:93;:::i;:::-;19039:2;19034:3;19030:12;19023:19;;18682:366;;;:::o;19054:::-;19196:3;19217:67;19281:2;19276:3;19217:67;:::i;:::-;19210:74;;19293:93;19382:3;19293:93;:::i;:::-;19411:2;19406:3;19402:12;19395:19;;19054:366;;;:::o;19426:::-;19568:3;19589:67;19653:2;19648:3;19589:67;:::i;:::-;19582:74;;19665:93;19754:3;19665:93;:::i;:::-;19783:2;19778:3;19774:12;19767:19;;19426:366;;;:::o;19798:::-;19940:3;19961:67;20025:2;20020:3;19961:67;:::i;:::-;19954:74;;20037:93;20126:3;20037:93;:::i;:::-;20155:2;20150:3;20146:12;20139:19;;19798:366;;;:::o;20170:::-;20312:3;20333:67;20397:2;20392:3;20333:67;:::i;:::-;20326:74;;20409:93;20498:3;20409:93;:::i;:::-;20527:2;20522:3;20518:12;20511:19;;20170:366;;;:::o;20542:::-;20684:3;20705:67;20769:2;20764:3;20705:67;:::i;:::-;20698:74;;20781:93;20870:3;20781:93;:::i;:::-;20899:2;20894:3;20890:12;20883:19;;20542:366;;;:::o;20914:::-;21056:3;21077:67;21141:2;21136:3;21077:67;:::i;:::-;21070:74;;21153:93;21242:3;21153:93;:::i;:::-;21271:2;21266:3;21262:12;21255:19;;20914:366;;;:::o;21286:400::-;21446:3;21467:84;21549:1;21544:3;21467:84;:::i;:::-;21460:91;;21560:93;21649:3;21560:93;:::i;:::-;21678:1;21673:3;21669:11;21662:18;;21286:400;;;:::o;21692:366::-;21834:3;21855:67;21919:2;21914:3;21855:67;:::i;:::-;21848:74;;21931:93;22020:3;21931:93;:::i;:::-;22049:2;22044:3;22040:12;22033:19;;21692:366;;;:::o;22064:::-;22206:3;22227:67;22291:2;22286:3;22227:67;:::i;:::-;22220:74;;22303:93;22392:3;22303:93;:::i;:::-;22421:2;22416:3;22412:12;22405:19;;22064:366;;;:::o;22436:::-;22578:3;22599:67;22663:2;22658:3;22599:67;:::i;:::-;22592:74;;22675:93;22764:3;22675:93;:::i;:::-;22793:2;22788:3;22784:12;22777:19;;22436:366;;;:::o;22808:::-;22950:3;22971:67;23035:2;23030:3;22971:67;:::i;:::-;22964:74;;23047:93;23136:3;23047:93;:::i;:::-;23165:2;23160:3;23156:12;23149:19;;22808:366;;;:::o;23180:::-;23322:3;23343:67;23407:2;23402:3;23343:67;:::i;:::-;23336:74;;23419:93;23508:3;23419:93;:::i;:::-;23537:2;23532:3;23528:12;23521:19;;23180:366;;;:::o;23552:::-;23694:3;23715:67;23779:2;23774:3;23715:67;:::i;:::-;23708:74;;23791:93;23880:3;23791:93;:::i;:::-;23909:2;23904:3;23900:12;23893:19;;23552:366;;;:::o;23924:::-;24066:3;24087:67;24151:2;24146:3;24087:67;:::i;:::-;24080:74;;24163:93;24252:3;24163:93;:::i;:::-;24281:2;24276:3;24272:12;24265:19;;23924:366;;;:::o;24296:::-;24438:3;24459:67;24523:2;24518:3;24459:67;:::i;:::-;24452:74;;24535:93;24624:3;24535:93;:::i;:::-;24653:2;24648:3;24644:12;24637:19;;24296:366;;;:::o;24668:::-;24810:3;24831:67;24895:2;24890:3;24831:67;:::i;:::-;24824:74;;24907:93;24996:3;24907:93;:::i;:::-;25025:2;25020:3;25016:12;25009:19;;24668:366;;;:::o;25040:::-;25182:3;25203:67;25267:2;25262:3;25203:67;:::i;:::-;25196:74;;25279:93;25368:3;25279:93;:::i;:::-;25397:2;25392:3;25388:12;25381:19;;25040:366;;;:::o;25412:::-;25554:3;25575:67;25639:2;25634:3;25575:67;:::i;:::-;25568:74;;25651:93;25740:3;25651:93;:::i;:::-;25769:2;25764:3;25760:12;25753:19;;25412:366;;;:::o;25784:118::-;25871:24;25889:5;25871:24;:::i;:::-;25866:3;25859:37;25784:118;;:::o;25908:695::-;26186:3;26208:92;26296:3;26287:6;26208:92;:::i;:::-;26201:99;;26317:95;26408:3;26399:6;26317:95;:::i;:::-;26310:102;;26429:148;26573:3;26429:148;:::i;:::-;26422:155;;26594:3;26587:10;;25908:695;;;;;:::o;26609:222::-;26702:4;26740:2;26729:9;26725:18;26717:26;;26753:71;26821:1;26810:9;26806:17;26797:6;26753:71;:::i;:::-;26609:222;;;;:::o;26837:640::-;27032:4;27070:3;27059:9;27055:19;27047:27;;27084:71;27152:1;27141:9;27137:17;27128:6;27084:71;:::i;:::-;27165:72;27233:2;27222:9;27218:18;27209:6;27165:72;:::i;:::-;27247;27315:2;27304:9;27300:18;27291:6;27247:72;:::i;:::-;27366:9;27360:4;27356:20;27351:2;27340:9;27336:18;27329:48;27394:76;27465:4;27456:6;27394:76;:::i;:::-;27386:84;;26837:640;;;;;;;:::o;27483:210::-;27570:4;27608:2;27597:9;27593:18;27585:26;;27621:65;27683:1;27672:9;27668:17;27659:6;27621:65;:::i;:::-;27483:210;;;;:::o;27699:313::-;27812:4;27850:2;27839:9;27835:18;27827:26;;27899:9;27893:4;27889:20;27885:1;27874:9;27870:17;27863:47;27927:78;28000:4;27991:6;27927:78;:::i;:::-;27919:86;;27699:313;;;;:::o;28018:953::-;28287:4;28325:3;28314:9;28310:19;28302:27;;28375:9;28369:4;28365:20;28361:1;28350:9;28346:17;28339:47;28403:78;28476:4;28467:6;28403:78;:::i;:::-;28395:86;;28491:72;28559:2;28548:9;28544:18;28535:6;28491:72;:::i;:::-;28573;28641:2;28630:9;28626:18;28617:6;28573:72;:::i;:::-;28655;28723:2;28712:9;28708:18;28699:6;28655:72;:::i;:::-;28737:73;28805:3;28794:9;28790:19;28781:6;28737:73;:::i;:::-;28820:67;28882:3;28871:9;28867:19;28858:6;28820:67;:::i;:::-;28897;28959:3;28948:9;28944:19;28935:6;28897:67;:::i;:::-;28018:953;;;;;;;;;;:::o;28977:419::-;29143:4;29181:2;29170:9;29166:18;29158:26;;29230:9;29224:4;29220:20;29216:1;29205:9;29201:17;29194:47;29258:131;29384:4;29258:131;:::i;:::-;29250:139;;28977:419;;;:::o;29402:::-;29568:4;29606:2;29595:9;29591:18;29583:26;;29655:9;29649:4;29645:20;29641:1;29630:9;29626:17;29619:47;29683:131;29809:4;29683:131;:::i;:::-;29675:139;;29402:419;;;:::o;29827:::-;29993:4;30031:2;30020:9;30016:18;30008:26;;30080:9;30074:4;30070:20;30066:1;30055:9;30051:17;30044:47;30108:131;30234:4;30108:131;:::i;:::-;30100:139;;29827:419;;;:::o;30252:::-;30418:4;30456:2;30445:9;30441:18;30433:26;;30505:9;30499:4;30495:20;30491:1;30480:9;30476:17;30469:47;30533:131;30659:4;30533:131;:::i;:::-;30525:139;;30252:419;;;:::o;30677:::-;30843:4;30881:2;30870:9;30866:18;30858:26;;30930:9;30924:4;30920:20;30916:1;30905:9;30901:17;30894:47;30958:131;31084:4;30958:131;:::i;:::-;30950:139;;30677:419;;;:::o;31102:::-;31268:4;31306:2;31295:9;31291:18;31283:26;;31355:9;31349:4;31345:20;31341:1;31330:9;31326:17;31319:47;31383:131;31509:4;31383:131;:::i;:::-;31375:139;;31102:419;;;:::o;31527:::-;31693:4;31731:2;31720:9;31716:18;31708:26;;31780:9;31774:4;31770:20;31766:1;31755:9;31751:17;31744:47;31808:131;31934:4;31808:131;:::i;:::-;31800:139;;31527:419;;;:::o;31952:::-;32118:4;32156:2;32145:9;32141:18;32133:26;;32205:9;32199:4;32195:20;32191:1;32180:9;32176:17;32169:47;32233:131;32359:4;32233:131;:::i;:::-;32225:139;;31952:419;;;:::o;32377:::-;32543:4;32581:2;32570:9;32566:18;32558:26;;32630:9;32624:4;32620:20;32616:1;32605:9;32601:17;32594:47;32658:131;32784:4;32658:131;:::i;:::-;32650:139;;32377:419;;;:::o;32802:::-;32968:4;33006:2;32995:9;32991:18;32983:26;;33055:9;33049:4;33045:20;33041:1;33030:9;33026:17;33019:47;33083:131;33209:4;33083:131;:::i;:::-;33075:139;;32802:419;;;:::o;33227:::-;33393:4;33431:2;33420:9;33416:18;33408:26;;33480:9;33474:4;33470:20;33466:1;33455:9;33451:17;33444:47;33508:131;33634:4;33508:131;:::i;:::-;33500:139;;33227:419;;;:::o;33652:::-;33818:4;33856:2;33845:9;33841:18;33833:26;;33905:9;33899:4;33895:20;33891:1;33880:9;33876:17;33869:47;33933:131;34059:4;33933:131;:::i;:::-;33925:139;;33652:419;;;:::o;34077:::-;34243:4;34281:2;34270:9;34266:18;34258:26;;34330:9;34324:4;34320:20;34316:1;34305:9;34301:17;34294:47;34358:131;34484:4;34358:131;:::i;:::-;34350:139;;34077:419;;;:::o;34502:::-;34668:4;34706:2;34695:9;34691:18;34683:26;;34755:9;34749:4;34745:20;34741:1;34730:9;34726:17;34719:47;34783:131;34909:4;34783:131;:::i;:::-;34775:139;;34502:419;;;:::o;34927:::-;35093:4;35131:2;35120:9;35116:18;35108:26;;35180:9;35174:4;35170:20;35166:1;35155:9;35151:17;35144:47;35208:131;35334:4;35208:131;:::i;:::-;35200:139;;34927:419;;;:::o;35352:::-;35518:4;35556:2;35545:9;35541:18;35533:26;;35605:9;35599:4;35595:20;35591:1;35580:9;35576:17;35569:47;35633:131;35759:4;35633:131;:::i;:::-;35625:139;;35352:419;;;:::o;35777:::-;35943:4;35981:2;35970:9;35966:18;35958:26;;36030:9;36024:4;36020:20;36016:1;36005:9;36001:17;35994:47;36058:131;36184:4;36058:131;:::i;:::-;36050:139;;35777:419;;;:::o;36202:::-;36368:4;36406:2;36395:9;36391:18;36383:26;;36455:9;36449:4;36445:20;36441:1;36430:9;36426:17;36419:47;36483:131;36609:4;36483:131;:::i;:::-;36475:139;;36202:419;;;:::o;36627:::-;36793:4;36831:2;36820:9;36816:18;36808:26;;36880:9;36874:4;36870:20;36866:1;36855:9;36851:17;36844:47;36908:131;37034:4;36908:131;:::i;:::-;36900:139;;36627:419;;;:::o;37052:::-;37218:4;37256:2;37245:9;37241:18;37233:26;;37305:9;37299:4;37295:20;37291:1;37280:9;37276:17;37269:47;37333:131;37459:4;37333:131;:::i;:::-;37325:139;;37052:419;;;:::o;37477:::-;37643:4;37681:2;37670:9;37666:18;37658:26;;37730:9;37724:4;37720:20;37716:1;37705:9;37701:17;37694:47;37758:131;37884:4;37758:131;:::i;:::-;37750:139;;37477:419;;;:::o;37902:::-;38068:4;38106:2;38095:9;38091:18;38083:26;;38155:9;38149:4;38145:20;38141:1;38130:9;38126:17;38119:47;38183:131;38309:4;38183:131;:::i;:::-;38175:139;;37902:419;;;:::o;38327:::-;38493:4;38531:2;38520:9;38516:18;38508:26;;38580:9;38574:4;38570:20;38566:1;38555:9;38551:17;38544:47;38608:131;38734:4;38608:131;:::i;:::-;38600:139;;38327:419;;;:::o;38752:::-;38918:4;38956:2;38945:9;38941:18;38933:26;;39005:9;38999:4;38995:20;38991:1;38980:9;38976:17;38969:47;39033:131;39159:4;39033:131;:::i;:::-;39025:139;;38752:419;;;:::o;39177:::-;39343:4;39381:2;39370:9;39366:18;39358:26;;39430:9;39424:4;39420:20;39416:1;39405:9;39401:17;39394:47;39458:131;39584:4;39458:131;:::i;:::-;39450:139;;39177:419;;;:::o;39602:::-;39768:4;39806:2;39795:9;39791:18;39783:26;;39855:9;39849:4;39845:20;39841:1;39830:9;39826:17;39819:47;39883:131;40009:4;39883:131;:::i;:::-;39875:139;;39602:419;;;:::o;40027:::-;40193:4;40231:2;40220:9;40216:18;40208:26;;40280:9;40274:4;40270:20;40266:1;40255:9;40251:17;40244:47;40308:131;40434:4;40308:131;:::i;:::-;40300:139;;40027:419;;;:::o;40452:::-;40618:4;40656:2;40645:9;40641:18;40633:26;;40705:9;40699:4;40695:20;40691:1;40680:9;40676:17;40669:47;40733:131;40859:4;40733:131;:::i;:::-;40725:139;;40452:419;;;:::o;40877:::-;41043:4;41081:2;41070:9;41066:18;41058:26;;41130:9;41124:4;41120:20;41116:1;41105:9;41101:17;41094:47;41158:131;41284:4;41158:131;:::i;:::-;41150:139;;40877:419;;;:::o;41302:222::-;41395:4;41433:2;41422:9;41418:18;41410:26;;41446:71;41514:1;41503:9;41499:17;41490:6;41446:71;:::i;:::-;41302:222;;;;:::o;41530:129::-;41564:6;41591:20;;:::i;:::-;41581:30;;41620:33;41648:4;41640:6;41620:33;:::i;:::-;41530:129;;;:::o;41665:75::-;41698:6;41731:2;41725:9;41715:19;;41665:75;:::o;41746:307::-;41807:4;41897:18;41889:6;41886:30;41883:56;;;41919:18;;:::i;:::-;41883:56;41957:29;41979:6;41957:29;:::i;:::-;41949:37;;42041:4;42035;42031:15;42023:23;;41746:307;;;:::o;42059:308::-;42121:4;42211:18;42203:6;42200:30;42197:56;;;42233:18;;:::i;:::-;42197:56;42271:29;42293:6;42271:29;:::i;:::-;42263:37;;42355:4;42349;42345:15;42337:23;;42059:308;;;:::o;42373:141::-;42422:4;42445:3;42437:11;;42468:3;42465:1;42458:14;42502:4;42499:1;42489:18;42481:26;;42373:141;;;:::o;42520:98::-;42571:6;42605:5;42599:12;42589:22;;42520:98;;;:::o;42624:99::-;42676:6;42710:5;42704:12;42694:22;;42624:99;;;:::o;42729:168::-;42812:11;42846:6;42841:3;42834:19;42886:4;42881:3;42877:14;42862:29;;42729:168;;;;:::o;42903:169::-;42987:11;43021:6;43016:3;43009:19;43061:4;43056:3;43052:14;43037:29;;42903:169;;;;:::o;43078:148::-;43180:11;43217:3;43202:18;;43078:148;;;;:::o;43232:305::-;43272:3;43291:20;43309:1;43291:20;:::i;:::-;43286:25;;43325:20;43343:1;43325:20;:::i;:::-;43320:25;;43479:1;43411:66;43407:74;43404:1;43401:81;43398:107;;;43485:18;;:::i;:::-;43398:107;43529:1;43526;43522:9;43515:16;;43232:305;;;;:::o;43543:185::-;43583:1;43600:20;43618:1;43600:20;:::i;:::-;43595:25;;43634:20;43652:1;43634:20;:::i;:::-;43629:25;;43673:1;43663:35;;43678:18;;:::i;:::-;43663:35;43720:1;43717;43713:9;43708:14;;43543:185;;;;:::o;43734:348::-;43774:7;43797:20;43815:1;43797:20;:::i;:::-;43792:25;;43831:20;43849:1;43831:20;:::i;:::-;43826:25;;44019:1;43951:66;43947:74;43944:1;43941:81;43936:1;43929:9;43922:17;43918:105;43915:131;;;44026:18;;:::i;:::-;43915:131;44074:1;44071;44067:9;44056:20;;43734:348;;;;:::o;44088:191::-;44128:4;44148:20;44166:1;44148:20;:::i;:::-;44143:25;;44182:20;44200:1;44182:20;:::i;:::-;44177:25;;44221:1;44218;44215:8;44212:34;;;44226:18;;:::i;:::-;44212:34;44271:1;44268;44264:9;44256:17;;44088:191;;;;:::o;44285:96::-;44322:7;44351:24;44369:5;44351:24;:::i;:::-;44340:35;;44285:96;;;:::o;44387:90::-;44421:7;44464:5;44457:13;44450:21;44439:32;;44387:90;;;:::o;44483:149::-;44519:7;44559:66;44552:5;44548:78;44537:89;;44483:149;;;:::o;44638:125::-;44704:7;44733:24;44751:5;44733:24;:::i;:::-;44722:35;;44638:125;;;:::o;44769:126::-;44806:7;44846:42;44839:5;44835:54;44824:65;;44769:126;;;:::o;44901:77::-;44938:7;44967:5;44956:16;;44901:77;;;:::o;44984:154::-;45068:6;45063:3;45058;45045:30;45130:1;45121:6;45116:3;45112:16;45105:27;44984:154;;;:::o;45144:307::-;45212:1;45222:113;45236:6;45233:1;45230:13;45222:113;;;45321:1;45316:3;45312:11;45306:18;45302:1;45297:3;45293:11;45286:39;45258:2;45255:1;45251:10;45246:15;;45222:113;;;45353:6;45350:1;45347:13;45344:101;;;45433:1;45424:6;45419:3;45415:16;45408:27;45344:101;45193:258;45144:307;;;:::o;45457:320::-;45501:6;45538:1;45532:4;45528:12;45518:22;;45585:1;45579:4;45575:12;45606:18;45596:81;;45662:4;45654:6;45650:17;45640:27;;45596:81;45724:2;45716:6;45713:14;45693:18;45690:38;45687:84;;;45743:18;;:::i;:::-;45687:84;45508:269;45457:320;;;:::o;45783:281::-;45866:27;45888:4;45866:27;:::i;:::-;45858:6;45854:40;45996:6;45984:10;45981:22;45960:18;45948:10;45945:34;45942:62;45939:88;;;46007:18;;:::i;:::-;45939:88;46047:10;46043:2;46036:22;45826:238;45783:281;;:::o;46070:233::-;46109:3;46132:24;46150:5;46132:24;:::i;:::-;46123:33;;46178:66;46171:5;46168:77;46165:103;;;46248:18;;:::i;:::-;46165:103;46295:1;46288:5;46284:13;46277:20;;46070:233;;;:::o;46309:176::-;46341:1;46358:20;46376:1;46358:20;:::i;:::-;46353:25;;46392:20;46410:1;46392:20;:::i;:::-;46387:25;;46431:1;46421:35;;46436:18;;:::i;:::-;46421:35;46477:1;46474;46470:9;46465:14;;46309:176;;;;:::o;46491:180::-;46539:77;46536:1;46529:88;46636:4;46633:1;46626:15;46660:4;46657:1;46650:15;46677:180;46725:77;46722:1;46715:88;46822:4;46819:1;46812:15;46846:4;46843:1;46836:15;46863:180;46911:77;46908:1;46901:88;47008:4;47005:1;46998:15;47032:4;47029:1;47022:15;47049:180;47097:77;47094:1;47087:88;47194:4;47191:1;47184:15;47218:4;47215:1;47208:15;47235:180;47283:77;47280:1;47273:88;47380:4;47377:1;47370:15;47404:4;47401:1;47394:15;47421:180;47469:77;47466:1;47459:88;47566:4;47563:1;47556:15;47590:4;47587:1;47580:15;47607:117;47716:1;47713;47706:12;47730:117;47839:1;47836;47829:12;47853:117;47962:1;47959;47952:12;47976:117;48085:1;48082;48075:12;48099:117;48208:1;48205;48198:12;48222:117;48331:1;48328;48321:12;48345:102;48386:6;48437:2;48433:7;48428:2;48421:5;48417:14;48413:28;48403:38;;48345:102;;;:::o;48453:242::-;48593:34;48589:1;48581:6;48577:14;48570:58;48662:25;48657:2;48649:6;48645:15;48638:50;48453:242;:::o;48701:230::-;48841:34;48837:1;48829:6;48825:14;48818:58;48910:13;48905:2;48897:6;48893:15;48886:38;48701:230;:::o;48937:237::-;49077:34;49073:1;49065:6;49061:14;49054:58;49146:20;49141:2;49133:6;49129:15;49122:45;48937:237;:::o;49180:225::-;49320:34;49316:1;49308:6;49304:14;49297:58;49389:8;49384:2;49376:6;49372:15;49365:33;49180:225;:::o;49411:178::-;49551:30;49547:1;49539:6;49535:14;49528:54;49411:178;:::o;49595:::-;49735:30;49731:1;49723:6;49719:14;49712:54;49595:178;:::o;49779:176::-;49919:28;49915:1;49907:6;49903:14;49896:52;49779:176;:::o;49961:223::-;50101:34;50097:1;50089:6;50085:14;50078:58;50170:6;50165:2;50157:6;50153:15;50146:31;49961:223;:::o;50190:175::-;50330:27;50326:1;50318:6;50314:14;50307:51;50190:175;:::o;50371:231::-;50511:34;50507:1;50499:6;50495:14;50488:58;50580:14;50575:2;50567:6;50563:15;50556:39;50371:231;:::o;50608:165::-;50748:17;50744:1;50736:6;50732:14;50725:41;50608:165;:::o;50779:243::-;50919:34;50915:1;50907:6;50903:14;50896:58;50988:26;50983:2;50975:6;50971:15;50964:51;50779:243;:::o;51028:229::-;51168:34;51164:1;51156:6;51152:14;51145:58;51237:12;51232:2;51224:6;51220:15;51213:37;51028:229;:::o;51263:228::-;51403:34;51399:1;51391:6;51387:14;51380:58;51472:11;51467:2;51459:6;51455:15;51448:36;51263:228;:::o;51497:182::-;51637:34;51633:1;51625:6;51621:14;51614:58;51497:182;:::o;51685:292::-;51825:34;51821:1;51813:6;51809:14;51802:58;51894:34;51889:2;51881:6;51877:15;51870:59;51963:6;51958:2;51950:6;51946:15;51939:31;51685:292;:::o;51983:163::-;52123:15;52119:1;52111:6;52107:14;52100:39;51983:163;:::o;52152:231::-;52292:34;52288:1;52280:6;52276:14;52269:58;52361:14;52356:2;52348:6;52344:15;52337:39;52152:231;:::o;52389:155::-;52529:7;52525:1;52517:6;52513:14;52506:31;52389:155;:::o;52550:182::-;52690:34;52686:1;52678:6;52674:14;52667:58;52550:182;:::o;52738:176::-;52878:28;52874:1;52866:6;52862:14;52855:52;52738:176;:::o;52920:178::-;53060:30;53056:1;53048:6;53044:14;53037:54;52920:178;:::o;53104:228::-;53244:34;53240:1;53232:6;53228:14;53221:58;53313:11;53308:2;53300:6;53296:15;53289:36;53104:228;:::o;53338:234::-;53478:34;53474:1;53466:6;53462:14;53455:58;53547:17;53542:2;53534:6;53530:15;53523:42;53338:234;:::o;53578:181::-;53718:33;53714:1;53706:6;53702:14;53695:57;53578:181;:::o;53765:220::-;53905:34;53901:1;53893:6;53889:14;53882:58;53974:3;53969:2;53961:6;53957:15;53950:28;53765:220;:::o;53991:236::-;54131:34;54127:1;54119:6;54115:14;54108:58;54200:19;54195:2;54187:6;54183:15;54176:44;53991:236;:::o;54233:166::-;54373:18;54369:1;54361:6;54357:14;54350:42;54233:166;:::o;54405:231::-;54545:34;54541:1;54533:6;54529:14;54522:58;54614:14;54609:2;54601:6;54597:15;54590:39;54405:231;:::o;54642:235::-;54782:34;54778:1;54770:6;54766:14;54759:58;54851:18;54846:2;54838:6;54834:15;54827:43;54642:235;:::o;54883:122::-;54956:24;54974:5;54956:24;:::i;:::-;54949:5;54946:35;54936:63;;54995:1;54992;54985:12;54936:63;54883:122;:::o;55011:116::-;55081:21;55096:5;55081:21;:::i;:::-;55074:5;55071:32;55061:60;;55117:1;55114;55107:12;55061:60;55011:116;:::o;55133:120::-;55205:23;55222:5;55205:23;:::i;:::-;55198:5;55195:34;55185:62;;55243:1;55240;55233:12;55185:62;55133:120;:::o;55259:180::-;55361:53;55408:5;55361:53;:::i;:::-;55354:5;55351:64;55341:92;;55429:1;55426;55419:12;55341:92;55259:180;:::o;55445:122::-;55518:24;55536:5;55518:24;:::i;:::-;55511:5;55508:35;55498:63;;55557:1;55554;55547:12;55498:63;55445:122;:::o
Swarm Source
ipfs://17b5e52b3fbb21de6f5c62a6e1c86f1112c61488def0107f0592e0a3dbe28f96
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.