ERC-20
Overview
Max Total Supply
519,104,172.0000000000000021 OPTIX
Holders
420
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
6,417,370 OPTIXValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Optix
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-11 */ // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ 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); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/Optix.sol pragma solidity ^0.8.4; /**************************************************************** * OPTIX by The Blinkless: The Official Currency of New Cornea * "Soft" stake your favorite NFTs * code by @digitalkemical *****************************************************************/ contract Optix is ERC20, ERC20Burnable, Ownable { //define a stake structure struct Stake{ address contractAddress; address ownerAddress; uint startTime; uint tokenId; } //define a collection structure struct Collection{ address contractAddress; uint hourlyReward; } //define variables mapping( address => mapping(uint => Stake ) ) public openStakes; //mapping of all open stakes by collection address mapping( address => mapping( address => uint[] ) ) public myActiveCollections; //mapping of wallet address to all active collections mapping( address => bool ) public hasMigrated; //bool tracker of who has migrated from v1 Collection[] public collections; //array of NFT collections that can be staked address[] public freeCollections; //array of contract addresses for collections with no fee address v1ContractAddress = 0xcEE33d20845038Df71B88041B28c3654CF05ae2f; //address to v1 Optix contract (for migration) address payoutWallet = 0xeD2faa60373eC70E57B39152aeE5Ce4ed7C333c7; //wallet for payouts uint migrationMode = 1; //turn on/off migrations uint public thirdPartyFee = 0.001 ether; //fee to charge for 3rd party stakes //run on deploy constructor() ERC20("Optix", "OPTIX") {} /** * Owner can mint more tokens */ function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } /** * Migrate balance from v1 contract */ function migrateFromv1() public{ require(migrationMode == 1, "Migration period has closed."); require(hasMigrated[msg.sender] == false, "You have already migrated."); uint oldBalance = IERC20(v1ContractAddress).balanceOf(msg.sender); hasMigrated[msg.sender] = true; _mint(msg.sender, oldBalance + 100000 ether); } /** * Add a collection to the staking options */ function addCollection(address _contractAddress, uint _hourlyReward) public onlyOwner{ collections.push( Collection( _contractAddress, _hourlyReward ) ); } /** * Update the third party fee */ function updateThirdPartyFee(uint _fee) public onlyOwner{ thirdPartyFee = _fee; } /** * Update the migration mode */ function updateMigrationMode(uint _migrationMode) public onlyOwner{ migrationMode = _migrationMode; } /** * Add a collection to free collection list */ function addToFreeCollections(address _contractAddress) public onlyOwner{ freeCollections.push(_contractAddress); } /** * Update the v1 contract address */ function updateV1Contract(address _v1ContractAddress) public onlyOwner{ v1ContractAddress = _v1ContractAddress; } /** * Update the payout wallet address */ function updatePayoutWallet(address _payoutWallet) public onlyOwner{ payoutWallet = _payoutWallet; } /** * Remove a collection from the free collection list */ function removeFreeCollection(address _contractAddress) public onlyOwner{ uint i = 0; while(i < freeCollections.length){ if(freeCollections[i] == _contractAddress){ freeCollections[i] = freeCollections[freeCollections.length-1]; freeCollections.pop(); } i++; } } /** * Remove a collection from the staking options */ function removeCollection(address _contractAddress) public onlyOwner{ uint i = 0; while(i < collections.length){ if(collections[i].contractAddress == _contractAddress){ collections[i] = collections[collections.length-1]; collections.pop(); } i++; } } /** * Get all available collections */ function getAllCollections() public view returns(Collection[] memory _collections){ return collections; } /** * Get all free collections */ function getAllFreeCollections() public view returns(address[] memory _collections){ return freeCollections; } /** * Get a collection */ function getCollection(address _contractAddress) public view returns(Collection memory _collections){ uint i = 0; while(i < collections.length){ if(collections[i].contractAddress == _contractAddress){ return collections[i]; } i++; } } /** * Open a new soft stake (tokens are never locked) */ function openStake(address _contractAddress, uint[] memory _tokenIds) public payable { //check if collection is approved require(collectionIsApproved(_contractAddress),"This collection has not been approved."); bool isFree = false; uint i = 0; while(i < freeCollections.length){ if(freeCollections[i] == _contractAddress){ isFree = true; } i++; } //charge a withdrawal fee for 3rd party collections if(!isFree){ require(msg.value >= thirdPartyFee * _tokenIds.length, "Insufficient funds to open 3rd-party stake."); } uint counter = 0; while(counter < _tokenIds.length){ uint _tokenId = _tokenIds[counter]; //ensure sender is owner of token and collection is approved require(IERC721(_contractAddress).ownerOf(_tokenId) == msg.sender,"Could not verify ownership!"); //if trying to open a stake previously owned, update the stake owner if(checkForStake(_contractAddress,_tokenId) && openStakes[_contractAddress][_tokenId].ownerAddress != msg.sender){ updateOwnership( _contractAddress, _tokenId ); } //make sure stake doesn't already exist if(!checkForStake(_contractAddress,_tokenId)){ //create a new stake openStakes[_contractAddress][_tokenId]= Stake( _contractAddress, msg.sender, block.timestamp, _tokenId ) ; //add collection to active list addToActiveList(_contractAddress, _tokenId); } counter++; } } /** * Add an active collection to a wallet */ function addToActiveList(address _contractAddress, uint _tokenId) internal { uint i = 0; bool exists = false; while(i < myActiveCollections[msg.sender][_contractAddress].length){ if(myActiveCollections[msg.sender][_contractAddress][i] == _tokenId){ exists = true; } i++; } //if it doesnt already exist, add it if(!exists){ myActiveCollections[msg.sender][_contractAddress].push(_tokenId); } } /** * Get the active list for the wallet by collection contract address */ function getActiveList(address _contractAddress) external view returns(uint[] memory _activeList){ //get list of active collections for sender return myActiveCollections[msg.sender][_contractAddress]; } /** * Verify that a collection being staked has been approved */ function collectionIsApproved(address _contractAddress) public view returns(bool _approved){ uint i = 0; while(i < collections.length){ if(collections[i].contractAddress == _contractAddress){ return true; } i++; } return false; } /** * Check if a stake exists already */ function checkForStake(address _contractAddress, uint _tokenId) public view returns(bool _exists){ if(openStakes[_contractAddress][_tokenId].startTime > 0){ return true; } return false; } /** * Get a stake */ function getStake(address _contractAddress, uint _tokenId) public view returns(Stake memory _exists){ return openStakes[_contractAddress][_tokenId]; } /** * Calculate stake reward for a token */ function calculateStakeReward(address _contractAddress, uint _tokenId) public view returns(uint _totalReward){ //get the stake Stake memory closingStake = getStake( _contractAddress, _tokenId ); //get collection data Collection memory stakedCollection = getCollection(_contractAddress); //calc hours in between start and now uint hoursDiff = (block.timestamp - closingStake.startTime) / 60 / 60; //calc total reward uint totalReward = hoursDiff * stakedCollection.hourlyReward; return totalReward; } /** * Close a stake and claim reward */ function closeStake(address _contractAddress, uint[] memory _tokenIds) public payable returns(uint _totalReward){ uint totalReward = 0; uint counter = 0; while(counter < _tokenIds.length){ uint _tokenId = _tokenIds[counter]; bool isFree = false; uint i2 = 0; while(i2 < freeCollections.length){ if(freeCollections[i2] == _contractAddress){ isFree = true; } i2++; } //charge a withdrawal fee for 3rd party collections - Blinkless NFTs will be zero if(!isFree){ require(msg.value >= thirdPartyFee * _tokenIds.length, "Insufficient funds to open 3rd-party stake."); } if(checkForStake(_contractAddress,_tokenId) && IERC721(_contractAddress).ownerOf(_tokenId) == msg.sender){ //calculate end of stake reward totalReward += calculateStakeReward(_contractAddress, _tokenId); //stake has been identified, remove stake delete(openStakes[_contractAddress][_tokenId]); //remove from active list uint i = 0; while(i < myActiveCollections[msg.sender][_contractAddress].length){ if(myActiveCollections[msg.sender][_contractAddress][i] == _tokenId){ myActiveCollections[msg.sender][_contractAddress][i] = myActiveCollections[msg.sender][_contractAddress][myActiveCollections[msg.sender][_contractAddress].length-1]; myActiveCollections[msg.sender][_contractAddress].pop(); } i++; } } counter++; } //award tokens if(totalReward > 0){ _mint(msg.sender, totalReward); } return totalReward; } /** * Claim rewards from multiple stakes at once without closing */ function claimWithoutClosing(address _contractAddress, uint[] memory _tokenIds) public returns(uint _totalReward){ uint totalReward = 0; uint counter = 0; while(counter < _tokenIds.length){ uint _tokenId = _tokenIds[counter]; if(checkForStake(_contractAddress,_tokenId) && IERC721(_contractAddress).ownerOf(_tokenId) == msg.sender){ //calculate end of stake reward totalReward += calculateStakeReward(_contractAddress, _tokenId); //stake has been identified, update the timestamp openStakes[_contractAddress][_tokenId].startTime = block.timestamp; } counter++; } //award tokens if(totalReward > 0){ _mint(msg.sender, totalReward); } return totalReward; } /** * Claim rewards from all stakes without closing */ function claimAllWithoutClosing() public returns(uint _totalReward){ uint totalReward = 0; uint collectionCounter = 0; while(collectionCounter < collections.length){ address _contractAddress = collections[collectionCounter].contractAddress; uint[] memory _tokenIds = myActiveCollections[msg.sender][_contractAddress]; uint counter = 0; while(counter < _tokenIds.length){ uint _tokenId = _tokenIds[counter]; if(checkForStake(_contractAddress,_tokenId) && IERC721(_contractAddress).ownerOf(_tokenId) == msg.sender){ //calculate end of stake reward totalReward += calculateStakeReward(_contractAddress, _tokenId); //stake has been identified, update the timestamp openStakes[_contractAddress][_tokenId].startTime = block.timestamp; } counter++; } collectionCounter++; } //award tokens if(totalReward > 0){ _mint(msg.sender, totalReward); } return totalReward; } /** * Update the ownership of a stake to match the NFT owner */ function updateOwnership(address _contractAddress, uint _tokenId) public{ //get the NFT owner address tokenOwner = IERC721(_contractAddress).ownerOf(_tokenId); if(openStakes[_contractAddress][_tokenId].ownerAddress != address(0) && openStakes[_contractAddress][_tokenId].ownerAddress != tokenOwner ){ //stake exists, update owner uint i = 0; while(i < myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress].length){ if(myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress][i] == _tokenId){ //delete active collection myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress][i] = myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress][myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress].length-1]; myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress].pop(); } i++; } //update stake ownership myActiveCollections[tokenOwner][_contractAddress].push(_tokenId); openStakes[_contractAddress][_tokenId].ownerAddress = tokenOwner; } } /* * Withdraw by owner */ function withdraw() external onlyOwner { (bool success, ) = payable(payoutWallet).call{value: address(this).balance}(""); require(success, "Transfer failed."); } /* * These are here to receive ETH sent to the contract address */ receive() external payable {} fallback() external payable {} }
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":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_hourlyReward","type":"uint256"}],"name":"addCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"addToFreeCollections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"calculateStakeReward","outputs":[{"internalType":"uint256","name":"_totalReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"checkForStake","outputs":[{"internalType":"bool","name":"_exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllWithoutClosing","outputs":[{"internalType":"uint256","name":"_totalReward","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimWithoutClosing","outputs":[{"internalType":"uint256","name":"_totalReward","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"closeStake","outputs":[{"internalType":"uint256","name":"_totalReward","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"collectionIsApproved","outputs":[{"internalType":"bool","name":"_approved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collections","outputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"hourlyReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"freeCollections","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"getActiveList","outputs":[{"internalType":"uint256[]","name":"_activeList","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllCollections","outputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"hourlyReward","type":"uint256"}],"internalType":"struct Optix.Collection[]","name":"_collections","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllFreeCollections","outputs":[{"internalType":"address[]","name":"_collections","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"getCollection","outputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"hourlyReward","type":"uint256"}],"internalType":"struct Optix.Collection","name":"_collections","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getStake","outputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct Optix.Stake","name":"_exists","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasMigrated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrateFromv1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"myActiveCollections","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"openStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"openStakes","outputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"removeCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"removeFreeCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thirdPartyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_migrationMode","type":"uint256"}],"name":"updateMigrationMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"updateOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payoutWallet","type":"address"}],"name":"updatePayoutWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateThirdPartyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_v1ContractAddress","type":"address"}],"name":"updateV1Contract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405273cee33d20845038df71b88041b28c3654cf05ae2f600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ed2faa60373ec70e57b39152aee5ce4ed7c333c7600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d5566038d7ea4c68000600e55348015620000cb57600080fd5b506040518060400160405280600581526020017f4f707469780000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4f5054495800000000000000000000000000000000000000000000000000000081525081600390805190602001906200015092919062000260565b5080600490805190602001906200016992919062000260565b5050506200018c620001806200019260201b60201c565b6200019a60201b60201c565b62000375565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026e9062000310565b90600052602060002090601f016020900481019282620002925760008555620002de565b82601f10620002ad57805160ff1916838001178555620002de565b82800160010185558215620002de579182015b82811115620002dd578251825591602001919060010190620002c0565b5b509050620002ed9190620002f1565b5090565b5b808211156200030c576000816000905550600101620002f2565b5090565b600060028204905060018216806200032957607f821691505b6020821081141562000340576200033f62000346565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615e9a80620003856000396000f3fe6080604052600436106102815760003560e01c806370a082311161014f578063aef78631116100c1578063e40de8871161007a578063e40de88714610a15578063ed832b8414610a52578063f2fde38b14610a6e578063fcc4628b14610a97578063fdbda0ec14610ac0578063ff26bbac14610afe57610288565b8063aef78631146108c6578063affab25814610903578063c4e977c814610933578063cfd476631461095e578063d7625c881461099b578063dd62ed3e146109d857610288565b80638da5cb5b116101135780638da5cb5b146107b657806395d89b41146107e1578063a457c2d71461080c578063a9059cbb14610849578063abacfc2614610886578063ac4d7e95146108af57610288565b806370a08231146106e7578063712c70ba14610724578063715018a61461074d57806379cc67901461076457806382a3bfad1461078d57610288565b806333a2b24d116101f357806342966c68116101ac57806342966c68146105c75780634ab2e523146105f05780635028d05a1461062d5780635c3d25ca1461065657806360391c921461067f5780636804a958146106bc57610288565b806333a2b24d146104cb5780633510103e146104f6578063395093511461051f5780633b28a0a61461055c5780633ccfd60b1461058757806340c10f191461059e57610288565b806318160ddd1161024557806318160ddd146103a957806319f101fa146103d457806322143290146103fd57806323b872dd1461042657806328746bf014610463578063313ce567146104a057610288565b806306fdde031461028a578063094615e4146102b5578063095ea7b3146102f25780630da4540f1461032f578063175d20241461036c57610288565b3661028857005b005b34801561029657600080fd5b5061029f610b3e565b6040516102ac9190615236565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190614b7c565b610bd0565b6040516102e9919061512c565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190614b3c565b610c0f565b604051610326919061521b565b60405180910390f35b34801561033b57600080fd5b50610356600480360381019061035191906149f3565b610c32565b604051610363919061521b565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190614b3c565b610ce8565b6040516103a0919061521b565b60405180910390f35b3480156103b557600080fd5b506103be610d59565b6040516103cb91906154ce565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190614b3c565b610d63565b005b34801561040957600080fd5b50610424600480360381019061041f9190614b7c565b610e8c565b005b34801561043257600080fd5b5061044d60048036038101906104489190614a8d565b610f12565b60405161045a919061521b565b60405180910390f35b34801561046f57600080fd5b5061048a60048036038101906104859190614ae0565b610f41565b60405161049791906154ce565b60405180910390f35b3480156104ac57600080fd5b506104b56110e4565b6040516104c291906154e9565b60405180910390f35b3480156104d757600080fd5b506104e06110ed565b6040516104ed91906154ce565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190614b7c565b6113cc565b005b34801561052b57600080fd5b5061054660048036038101906105419190614b3c565b611452565b604051610553919061521b565b60405180910390f35b34801561056857600080fd5b50610571611489565b60405161057e91906151b5565b60405180910390f35b34801561059357600080fd5b5061059c611517565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190614b3c565b611664565b005b3480156105d357600080fd5b506105ee60048036038101906105e99190614b7c565b6116ee565b005b3480156105fc57600080fd5b50610617600480360381019061061291906149f3565b611702565b60405161062491906151f9565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f91906149f3565b6117d6565b005b34801561066257600080fd5b5061067d600480360381019061067891906149f3565b611a16565b005b34801561068b57600080fd5b506106a660048036038101906106a19190614b3c565b611ad6565b6040516106b391906154ce565b60405180910390f35b3480156106c857600080fd5b506106d1611b3e565b6040516106de91906151d7565b60405180910390f35b3480156106f357600080fd5b5061070e600480360381019061070991906149f3565b611bfd565b60405161071b91906154ce565b60405180910390f35b34801561073057600080fd5b5061074b60048036038101906107469190614b3c565b611c45565b005b34801561075957600080fd5b506107626125b4565b005b34801561077057600080fd5b5061078b60048036038101906107869190614b3c565b61263c565b005b34801561079957600080fd5b506107b460048036038101906107af91906149f3565b61265c565b005b3480156107c257600080fd5b506107cb61273e565b6040516107d8919061512c565b60405180910390f35b3480156107ed57600080fd5b506107f6612768565b6040516108039190615236565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190614b3c565b6127fa565b604051610840919061521b565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b9190614b3c565b612871565b60405161087d919061521b565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906149f3565b612894565b005b3480156108bb57600080fd5b506108c4612a9d565b005b3480156108d257600080fd5b506108ed60048036038101906108e89190614a8d565b612c9e565b6040516108fa91906154ce565b60405180910390f35b61091d60048036038101906109189190614ae0565b612cdc565b60405161092a91906154ce565b60405180910390f35b34801561093f57600080fd5b5061094861336d565b60405161095591906154ce565b60405180910390f35b34801561096a57600080fd5b5061098560048036038101906109809190614b3c565b613373565b60405161099291906154b3565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd91906149f3565b61349e565b6040516109cf919061521b565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190614a4d565b6134be565b604051610a0c91906154ce565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a3791906149f3565b613545565b604051610a499190615498565b60405180910390f35b610a6c6004803603810190610a679190614ae0565b613685565b005b348015610a7a57600080fd5b50610a956004803603810190610a9091906149f3565b613b1b565b005b348015610aa357600080fd5b50610abe6004803603810190610ab991906149f3565b613c13565b005b348015610acc57600080fd5b50610ae76004803603810190610ae29190614b7c565b613cd3565b604051610af592919061518c565b60405180910390f35b348015610b0a57600080fd5b50610b256004803603810190610b209190614b3c565b613d27565b604051610b359493929190615147565b60405180910390f35b606060038054610b4d906157c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b79906157c4565b8015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b5050505050905090565b600a8181548110610be057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610c1a613da4565b9050610c27818585613dac565b600191505092915050565b600080600090505b600980549050811015610cdd578273ffffffffffffffffffffffffffffffffffffffff1660098281548110610c7257610c7161592c565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610cca576001915050610ce3565b8080610cd590615827565b915050610c3a565b60009150505b919050565b600080600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600201541115610d4e5760019050610d53565b600090505b92915050565b6000600254905090565b610d6b613da4565b73ffffffffffffffffffffffffffffffffffffffff16610d8961273e565b73ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690615378565b60405180910390fd5b600960405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b610e94613da4565b73ffffffffffffffffffffffffffffffffffffffff16610eb261273e565b73ffffffffffffffffffffffffffffffffffffffff1614610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90615378565b60405180910390fd5b80600d8190555050565b600080610f1d613da4565b9050610f2a858285613f77565b610f35858585614003565b60019150509392505050565b6000806000905060005b83518110156110c5576000848281518110610f6957610f6861592c565b5b60200260200101519050610f7d8682610ce8565b801561103c57503373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610fd491906154ce565b60206040518083038186803b158015610fec57600080fd5b505afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190614a20565b73ffffffffffffffffffffffffffffffffffffffff16145b156110b15761104b8682611ad6565b836110569190615627565b925042600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201819055505b81806110bc90615827565b92505050610f4b565b60008211156110d9576110d83383614284565b5b819250505092915050565b60006012905090565b6000806000905060005b6009805490508110156113b05760006009828154811061111a5761111961592c565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561121657602002820191906000526020600020905b815481526020019060010190808311611202575b5050505050905060005b815181101561139a57600082828151811061123e5761123d61592c565b5b602002602001015190506112528482610ce8565b801561131157503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016112a991906154ce565b60206040518083038186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f99190614a20565b73ffffffffffffffffffffffffffffffffffffffff16145b15611386576113208482611ad6565b8661132b9190615627565b955042600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201819055505b818061139190615827565b92505050611220565b83806113a590615827565b9450505050506110f7565b60008211156113c4576113c33383614284565b5b819250505090565b6113d4613da4565b73ffffffffffffffffffffffffffffffffffffffff166113f261273e565b73ffffffffffffffffffffffffffffffffffffffff1614611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f90615378565b60405180910390fd5b80600e8190555050565b60008061145d613da4565b905061147e81858561146f85896134be565b6114799190615627565b613dac565b600191505092915050565b6060600a80548060200260200160405190810160405280929190818152602001828054801561150d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116114c3575b5050505050905090565b61151f613da4565b73ffffffffffffffffffffffffffffffffffffffff1661153d61273e565b73ffffffffffffffffffffffffffffffffffffffff1614611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90615378565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516115db90615117565b60006040518083038185875af1925050503d8060008114611618576040519150601f19603f3d011682016040523d82523d6000602084013e61161d565b606091505b5050905080611661576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611658906153f8565b60405180910390fd5b50565b61166c613da4565b73ffffffffffffffffffffffffffffffffffffffff1661168a61273e565b73ffffffffffffffffffffffffffffffffffffffff16146116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790615378565b60405180910390fd5b6116ea8282614284565b5050565b6116ff6116f9613da4565b826143e4565b50565b6060600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156117ca57602002820191906000526020600020905b8154815260200190600101908083116117b6575b50505050509050919050565b6117de613da4565b73ffffffffffffffffffffffffffffffffffffffff166117fc61273e565b73ffffffffffffffffffffffffffffffffffffffff1614611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184990615378565b60405180910390fd5b60005b600980549050811015611a12578173ffffffffffffffffffffffffffffffffffffffff166009828154811061188d5761188c61592c565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119ff57600960016009805490506118ef9190615708565b81548110611900576118ff61592c565b5b9060005260206000209060020201600982815481106119225761192161592c565b5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001820154816001015590505060098054806119b6576119b56158fd565b5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160009055505090555b8080611a0a90615827565b915050611855565b5050565b611a1e613da4565b73ffffffffffffffffffffffffffffffffffffffff16611a3c61273e565b73ffffffffffffffffffffffffffffffffffffffff1614611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8990615378565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611ae38484613373565b90506000611af085613545565b90506000603c80846040015142611b079190615708565b611b11919061567d565b611b1b919061567d565b90506000826020015182611b2f91906156ae565b90508094505050505092915050565b60606009805480602002602001604051908101604052809291908181526020016000905b82821015611bf457838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190611b62565b50505050905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611c8091906154ce565b60206040518083038186803b158015611c9857600080fd5b505afa158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd09190614a20565b9050600073ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611e2157508073ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156125af5760005b60076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015612478578260076000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106120255761202461592c565b5b906000526020600020015414156124655760076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160076000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506122249190615708565b815481106122355761223461592c565b5b906000526020600020015460076000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106123415761234061592c565b5b906000526020600020018190555060076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061244e5761244d6158fd565b5b600190038181906000526020600020016000905590555b808061247090615827565b915050611e29565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083908060018154018082558091505060019003906000526020600020016000909190919091505581600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b505050565b6125bc613da4565b73ffffffffffffffffffffffffffffffffffffffff166125da61273e565b73ffffffffffffffffffffffffffffffffffffffff1614612630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262790615378565b60405180910390fd5b61263a60006145bb565b565b61264e82612648613da4565b83613f77565b61265882826143e4565b5050565b612664613da4565b73ffffffffffffffffffffffffffffffffffffffff1661268261273e565b73ffffffffffffffffffffffffffffffffffffffff16146126d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cf90615378565b60405180910390fd5b600a819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054612777906157c4565b80601f01602080910402602001604051908101604052809291908181526020018280546127a3906157c4565b80156127f05780601f106127c5576101008083540402835291602001916127f0565b820191906000526020600020905b8154815290600101906020018083116127d357829003601f168201915b5050505050905090565b600080612805613da4565b9050600061281382866134be565b905083811015612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284f90615458565b60405180910390fd5b6128658286868403613dac565b60019250505092915050565b60008061287c613da4565b9050612889818585614003565b600191505092915050565b61289c613da4565b73ffffffffffffffffffffffffffffffffffffffff166128ba61273e565b73ffffffffffffffffffffffffffffffffffffffff1614612910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290790615378565b60405180910390fd5b60005b600a80549050811015612a99578173ffffffffffffffffffffffffffffffffffffffff16600a828154811061294b5761294a61592c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a8657600a6001600a805490506129a69190615708565b815481106129b7576129b661592c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a82815481106129f6576129f561592c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a805480612a5057612a4f6158fd565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b8080612a9190615827565b915050612913565b5050565b6001600d5414612ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad990615358565b60405180910390fd5b60001515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6c906153d8565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612bd2919061512c565b60206040518083038186803b158015612bea57600080fd5b505afa158015612bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c229190614ba9565b90506001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612c9b3369152d02c7e14af680000083612c969190615627565b614284565b50565b60076020528260005260406000206020528160005260406000208181548110612cc657600080fd5b9060005260206000200160009250925050505481565b6000806000905060005b835181101561334e576000848281518110612d0457612d0361592c565b5b602002602001015190506000805b600a80549050811015612da9578773ffffffffffffffffffffffffffffffffffffffff16600a8281548110612d4a57612d4961592c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d9657600191505b8080612da190615827565b915050612d12565b81612e00578651600e54612dbd91906156ae565b341015612dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df690615298565b60405180910390fd5b5b612e0a8884610ce8565b8015612ec957503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401612e6191906154ce565b60206040518083038186803b158015612e7957600080fd5b505afa158015612e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb19190614a20565b73ffffffffffffffffffffffffffffffffffffffff16145b1561333857612ed88884611ad6565b85612ee39190615627565b9450600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055505060005b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156133365783600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106130af576130ae61592c565b5b9060005260206000200154141561332357600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506131c89190615708565b815481106131d9576131d861592c565b5b9060005260206000200154600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106132725761327161592c565b5b9060005260206000200181905550600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061330c5761330b6158fd565b5b600190038181906000526020600020016000905590555b808061332e90615827565b915050612f99565b505b838061334390615827565b945050505050612ce6565b6000821115613362576133613383614284565b5b819250505092915050565b600e5481565b61337b61487d565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481525050905092915050565b60086020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61354d6148d1565b60005b60098054905081101561367e578273ffffffffffffffffffffffffffffffffffffffff16600982815481106135885761358761592c565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561366b57600981815481106135ea576135e961592c565b5b90600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050915050613680565b808061367690615827565b915050613550565b505b919050565b61368e82610c32565b6136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c490615338565b60405180910390fd5b6000805b600a80549050811015613768578373ffffffffffffffffffffffffffffffffffffffff16600a82815481106137095761370861592c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561375557600191505b808061376090615827565b9150506136d1565b816137bf578251600e5461377c91906156ae565b3410156137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590615298565b60405180910390fd5b5b60005b8351811015613b145760008482815181106137e0576137df61592c565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161383a91906154ce565b60206040518083038186803b15801561385257600080fd5b505afa158015613866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388a9190614a20565b73ffffffffffffffffffffffffffffffffffffffff16146138e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d790615438565b60405180910390fd5b6138ea8682610ce8565b801561399557503373ffffffffffffffffffffffffffffffffffffffff16600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156139a5576139a48682611c45565b5b6139af8682610ce8565b613b005760405180608001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200142815260200182815250600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030155905050613aff8682614681565b5b8180613b0b90615827565b925050506137c2565b5050505050565b613b23613da4565b73ffffffffffffffffffffffffffffffffffffffff16613b4161273e565b73ffffffffffffffffffffffffffffffffffffffff1614613b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8e90615378565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfe906152b8565b60405180910390fd5b613c10816145bb565b50565b613c1b613da4565b73ffffffffffffffffffffffffffffffffffffffff16613c3961273e565b73ffffffffffffffffffffffffffffffffffffffff1614613c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8690615378565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60098181548110613ce357600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b6006602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154905084565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e1390615418565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e83906152d8565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051613f6a91906154ce565b60405180910390a3505050565b6000613f8384846134be565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114613ffd5781811015613fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe6906152f8565b60405180910390fd5b613ffc8484848403613dac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161406a906153b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156140e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140da90615258565b60405180910390fd5b6140ee838383614873565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015614174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161416b90615318565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142079190615627565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161426b91906154ce565b60405180910390a361427e848484614878565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156142f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142eb90615478565b60405180910390fd5b61430060008383614873565b80600260008282546143129190615627565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143679190615627565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516143cc91906154ce565b60405180910390a36143e060008383614878565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161444b90615398565b60405180910390fd5b61446082600083614873565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156144e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144dd90615278565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461453d9190615708565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516145a291906154ce565b60405180910390a36145b683600084614878565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000805b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508210156147c45782600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061479b5761479a61592c565b5b906000526020600020015414156147b157600190505b81806147bc90615827565b925050614685565b8061486d57600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150555b50505050565b505050565b505050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600061491461490f84615529565b615504565b905080838252602082019050828560208602820111156149375761493661598f565b5b60005b85811015614967578161494d88826149c9565b84526020840193506020830192505060018101905061493a565b5050509392505050565b60008135905061498081615e36565b92915050565b60008151905061499581615e36565b92915050565b600082601f8301126149b0576149af61598a565b5b81356149c0848260208601614901565b91505092915050565b6000813590506149d881615e4d565b92915050565b6000815190506149ed81615e4d565b92915050565b600060208284031215614a0957614a08615999565b5b6000614a1784828501614971565b91505092915050565b600060208284031215614a3657614a35615999565b5b6000614a4484828501614986565b91505092915050565b60008060408385031215614a6457614a63615999565b5b6000614a7285828601614971565b9250506020614a8385828601614971565b9150509250929050565b600080600060608486031215614aa657614aa5615999565b5b6000614ab486828701614971565b9350506020614ac586828701614971565b9250506040614ad6868287016149c9565b9150509250925092565b60008060408385031215614af757614af6615999565b5b6000614b0585828601614971565b925050602083013567ffffffffffffffff811115614b2657614b25615994565b5b614b328582860161499b565b9150509250929050565b60008060408385031215614b5357614b52615999565b5b6000614b6185828601614971565b9250506020614b72858286016149c9565b9150509250929050565b600060208284031215614b9257614b91615999565b5b6000614ba0848285016149c9565b91505092915050565b600060208284031215614bbf57614bbe615999565b5b6000614bcd848285016149de565b91505092915050565b6000614be28383614c1e565b60208301905092915050565b6000614bfa8383615037565b60408301905092915050565b6000614c1283836150ea565b60208301905092915050565b614c278161573c565b82525050565b614c368161573c565b82525050565b6000614c4782615585565b614c5181856155d8565b9350614c5c83615555565b8060005b83811015614c8d578151614c748882614bd6565b9750614c7f836155b1565b925050600181019050614c60565b5085935050505092915050565b6000614ca582615590565b614caf81856155e9565b9350614cba83615565565b8060005b83811015614ceb578151614cd28882614bee565b9750614cdd836155be565b925050600181019050614cbe565b5085935050505092915050565b6000614d038261559b565b614d0d81856155fa565b9350614d1883615575565b8060005b83811015614d49578151614d308882614c06565b9750614d3b836155cb565b925050600181019050614d1c565b5085935050505092915050565b614d5f8161574e565b82525050565b6000614d70826155a6565b614d7a8185615616565b9350614d8a818560208601615791565b614d938161599e565b840191505092915050565b6000614dab602383615616565b9150614db6826159af565b604082019050919050565b6000614dce602283615616565b9150614dd9826159fe565b604082019050919050565b6000614df1602b83615616565b9150614dfc82615a4d565b604082019050919050565b6000614e14602683615616565b9150614e1f82615a9c565b604082019050919050565b6000614e37602283615616565b9150614e4282615aeb565b604082019050919050565b6000614e5a601d83615616565b9150614e6582615b3a565b602082019050919050565b6000614e7d602683615616565b9150614e8882615b63565b604082019050919050565b6000614ea0602683615616565b9150614eab82615bb2565b604082019050919050565b6000614ec3601c83615616565b9150614ece82615c01565b602082019050919050565b6000614ee6602083615616565b9150614ef182615c2a565b602082019050919050565b6000614f09602183615616565b9150614f1482615c53565b604082019050919050565b6000614f2c602583615616565b9150614f3782615ca2565b604082019050919050565b6000614f4f601a83615616565b9150614f5a82615cf1565b602082019050919050565b6000614f7260008361560b565b9150614f7d82615d1a565b600082019050919050565b6000614f95601083615616565b9150614fa082615d1d565b602082019050919050565b6000614fb8602483615616565b9150614fc382615d46565b604082019050919050565b6000614fdb601b83615616565b9150614fe682615d95565b602082019050919050565b6000614ffe602583615616565b915061500982615dbe565b604082019050919050565b6000615021601f83615616565b915061502c82615e0d565b602082019050919050565b60408201600082015161504d6000850182614c1e565b50602082015161506060208501826150ea565b50505050565b60408201600082015161507c6000850182614c1e565b50602082015161508f60208501826150ea565b50505050565b6080820160008201516150ab6000850182614c1e565b5060208201516150be6020850182614c1e565b5060408201516150d160408501826150ea565b5060608201516150e460608501826150ea565b50505050565b6150f38161577a565b82525050565b6151028161577a565b82525050565b61511181615784565b82525050565b600061512282614f65565b9150819050919050565b60006020820190506151416000830184614c2d565b92915050565b600060808201905061515c6000830187614c2d565b6151696020830186614c2d565b61517660408301856150f9565b61518360608301846150f9565b95945050505050565b60006040820190506151a16000830185614c2d565b6151ae60208301846150f9565b9392505050565b600060208201905081810360008301526151cf8184614c3c565b905092915050565b600060208201905081810360008301526151f18184614c9a565b905092915050565b600060208201905081810360008301526152138184614cf8565b905092915050565b60006020820190506152306000830184614d56565b92915050565b600060208201905081810360008301526152508184614d65565b905092915050565b6000602082019050818103600083015261527181614d9e565b9050919050565b6000602082019050818103600083015261529181614dc1565b9050919050565b600060208201905081810360008301526152b181614de4565b9050919050565b600060208201905081810360008301526152d181614e07565b9050919050565b600060208201905081810360008301526152f181614e2a565b9050919050565b6000602082019050818103600083015261531181614e4d565b9050919050565b6000602082019050818103600083015261533181614e70565b9050919050565b6000602082019050818103600083015261535181614e93565b9050919050565b6000602082019050818103600083015261537181614eb6565b9050919050565b6000602082019050818103600083015261539181614ed9565b9050919050565b600060208201905081810360008301526153b181614efc565b9050919050565b600060208201905081810360008301526153d181614f1f565b9050919050565b600060208201905081810360008301526153f181614f42565b9050919050565b6000602082019050818103600083015261541181614f88565b9050919050565b6000602082019050818103600083015261543181614fab565b9050919050565b6000602082019050818103600083015261545181614fce565b9050919050565b6000602082019050818103600083015261547181614ff1565b9050919050565b6000602082019050818103600083015261549181615014565b9050919050565b60006040820190506154ad6000830184615066565b92915050565b60006080820190506154c86000830184615095565b92915050565b60006020820190506154e360008301846150f9565b92915050565b60006020820190506154fe6000830184615108565b92915050565b600061550e61551f565b905061551a82826157f6565b919050565b6000604051905090565b600067ffffffffffffffff8211156155445761554361595b565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006156328261577a565b915061563d8361577a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561567257615671615870565b5b828201905092915050565b60006156888261577a565b91506156938361577a565b9250826156a3576156a261589f565b5b828204905092915050565b60006156b98261577a565b91506156c48361577a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156fd576156fc615870565b5b828202905092915050565b60006157138261577a565b915061571e8361577a565b92508282101561573157615730615870565b5b828203905092915050565b60006157478261575a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156157af578082015181840152602081019050615794565b838111156157be576000848401525b50505050565b600060028204905060018216806157dc57607f821691505b602082108114156157f0576157ef6158ce565b5b50919050565b6157ff8261599e565b810181811067ffffffffffffffff8211171561581e5761581d61595b565b5b80604052505050565b60006158328261577a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561586557615864615870565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320746f206f70656e203372642d7060008201527f61727479207374616b652e000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5468697320636f6c6c656374696f6e20686173206e6f74206265656e2061707060008201527f726f7665642e0000000000000000000000000000000000000000000000000000602082015250565b7f4d6967726174696f6e20706572696f642068617320636c6f7365642e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206861766520616c7265616479206d696772617465642e000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f436f756c64206e6f7420766572696679206f776e657273686970210000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b615e3f8161573c565b8114615e4a57600080fd5b50565b615e568161577a565b8114615e6157600080fd5b5056fea264697066735822122038905d31e284ce8574e4ab3de9572f4900616533ffad9cbb90e314a31cabec8864736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102815760003560e01c806370a082311161014f578063aef78631116100c1578063e40de8871161007a578063e40de88714610a15578063ed832b8414610a52578063f2fde38b14610a6e578063fcc4628b14610a97578063fdbda0ec14610ac0578063ff26bbac14610afe57610288565b8063aef78631146108c6578063affab25814610903578063c4e977c814610933578063cfd476631461095e578063d7625c881461099b578063dd62ed3e146109d857610288565b80638da5cb5b116101135780638da5cb5b146107b657806395d89b41146107e1578063a457c2d71461080c578063a9059cbb14610849578063abacfc2614610886578063ac4d7e95146108af57610288565b806370a08231146106e7578063712c70ba14610724578063715018a61461074d57806379cc67901461076457806382a3bfad1461078d57610288565b806333a2b24d116101f357806342966c68116101ac57806342966c68146105c75780634ab2e523146105f05780635028d05a1461062d5780635c3d25ca1461065657806360391c921461067f5780636804a958146106bc57610288565b806333a2b24d146104cb5780633510103e146104f6578063395093511461051f5780633b28a0a61461055c5780633ccfd60b1461058757806340c10f191461059e57610288565b806318160ddd1161024557806318160ddd146103a957806319f101fa146103d457806322143290146103fd57806323b872dd1461042657806328746bf014610463578063313ce567146104a057610288565b806306fdde031461028a578063094615e4146102b5578063095ea7b3146102f25780630da4540f1461032f578063175d20241461036c57610288565b3661028857005b005b34801561029657600080fd5b5061029f610b3e565b6040516102ac9190615236565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190614b7c565b610bd0565b6040516102e9919061512c565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190614b3c565b610c0f565b604051610326919061521b565b60405180910390f35b34801561033b57600080fd5b50610356600480360381019061035191906149f3565b610c32565b604051610363919061521b565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190614b3c565b610ce8565b6040516103a0919061521b565b60405180910390f35b3480156103b557600080fd5b506103be610d59565b6040516103cb91906154ce565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190614b3c565b610d63565b005b34801561040957600080fd5b50610424600480360381019061041f9190614b7c565b610e8c565b005b34801561043257600080fd5b5061044d60048036038101906104489190614a8d565b610f12565b60405161045a919061521b565b60405180910390f35b34801561046f57600080fd5b5061048a60048036038101906104859190614ae0565b610f41565b60405161049791906154ce565b60405180910390f35b3480156104ac57600080fd5b506104b56110e4565b6040516104c291906154e9565b60405180910390f35b3480156104d757600080fd5b506104e06110ed565b6040516104ed91906154ce565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190614b7c565b6113cc565b005b34801561052b57600080fd5b5061054660048036038101906105419190614b3c565b611452565b604051610553919061521b565b60405180910390f35b34801561056857600080fd5b50610571611489565b60405161057e91906151b5565b60405180910390f35b34801561059357600080fd5b5061059c611517565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190614b3c565b611664565b005b3480156105d357600080fd5b506105ee60048036038101906105e99190614b7c565b6116ee565b005b3480156105fc57600080fd5b50610617600480360381019061061291906149f3565b611702565b60405161062491906151f9565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f91906149f3565b6117d6565b005b34801561066257600080fd5b5061067d600480360381019061067891906149f3565b611a16565b005b34801561068b57600080fd5b506106a660048036038101906106a19190614b3c565b611ad6565b6040516106b391906154ce565b60405180910390f35b3480156106c857600080fd5b506106d1611b3e565b6040516106de91906151d7565b60405180910390f35b3480156106f357600080fd5b5061070e600480360381019061070991906149f3565b611bfd565b60405161071b91906154ce565b60405180910390f35b34801561073057600080fd5b5061074b60048036038101906107469190614b3c565b611c45565b005b34801561075957600080fd5b506107626125b4565b005b34801561077057600080fd5b5061078b60048036038101906107869190614b3c565b61263c565b005b34801561079957600080fd5b506107b460048036038101906107af91906149f3565b61265c565b005b3480156107c257600080fd5b506107cb61273e565b6040516107d8919061512c565b60405180910390f35b3480156107ed57600080fd5b506107f6612768565b6040516108039190615236565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190614b3c565b6127fa565b604051610840919061521b565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b9190614b3c565b612871565b60405161087d919061521b565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906149f3565b612894565b005b3480156108bb57600080fd5b506108c4612a9d565b005b3480156108d257600080fd5b506108ed60048036038101906108e89190614a8d565b612c9e565b6040516108fa91906154ce565b60405180910390f35b61091d60048036038101906109189190614ae0565b612cdc565b60405161092a91906154ce565b60405180910390f35b34801561093f57600080fd5b5061094861336d565b60405161095591906154ce565b60405180910390f35b34801561096a57600080fd5b5061098560048036038101906109809190614b3c565b613373565b60405161099291906154b3565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd91906149f3565b61349e565b6040516109cf919061521b565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190614a4d565b6134be565b604051610a0c91906154ce565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a3791906149f3565b613545565b604051610a499190615498565b60405180910390f35b610a6c6004803603810190610a679190614ae0565b613685565b005b348015610a7a57600080fd5b50610a956004803603810190610a9091906149f3565b613b1b565b005b348015610aa357600080fd5b50610abe6004803603810190610ab991906149f3565b613c13565b005b348015610acc57600080fd5b50610ae76004803603810190610ae29190614b7c565b613cd3565b604051610af592919061518c565b60405180910390f35b348015610b0a57600080fd5b50610b256004803603810190610b209190614b3c565b613d27565b604051610b359493929190615147565b60405180910390f35b606060038054610b4d906157c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b79906157c4565b8015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b5050505050905090565b600a8181548110610be057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610c1a613da4565b9050610c27818585613dac565b600191505092915050565b600080600090505b600980549050811015610cdd578273ffffffffffffffffffffffffffffffffffffffff1660098281548110610c7257610c7161592c565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610cca576001915050610ce3565b8080610cd590615827565b915050610c3a565b60009150505b919050565b600080600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600201541115610d4e5760019050610d53565b600090505b92915050565b6000600254905090565b610d6b613da4565b73ffffffffffffffffffffffffffffffffffffffff16610d8961273e565b73ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690615378565b60405180910390fd5b600960405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b610e94613da4565b73ffffffffffffffffffffffffffffffffffffffff16610eb261273e565b73ffffffffffffffffffffffffffffffffffffffff1614610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90615378565b60405180910390fd5b80600d8190555050565b600080610f1d613da4565b9050610f2a858285613f77565b610f35858585614003565b60019150509392505050565b6000806000905060005b83518110156110c5576000848281518110610f6957610f6861592c565b5b60200260200101519050610f7d8682610ce8565b801561103c57503373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610fd491906154ce565b60206040518083038186803b158015610fec57600080fd5b505afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190614a20565b73ffffffffffffffffffffffffffffffffffffffff16145b156110b15761104b8682611ad6565b836110569190615627565b925042600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201819055505b81806110bc90615827565b92505050610f4b565b60008211156110d9576110d83383614284565b5b819250505092915050565b60006012905090565b6000806000905060005b6009805490508110156113b05760006009828154811061111a5761111961592c565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561121657602002820191906000526020600020905b815481526020019060010190808311611202575b5050505050905060005b815181101561139a57600082828151811061123e5761123d61592c565b5b602002602001015190506112528482610ce8565b801561131157503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016112a991906154ce565b60206040518083038186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f99190614a20565b73ffffffffffffffffffffffffffffffffffffffff16145b15611386576113208482611ad6565b8661132b9190615627565b955042600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201819055505b818061139190615827565b92505050611220565b83806113a590615827565b9450505050506110f7565b60008211156113c4576113c33383614284565b5b819250505090565b6113d4613da4565b73ffffffffffffffffffffffffffffffffffffffff166113f261273e565b73ffffffffffffffffffffffffffffffffffffffff1614611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f90615378565b60405180910390fd5b80600e8190555050565b60008061145d613da4565b905061147e81858561146f85896134be565b6114799190615627565b613dac565b600191505092915050565b6060600a80548060200260200160405190810160405280929190818152602001828054801561150d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116114c3575b5050505050905090565b61151f613da4565b73ffffffffffffffffffffffffffffffffffffffff1661153d61273e565b73ffffffffffffffffffffffffffffffffffffffff1614611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90615378565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516115db90615117565b60006040518083038185875af1925050503d8060008114611618576040519150601f19603f3d011682016040523d82523d6000602084013e61161d565b606091505b5050905080611661576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611658906153f8565b60405180910390fd5b50565b61166c613da4565b73ffffffffffffffffffffffffffffffffffffffff1661168a61273e565b73ffffffffffffffffffffffffffffffffffffffff16146116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790615378565b60405180910390fd5b6116ea8282614284565b5050565b6116ff6116f9613da4565b826143e4565b50565b6060600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156117ca57602002820191906000526020600020905b8154815260200190600101908083116117b6575b50505050509050919050565b6117de613da4565b73ffffffffffffffffffffffffffffffffffffffff166117fc61273e565b73ffffffffffffffffffffffffffffffffffffffff1614611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184990615378565b60405180910390fd5b60005b600980549050811015611a12578173ffffffffffffffffffffffffffffffffffffffff166009828154811061188d5761188c61592c565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119ff57600960016009805490506118ef9190615708565b81548110611900576118ff61592c565b5b9060005260206000209060020201600982815481106119225761192161592c565b5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001820154816001015590505060098054806119b6576119b56158fd565b5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160009055505090555b8080611a0a90615827565b915050611855565b5050565b611a1e613da4565b73ffffffffffffffffffffffffffffffffffffffff16611a3c61273e565b73ffffffffffffffffffffffffffffffffffffffff1614611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8990615378565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611ae38484613373565b90506000611af085613545565b90506000603c80846040015142611b079190615708565b611b11919061567d565b611b1b919061567d565b90506000826020015182611b2f91906156ae565b90508094505050505092915050565b60606009805480602002602001604051908101604052809291908181526020016000905b82821015611bf457838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190611b62565b50505050905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611c8091906154ce565b60206040518083038186803b158015611c9857600080fd5b505afa158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd09190614a20565b9050600073ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611e2157508073ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156125af5760005b60076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015612478578260076000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106120255761202461592c565b5b906000526020600020015414156124655760076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160076000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506122249190615708565b815481106122355761223461592c565b5b906000526020600020015460076000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106123415761234061592c565b5b906000526020600020018190555060076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061244e5761244d6158fd565b5b600190038181906000526020600020016000905590555b808061247090615827565b915050611e29565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083908060018154018082558091505060019003906000526020600020016000909190919091505581600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b505050565b6125bc613da4565b73ffffffffffffffffffffffffffffffffffffffff166125da61273e565b73ffffffffffffffffffffffffffffffffffffffff1614612630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262790615378565b60405180910390fd5b61263a60006145bb565b565b61264e82612648613da4565b83613f77565b61265882826143e4565b5050565b612664613da4565b73ffffffffffffffffffffffffffffffffffffffff1661268261273e565b73ffffffffffffffffffffffffffffffffffffffff16146126d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cf90615378565b60405180910390fd5b600a819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054612777906157c4565b80601f01602080910402602001604051908101604052809291908181526020018280546127a3906157c4565b80156127f05780601f106127c5576101008083540402835291602001916127f0565b820191906000526020600020905b8154815290600101906020018083116127d357829003601f168201915b5050505050905090565b600080612805613da4565b9050600061281382866134be565b905083811015612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284f90615458565b60405180910390fd5b6128658286868403613dac565b60019250505092915050565b60008061287c613da4565b9050612889818585614003565b600191505092915050565b61289c613da4565b73ffffffffffffffffffffffffffffffffffffffff166128ba61273e565b73ffffffffffffffffffffffffffffffffffffffff1614612910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290790615378565b60405180910390fd5b60005b600a80549050811015612a99578173ffffffffffffffffffffffffffffffffffffffff16600a828154811061294b5761294a61592c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a8657600a6001600a805490506129a69190615708565b815481106129b7576129b661592c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a82815481106129f6576129f561592c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a805480612a5057612a4f6158fd565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b8080612a9190615827565b915050612913565b5050565b6001600d5414612ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad990615358565b60405180910390fd5b60001515600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6c906153d8565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612bd2919061512c565b60206040518083038186803b158015612bea57600080fd5b505afa158015612bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c229190614ba9565b90506001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612c9b3369152d02c7e14af680000083612c969190615627565b614284565b50565b60076020528260005260406000206020528160005260406000208181548110612cc657600080fd5b9060005260206000200160009250925050505481565b6000806000905060005b835181101561334e576000848281518110612d0457612d0361592c565b5b602002602001015190506000805b600a80549050811015612da9578773ffffffffffffffffffffffffffffffffffffffff16600a8281548110612d4a57612d4961592c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d9657600191505b8080612da190615827565b915050612d12565b81612e00578651600e54612dbd91906156ae565b341015612dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df690615298565b60405180910390fd5b5b612e0a8884610ce8565b8015612ec957503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401612e6191906154ce565b60206040518083038186803b158015612e7957600080fd5b505afa158015612e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb19190614a20565b73ffffffffffffffffffffffffffffffffffffffff16145b1561333857612ed88884611ad6565b85612ee39190615627565b9450600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055505060005b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156133365783600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106130af576130ae61592c565b5b9060005260206000200154141561332357600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506131c89190615708565b815481106131d9576131d861592c565b5b9060005260206000200154600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106132725761327161592c565b5b9060005260206000200181905550600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061330c5761330b6158fd565b5b600190038181906000526020600020016000905590555b808061332e90615827565b915050612f99565b505b838061334390615827565b945050505050612ce6565b6000821115613362576133613383614284565b5b819250505092915050565b600e5481565b61337b61487d565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481525050905092915050565b60086020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61354d6148d1565b60005b60098054905081101561367e578273ffffffffffffffffffffffffffffffffffffffff16600982815481106135885761358761592c565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561366b57600981815481106135ea576135e961592c565b5b90600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050915050613680565b808061367690615827565b915050613550565b505b919050565b61368e82610c32565b6136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c490615338565b60405180910390fd5b6000805b600a80549050811015613768578373ffffffffffffffffffffffffffffffffffffffff16600a82815481106137095761370861592c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561375557600191505b808061376090615827565b9150506136d1565b816137bf578251600e5461377c91906156ae565b3410156137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590615298565b60405180910390fd5b5b60005b8351811015613b145760008482815181106137e0576137df61592c565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161383a91906154ce565b60206040518083038186803b15801561385257600080fd5b505afa158015613866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388a9190614a20565b73ffffffffffffffffffffffffffffffffffffffff16146138e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d790615438565b60405180910390fd5b6138ea8682610ce8565b801561399557503373ffffffffffffffffffffffffffffffffffffffff16600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156139a5576139a48682611c45565b5b6139af8682610ce8565b613b005760405180608001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200142815260200182815250600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030155905050613aff8682614681565b5b8180613b0b90615827565b925050506137c2565b5050505050565b613b23613da4565b73ffffffffffffffffffffffffffffffffffffffff16613b4161273e565b73ffffffffffffffffffffffffffffffffffffffff1614613b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8e90615378565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfe906152b8565b60405180910390fd5b613c10816145bb565b50565b613c1b613da4565b73ffffffffffffffffffffffffffffffffffffffff16613c3961273e565b73ffffffffffffffffffffffffffffffffffffffff1614613c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8690615378565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60098181548110613ce357600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b6006602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154905084565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e1390615418565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e83906152d8565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051613f6a91906154ce565b60405180910390a3505050565b6000613f8384846134be565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114613ffd5781811015613fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe6906152f8565b60405180910390fd5b613ffc8484848403613dac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161406a906153b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156140e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140da90615258565b60405180910390fd5b6140ee838383614873565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015614174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161416b90615318565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142079190615627565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161426b91906154ce565b60405180910390a361427e848484614878565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156142f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142eb90615478565b60405180910390fd5b61430060008383614873565b80600260008282546143129190615627565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143679190615627565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516143cc91906154ce565b60405180910390a36143e060008383614878565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161444b90615398565b60405180910390fd5b61446082600083614873565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156144e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144dd90615278565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461453d9190615708565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516145a291906154ce565b60405180910390a36145b683600084614878565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000805b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508210156147c45782600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061479b5761479a61592c565b5b906000526020600020015414156147b157600190505b81806147bc90615827565b925050614685565b8061486d57600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150555b50505050565b505050565b505050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600061491461490f84615529565b615504565b905080838252602082019050828560208602820111156149375761493661598f565b5b60005b85811015614967578161494d88826149c9565b84526020840193506020830192505060018101905061493a565b5050509392505050565b60008135905061498081615e36565b92915050565b60008151905061499581615e36565b92915050565b600082601f8301126149b0576149af61598a565b5b81356149c0848260208601614901565b91505092915050565b6000813590506149d881615e4d565b92915050565b6000815190506149ed81615e4d565b92915050565b600060208284031215614a0957614a08615999565b5b6000614a1784828501614971565b91505092915050565b600060208284031215614a3657614a35615999565b5b6000614a4484828501614986565b91505092915050565b60008060408385031215614a6457614a63615999565b5b6000614a7285828601614971565b9250506020614a8385828601614971565b9150509250929050565b600080600060608486031215614aa657614aa5615999565b5b6000614ab486828701614971565b9350506020614ac586828701614971565b9250506040614ad6868287016149c9565b9150509250925092565b60008060408385031215614af757614af6615999565b5b6000614b0585828601614971565b925050602083013567ffffffffffffffff811115614b2657614b25615994565b5b614b328582860161499b565b9150509250929050565b60008060408385031215614b5357614b52615999565b5b6000614b6185828601614971565b9250506020614b72858286016149c9565b9150509250929050565b600060208284031215614b9257614b91615999565b5b6000614ba0848285016149c9565b91505092915050565b600060208284031215614bbf57614bbe615999565b5b6000614bcd848285016149de565b91505092915050565b6000614be28383614c1e565b60208301905092915050565b6000614bfa8383615037565b60408301905092915050565b6000614c1283836150ea565b60208301905092915050565b614c278161573c565b82525050565b614c368161573c565b82525050565b6000614c4782615585565b614c5181856155d8565b9350614c5c83615555565b8060005b83811015614c8d578151614c748882614bd6565b9750614c7f836155b1565b925050600181019050614c60565b5085935050505092915050565b6000614ca582615590565b614caf81856155e9565b9350614cba83615565565b8060005b83811015614ceb578151614cd28882614bee565b9750614cdd836155be565b925050600181019050614cbe565b5085935050505092915050565b6000614d038261559b565b614d0d81856155fa565b9350614d1883615575565b8060005b83811015614d49578151614d308882614c06565b9750614d3b836155cb565b925050600181019050614d1c565b5085935050505092915050565b614d5f8161574e565b82525050565b6000614d70826155a6565b614d7a8185615616565b9350614d8a818560208601615791565b614d938161599e565b840191505092915050565b6000614dab602383615616565b9150614db6826159af565b604082019050919050565b6000614dce602283615616565b9150614dd9826159fe565b604082019050919050565b6000614df1602b83615616565b9150614dfc82615a4d565b604082019050919050565b6000614e14602683615616565b9150614e1f82615a9c565b604082019050919050565b6000614e37602283615616565b9150614e4282615aeb565b604082019050919050565b6000614e5a601d83615616565b9150614e6582615b3a565b602082019050919050565b6000614e7d602683615616565b9150614e8882615b63565b604082019050919050565b6000614ea0602683615616565b9150614eab82615bb2565b604082019050919050565b6000614ec3601c83615616565b9150614ece82615c01565b602082019050919050565b6000614ee6602083615616565b9150614ef182615c2a565b602082019050919050565b6000614f09602183615616565b9150614f1482615c53565b604082019050919050565b6000614f2c602583615616565b9150614f3782615ca2565b604082019050919050565b6000614f4f601a83615616565b9150614f5a82615cf1565b602082019050919050565b6000614f7260008361560b565b9150614f7d82615d1a565b600082019050919050565b6000614f95601083615616565b9150614fa082615d1d565b602082019050919050565b6000614fb8602483615616565b9150614fc382615d46565b604082019050919050565b6000614fdb601b83615616565b9150614fe682615d95565b602082019050919050565b6000614ffe602583615616565b915061500982615dbe565b604082019050919050565b6000615021601f83615616565b915061502c82615e0d565b602082019050919050565b60408201600082015161504d6000850182614c1e565b50602082015161506060208501826150ea565b50505050565b60408201600082015161507c6000850182614c1e565b50602082015161508f60208501826150ea565b50505050565b6080820160008201516150ab6000850182614c1e565b5060208201516150be6020850182614c1e565b5060408201516150d160408501826150ea565b5060608201516150e460608501826150ea565b50505050565b6150f38161577a565b82525050565b6151028161577a565b82525050565b61511181615784565b82525050565b600061512282614f65565b9150819050919050565b60006020820190506151416000830184614c2d565b92915050565b600060808201905061515c6000830187614c2d565b6151696020830186614c2d565b61517660408301856150f9565b61518360608301846150f9565b95945050505050565b60006040820190506151a16000830185614c2d565b6151ae60208301846150f9565b9392505050565b600060208201905081810360008301526151cf8184614c3c565b905092915050565b600060208201905081810360008301526151f18184614c9a565b905092915050565b600060208201905081810360008301526152138184614cf8565b905092915050565b60006020820190506152306000830184614d56565b92915050565b600060208201905081810360008301526152508184614d65565b905092915050565b6000602082019050818103600083015261527181614d9e565b9050919050565b6000602082019050818103600083015261529181614dc1565b9050919050565b600060208201905081810360008301526152b181614de4565b9050919050565b600060208201905081810360008301526152d181614e07565b9050919050565b600060208201905081810360008301526152f181614e2a565b9050919050565b6000602082019050818103600083015261531181614e4d565b9050919050565b6000602082019050818103600083015261533181614e70565b9050919050565b6000602082019050818103600083015261535181614e93565b9050919050565b6000602082019050818103600083015261537181614eb6565b9050919050565b6000602082019050818103600083015261539181614ed9565b9050919050565b600060208201905081810360008301526153b181614efc565b9050919050565b600060208201905081810360008301526153d181614f1f565b9050919050565b600060208201905081810360008301526153f181614f42565b9050919050565b6000602082019050818103600083015261541181614f88565b9050919050565b6000602082019050818103600083015261543181614fab565b9050919050565b6000602082019050818103600083015261545181614fce565b9050919050565b6000602082019050818103600083015261547181614ff1565b9050919050565b6000602082019050818103600083015261549181615014565b9050919050565b60006040820190506154ad6000830184615066565b92915050565b60006080820190506154c86000830184615095565b92915050565b60006020820190506154e360008301846150f9565b92915050565b60006020820190506154fe6000830184615108565b92915050565b600061550e61551f565b905061551a82826157f6565b919050565b6000604051905090565b600067ffffffffffffffff8211156155445761554361595b565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006156328261577a565b915061563d8361577a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561567257615671615870565b5b828201905092915050565b60006156888261577a565b91506156938361577a565b9250826156a3576156a261589f565b5b828204905092915050565b60006156b98261577a565b91506156c48361577a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156fd576156fc615870565b5b828202905092915050565b60006157138261577a565b915061571e8361577a565b92508282101561573157615730615870565b5b828203905092915050565b60006157478261575a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156157af578082015181840152602081019050615794565b838111156157be576000848401525b50505050565b600060028204905060018216806157dc57607f821691505b602082108114156157f0576157ef6158ce565b5b50919050565b6157ff8261599e565b810181811067ffffffffffffffff8211171561581e5761581d61595b565b5b80604052505050565b60006158328261577a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561586557615864615870565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320746f206f70656e203372642d7060008201527f61727479207374616b652e000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5468697320636f6c6c656374696f6e20686173206e6f74206265656e2061707060008201527f726f7665642e0000000000000000000000000000000000000000000000000000602082015250565b7f4d6967726174696f6e20706572696f642068617320636c6f7365642e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206861766520616c7265616479206d696772617465642e000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f436f756c64206e6f7420766572696679206f776e657273686970210000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b615e3f8161573c565b8114615e4a57600080fd5b50565b615e568161577a565b8114615e6157600080fd5b5056fea264697066735822122038905d31e284ce8574e4ab3de9572f4900616533ffad9cbb90e314a31cabec8864736f6c63430008070033
Deployed Bytecode Sourcemap
28084:15881:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9183:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28906:32;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11534:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35899:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36291:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10303:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30108:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30562:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12315:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39716:999;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10145:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40795:1258;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30409:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13019:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32369:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43617:184;;;;;;;;;;;;;:::i;:::-;;29479:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20561:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35576:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31776:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31136:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36815:587;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32193:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10474:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42140:1424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2606:103;;;;;;;;;;;;;:::i;:::-;;20971:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30750:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1955:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9402:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13760:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10807:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31332:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29639:395;;;;;;;;;;;;;:::i;:::-;;28589:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37465:2159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29274:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36584:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28727:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11063:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32542:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32944:1936;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2864:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30944:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28822:31;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;28468:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;9183:100;9237:13;9270:5;9263:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9183:100;:::o;28906:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11534:201::-;11617:4;11634:13;11650:12;:10;:12::i;:::-;11634:28;;11673:32;11682:5;11689:7;11698:6;11673:8;:32::i;:::-;11723:4;11716:11;;;11534:201;;;;:::o;35899:328::-;35975:14;36001:6;36010:1;36001:10;;36022:173;36032:11;:18;;;;36028:1;:22;36022:173;;;36103:16;36069:50;;:11;36081:1;36069:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;;;;;;;;;;:50;;;36066:100;;;36146:4;36139:11;;;;;36066:100;36180:3;;;;;:::i;:::-;;;;36022:173;;;36214:5;36207:12;;;35899:328;;;;:::o;36291:249::-;36375:12;36460:1;36409:10;:28;36420:16;36409:28;;;;;;;;;;;;;;;:38;36438:8;36409:38;;;;;;;;;;;:48;;;:52;36406:102;;;36488:4;36481:11;;;;36406:102;36527:5;36520:12;;36291:249;;;;;:::o;10303:108::-;10364:7;10391:12;;10384:19;;10303:108;:::o;30108:242::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30204:11:::1;30235:92;;;;;;;;30264:16;30235:92;;;;;;30299:13;30235:92;;::::0;30204:138:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30108:242:::0;;:::o;30562:115::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30655:14:::1;30639:13;:30;;;;30562:115:::0;:::o;12315:295::-;12446:4;12463:15;12481:12;:10;:12::i;:::-;12463:30;;12504:38;12520:4;12526:7;12535:6;12504:15;:38::i;:::-;12553:27;12563:4;12569:2;12573:6;12553:9;:27::i;:::-;12598:4;12591:11;;;12315:295;;;;;:::o;39716:999::-;39811:17;39850:16;39869:1;39850:20;;39887:12;39918:622;39934:9;:16;39924:7;:26;39918:622;;;39970:13;39986:9;39996:7;39986:18;;;;;;;;:::i;:::-;;;;;;;;39970:34;;40032:40;40046:16;40063:8;40032:13;:40::i;:::-;:101;;;;;40123:10;40076:57;;40084:16;40076:33;;;40110:8;40076:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;40032:101;40029:466;;;40243:48;40264:16;40282:8;40243:20;:48::i;:::-;40228:63;;;;;:::i;:::-;;;40454:15;40403:10;:28;40414:16;40403:28;;;;;;;;;;;;;;;:38;40432:8;40403:38;;;;;;;;;;;:48;;:66;;;;40029:466;40515:9;;;;;:::i;:::-;;;;39951:589;39918:622;;;40608:1;40594:11;:15;40591:76;;;40625:30;40631:10;40643:11;40625:5;:30::i;:::-;40591:76;40686:11;40679:18;;;;39716:999;;;;:::o;10145:93::-;10203:5;10228:2;10221:9;;10145:93;:::o;40795:1258::-;40844:17;40883:16;40902:1;40883:20;;40914:22;40951:942;40977:11;:18;;;;40957:17;:38;40951:942;;;41011:24;41038:11;41050:17;41038:30;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;;;;;;;;;;;41011:73;;41099:23;41125:19;:31;41145:10;41125:31;;;;;;;;;;;;;;;:49;41157:16;41125:49;;;;;;;;;;;;;;;41099:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41191:12;41222:622;41238:9;:16;41228:7;:26;41222:622;;;41274:13;41290:9;41300:7;41290:18;;;;;;;;:::i;:::-;;;;;;;;41274:34;;41336:40;41350:16;41367:8;41336:13;:40::i;:::-;:101;;;;;41427:10;41380:57;;41388:16;41380:33;;;41414:8;41380:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;41336:101;41333:466;;;41547:48;41568:16;41586:8;41547:20;:48::i;:::-;41532:63;;;;;:::i;:::-;;;41758:15;41707:10;:28;41718:16;41707:28;;;;;;;;;;;;;;;:38;41736:8;41707:38;;;;;;;;;;;:48;;:66;;;;41333:466;41819:9;;;;;:::i;:::-;;;;41255:589;41222:622;;;41860:19;;;;;:::i;:::-;;;;40996:897;;;40951:942;;;41946:1;41932:11;:15;41929:76;;;41963:30;41969:10;41981:11;41963:5;:30::i;:::-;41929:76;42024:11;42017:18;;;;40795:1258;:::o;30409:95::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30492:4:::1;30476:13;:20;;;;30409:95:::0;:::o;13019:238::-;13107:4;13124:13;13140:12;:10;:12::i;:::-;13124:28;;13163:64;13172:5;13179:7;13216:10;13188:25;13198:5;13205:7;13188:9;:25::i;:::-;:38;;;;:::i;:::-;13163:8;:64::i;:::-;13245:4;13238:11;;;13019:238;;;;:::o;32369:124::-;32422:29;32470:15;32463:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32369:124;:::o;43617:184::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43668:12:::1;43694;;;;;;;;;;;43686:26;;43720:21;43686:60;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43667:79;;;43765:7;43757:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;43656:145;43617:184::o:0;29479:95::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29549:17:::1;29555:2;29559:6;29549:5;:17::i;:::-;29479:95:::0;;:::o;20561:91::-;20617:27;20623:12;:10;:12::i;:::-;20637:6;20617:5;:27::i;:::-;20561:91;:::o;35576:235::-;35647:25;35744:19;:31;35764:10;35744:31;;;;;;;;;;;;;;;:49;35776:16;35744:49;;;;;;;;;;;;;;;35737:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35576:235;;;:::o;31776:355::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31855:6:::1;31876:248;31886:11;:18;;;;31882:1;:22;31876:248;;;31957:16;31923:50;;:11;31935:1;31923:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;;;;;;;;;;:50;;;31920:175;;;32010:11;32041:1;32022:11;:18;;;;:20;;;;:::i;:::-;32010:33;;;;;;;;:::i;:::-;;;;;;;;;;;;31993:11;32005:1;31993:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32062:11;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;31920:175;32109:3;;;;;:::i;:::-;;;;31876:248;;;31844:287;31776:355:::0;:::o;31136:114::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31229:13:::1;31214:12;;:28;;;;;;;;;;;;;;;;;;31136:114:::0;:::o;36815:587::-;36906:17;36960:25;36988:38;36998:16;37016:8;36988;:38::i;:::-;36960:66;;37068:34;37105:31;37119:16;37105:13;:31::i;:::-;37068:68;;37194:14;37261:2;37256;37230:12;:22;;;37212:15;:40;;;;:::i;:::-;37211:47;;;;:::i;:::-;:52;;;;:::i;:::-;37194:69;;37303:16;37334;:29;;;37322:9;:41;;;;:::i;:::-;37303:60;;37383:11;37376:18;;;;;;36815:587;;;;:::o;32193:119::-;32242:32;32293:11;32286:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32193:119;:::o;10474:127::-;10548:7;10575:9;:18;10585:7;10575:18;;;;;;;;;;;;;;;;10568:25;;10474:127;;;:::o;42140:1424::-;42252:18;42281:16;42273:33;;;42307:8;42273:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42252:64;;42393:1;42330:65;;:10;:28;42341:16;42330:28;;;;;;;;;;;;;;;:38;42359:8;42330:38;;;;;;;;;;;:51;;;;;;;;;;;;:65;;;;:147;;;;;42467:10;42412:65;;:10;:28;42423:16;42412:28;;;;;;;;;;;;;;;:38;42441:8;42412:38;;;;;;;;;;;:51;;;;;;;;;;;;:65;;;;42330:147;42327:1220;;;42545:6;42570:770;42580:19;:72;42600:10;:28;42611:16;42600:28;;;;;;;;;;;;;;;:38;42629:8;42600:38;;;;;;;;;;;:51;;;;;;;;;;;;42580:72;;;;;;;;;;;;;;;:90;42653:16;42580:90;;;;;;;;;;;;;;;:97;;;;42576:1;:101;42570:770;;;42797:8;42700:19;:72;42720:10;:28;42731:16;42720:28;;;;;;;;;;;;;;;:38;42749:8;42720:38;;;;;;;;;;;:51;;;;;;;;;;;;42700:72;;;;;;;;;;;;;;;:90;42773:16;42700:90;;;;;;;;;;;;;;;42791:1;42700:93;;;;;;;;:::i;:::-;;;;;;;;;;:105;42697:606;;;42973:19;:72;42993:10;:28;43004:16;42993:28;;;;;;;;;;;;;;;:38;43022:8;42993:38;;;;;;;;;;;:51;;;;;;;;;;;;42973:72;;;;;;;;;;;;;;;:90;43046:16;42973:90;;;;;;;;;;;;;;;43162:1;43064:19;:72;43084:10;:28;43095:16;43084:28;;;;;;;;;;;;;;;:38;43113:8;43084:38;;;;;;;;;;;:51;;;;;;;;;;;;43064:72;;;;;;;;;;;;;;;:90;43137:16;43064:90;;;;;;;;;;;;;;;:97;;;;:99;;;;:::i;:::-;42973:191;;;;;;;;:::i;:::-;;;;;;;;;;42877:19;:72;42897:10;:28;42908:16;42897:28;;;;;;;;;;;;;;;:38;42926:8;42897:38;;;;;;;;;;;:51;;;;;;;;;;;;42877:72;;;;;;;;;;;;;;;:90;42950:16;42877:90;;;;;;;;;;;;;;;42968:1;42877:93;;;;;;;;:::i;:::-;;;;;;;;;:287;;;;43187:19;:72;43207:10;:28;43218:16;43207:28;;;;;;;;;;;;;;;:38;43236:8;43207:38;;;;;;;;;;;:51;;;;;;;;;;;;43187:72;;;;;;;;;;;;;;;:90;43260:16;43187:90;;;;;;;;;;;;;;;:96;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42697:606;43321:3;;;;;:::i;:::-;;;;42570:770;;;43392:19;:31;43412:10;43392:31;;;;;;;;;;;;;;;:49;43424:16;43392:49;;;;;;;;;;;;;;;43447:8;43392:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43525:10;43471;:28;43482:16;43471:28;;;;;;;;;;;;;;;:38;43500:8;43471:38;;;;;;;;;;;:51;;;:64;;;;;;;;;;;;;;;;;;42488:1059;42327:1220;42212:1352;42140:1424;;:::o;2606:103::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2671:30:::1;2698:1;2671:18;:30::i;:::-;2606:103::o:0;20971:164::-;21048:46;21064:7;21073:12;:10;:12::i;:::-;21087:6;21048:15;:46::i;:::-;21105:22;21111:7;21120:6;21105:5;:22::i;:::-;20971:164;;:::o;30750:131::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30833:15:::1;30854:16;30833:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30750:131:::0;:::o;1955:87::-;2001:7;2028:6;;;;;;;;;;;2021:13;;1955:87;:::o;9402:104::-;9458:13;9491:7;9484:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9402:104;:::o;13760:436::-;13853:4;13870:13;13886:12;:10;:12::i;:::-;13870:28;;13909:24;13936:25;13946:5;13953:7;13936:9;:25::i;:::-;13909:52;;14000:15;13980:16;:35;;13972:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14093:60;14102:5;14109:7;14137:15;14118:16;:34;14093:8;:60::i;:::-;14184:4;14177:11;;;;13760:436;;;;:::o;10807:193::-;10886:4;10903:13;10919:12;:10;:12::i;:::-;10903:28;;10942;10952:5;10959:2;10963:6;10942:9;:28::i;:::-;10988:4;10981:11;;;10807:193;;;;:::o;31332:367::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31415:6:::1;31436:256;31446:15;:22;;;;31442:1;:26;31436:256;;;31509:16;31487:38;;:15;31503:1;31487:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:38;;;31484:179;;;31566:15;31605:1;31582:15;:22;;;;:24;;;;:::i;:::-;31566:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31545:15;31561:1;31545:18;;;;;;;;:::i;:::-;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;31626:15;:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;31484:179;31677:3;;;;;:::i;:::-;;;;31436:256;;;31404:295;31332:367:::0;:::o;29639:395::-;29706:1;29689:13;;:18;29681:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;29786:5;29759:32;;:11;:23;29771:10;29759:23;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;29751:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29836:15;29861:17;;;;;;;;;;;29854:35;;;29890:10;29854:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29836:65;;29947:4;29921:11;:23;29933:10;29921:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;29962:44;29968:10;29993:12;29980:10;:25;;;;:::i;:::-;29962:5;:44::i;:::-;29670:364;29639:395::o;28589:77::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37465:2159::-;37559:17;37598:16;37617:1;37598:20;;37639:12;37666:1798;37682:9;:16;37672:7;:26;37666:1798;;;37714:13;37730:9;37740:7;37730:18;;;;;;;;:::i;:::-;;;;;;;;37714:34;;37769:11;37807:7;37837:210;37848:15;:22;;;;37843:2;:27;37837:210;;;37920:16;37897:39;;:15;37913:2;37897:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:39;;;37894:107;;;37973:4;37964:13;;37894:107;38023:4;;;;;:::i;:::-;;;;37837:210;;;38170:6;38166:155;;38237:9;:16;38221:13;;:32;;;;:::i;:::-;38208:9;:45;;38200:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;38166:155;38344:40;38358:16;38375:8;38344:13;:40::i;:::-;:101;;;;;38435:10;38388:57;;38396:16;38388:33;;;38422:8;38388:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;38344:101;38341:1082;;;38547:48;38568:16;38586:8;38547:20;:48::i;:::-;38532:63;;;;;:::i;:::-;;;38698:10;:28;38709:16;38698:28;;;;;;;;;;;;;;;:38;38727:8;38698:38;;;;;;;;;;;;38691:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38817:6;38854:548;38864:19;:31;38884:10;38864:31;;;;;;;;;;;;;;;:49;38896:16;38864:49;;;;;;;;;;;;;;;:56;;;;38860:1;:60;38854:548;;;39011:8;38955:19;:31;38975:10;38955:31;;;;;;;;;;;;;;;:49;38987:16;38955:49;;;;;;;;;;;;;;;39005:1;38955:52;;;;;;;;:::i;:::-;;;;;;;;;;:64;38952:389;;;39110:19;:31;39130:10;39110:31;;;;;;;;;;;;;;;:49;39142:16;39110:49;;;;;;;;;;;;;;;39217:1;39160:19;:31;39180:10;39160:31;;;;;;;;;;;;;;;:49;39192:16;39160:49;;;;;;;;;;;;;;;:56;;;;:58;;;;:::i;:::-;39110:109;;;;;;;;:::i;:::-;;;;;;;;;;39055:19;:31;39075:10;39055:31;;;;;;;;;;;;;;;:49;39087:16;39055:49;;;;;;;;;;;;;;;39105:1;39055:52;;;;;;;;:::i;:::-;;;;;;;;;:164;;;;39254:19;:31;39274:10;39254:31;;;;;;;;;;;;;;;:49;39286:16;39254:49;;;;;;;;;;;;;;;:55;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38952:389;39371:3;;;;;:::i;:::-;;;;38854:548;;;38446:977;38341:1082;39443:9;;;;;:::i;:::-;;;;37699:1765;;;37666:1798;;;39517:1;39503:11;:15;39500:76;;;39534:30;39540:10;39552:11;39534:5;:30::i;:::-;39500:76;39595:11;39588:18;;;;37465:2159;;;;:::o;29274:39::-;;;;:::o;36584:164::-;36663:20;;:::i;:::-;36702:10;:28;36713:16;36702:28;;;;;;;;;;;;;;;:38;36731:8;36702:38;;;;;;;;;;;36695:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36584:164;;;;:::o;28727:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;11063:151::-;11152:7;11179:11;:18;11191:5;11179:18;;;;;;;;;;;;;;;:27;11198:7;11179:27;;;;;;;;;;;;;;;;11172:34;;11063:151;;;;:::o;32542:322::-;32611:30;;:::i;:::-;32653:6;32674:183;32684:11;:18;;;;32680:1;:22;32674:183;;;32755:16;32721:50;;:11;32733:1;32721:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;;;;;;;;;;:50;;;32718:110;;;32798:11;32810:1;32798:14;;;;;;;;:::i;:::-;;;;;;;;;;;;32791:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32718:110;32842:3;;;;;:::i;:::-;;;;32674:183;;;32642:222;32542:322;;;;:::o;32944:1936::-;33091:38;33112:16;33091:20;:38::i;:::-;33083:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;33184:11;33214:6;33235:167;33245:15;:22;;;;33241:1;:26;33235:167;;;33308:16;33286:38;;:15;33302:1;33286:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:38;;;33283:90;;;33353:4;33344:13;;33283:90;33387:3;;;;;:::i;:::-;;;;33235:167;;;33480:6;33476:139;;33539:9;:16;33523:13;;:32;;;;:::i;:::-;33510:9;:45;;33502:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;33476:139;33627:12;33654:1209;33670:9;:16;33660:7;:26;33654:1209;;;33702:13;33718:9;33728:7;33718:18;;;;;;;;:::i;:::-;;;;;;;;33702:34;;33894:10;33847:57;;33855:16;33847:33;;;33881:8;33847:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;33839:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;34037:40;34051:16;34068:8;34037:13;:40::i;:::-;:109;;;;;34136:10;34081:65;;:10;:28;34092:16;34081:28;;;;;;;;;;;;;;;:38;34110:8;34081:38;;;;;;;;;;;:51;;;;;;;;;;;;:65;;;;34037:109;34034:193;;;34166:45;34183:16;34201:8;34166:15;:45::i;:::-;34034:193;34298:40;34312:16;34329:8;34298:13;:40::i;:::-;34294:532;;34474:185;;;;;;;;34506:16;34474:185;;;;;;34549:10;34474:185;;;;;;34586:15;34474:185;;;;34628:8;34474:185;;;34413:10;:28;34424:16;34413:28;;;;;;;;;;;;;;;:38;34442:8;34413:38;;;;;;;;;;;:246;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34767:43;34783:16;34801:8;34767:15;:43::i;:::-;34294:532;34842:9;;;;;:::i;:::-;;;;33687:1176;33654:1209;;;33029:1851;;;32944:1936;;:::o;2864:201::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2973:1:::1;2953:22;;:8;:22;;;;2945:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3029:28;3048:8;3029:18;:28::i;:::-;2864:201:::0;:::o;30944:127::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31045:18:::1;31025:17;;:38;;;;;;;;;;;;;;;;;;30944:127:::0;:::o;28822:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28468:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;17394:380::-;17547:1;17530:19;;:5;:19;;;;17522:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17628:1;17609:21;;:7;:21;;;;17601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17712:6;17682:11;:18;17694:5;17682:18;;;;;;;;;;;;;;;:27;17701:7;17682:27;;;;;;;;;;;;;;;:36;;;;17750:7;17734:32;;17743:5;17734:32;;;17759:6;17734:32;;;;;;:::i;:::-;;;;;;;;17394:380;;;:::o;18065:453::-;18200:24;18227:25;18237:5;18244:7;18227:9;:25::i;:::-;18200:52;;18287:17;18267:16;:37;18263:248;;18349:6;18329:16;:26;;18321:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18433:51;18442:5;18449:7;18477:6;18458:16;:25;18433:8;:51::i;:::-;18263:248;18189:329;18065:453;;;:::o;14675:671::-;14822:1;14806:18;;:4;:18;;;;14798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14899:1;14885:16;;:2;:16;;;;14877:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;14954:38;14975:4;14981:2;14985:6;14954:20;:38::i;:::-;15005:19;15027:9;:15;15037:4;15027:15;;;;;;;;;;;;;;;;15005:37;;15076:6;15061:11;:21;;15053:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;15193:6;15179:11;:20;15161:9;:15;15171:4;15161:15;;;;;;;;;;;;;;;:38;;;;15238:6;15221:9;:13;15231:2;15221:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;15277:2;15262:26;;15271:4;15262:26;;;15281:6;15262:26;;;;;;:::i;:::-;;;;;;;;15301:37;15321:4;15327:2;15331:6;15301:19;:37::i;:::-;14787:559;14675:671;;;:::o;15633:399::-;15736:1;15717:21;;:7;:21;;;;15709:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15787:49;15816:1;15820:7;15829:6;15787:20;:49::i;:::-;15865:6;15849:12;;:22;;;;;;;:::i;:::-;;;;;;;;15904:6;15882:9;:18;15892:7;15882:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15947:7;15926:37;;15943:1;15926:37;;;15956:6;15926:37;;;;;;:::i;:::-;;;;;;;;15976:48;16004:1;16008:7;16017:6;15976:19;:48::i;:::-;15633:399;;:::o;16365:591::-;16468:1;16449:21;;:7;:21;;;;16441:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16521:49;16542:7;16559:1;16563:6;16521:20;:49::i;:::-;16583:22;16608:9;:18;16618:7;16608:18;;;;;;;;;;;;;;;;16583:43;;16663:6;16645:14;:24;;16637:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;16782:6;16765:14;:23;16744:9;:18;16754:7;16744:18;;;;;;;;;;;;;;;:44;;;;16826:6;16810:12;;:22;;;;;;;:::i;:::-;;;;;;;;16876:1;16850:37;;16859:7;16850:37;;;16880:6;16850:37;;;;;;:::i;:::-;;;;;;;;16900:48;16920:7;16937:1;16941:6;16900:19;:48::i;:::-;16430:526;16365:591;;:::o;3225:191::-;3299:16;3318:6;;;;;;;;;;;3299:25;;3344:8;3335:6;;:17;;;;;;;;;;;;;;;;;;3399:8;3368:40;;3389:8;3368:40;;;;;;;;;;;;3288:128;3225:191;:::o;34949:529::-;35035:6;35056:11;35086:227;35096:19;:31;35116:10;35096:31;;;;;;;;;;;;;;;:49;35128:16;35096:49;;;;;;;;;;;;;;;:56;;;;35092:1;:60;35086:227;;;35227:8;35171:19;:31;35191:10;35171:31;;;;;;;;;;;;;;;:49;35203:16;35171:49;;;;;;;;;;;;;;;35221:1;35171:52;;;;;;;;:::i;:::-;;;;;;;;;;:64;35168:116;;;35264:4;35255:13;;35168:116;35298:3;;;;;:::i;:::-;;;;35086:227;;;35373:6;35369:102;;35395:19;:31;35415:10;35395:31;;;;;;;;;;;;;;;:49;35427:16;35395:49;;;;;;;;;;;;;;;35450:8;35395:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35369:102;35024:454;;34949:529;;:::o;19118:125::-;;;;:::o;19847:124::-;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:139::-;798:5;836:6;823:20;814:29;;852:33;879:5;852:33;:::i;:::-;752:139;;;;:::o;897:143::-;954:5;985:6;979:13;970:22;;1001:33;1028:5;1001:33;:::i;:::-;897:143;;;;:::o;1063:370::-;1134:5;1183:3;1176:4;1168:6;1164:17;1160:27;1150:122;;1191:79;;:::i;:::-;1150:122;1308:6;1295:20;1333:94;1423:3;1415:6;1408:4;1400:6;1396:17;1333:94;:::i;:::-;1324:103;;1140:293;1063:370;;;;:::o;1439:139::-;1485:5;1523:6;1510:20;1501:29;;1539:33;1566:5;1539:33;:::i;:::-;1439:139;;;;:::o;1584:143::-;1641:5;1672:6;1666:13;1657:22;;1688:33;1715:5;1688:33;:::i;:::-;1584:143;;;;:::o;1733:329::-;1792:6;1841:2;1829:9;1820:7;1816:23;1812:32;1809:119;;;1847:79;;:::i;:::-;1809:119;1967:1;1992:53;2037:7;2028:6;2017:9;2013:22;1992:53;:::i;:::-;1982:63;;1938:117;1733:329;;;;:::o;2068:351::-;2138:6;2187:2;2175:9;2166:7;2162:23;2158:32;2155:119;;;2193:79;;:::i;:::-;2155:119;2313:1;2338:64;2394:7;2385:6;2374:9;2370:22;2338:64;:::i;:::-;2328:74;;2284:128;2068:351;;;;:::o;2425:474::-;2493:6;2501;2550:2;2538:9;2529:7;2525:23;2521:32;2518:119;;;2556:79;;:::i;:::-;2518:119;2676:1;2701:53;2746:7;2737:6;2726:9;2722:22;2701:53;:::i;:::-;2691:63;;2647:117;2803:2;2829:53;2874:7;2865:6;2854:9;2850:22;2829:53;:::i;:::-;2819:63;;2774:118;2425:474;;;;;:::o;2905:619::-;2982:6;2990;2998;3047:2;3035:9;3026:7;3022:23;3018:32;3015:119;;;3053:79;;:::i;:::-;3015:119;3173:1;3198:53;3243:7;3234:6;3223:9;3219:22;3198:53;:::i;:::-;3188:63;;3144:117;3300:2;3326:53;3371:7;3362:6;3351:9;3347:22;3326:53;:::i;:::-;3316:63;;3271:118;3428:2;3454:53;3499:7;3490:6;3479:9;3475:22;3454:53;:::i;:::-;3444:63;;3399:118;2905:619;;;;;:::o;3530:684::-;3623:6;3631;3680:2;3668:9;3659:7;3655:23;3651:32;3648:119;;;3686:79;;:::i;:::-;3648:119;3806:1;3831:53;3876:7;3867:6;3856:9;3852:22;3831:53;:::i;:::-;3821:63;;3777:117;3961:2;3950:9;3946:18;3933:32;3992:18;3984:6;3981:30;3978:117;;;4014:79;;:::i;:::-;3978:117;4119:78;4189:7;4180:6;4169:9;4165:22;4119:78;:::i;:::-;4109:88;;3904:303;3530:684;;;;;:::o;4220:474::-;4288:6;4296;4345:2;4333:9;4324:7;4320:23;4316:32;4313:119;;;4351:79;;:::i;:::-;4313:119;4471:1;4496:53;4541:7;4532:6;4521:9;4517:22;4496:53;:::i;:::-;4486:63;;4442:117;4598:2;4624:53;4669:7;4660:6;4649:9;4645:22;4624:53;:::i;:::-;4614:63;;4569:118;4220:474;;;;;:::o;4700:329::-;4759:6;4808:2;4796:9;4787:7;4783:23;4779:32;4776:119;;;4814:79;;:::i;:::-;4776:119;4934:1;4959:53;5004:7;4995:6;4984:9;4980:22;4959:53;:::i;:::-;4949:63;;4905:117;4700:329;;;;:::o;5035:351::-;5105:6;5154:2;5142:9;5133:7;5129:23;5125:32;5122:119;;;5160:79;;:::i;:::-;5122:119;5280:1;5305:64;5361:7;5352:6;5341:9;5337:22;5305:64;:::i;:::-;5295:74;;5251:128;5035:351;;;;:::o;5392:179::-;5461:10;5482:46;5524:3;5516:6;5482:46;:::i;:::-;5560:4;5555:3;5551:14;5537:28;;5392:179;;;;:::o;5577:291::-;5702:10;5723:102;5821:3;5813:6;5723:102;:::i;:::-;5857:4;5852:3;5848:14;5834:28;;5577:291;;;;:::o;5874:179::-;5943:10;5964:46;6006:3;5998:6;5964:46;:::i;:::-;6042:4;6037:3;6033:14;6019:28;;5874:179;;;;:::o;6059:108::-;6136:24;6154:5;6136:24;:::i;:::-;6131:3;6124:37;6059:108;;:::o;6173:118::-;6260:24;6278:5;6260:24;:::i;:::-;6255:3;6248:37;6173:118;;:::o;6327:732::-;6446:3;6475:54;6523:5;6475:54;:::i;:::-;6545:86;6624:6;6619:3;6545:86;:::i;:::-;6538:93;;6655:56;6705:5;6655:56;:::i;:::-;6734:7;6765:1;6750:284;6775:6;6772:1;6769:13;6750:284;;;6851:6;6845:13;6878:63;6937:3;6922:13;6878:63;:::i;:::-;6871:70;;6964:60;7017:6;6964:60;:::i;:::-;6954:70;;6810:224;6797:1;6794;6790:9;6785:14;;6750:284;;;6754:14;7050:3;7043:10;;6451:608;;;6327:732;;;;:::o;7127:956::-;7302:3;7331:82;7407:5;7331:82;:::i;:::-;7429:114;7536:6;7531:3;7429:114;:::i;:::-;7422:121;;7567:84;7645:5;7567:84;:::i;:::-;7674:7;7705:1;7690:368;7715:6;7712:1;7709:13;7690:368;;;7791:6;7785:13;7818:119;7933:3;7918:13;7818:119;:::i;:::-;7811:126;;7960:88;8041:6;7960:88;:::i;:::-;7950:98;;7750:308;7737:1;7734;7730:9;7725:14;;7690:368;;;7694:14;8074:3;8067:10;;7307:776;;;7127:956;;;;:::o;8119:732::-;8238:3;8267:54;8315:5;8267:54;:::i;:::-;8337:86;8416:6;8411:3;8337:86;:::i;:::-;8330:93;;8447:56;8497:5;8447:56;:::i;:::-;8526:7;8557:1;8542:284;8567:6;8564:1;8561:13;8542:284;;;8643:6;8637:13;8670:63;8729:3;8714:13;8670:63;:::i;:::-;8663:70;;8756:60;8809:6;8756:60;:::i;:::-;8746:70;;8602:224;8589:1;8586;8582:9;8577:14;;8542:284;;;8546:14;8842:3;8835:10;;8243:608;;;8119:732;;;;:::o;8857:109::-;8938:21;8953:5;8938:21;:::i;:::-;8933:3;8926:34;8857:109;;:::o;8972:364::-;9060:3;9088:39;9121:5;9088:39;:::i;:::-;9143:71;9207:6;9202:3;9143:71;:::i;:::-;9136:78;;9223:52;9268:6;9263:3;9256:4;9249:5;9245:16;9223:52;:::i;:::-;9300:29;9322:6;9300:29;:::i;:::-;9295:3;9291:39;9284:46;;9064:272;8972:364;;;;:::o;9342:366::-;9484:3;9505:67;9569:2;9564:3;9505:67;:::i;:::-;9498:74;;9581:93;9670:3;9581:93;:::i;:::-;9699:2;9694:3;9690:12;9683:19;;9342:366;;;:::o;9714:::-;9856:3;9877:67;9941:2;9936:3;9877:67;:::i;:::-;9870:74;;9953:93;10042:3;9953:93;:::i;:::-;10071:2;10066:3;10062:12;10055:19;;9714:366;;;:::o;10086:::-;10228:3;10249:67;10313:2;10308:3;10249:67;:::i;:::-;10242:74;;10325:93;10414:3;10325:93;:::i;:::-;10443:2;10438:3;10434:12;10427:19;;10086:366;;;:::o;10458:::-;10600:3;10621:67;10685:2;10680:3;10621:67;:::i;:::-;10614:74;;10697:93;10786:3;10697:93;:::i;:::-;10815:2;10810:3;10806:12;10799:19;;10458:366;;;:::o;10830:::-;10972:3;10993:67;11057:2;11052:3;10993:67;:::i;:::-;10986:74;;11069:93;11158:3;11069:93;:::i;:::-;11187:2;11182:3;11178:12;11171:19;;10830:366;;;:::o;11202:::-;11344:3;11365:67;11429:2;11424:3;11365:67;:::i;:::-;11358:74;;11441:93;11530:3;11441:93;:::i;:::-;11559:2;11554:3;11550:12;11543:19;;11202:366;;;:::o;11574:::-;11716:3;11737:67;11801:2;11796:3;11737:67;:::i;:::-;11730:74;;11813:93;11902:3;11813:93;:::i;:::-;11931:2;11926:3;11922:12;11915:19;;11574:366;;;:::o;11946:::-;12088:3;12109:67;12173:2;12168:3;12109:67;:::i;:::-;12102:74;;12185:93;12274:3;12185:93;:::i;:::-;12303:2;12298:3;12294:12;12287:19;;11946:366;;;:::o;12318:::-;12460:3;12481:67;12545:2;12540:3;12481:67;:::i;:::-;12474:74;;12557:93;12646:3;12557:93;:::i;:::-;12675:2;12670:3;12666:12;12659:19;;12318:366;;;:::o;12690:::-;12832:3;12853:67;12917:2;12912:3;12853:67;:::i;:::-;12846:74;;12929:93;13018:3;12929:93;:::i;:::-;13047:2;13042:3;13038:12;13031:19;;12690:366;;;:::o;13062:::-;13204:3;13225:67;13289:2;13284:3;13225:67;:::i;:::-;13218:74;;13301:93;13390:3;13301:93;:::i;:::-;13419:2;13414:3;13410:12;13403:19;;13062:366;;;:::o;13434:::-;13576:3;13597:67;13661:2;13656:3;13597:67;:::i;:::-;13590:74;;13673:93;13762:3;13673:93;:::i;:::-;13791:2;13786:3;13782:12;13775:19;;13434:366;;;:::o;13806:::-;13948:3;13969:67;14033:2;14028:3;13969:67;:::i;:::-;13962:74;;14045:93;14134:3;14045:93;:::i;:::-;14163:2;14158:3;14154:12;14147:19;;13806:366;;;:::o;14178:398::-;14337:3;14358:83;14439:1;14434:3;14358:83;:::i;:::-;14351:90;;14450:93;14539:3;14450:93;:::i;:::-;14568:1;14563:3;14559:11;14552:18;;14178:398;;;:::o;14582:366::-;14724:3;14745:67;14809:2;14804:3;14745:67;:::i;:::-;14738:74;;14821:93;14910:3;14821:93;:::i;:::-;14939:2;14934:3;14930:12;14923:19;;14582:366;;;:::o;14954:::-;15096:3;15117:67;15181:2;15176:3;15117:67;:::i;:::-;15110:74;;15193:93;15282:3;15193:93;:::i;:::-;15311:2;15306:3;15302:12;15295:19;;14954:366;;;:::o;15326:::-;15468:3;15489:67;15553:2;15548:3;15489:67;:::i;:::-;15482:74;;15565:93;15654:3;15565:93;:::i;:::-;15683:2;15678:3;15674:12;15667:19;;15326:366;;;:::o;15698:::-;15840:3;15861:67;15925:2;15920:3;15861:67;:::i;:::-;15854:74;;15937:93;16026:3;15937:93;:::i;:::-;16055:2;16050:3;16046:12;16039:19;;15698:366;;;:::o;16070:::-;16212:3;16233:67;16297:2;16292:3;16233:67;:::i;:::-;16226:74;;16309:93;16398:3;16309:93;:::i;:::-;16427:2;16422:3;16418:12;16411:19;;16070:366;;;:::o;16500:522::-;16643:4;16638:3;16634:14;16741:4;16734:5;16730:16;16724:23;16760:63;16817:4;16812:3;16808:14;16794:12;16760:63;:::i;:::-;16658:175;16923:4;16916:5;16912:16;16906:23;16942:63;16999:4;16994:3;16990:14;16976:12;16942:63;:::i;:::-;16843:172;16612:410;16500:522;;:::o;17086:532::-;17239:4;17234:3;17230:14;17337:4;17330:5;17326:16;17320:23;17356:63;17413:4;17408:3;17404:14;17390:12;17356:63;:::i;:::-;17254:175;17519:4;17512:5;17508:16;17502:23;17538:63;17595:4;17590:3;17586:14;17572:12;17538:63;:::i;:::-;17439:172;17208:410;17086:532;;:::o;17672:878::-;17815:4;17810:3;17806:14;17913:4;17906:5;17902:16;17896:23;17932:63;17989:4;17984:3;17980:14;17966:12;17932:63;:::i;:::-;17830:175;18095:4;18088:5;18084:16;18078:23;18114:63;18171:4;18166:3;18162:14;18148:12;18114:63;:::i;:::-;18015:172;18274:4;18267:5;18263:16;18257:23;18293:63;18350:4;18345:3;18341:14;18327:12;18293:63;:::i;:::-;18197:169;18451:4;18444:5;18440:16;18434:23;18470:63;18527:4;18522:3;18518:14;18504:12;18470:63;:::i;:::-;18376:167;17784:766;17672:878;;:::o;18556:108::-;18633:24;18651:5;18633:24;:::i;:::-;18628:3;18621:37;18556:108;;:::o;18670:118::-;18757:24;18775:5;18757:24;:::i;:::-;18752:3;18745:37;18670:118;;:::o;18794:112::-;18877:22;18893:5;18877:22;:::i;:::-;18872:3;18865:35;18794:112;;:::o;18912:379::-;19096:3;19118:147;19261:3;19118:147;:::i;:::-;19111:154;;19282:3;19275:10;;18912:379;;;:::o;19297:222::-;19390:4;19428:2;19417:9;19413:18;19405:26;;19441:71;19509:1;19498:9;19494:17;19485:6;19441:71;:::i;:::-;19297:222;;;;:::o;19525:553::-;19702:4;19740:3;19729:9;19725:19;19717:27;;19754:71;19822:1;19811:9;19807:17;19798:6;19754:71;:::i;:::-;19835:72;19903:2;19892:9;19888:18;19879:6;19835:72;:::i;:::-;19917;19985:2;19974:9;19970:18;19961:6;19917:72;:::i;:::-;19999;20067:2;20056:9;20052:18;20043:6;19999:72;:::i;:::-;19525:553;;;;;;;:::o;20084:332::-;20205:4;20243:2;20232:9;20228:18;20220:26;;20256:71;20324:1;20313:9;20309:17;20300:6;20256:71;:::i;:::-;20337:72;20405:2;20394:9;20390:18;20381:6;20337:72;:::i;:::-;20084:332;;;;;:::o;20422:373::-;20565:4;20603:2;20592:9;20588:18;20580:26;;20652:9;20646:4;20642:20;20638:1;20627:9;20623:17;20616:47;20680:108;20783:4;20774:6;20680:108;:::i;:::-;20672:116;;20422:373;;;;:::o;20801:485::-;21000:4;21038:2;21027:9;21023:18;21015:26;;21087:9;21081:4;21077:20;21073:1;21062:9;21058:17;21051:47;21115:164;21274:4;21265:6;21115:164;:::i;:::-;21107:172;;20801:485;;;;:::o;21292:373::-;21435:4;21473:2;21462:9;21458:18;21450:26;;21522:9;21516:4;21512:20;21508:1;21497:9;21493:17;21486:47;21550:108;21653:4;21644:6;21550:108;:::i;:::-;21542:116;;21292:373;;;;:::o;21671:210::-;21758:4;21796:2;21785:9;21781:18;21773:26;;21809:65;21871:1;21860:9;21856:17;21847:6;21809:65;:::i;:::-;21671:210;;;;:::o;21887:313::-;22000:4;22038:2;22027:9;22023:18;22015:26;;22087:9;22081:4;22077:20;22073:1;22062:9;22058:17;22051:47;22115:78;22188:4;22179:6;22115:78;:::i;:::-;22107:86;;21887:313;;;;:::o;22206:419::-;22372:4;22410:2;22399:9;22395:18;22387:26;;22459:9;22453:4;22449:20;22445:1;22434:9;22430:17;22423:47;22487:131;22613:4;22487:131;:::i;:::-;22479:139;;22206:419;;;:::o;22631:::-;22797:4;22835:2;22824:9;22820:18;22812:26;;22884:9;22878:4;22874:20;22870:1;22859:9;22855:17;22848:47;22912:131;23038:4;22912:131;:::i;:::-;22904:139;;22631:419;;;:::o;23056:::-;23222:4;23260:2;23249:9;23245:18;23237:26;;23309:9;23303:4;23299:20;23295:1;23284:9;23280:17;23273:47;23337:131;23463:4;23337:131;:::i;:::-;23329:139;;23056:419;;;:::o;23481:::-;23647:4;23685:2;23674:9;23670:18;23662:26;;23734:9;23728:4;23724:20;23720:1;23709:9;23705:17;23698:47;23762:131;23888:4;23762:131;:::i;:::-;23754:139;;23481:419;;;:::o;23906:::-;24072:4;24110:2;24099:9;24095:18;24087:26;;24159:9;24153:4;24149:20;24145:1;24134:9;24130:17;24123:47;24187:131;24313:4;24187:131;:::i;:::-;24179:139;;23906:419;;;:::o;24331:::-;24497:4;24535:2;24524:9;24520:18;24512:26;;24584:9;24578:4;24574:20;24570:1;24559:9;24555:17;24548:47;24612:131;24738:4;24612:131;:::i;:::-;24604:139;;24331:419;;;:::o;24756:::-;24922:4;24960:2;24949:9;24945:18;24937:26;;25009:9;25003:4;24999:20;24995:1;24984:9;24980:17;24973:47;25037:131;25163:4;25037:131;:::i;:::-;25029:139;;24756:419;;;:::o;25181:::-;25347:4;25385:2;25374:9;25370:18;25362:26;;25434:9;25428:4;25424:20;25420:1;25409:9;25405:17;25398:47;25462:131;25588:4;25462:131;:::i;:::-;25454:139;;25181:419;;;:::o;25606:::-;25772:4;25810:2;25799:9;25795:18;25787:26;;25859:9;25853:4;25849:20;25845:1;25834:9;25830:17;25823:47;25887:131;26013:4;25887:131;:::i;:::-;25879:139;;25606:419;;;:::o;26031:::-;26197:4;26235:2;26224:9;26220:18;26212:26;;26284:9;26278:4;26274:20;26270:1;26259:9;26255:17;26248:47;26312:131;26438:4;26312:131;:::i;:::-;26304:139;;26031:419;;;:::o;26456:::-;26622:4;26660:2;26649:9;26645:18;26637:26;;26709:9;26703:4;26699:20;26695:1;26684:9;26680:17;26673:47;26737:131;26863:4;26737:131;:::i;:::-;26729:139;;26456:419;;;:::o;26881:::-;27047:4;27085:2;27074:9;27070:18;27062:26;;27134:9;27128:4;27124:20;27120:1;27109:9;27105:17;27098:47;27162:131;27288:4;27162:131;:::i;:::-;27154:139;;26881:419;;;:::o;27306:::-;27472:4;27510:2;27499:9;27495:18;27487:26;;27559:9;27553:4;27549:20;27545:1;27534:9;27530:17;27523:47;27587:131;27713:4;27587:131;:::i;:::-;27579:139;;27306:419;;;:::o;27731:::-;27897:4;27935:2;27924:9;27920:18;27912:26;;27984:9;27978:4;27974:20;27970:1;27959:9;27955:17;27948:47;28012:131;28138:4;28012:131;:::i;:::-;28004:139;;27731:419;;;:::o;28156:::-;28322:4;28360:2;28349:9;28345:18;28337:26;;28409:9;28403:4;28399:20;28395:1;28384:9;28380:17;28373:47;28437:131;28563:4;28437:131;:::i;:::-;28429:139;;28156:419;;;:::o;28581:::-;28747:4;28785:2;28774:9;28770:18;28762:26;;28834:9;28828:4;28824:20;28820:1;28809:9;28805:17;28798:47;28862:131;28988:4;28862:131;:::i;:::-;28854:139;;28581:419;;;:::o;29006:::-;29172:4;29210:2;29199:9;29195:18;29187:26;;29259:9;29253:4;29249:20;29245:1;29234:9;29230:17;29223:47;29287:131;29413:4;29287:131;:::i;:::-;29279:139;;29006:419;;;:::o;29431:::-;29597:4;29635:2;29624:9;29620:18;29612:26;;29684:9;29678:4;29674:20;29670:1;29659:9;29655:17;29648:47;29712:131;29838:4;29712:131;:::i;:::-;29704:139;;29431:419;;;:::o;29856:334::-;30005:4;30043:2;30032:9;30028:18;30020:26;;30056:127;30180:1;30169:9;30165:17;30156:6;30056:127;:::i;:::-;29856:334;;;;:::o;30196:315::-;30335:4;30373:3;30362:9;30358:19;30350:27;;30387:117;30501:1;30490:9;30486:17;30477:6;30387:117;:::i;:::-;30196:315;;;;:::o;30517:222::-;30610:4;30648:2;30637:9;30633:18;30625:26;;30661:71;30729:1;30718:9;30714:17;30705:6;30661:71;:::i;:::-;30517:222;;;;:::o;30745:214::-;30834:4;30872:2;30861:9;30857:18;30849:26;;30885:67;30949:1;30938:9;30934:17;30925:6;30885:67;:::i;:::-;30745:214;;;;:::o;30965:129::-;30999:6;31026:20;;:::i;:::-;31016:30;;31055:33;31083:4;31075:6;31055:33;:::i;:::-;30965:129;;;:::o;31100:75::-;31133:6;31166:2;31160:9;31150:19;;31100:75;:::o;31181:311::-;31258:4;31348:18;31340:6;31337:30;31334:56;;;31370:18;;:::i;:::-;31334:56;31420:4;31412:6;31408:17;31400:25;;31480:4;31474;31470:15;31462:23;;31181:311;;;:::o;31498:132::-;31565:4;31588:3;31580:11;;31618:4;31613:3;31609:14;31601:22;;31498:132;;;:::o;31636:160::-;31731:4;31754:3;31746:11;;31784:4;31779:3;31775:14;31767:22;;31636:160;;;:::o;31802:132::-;31869:4;31892:3;31884:11;;31922:4;31917:3;31913:14;31905:22;;31802:132;;;:::o;31940:114::-;32007:6;32041:5;32035:12;32025:22;;31940:114;;;:::o;32060:142::-;32155:6;32189:5;32183:12;32173:22;;32060:142;;;:::o;32208:114::-;32275:6;32309:5;32303:12;32293:22;;32208:114;;;:::o;32328:99::-;32380:6;32414:5;32408:12;32398:22;;32328:99;;;:::o;32433:113::-;32503:4;32535;32530:3;32526:14;32518:22;;32433:113;;;:::o;32552:141::-;32650:4;32682;32677:3;32673:14;32665:22;;32552:141;;;:::o;32699:113::-;32769:4;32801;32796:3;32792:14;32784:22;;32699:113;;;:::o;32818:184::-;32917:11;32951:6;32946:3;32939:19;32991:4;32986:3;32982:14;32967:29;;32818:184;;;;:::o;33008:212::-;33135:11;33169:6;33164:3;33157:19;33209:4;33204:3;33200:14;33185:29;;33008:212;;;;:::o;33226:184::-;33325:11;33359:6;33354:3;33347:19;33399:4;33394:3;33390:14;33375:29;;33226:184;;;;:::o;33416:147::-;33517:11;33554:3;33539:18;;33416:147;;;;:::o;33569:169::-;33653:11;33687:6;33682:3;33675:19;33727:4;33722:3;33718:14;33703:29;;33569:169;;;;:::o;33744:305::-;33784:3;33803:20;33821:1;33803:20;:::i;:::-;33798:25;;33837:20;33855:1;33837:20;:::i;:::-;33832:25;;33991:1;33923:66;33919:74;33916:1;33913:81;33910:107;;;33997:18;;:::i;:::-;33910:107;34041:1;34038;34034:9;34027:16;;33744:305;;;;:::o;34055:185::-;34095:1;34112:20;34130:1;34112:20;:::i;:::-;34107:25;;34146:20;34164:1;34146:20;:::i;:::-;34141:25;;34185:1;34175:35;;34190:18;;:::i;:::-;34175:35;34232:1;34229;34225:9;34220:14;;34055:185;;;;:::o;34246:348::-;34286:7;34309:20;34327:1;34309:20;:::i;:::-;34304:25;;34343:20;34361:1;34343:20;:::i;:::-;34338:25;;34531:1;34463:66;34459:74;34456:1;34453:81;34448:1;34441:9;34434:17;34430:105;34427:131;;;34538:18;;:::i;:::-;34427:131;34586:1;34583;34579:9;34568:20;;34246:348;;;;:::o;34600:191::-;34640:4;34660:20;34678:1;34660:20;:::i;:::-;34655:25;;34694:20;34712:1;34694:20;:::i;:::-;34689:25;;34733:1;34730;34727:8;34724:34;;;34738:18;;:::i;:::-;34724:34;34783:1;34780;34776:9;34768:17;;34600:191;;;;:::o;34797:96::-;34834:7;34863:24;34881:5;34863:24;:::i;:::-;34852:35;;34797:96;;;:::o;34899:90::-;34933:7;34976:5;34969:13;34962:21;34951:32;;34899:90;;;:::o;34995:126::-;35032:7;35072:42;35065:5;35061:54;35050:65;;34995:126;;;:::o;35127:77::-;35164:7;35193:5;35182:16;;35127:77;;;:::o;35210:86::-;35245:7;35285:4;35278:5;35274:16;35263:27;;35210:86;;;:::o;35302:307::-;35370:1;35380:113;35394:6;35391:1;35388:13;35380:113;;;35479:1;35474:3;35470:11;35464:18;35460:1;35455:3;35451:11;35444:39;35416:2;35413:1;35409:10;35404:15;;35380:113;;;35511:6;35508:1;35505:13;35502:101;;;35591:1;35582:6;35577:3;35573:16;35566:27;35502:101;35351:258;35302:307;;;:::o;35615:320::-;35659:6;35696:1;35690:4;35686:12;35676:22;;35743:1;35737:4;35733:12;35764:18;35754:81;;35820:4;35812:6;35808:17;35798:27;;35754:81;35882:2;35874:6;35871:14;35851:18;35848:38;35845:84;;;35901:18;;:::i;:::-;35845:84;35666:269;35615:320;;;:::o;35941:281::-;36024:27;36046:4;36024:27;:::i;:::-;36016:6;36012:40;36154:6;36142:10;36139:22;36118:18;36106:10;36103:34;36100:62;36097:88;;;36165:18;;:::i;:::-;36097:88;36205:10;36201:2;36194:22;35984:238;35941:281;;:::o;36228:233::-;36267:3;36290:24;36308:5;36290:24;:::i;:::-;36281:33;;36336:66;36329:5;36326:77;36323:103;;;36406:18;;:::i;:::-;36323:103;36453:1;36446:5;36442:13;36435:20;;36228:233;;;:::o;36467:180::-;36515:77;36512:1;36505:88;36612:4;36609:1;36602:15;36636:4;36633:1;36626:15;36653:180;36701:77;36698:1;36691:88;36798:4;36795:1;36788:15;36822:4;36819:1;36812:15;36839:180;36887:77;36884:1;36877:88;36984:4;36981:1;36974:15;37008:4;37005:1;36998:15;37025:180;37073:77;37070:1;37063:88;37170:4;37167:1;37160:15;37194:4;37191:1;37184:15;37211:180;37259:77;37256:1;37249:88;37356:4;37353:1;37346:15;37380:4;37377:1;37370:15;37397:180;37445:77;37442:1;37435:88;37542:4;37539:1;37532:15;37566:4;37563:1;37556:15;37583:117;37692:1;37689;37682:12;37706:117;37815:1;37812;37805:12;37829:117;37938:1;37935;37928:12;37952:117;38061:1;38058;38051:12;38075:102;38116:6;38167:2;38163:7;38158:2;38151:5;38147:14;38143:28;38133:38;;38075:102;;;:::o;38183:222::-;38323:34;38319:1;38311:6;38307:14;38300:58;38392:5;38387:2;38379:6;38375:15;38368:30;38183:222;:::o;38411:221::-;38551:34;38547:1;38539:6;38535:14;38528:58;38620:4;38615:2;38607:6;38603:15;38596:29;38411:221;:::o;38638:230::-;38778:34;38774:1;38766:6;38762:14;38755:58;38847:13;38842:2;38834:6;38830:15;38823:38;38638:230;:::o;38874:225::-;39014:34;39010:1;39002:6;38998:14;38991:58;39083:8;39078:2;39070:6;39066:15;39059:33;38874:225;:::o;39105:221::-;39245:34;39241:1;39233:6;39229:14;39222:58;39314:4;39309:2;39301:6;39297:15;39290:29;39105:221;:::o;39332:179::-;39472:31;39468:1;39460:6;39456:14;39449:55;39332:179;:::o;39517:225::-;39657:34;39653:1;39645:6;39641:14;39634:58;39726:8;39721:2;39713:6;39709:15;39702:33;39517:225;:::o;39748:::-;39888:34;39884:1;39876:6;39872:14;39865:58;39957:8;39952:2;39944:6;39940:15;39933:33;39748:225;:::o;39979:178::-;40119:30;40115:1;40107:6;40103:14;40096:54;39979:178;:::o;40163:182::-;40303:34;40299:1;40291:6;40287:14;40280:58;40163:182;:::o;40351:220::-;40491:34;40487:1;40479:6;40475:14;40468:58;40560:3;40555:2;40547:6;40543:15;40536:28;40351:220;:::o;40577:224::-;40717:34;40713:1;40705:6;40701:14;40694:58;40786:7;40781:2;40773:6;40769:15;40762:32;40577:224;:::o;40807:176::-;40947:28;40943:1;40935:6;40931:14;40924:52;40807:176;:::o;40989:114::-;;:::o;41109:166::-;41249:18;41245:1;41237:6;41233:14;41226:42;41109:166;:::o;41281:223::-;41421:34;41417:1;41409:6;41405:14;41398:58;41490:6;41485:2;41477:6;41473:15;41466:31;41281:223;:::o;41510:177::-;41650:29;41646:1;41638:6;41634:14;41627:53;41510:177;:::o;41693:224::-;41833:34;41829:1;41821:6;41817:14;41810:58;41902:7;41897:2;41889:6;41885:15;41878:32;41693:224;:::o;41923:181::-;42063:33;42059:1;42051:6;42047:14;42040:57;41923:181;:::o;42110:122::-;42183:24;42201:5;42183:24;:::i;:::-;42176:5;42173:35;42163:63;;42222:1;42219;42212:12;42163:63;42110:122;:::o;42238:::-;42311:24;42329:5;42311:24;:::i;:::-;42304:5;42301:35;42291:63;;42350:1;42347;42340:12;42291:63;42238:122;:::o
Swarm Source
ipfs://38905d31e284ce8574e4ab3de9572f4900616533ffad9cbb90e314a31cabec88
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.