Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize | 13299537 | 1627 days ago | IN | 0 ETH | 0.00903023 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SunflowerArtV2
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
//
//
// ,╔φ▒╠▒▒▒
// ,φ╠░▒▒▒▒▒▒▒
// ,▒░░░░░▒▒▒▒▒▒ε
// φ░░░░░░▒▒▒▒▒▒▒╠
// φ░░░░░░░▒▒▒▒▒▒▒╠
// ,≤φ░░░░░φφφ≡, ░░░░░░░▒▒▒▒▒▒▒▒╠
// ;φ░░░░░░░░░░░░░Γ «░░░░░░▒▒▒▒▒▒▒▒╠╠
// ;░░░░░░░░░░░░░░░░░[ )░░░░░▒▒▒▒▒▒▒▒▒╠╠
// ,░░░░░░░░░░░░░░░░░░░╠" ╙▒▒▒▒▒▒▒▒▒╠╠
// ≤░░░░░░░░░░░░░░░░░░░░╚ ╔╠░░φ, ▒▒▒▒▒▒▒╠╩
// ⁿ░░││││░░░░░░░░░░░░░ε ░░░░░▒ `╙╠▒▒╩
// "░'\││░░░░░░░░░░░░╚ `╙╩╩" ╓╓
// ""░░░░░░░≥=" ,- ,╔╠▒▒▒╠╦
// ,φ▒░░░▒▒▒▒▒▒▒▒▒▒╠╦
// ░░░░░░░▒▒▒▒▒▒▒▒▒╠╠╬
// `░░░░░▒▒▒▒▒▒▒▒╠╠╠╠╠╠
// "░░░░▒▒▒▒▒▒╠╠╠╠╠╠╠╠╬
// ╚░░▒▒▒▒╠╠╠╠╠╠╠╠╠╠╠
// "╩▒▒╠╠╠╠╠╠╠╠╠╠╠╠
// "╚╠╠╠╠╠╠╠╠╠╩
// "╙╝╠╠╩
//
//
//
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "./License.sol";
contract SunflowerArtV2 is Initializable, ERC721EnumerableUpgradeable, OwnableUpgradeable, PausableUpgradeable {
string public artCode;
string public artCodeDependencies; //e.g. [email protected]
string public artDescription;
bool public isArtCodeSealed;
uint256 public currentTokenID;
uint256 public maxTokens;
uint256 public tokenPrice;
string public tokenBaseURI;
string public extraStringArtist;
string public extraStringPlatform;
// Address that can mint when paused, intended to be the address of another contract.
address public privilegedMinterAddress; //
address payable public artistFundsAddress;
address public artistAddress; // Deployer address is the artist.
uint256 private artistBalance; // For safety with arbitrary address, use withdrawal mechanism.
address payable constant platformAddress = payable(0xf0bE1F2FB8abfa9aBF7d218a226ef4F046f09a40);
uint256 public sunflowerMintPercent; // e.g. 10 for %10
uint256 public sunflowerTokenRoyalty; // e.g. 31 for every 31th token
uint256 public artistTokenRoyalty;
address constant public sunflowerPreviousVersionContractAddress = 0xD58434F33a20661f186ff67626ea6BDf41B80bCA;
uint256 constant public sunflowerContractVersion = 2;
// Block hashes are determined at mint time.
// The seed corresponding to a token can only be accesed one block after, and is equal to keccak256(blockhash ^ tokenID)
mapping(uint256 => bytes32) internal blockhashForToken;
// Want "initialize" so can use proxy
function initialize(string memory _name, string memory _symbol, uint256 _maxTokens, uint256 _tokenPrice, address _artistFundsAddress, uint256 _artistTokenRoyalty) public initializer {
__ERC721_init(_name, _symbol);
__ERC721Enumerable_init_unchained();
__Ownable_init();
__Pausable_init();
isArtCodeSealed = false;
// Fixed, but can be adjusted for each proxy contract with setPlatformFields.
sunflowerMintPercent = 29;
sunflowerTokenRoyalty = 31; // Every 31th token, so 3.22%. Use a prime to reduce collisions.
artistBalance = 0;
tokenBaseURI = "";
// Use these methods so the checks of those methods will run.
setArtistFields(_artistTokenRoyalty);
setMaxTokens(_maxTokens);
setTokenPrice(_tokenPrice);
currentTokenID = 0;
artistFundsAddress = payable(_artistFundsAddress);
privilegedMinterAddress = address(0);
artistAddress = owner(); // initialize to the deployer address, and don't let it be changed
pauseNormalMinting();
}
// Guarantee every seed is different, and make it impractical to predict, by XORing with tokenID.
function seedForToken(uint256 tokenID) public view returns (uint256) {
require(_exists(tokenID), "Nonexistant token");
bytes32 intermediate = bytes32(tokenID) ^ blockhashForToken[tokenID];
bytes32 hashed = keccak256(abi.encodePacked(intermediate));
uint256 seed = uint256(hashed);
return seed;
}
// Base minting function. Ensures only maxTokens can ever be minted. MaxTokens can only be set before the contract is sealed.
function _mintBase(address _recipient, uint256 _tokenID) internal {
requireSealed();
require(_tokenID < maxTokens, "Max number of tokens minted");
_safeMint(_recipient, _tokenID);
blockhashForToken[_tokenID] = blockhash(block.number - 1);
}
function _generalMint(address _recipient) internal {
// Skip token if it's meant for platform or artist royalties.
if (((sunflowerTokenRoyalty != 0) && ((currentTokenID % sunflowerTokenRoyalty) == 0)) || ((artistTokenRoyalty != 0) && ((currentTokenID % artistTokenRoyalty) == 0))) {
currentTokenID = currentTokenID + 1;
_generalMint(_recipient);
return;
}
// Mint currentTokenID
_mintBase(_recipient, currentTokenID);
currentTokenID = currentTokenID + 1;
// Handle payment
require(msg.value == tokenPrice, "Tx value incorrect");
uint256 sunflowerFee = (sunflowerMintPercent * 100 * msg.value) / (100*100);
uint256 artistAmount = msg.value - sunflowerFee;
// Trusted address
platformAddress.transfer(sunflowerFee);
// Add to artist balance
artistBalance += artistAmount;
}
function mintRoyalties() public {
requireSealed();
require(currentTokenID >= maxTokens - 2, "Max tokens not yet reached");
if (artistTokenRoyalty != 0) {
for (uint256 i =0; i<maxTokens; i+= artistTokenRoyalty) {
// Avoid numbers where (i % sunflowerTokenRoyalty == 0) && (i % artistTokenRoyalty == 0)
if ((i % sunflowerTokenRoyalty) != 0) {
_mintBase(artistFundsAddress, i);
}
}
}
if (sunflowerTokenRoyalty != 0) {
for (uint256 i =0; i<maxTokens; i+= sunflowerTokenRoyalty) {
_mintBase(platformAddress, i);
}
}
}
// Standard minting function. Requires msg.value==tokenPrice and mintingNotPaused.
function mintToken() public payable {
requireMintingNotPaused();
_generalMint(msg.sender);
}
// Mint for owner, ignoring pause status. Requires msg.value==tokenPrice and owner.
function mintTokenOwner() public payable {
requireOwner();
_generalMint(msg.sender);
}
// Mintable by privilegedMinterAddress, ignoring pause status.
function mintTokenPrivileged(address _recipient) public payable {
require(privilegedMinterAddress != address(0));
require(msg.sender == privilegedMinterAddress);
_generalMint(_recipient);
}
function withdrawArtistBalance() public {
uint256 balanceToSend = artistBalance;
artistBalance = 0;
artistFundsAddress.transfer(balanceToSend);
}
// Pause and unpause
function pauseNormalMinting() public {
requireOwner();
_pause();
}
function resumeNormalMinting() public {
requireOwner();
_unpause();
}
function requireMintingNotPaused() internal view whenNotPaused {}
// Fields that are adjustable any time.
function setTokenPrice(uint256 _tokenPrice) public {
requireOwner();
tokenPrice = _tokenPrice;
require(_tokenPrice == 0 || artistTokenRoyalty == 0);
}
function setPrivilegedMinterAddress(address _privilegedMinterAddress) public {
// RequirePlatform
requirePlatform();
privilegedMinterAddress = _privilegedMinterAddress;
}
// Fields that are only adjustable before sealing.
function setPlatformFields(uint256 _sunflowerMintPercent, uint256 _sunflowerTokenRoyalty) public {
requirePlatform();
requireNotSealed();
sunflowerMintPercent = _sunflowerMintPercent;
sunflowerTokenRoyalty = _sunflowerTokenRoyalty;
}
function setArtistFields(uint256 _artistTokenRoyalty) public {
requireOwner();
requireNotSealed();
require((_artistTokenRoyalty == 0) || (((_artistTokenRoyalty % sunflowerTokenRoyalty) != 0) && (_artistTokenRoyalty > 2)), "See requirements for artistTokenRoyalty");
artistTokenRoyalty = _artistTokenRoyalty;
require(tokenPrice == 0 || _artistTokenRoyalty == 0);
}
function setMaxTokens(uint256 _maxTokens) public {
requireOwner();
requireNotSealed();
maxTokens = _maxTokens;
}
function setArtCode(string memory _artCode, string memory _artCodeDependencies, string memory _artDescription) public {
requireOwner();
requireNotSealed();
artCode = _artCode;
artCodeDependencies = _artCodeDependencies;
artDescription = _artDescription;
}
// Seal the art code. Disables many functions of the contract
function sealArtCode() public {
requireOwner();
requireNotSealed();
require((bytes(artCode).length != 0) && (bytes(artCodeDependencies).length != 0) && (bytes(artDescription).length != 0), "Art not fully set.");
isArtCodeSealed = true;
}
function requireNotSealed() internal view {
require(isArtCodeSealed == false, "Art is sealed");
}
function requireSealed() internal view {
require(isArtCodeSealed == true, "Art is not sealed");
}
// Functions for token URI and other strings that provide extra context (e.g. social links that may change, IPFS links to contract ABI, etc.). Can be set anytime.
function _baseURI() internal view override returns (string memory) {
return tokenBaseURI;
}
function setBaseURI(string memory _tokenBaseURI) public {
requireOwner();
tokenBaseURI = _tokenBaseURI;
}
function setExtraStringArtist(string memory _extraStringArtist) public {
requireOwner();
extraStringArtist = _extraStringArtist;
}
function setExtraStringPlatform(string memory _extraStringPlatform) public {
requirePlatform();
extraStringPlatform = _extraStringPlatform;
}
// Convert any modifiers to require functions, for readability.
function requireOwner() internal view onlyOwner {}
function requirePlatform() internal view {
require(platformAddress == msg.sender, "Platform only");
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "./IERC721EnumerableUpgradeable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable {
function __ERC721Enumerable_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__ERC721Enumerable_init_unchained();
}
function __ERC721Enumerable_init_unchained() internal initializer {
}
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC721Upgradeable) returns (bool) {
return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Upgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721EnumerableUpgradeable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721Upgradeable.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721Upgradeable.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
uint256[46] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal initializer {
_setOwner(_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 {
_setOwner(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");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(_initializing || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
function __Pausable_init() internal initializer {
__Context_init_unchained();
__Pausable_init_unchained();
}
function __Pausable_init_unchained() internal initializer {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC721Upgradeable.sol";
import "./IERC721ReceiverUpgradeable.sol";
import "./extensions/IERC721MetadataUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/StringsUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {
using AddressUpgradeable for address;
using StringsUpgradeable for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
function __ERC721_init(string memory name_, string memory symbol_) internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__ERC721_init_unchained(name_, symbol_);
}
function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
return
interfaceId == type(IERC721Upgradeable).interfaceId ||
interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721Upgradeable.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721Upgradeable.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721Upgradeable.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721ReceiverUpgradeable.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
uint256[44] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../IERC721Upgradeable.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721EnumerableUpgradeable is IERC721Upgradeable {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165Upgradeable.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721Upgradeable is IERC165Upgradeable {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721ReceiverUpgradeable {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../IERC721Upgradeable.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721MetadataUpgradeable is IERC721Upgradeable {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @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 ContextUpgradeable is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library StringsUpgradeable {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {
function __ERC165_init() internal initializer {
__ERC165_init_unchained();
}
function __ERC165_init_unchained() internal initializer {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
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 IERC165Upgradeable {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
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);
}// The MIT License (MIT) // // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artCodeDependencies","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artistFundsAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artistTokenRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extraStringArtist","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extraStringPlatform","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxTokens","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"},{"internalType":"address","name":"_artistFundsAddress","type":"address"},{"internalType":"uint256","name":"_artistTokenRoyalty","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isArtCodeSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintTokenOwner","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"mintTokenPrivileged","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseNormalMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privilegedMinterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeNormalMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealArtCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"seedForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_artCode","type":"string"},{"internalType":"string","name":"_artCodeDependencies","type":"string"},{"internalType":"string","name":"_artDescription","type":"string"}],"name":"setArtCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_artistTokenRoyalty","type":"uint256"}],"name":"setArtistFields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_extraStringArtist","type":"string"}],"name":"setExtraStringArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_extraStringPlatform","type":"string"}],"name":"setExtraStringPlatform","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sunflowerMintPercent","type":"uint256"},{"internalType":"uint256","name":"_sunflowerTokenRoyalty","type":"uint256"}],"name":"setPlatformFields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_privilegedMinterAddress","type":"address"}],"name":"setPrivilegedMinterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sunflowerContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sunflowerMintPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sunflowerPreviousVersionContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sunflowerTokenRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawArtistBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50615fcb80620000216000396000f3fe6080604052600436106103765760003560e01c80635c975abb116101d1578063ad3a25b611610102578063d74edb5e116100a0578063eb02b4641161006f578063eb02b46414610c2e578063f2fde38b14610c4a578063f9bc98c514610c73578063ff0ca38014610c9c57610376565b8063d74edb5e14610b84578063d7eb3f3a14610b9b578063e831574214610bc6578063e985e9c514610bf157610376565b8063c87b56dd116100dc578063c87b56dd14610ac6578063cb53a7d614610b03578063ce4fb7f314610b2e578063d3f6002114610b5957610376565b8063ad3a25b614610a49578063b88d4fde14610a72578063bb62115e14610a9b57610376565b80637ff9b5961161016f57806395d89b411161014957806395d89b41146109a157806396052ded146109cc578063a22cb465146109f7578063a347a46014610a2057610376565b80637ff9b596146109225780638da5cb5b1461094d5780638fab34e71461097857610376565b80636a61e5fc116101ab5780636a61e5fc1461086857806370a0823114610891578063715018a6146108ce578063742cfb87146108e557610376565b80635c975abb146107f65780636352211e1461082157806369a3c7b11461085e57610376565b80632f72658d116102ab5780634e99b8001161024957806350f1f3bc1161022357806350f1f3bc1461076057806354c558a91461078b57806355f804b3146107b6578063560ee8fd146107df57610376565b80634e99b800146106cf5780634f6ccce7146106fa578063507d923c1461073757610376565b806342842e0e1161028557806342842e0e1461063957806348b0410f146106625780634dfe33ac1461068d5780634e06b03a146106a457610376565b80632f72658d146105ba5780632f745c59146105e557806330e466191461062257610376565b8063152f9bf7116103185780631e309041116102f25780631e309041146105315780632004ffd91461055c57806323b872dd1461056657806328b5e9651461058f57610376565b8063152f9bf7146104b257806318160ddd146104dd5780631d7334b71461050857610376565b8063095ea7b311610354578063095ea7b3146104205780630e4c8b67146104495780630ed079001461047257806311e776fe1461048957610376565b806301ffc9a71461037b57806306fdde03146103b8578063081812fc146103e3575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190614775565b610cc7565b6040516103af9190614f8e565b60405180910390f35b3480156103c457600080fd5b506103cd610d41565b6040516103da9190614fa9565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190614958565b610dd3565b6040516104179190614f0c565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190614739565b610e58565b005b34801561045557600080fd5b50610470600480360381019061046b91906147c7565b610f70565b005b34801561047e57600080fd5b50610487610f93565b005b34801561049557600080fd5b506104b060048036038101906104ab9190614958565b610fa5565b005b3480156104be57600080fd5b506104c7610fc0565b6040516104d4919061538b565b60405180910390f35b3480156104e957600080fd5b506104f2610fc7565b6040516104ff919061538b565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a91906145ce565b610fd4565b005b34801561053d57600080fd5b50610546611021565b6040516105539190614fa9565b60405180910390f35b6105646110b0565b005b34801561057257600080fd5b5061058d60048036038101906105889190614633565b6110c3565b005b34801561059b57600080fd5b506105a4611123565b6040516105b19190614fa9565b60405180910390f35b3480156105c657600080fd5b506105cf6111b2565b6040516105dc919061538b565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190614739565b6111b9565b604051610619919061538b565b60405180910390f35b34801561062e57600080fd5b5061063761125e565b005b34801561064557600080fd5b50610660600480360381019061065b9190614633565b611317565b005b34801561066e57600080fd5b50610677611337565b6040516106849190614fa9565b60405180910390f35b34801561069957600080fd5b506106a26113c6565b005b3480156106b057600080fd5b506106b9611444565b6040516106c6919061538b565b60405180910390f35b3480156106db57600080fd5b506106e461144b565b6040516106f19190614fa9565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190614958565b6114da565b60405161072e919061538b565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190614958565b611571565b005b34801561076c57600080fd5b50610775611610565b6040516107829190614f27565b60405180910390f35b34801561079757600080fd5b506107a0611637565b6040516107ad9190614f0c565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d891906147c7565b61164f565b005b3480156107eb57600080fd5b506107f4611672565b005b34801561080257600080fd5b5061080b611684565b6040516108189190614f8e565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190614958565b61169b565b6040516108559190614f0c565b60405180910390f35b61086661174d565b005b34801561087457600080fd5b5061088f600480360381019061088a9190614958565b611760565b005b34801561089d57600080fd5b506108b860048036038101906108b391906145ce565b61178e565b6040516108c5919061538b565b60405180910390f35b3480156108da57600080fd5b506108e3611846565b005b3480156108f157600080fd5b5061090c60048036038101906109079190614958565b6118ce565b604051610919919061538b565b60405180910390f35b34801561092e57600080fd5b50610937611974565b604051610944919061538b565b60405180910390f35b34801561095957600080fd5b5061096261197b565b60405161096f9190614f0c565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a9190614808565b6119a5565b005b3480156109ad57600080fd5b506109b6611a02565b6040516109c39190614fa9565b60405180910390f35b3480156109d857600080fd5b506109e1611a94565b6040516109ee9190614f8e565b60405180910390f35b348015610a0357600080fd5b50610a1e6004803603810190610a1991906146fd565b611aa8565b005b348015610a2c57600080fd5b50610a476004803603810190610a429190614981565b611c29565b005b348015610a5557600080fd5b50610a706004803603810190610a6b91906147c7565b611c4d565b005b348015610a7e57600080fd5b50610a996004803603810190610a949190614682565b611c70565b005b348015610aa757600080fd5b50610ab0611cd2565b604051610abd919061538b565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190614958565b611cd9565b604051610afa9190614fa9565b60405180910390f35b348015610b0f57600080fd5b50610b18611d80565b604051610b259190614fa9565b60405180910390f35b348015610b3a57600080fd5b50610b43611e0f565b604051610b509190614f0c565b60405180910390f35b348015610b6557600080fd5b50610b6e611e36565b604051610b7b9190614fa9565b60405180910390f35b348015610b9057600080fd5b50610b99611ec5565b005b348015610ba757600080fd5b50610bb0611fe8565b604051610bbd9190614f0c565b60405180910390f35b348015610bd257600080fd5b50610bdb61200f565b604051610be8919061538b565b60405180910390f35b348015610bfd57600080fd5b50610c186004803603810190610c1391906145f7565b612016565b604051610c259190614f8e565b60405180910390f35b610c486004803603810190610c4391906145ce565b6120aa565b005b348015610c5657600080fd5b50610c716004803603810190610c6c91906145ce565b61216e565b005b348015610c7f57600080fd5b50610c9a6004803603810190610c95919061489f565b612266565b005b348015610ca857600080fd5b50610cb16124bf565b604051610cbe919061538b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d3a5750610d39826124c4565b5b9050919050565b606060658054610d5090615657565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7c90615657565b8015610dc95780601f10610d9e57610100808354040283529160200191610dc9565b820191906000526020600020905b815481529060010190602001808311610dac57829003601f168201915b5050505050905090565b6000610dde826125a6565b610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e149061520b565b60405180910390fd5b6069600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e638261169b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb9061528b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ef3612612565b73ffffffffffffffffffffffffffffffffffffffff161480610f225750610f2181610f1c612612565b612016565b5b610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f589061516b565b60405180910390fd5b610f6b838361261a565b505050565b610f786126d3565b806101369080519060200190610f8f9291906143f2565b5050565b610f9b612757565b610fa36127d5565b565b610fad612757565b610fb5612877565b806101328190555050565b61013b5481565b6000609980549050905090565b610fdc6126d3565b8061013760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610135805461102f90615657565b80601f016020809104026020016040519081016040528092919081815260200182805461105b90615657565b80156110a85780601f1061107d576101008083540402835291602001916110a8565b820191906000526020600020905b81548152906001019060200180831161108b57829003601f168201915b505050505081565b6110b86128d0565b6110c13361291a565b565b6110d46110ce612612565b82612ab5565b611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a906152eb565b60405180910390fd5b61111e838383612b93565b505050565b61012f805461113190615657565b80601f016020809104026020016040519081016040528092919081815260200182805461115d90615657565b80156111aa5780601f1061117f576101008083540402835291602001916111aa565b820191906000526020600020905b81548152906001019060200180831161118d57829003601f168201915b505050505081565b61013d5481565b60006111c48361178e565b8210611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc9061502b565b60405180910390fd5b609760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611266612757565b61126e612877565b600061012d805461127e90615657565b90501415801561129e5750600061012e805461129990615657565b905014155b80156112ba5750600061012f80546112b590615657565b905014155b6112f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f0906150eb565b60405180910390fd5b600161013060006101000a81548160ff021916908315150217905550565b61133283838360405180602001604052806000815250611c70565b505050565b610136805461134590615657565b80601f016020809104026020016040519081016040528092919081815260200182805461137190615657565b80156113be5780601f10611393576101008083540402835291602001916113be565b820191906000526020600020905b8154815290600101906020018083116113a157829003601f168201915b505050505081565b600061013a549050600061013a8190555061013860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611440573d6000803e3d6000fd5b5050565b61013c5481565b610134805461145990615657565b80601f016020809104026020016040519081016040528092919081815260200182805461148590615657565b80156114d25780601f106114a7576101008083540402835291602001916114d2565b820191906000526020600020905b8154815290600101906020018083116114b557829003601f168201915b505050505081565b60006114e4610fc7565b8210611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c9061530b565b60405180910390fd5b6099828154811061155f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611579612757565b611581612877565b60008114806115ab5750600061013c548261159c919061570d565b141580156115aa5750600281115b5b6115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e1906152ab565b60405180910390fd5b8061013d8190555060006101335414806116045750600081145b61160d57600080fd5b50565b61013860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73d58434f33a20661f186ff67626ea6bdf41b80bca81565b611657612757565b80610134908051906020019061166e9291906143f2565b5050565b61167a612757565b611682612def565b565b600060fb60009054906101000a900460ff16905090565b6000806067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b906151ab565b60405180910390fd5b80915050919050565b611755612757565b61175e3361291a565b565b611768612757565b806101338190555060008114806117825750600061013d54145b61178b57600080fd5b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f69061518b565b60405180910390fd5b606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61184e612612565b73ffffffffffffffffffffffffffffffffffffffff1661186c61197b565b73ffffffffffffffffffffffffffffffffffffffff16146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b99061522b565b60405180910390fd5b6118cc6000612e92565b565b60006118d9826125a6565b611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614fcb565b60405180910390fd5b600061013e6000848152602001908152602001600020548360001b1890506000816040516020016119499190614ecd565b60405160208183030381529060405280519060200120905060008160001c9050809350505050919050565b6101335481565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119ad612757565b6119b5612877565b8261012d90805190602001906119cc9291906143f2565b508161012e90805190602001906119e49291906143f2565b508061012f90805190602001906119fc9291906143f2565b50505050565b606060668054611a1190615657565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3d90615657565b8015611a8a5780601f10611a5f57610100808354040283529160200191611a8a565b820191906000526020600020905b815481529060010190602001808311611a6d57829003601f168201915b5050505050905090565b61013060009054906101000a900460ff1681565b611ab0612612565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b15906150cb565b60405180910390fd5b80606a6000611b2b612612565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bd8612612565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c1d9190614f8e565b60405180910390a35050565b611c316126d3565b611c39612877565b8161013b819055508061013c819055505050565b611c55612757565b806101359080519060200190611c6c9291906143f2565b5050565b611c81611c7b612612565b83612ab5565b611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb7906152eb565b60405180910390fd5b611ccc84848484612f58565b50505050565b6101315481565b6060611ce4826125a6565b611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a9061526b565b60405180910390fd5b6000611d2d612fb4565b90506000815111611d4d5760405180602001604052806000815250611d78565b80611d5784613047565b604051602001611d68929190614ee8565b6040516020818303038152906040525b915050919050565b61012d8054611d8e90615657565b80601f0160208091040260200160405190810160405280929190818152602001828054611dba90615657565b8015611e075780601f10611ddc57610100808354040283529160200191611e07565b820191906000526020600020905b815481529060010190602001808311611dea57829003601f168201915b505050505081565b61013760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61012e8054611e4490615657565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7090615657565b8015611ebd5780601f10611e9257610100808354040283529160200191611ebd565b820191906000526020600020905b815481529060010190602001808311611ea057829003601f168201915b505050505081565b611ecd6131f4565b600261013254611edd9190615551565b610131541015611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f199061512b565b60405180910390fd5b600061013d5414611f975760005b61013254811015611f9557600061013c5482611f4c919061570d565b14611f7f57611f7e61013860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261324d565b5b61013d5481611f8e9190615470565b9050611f30565b505b600061013c5414611fe65760005b61013254811015611fe457611fce73f0be1f2fb8abfa9abf7d218a226ef4f046f09a408261324d565b61013c5481611fdd9190615470565b9050611fa5565b505b565b61013960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6101325481565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1661013760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561210757600080fd5b61013760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461216257600080fd5b61216b8161291a565b50565b612176612612565b73ffffffffffffffffffffffffffffffffffffffff1661219461197b565b73ffffffffffffffffffffffffffffffffffffffff16146121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e19061522b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561225a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122519061506b565b60405180910390fd5b61226381612e92565b50565b600060019054906101000a900460ff168061228c575060008054906101000a900460ff16155b6122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c2906151cb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561231b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61232587876132ce565b61232d6133c3565b61233561349c565b61233d613585565b600061013060006101000a81548160ff021916908315150217905550601d61013b81905550601f61013c81905550600061013a8190555060405180602001604052806000815250610134908051906020019061239a9291906143f2565b506123a482611571565b6123ad85610fa5565b6123b684611760565b6000610131819055508261013860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600061013760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061244c61197b565b61013960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612495611672565b80156124b65760008060016101000a81548160ff0219169083151502179055505b50505050505050565b600281565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061258f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061259f575061259e8261366e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816069600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661268d8361169b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b3373ffffffffffffffffffffffffffffffffffffffff1673f0be1f2fb8abfa9abf7d218a226ef4f046f09a4073ffffffffffffffffffffffffffffffffffffffff1614612755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274c9061536b565b60405180910390fd5b565b61275f612612565b73ffffffffffffffffffffffffffffffffffffffff1661277d61197b565b73ffffffffffffffffffffffffffffffffffffffff16146127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca9061522b565b60405180910390fd5b565b6127dd611684565b61281c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281390614feb565b60405180910390fd5b600060fb60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612860612612565b60405161286d9190614f0c565b60405180910390a1565b6000151561013060009054906101000a900460ff161515146128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c59061534b565b60405180910390fd5b565b6128d8611684565b15612918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290f9061514b565b60405180910390fd5b565b600061013c541415801561293f5750600061013c546101315461293d919061570d565b145b8061296b5750600061013d541415801561296a5750600061013d5461013154612968919061570d565b145b5b15612995576001610131546129809190615470565b610131819055506129908161291a565b612ab2565b6129a2816101315461324d565b6001610131546129b29190615470565b610131819055506101335434146129fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f5906152cb565b60405180910390fd5b600061271034606461013b54612a1491906154f7565b612a1e91906154f7565b612a2891906154c6565b905060008134612a389190615551565b905073f0be1f2fb8abfa9abf7d218a226ef4f046f09a4073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612a94573d6000803e3d6000fd5b508061013a6000828254612aa89190615470565b9250508190555050505b50565b6000612ac0826125a6565b612aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af69061510b565b60405180910390fd5b6000612b0a8361169b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b7957508373ffffffffffffffffffffffffffffffffffffffff16612b6184610dd3565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b8a5750612b898185612016565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bb38261169b565b73ffffffffffffffffffffffffffffffffffffffff1614612c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c009061524b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c70906150ab565b60405180910390fd5b612c848383836136d8565b612c8f60008261261a565b6001606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cdf9190615551565b925050819055506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d369190615470565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612df7611684565b15612e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2e9061514b565b60405180910390fd5b600160fb60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e7b612612565b604051612e889190614f0c565b60405180910390a1565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160c960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f63848484612b93565b612f6f848484846137ec565b612fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa59061504b565b60405180910390fd5b50505050565b60606101348054612fc490615657565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff090615657565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b5050505050905090565b6060600082141561308f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131ef565b600082905060005b600082146130c15780806130aa906156ba565b915050600a826130ba91906154c6565b9150613097565b60008167ffffffffffffffff811115613103577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131355781602001600182028036833780820191505090505b5090505b600085146131e85760018261314e9190615551565b9150600a8561315d919061570d565b60306131699190615470565b60f81b8183815181106131a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131e191906154c6565b9450613139565b8093505050505b919050565b6001151561013060009054906101000a900460ff1615151461324b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132429061500b565b60405180910390fd5b565b6132556131f4565b61013254811061329a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132919061532b565b60405180910390fd5b6132a48282613983565b6001436132b19190615551565b4061013e6000838152602001908152602001600020819055505050565b600060019054906101000a900460ff16806132f4575060008054906101000a900460ff16155b613333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332a906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613383576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61338b6139a1565b613393613a7a565b61339d8383613b53565b80156133be5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806133e9575060008054906101000a900460ff16155b613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341f906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613478576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156134995760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806134c2575060008054906101000a900460ff16155b613501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f8906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613551576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6135596139a1565b613561613c5c565b80156135825760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806135ab575060008054906101000a900460ff16155b6135ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e1906151cb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561363a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6136426139a1565b61364a613d45565b801561366b5760008060016101000a81548160ff0219169083151502179055505b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136e3838383613e39565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137265761372181613e3e565b613765565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613764576137638382613e87565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137a8576137a381613ff4565b6137e7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137e6576137e58282614137565b5b5b505050565b600061380d8473ffffffffffffffffffffffffffffffffffffffff166141b6565b15613976578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613836612612565b8786866040518563ffffffff1660e01b81526004016138589493929190614f42565b602060405180830381600087803b15801561387257600080fd5b505af19250505080156138a357506040513d601f19601f820116820180604052508101906138a0919061479e565b60015b613926573d80600081146138d3576040519150601f19603f3d011682016040523d82523d6000602084013e6138d8565b606091505b5060008151141561391e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139159061504b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061397b565b600190505b949350505050565b61399d8282604051806020016040528060008152506141c9565b5050565b600060019054906101000a900460ff16806139c7575060008054906101000a900460ff16155b613a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fd906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613a56576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8015613a775760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613aa0575060008054906101000a900460ff16155b613adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad6906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613b2f576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8015613b505760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613b79575060008054906101000a900460ff16155b613bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613baf906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613c08576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8260659080519060200190613c1e9291906143f2565b508160669080519060200190613c359291906143f2565b508015613c575760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680613c82575060008054906101000a900460ff16155b613cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cb8906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613d11576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b613d21613d1c612612565b612e92565b8015613d425760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613d6b575060008054906101000a900460ff16155b613daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613da1906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613dfa576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600060fb60006101000a81548160ff0219169083151502179055508015613e365760008060016101000a81548160ff0219169083151502179055505b50565b505050565b609980549050609a600083815260200190815260200160002081905550609981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e948461178e565b613e9e9190615551565b9050600060986000848152602001908152602001600020549050818114613f83576000609760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080609760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816098600083815260200190815260200160002081905550505b6098600084815260200190815260200160002060009055609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016099805490506140089190615551565b90506000609a600084815260200190815260200160002054905060006099838154811061405e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080609983815481106140a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081609a600083815260200190815260200160002081905550609a600085815260200190815260200160002060009055609980548061411b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006141428361178e565b905081609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806098600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6141d38383614224565b6141e060008484846137ec565b61421f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142169061504b565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161428b906151eb565b60405180910390fd5b61429d816125a6565b156142dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142d49061508b565b60405180910390fd5b6142e9600083836136d8565b6001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143399190615470565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546143fe90615657565b90600052602060002090601f0160209004810192826144205760008555614467565b82601f1061443957805160ff1916838001178555614467565b82800160010185558215614467579182015b8281111561446657825182559160200191906001019061444b565b5b5090506144749190614478565b5090565b5b80821115614491576000816000905550600101614479565b5090565b60006144a86144a3846153cb565b6153a6565b9050828152602081018484840111156144c057600080fd5b6144cb848285615615565b509392505050565b60006144e66144e1846153fc565b6153a6565b9050828152602081018484840111156144fe57600080fd5b614509848285615615565b509392505050565b60008135905061452081615f39565b92915050565b60008135905061453581615f50565b92915050565b60008135905061454a81615f67565b92915050565b60008151905061455f81615f67565b92915050565b600082601f83011261457657600080fd5b8135614586848260208601614495565b91505092915050565b600082601f8301126145a057600080fd5b81356145b08482602086016144d3565b91505092915050565b6000813590506145c881615f7e565b92915050565b6000602082840312156145e057600080fd5b60006145ee84828501614511565b91505092915050565b6000806040838503121561460a57600080fd5b600061461885828601614511565b925050602061462985828601614511565b9150509250929050565b60008060006060848603121561464857600080fd5b600061465686828701614511565b935050602061466786828701614511565b9250506040614678868287016145b9565b9150509250925092565b6000806000806080858703121561469857600080fd5b60006146a687828801614511565b94505060206146b787828801614511565b93505060406146c8878288016145b9565b925050606085013567ffffffffffffffff8111156146e557600080fd5b6146f187828801614565565b91505092959194509250565b6000806040838503121561471057600080fd5b600061471e85828601614511565b925050602061472f85828601614526565b9150509250929050565b6000806040838503121561474c57600080fd5b600061475a85828601614511565b925050602061476b858286016145b9565b9150509250929050565b60006020828403121561478757600080fd5b60006147958482850161453b565b91505092915050565b6000602082840312156147b057600080fd5b60006147be84828501614550565b91505092915050565b6000602082840312156147d957600080fd5b600082013567ffffffffffffffff8111156147f357600080fd5b6147ff8482850161458f565b91505092915050565b60008060006060848603121561481d57600080fd5b600084013567ffffffffffffffff81111561483757600080fd5b6148438682870161458f565b935050602084013567ffffffffffffffff81111561486057600080fd5b61486c8682870161458f565b925050604084013567ffffffffffffffff81111561488957600080fd5b6148958682870161458f565b9150509250925092565b60008060008060008060c087890312156148b857600080fd5b600087013567ffffffffffffffff8111156148d257600080fd5b6148de89828a0161458f565b965050602087013567ffffffffffffffff8111156148fb57600080fd5b61490789828a0161458f565b955050604061491889828a016145b9565b945050606061492989828a016145b9565b935050608061493a89828a01614511565b92505060a061494b89828a016145b9565b9150509295509295509295565b60006020828403121561496a57600080fd5b6000614978848285016145b9565b91505092915050565b6000806040838503121561499457600080fd5b60006149a2858286016145b9565b92505060206149b3858286016145b9565b9150509250929050565b6149c681615597565b82525050565b6149d581615585565b82525050565b6149e4816155a9565b82525050565b6149fb6149f6826155b5565b615703565b82525050565b6000614a0c8261542d565b614a168185615443565b9350614a26818560208601615624565b614a2f816157fa565b840191505092915050565b6000614a4582615438565b614a4f8185615454565b9350614a5f818560208601615624565b614a68816157fa565b840191505092915050565b6000614a7e82615438565b614a888185615465565b9350614a98818560208601615624565b80840191505092915050565b6000614ab1601183615454565b9150614abc8261580b565b602082019050919050565b6000614ad4601483615454565b9150614adf82615834565b602082019050919050565b6000614af7601183615454565b9150614b028261585d565b602082019050919050565b6000614b1a602b83615454565b9150614b2582615886565b604082019050919050565b6000614b3d603283615454565b9150614b48826158d5565b604082019050919050565b6000614b60602683615454565b9150614b6b82615924565b604082019050919050565b6000614b83601c83615454565b9150614b8e82615973565b602082019050919050565b6000614ba6602483615454565b9150614bb18261599c565b604082019050919050565b6000614bc9601983615454565b9150614bd4826159eb565b602082019050919050565b6000614bec601283615454565b9150614bf782615a14565b602082019050919050565b6000614c0f602c83615454565b9150614c1a82615a3d565b604082019050919050565b6000614c32601a83615454565b9150614c3d82615a8c565b602082019050919050565b6000614c55601083615454565b9150614c6082615ab5565b602082019050919050565b6000614c78603883615454565b9150614c8382615ade565b604082019050919050565b6000614c9b602a83615454565b9150614ca682615b2d565b604082019050919050565b6000614cbe602983615454565b9150614cc982615b7c565b604082019050919050565b6000614ce1602e83615454565b9150614cec82615bcb565b604082019050919050565b6000614d04602083615454565b9150614d0f82615c1a565b602082019050919050565b6000614d27602c83615454565b9150614d3282615c43565b604082019050919050565b6000614d4a602083615454565b9150614d5582615c92565b602082019050919050565b6000614d6d602983615454565b9150614d7882615cbb565b604082019050919050565b6000614d90602f83615454565b9150614d9b82615d0a565b604082019050919050565b6000614db3602183615454565b9150614dbe82615d59565b604082019050919050565b6000614dd6602783615454565b9150614de182615da8565b604082019050919050565b6000614df9601283615454565b9150614e0482615df7565b602082019050919050565b6000614e1c603183615454565b9150614e2782615e20565b604082019050919050565b6000614e3f602c83615454565b9150614e4a82615e6f565b604082019050919050565b6000614e62601b83615454565b9150614e6d82615ebe565b602082019050919050565b6000614e85600d83615454565b9150614e9082615ee7565b602082019050919050565b6000614ea8600d83615454565b9150614eb382615f10565b602082019050919050565b614ec78161560b565b82525050565b6000614ed982846149ea565b60208201915081905092915050565b6000614ef48285614a73565b9150614f008284614a73565b91508190509392505050565b6000602082019050614f2160008301846149cc565b92915050565b6000602082019050614f3c60008301846149bd565b92915050565b6000608082019050614f5760008301876149cc565b614f6460208301866149cc565b614f716040830185614ebe565b8181036060830152614f838184614a01565b905095945050505050565b6000602082019050614fa360008301846149db565b92915050565b60006020820190508181036000830152614fc38184614a3a565b905092915050565b60006020820190508181036000830152614fe481614aa4565b9050919050565b6000602082019050818103600083015261500481614ac7565b9050919050565b6000602082019050818103600083015261502481614aea565b9050919050565b6000602082019050818103600083015261504481614b0d565b9050919050565b6000602082019050818103600083015261506481614b30565b9050919050565b6000602082019050818103600083015261508481614b53565b9050919050565b600060208201905081810360008301526150a481614b76565b9050919050565b600060208201905081810360008301526150c481614b99565b9050919050565b600060208201905081810360008301526150e481614bbc565b9050919050565b6000602082019050818103600083015261510481614bdf565b9050919050565b6000602082019050818103600083015261512481614c02565b9050919050565b6000602082019050818103600083015261514481614c25565b9050919050565b6000602082019050818103600083015261516481614c48565b9050919050565b6000602082019050818103600083015261518481614c6b565b9050919050565b600060208201905081810360008301526151a481614c8e565b9050919050565b600060208201905081810360008301526151c481614cb1565b9050919050565b600060208201905081810360008301526151e481614cd4565b9050919050565b6000602082019050818103600083015261520481614cf7565b9050919050565b6000602082019050818103600083015261522481614d1a565b9050919050565b6000602082019050818103600083015261524481614d3d565b9050919050565b6000602082019050818103600083015261526481614d60565b9050919050565b6000602082019050818103600083015261528481614d83565b9050919050565b600060208201905081810360008301526152a481614da6565b9050919050565b600060208201905081810360008301526152c481614dc9565b9050919050565b600060208201905081810360008301526152e481614dec565b9050919050565b6000602082019050818103600083015261530481614e0f565b9050919050565b6000602082019050818103600083015261532481614e32565b9050919050565b6000602082019050818103600083015261534481614e55565b9050919050565b6000602082019050818103600083015261536481614e78565b9050919050565b6000602082019050818103600083015261538481614e9b565b9050919050565b60006020820190506153a06000830184614ebe565b92915050565b60006153b06153c1565b90506153bc8282615689565b919050565b6000604051905090565b600067ffffffffffffffff8211156153e6576153e56157cb565b5b6153ef826157fa565b9050602081019050919050565b600067ffffffffffffffff821115615417576154166157cb565b5b615420826157fa565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061547b8261560b565b91506154868361560b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154bb576154ba61573e565b5b828201905092915050565b60006154d18261560b565b91506154dc8361560b565b9250826154ec576154eb61576d565b5b828204905092915050565b60006155028261560b565b915061550d8361560b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155465761554561573e565b5b828202905092915050565b600061555c8261560b565b91506155678361560b565b92508282101561557a5761557961573e565b5b828203905092915050565b6000615590826155eb565b9050919050565b60006155a2826155eb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615642578082015181840152602081019050615627565b83811115615651576000848401525b50505050565b6000600282049050600182168061566f57607f821691505b602082108114156156835761568261579c565b5b50919050565b615692826157fa565b810181811067ffffffffffffffff821117156156b1576156b06157cb565b5b80604052505050565b60006156c58261560b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156f8576156f761573e565b5b600182019050919050565b6000819050919050565b60006157188261560b565b91506157238361560b565b9250826157335761573261576d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e6f6e6578697374616e7420746f6b656e000000000000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f417274206973206e6f74207365616c6564000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f417274206e6f742066756c6c79207365742e0000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d617820746f6b656e73206e6f74207965742072656163686564000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53656520726571756972656d656e747320666f7220617274697374546f6b656e60008201527f526f79616c747900000000000000000000000000000000000000000000000000602082015250565b7f54782076616c756520696e636f72726563740000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d6178206e756d626572206f6620746f6b656e73206d696e7465640000000000600082015250565b7f417274206973207365616c656400000000000000000000000000000000000000600082015250565b7f506c6174666f726d206f6e6c7900000000000000000000000000000000000000600082015250565b615f4281615585565b8114615f4d57600080fd5b50565b615f59816155a9565b8114615f6457600080fd5b50565b615f70816155bf565b8114615f7b57600080fd5b50565b615f878161560b565b8114615f9257600080fd5b5056fea2646970667358221220d60f4ba31cf34a3daf639657e0a1a64d98189757ec6b46e05e7bdf32b22da91764736f6c63430008040033
Deployed Bytecode
0x6080604052600436106103765760003560e01c80635c975abb116101d1578063ad3a25b611610102578063d74edb5e116100a0578063eb02b4641161006f578063eb02b46414610c2e578063f2fde38b14610c4a578063f9bc98c514610c73578063ff0ca38014610c9c57610376565b8063d74edb5e14610b84578063d7eb3f3a14610b9b578063e831574214610bc6578063e985e9c514610bf157610376565b8063c87b56dd116100dc578063c87b56dd14610ac6578063cb53a7d614610b03578063ce4fb7f314610b2e578063d3f6002114610b5957610376565b8063ad3a25b614610a49578063b88d4fde14610a72578063bb62115e14610a9b57610376565b80637ff9b5961161016f57806395d89b411161014957806395d89b41146109a157806396052ded146109cc578063a22cb465146109f7578063a347a46014610a2057610376565b80637ff9b596146109225780638da5cb5b1461094d5780638fab34e71461097857610376565b80636a61e5fc116101ab5780636a61e5fc1461086857806370a0823114610891578063715018a6146108ce578063742cfb87146108e557610376565b80635c975abb146107f65780636352211e1461082157806369a3c7b11461085e57610376565b80632f72658d116102ab5780634e99b8001161024957806350f1f3bc1161022357806350f1f3bc1461076057806354c558a91461078b57806355f804b3146107b6578063560ee8fd146107df57610376565b80634e99b800146106cf5780634f6ccce7146106fa578063507d923c1461073757610376565b806342842e0e1161028557806342842e0e1461063957806348b0410f146106625780634dfe33ac1461068d5780634e06b03a146106a457610376565b80632f72658d146105ba5780632f745c59146105e557806330e466191461062257610376565b8063152f9bf7116103185780631e309041116102f25780631e309041146105315780632004ffd91461055c57806323b872dd1461056657806328b5e9651461058f57610376565b8063152f9bf7146104b257806318160ddd146104dd5780631d7334b71461050857610376565b8063095ea7b311610354578063095ea7b3146104205780630e4c8b67146104495780630ed079001461047257806311e776fe1461048957610376565b806301ffc9a71461037b57806306fdde03146103b8578063081812fc146103e3575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190614775565b610cc7565b6040516103af9190614f8e565b60405180910390f35b3480156103c457600080fd5b506103cd610d41565b6040516103da9190614fa9565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190614958565b610dd3565b6040516104179190614f0c565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190614739565b610e58565b005b34801561045557600080fd5b50610470600480360381019061046b91906147c7565b610f70565b005b34801561047e57600080fd5b50610487610f93565b005b34801561049557600080fd5b506104b060048036038101906104ab9190614958565b610fa5565b005b3480156104be57600080fd5b506104c7610fc0565b6040516104d4919061538b565b60405180910390f35b3480156104e957600080fd5b506104f2610fc7565b6040516104ff919061538b565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a91906145ce565b610fd4565b005b34801561053d57600080fd5b50610546611021565b6040516105539190614fa9565b60405180910390f35b6105646110b0565b005b34801561057257600080fd5b5061058d60048036038101906105889190614633565b6110c3565b005b34801561059b57600080fd5b506105a4611123565b6040516105b19190614fa9565b60405180910390f35b3480156105c657600080fd5b506105cf6111b2565b6040516105dc919061538b565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190614739565b6111b9565b604051610619919061538b565b60405180910390f35b34801561062e57600080fd5b5061063761125e565b005b34801561064557600080fd5b50610660600480360381019061065b9190614633565b611317565b005b34801561066e57600080fd5b50610677611337565b6040516106849190614fa9565b60405180910390f35b34801561069957600080fd5b506106a26113c6565b005b3480156106b057600080fd5b506106b9611444565b6040516106c6919061538b565b60405180910390f35b3480156106db57600080fd5b506106e461144b565b6040516106f19190614fa9565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190614958565b6114da565b60405161072e919061538b565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190614958565b611571565b005b34801561076c57600080fd5b50610775611610565b6040516107829190614f27565b60405180910390f35b34801561079757600080fd5b506107a0611637565b6040516107ad9190614f0c565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d891906147c7565b61164f565b005b3480156107eb57600080fd5b506107f4611672565b005b34801561080257600080fd5b5061080b611684565b6040516108189190614f8e565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190614958565b61169b565b6040516108559190614f0c565b60405180910390f35b61086661174d565b005b34801561087457600080fd5b5061088f600480360381019061088a9190614958565b611760565b005b34801561089d57600080fd5b506108b860048036038101906108b391906145ce565b61178e565b6040516108c5919061538b565b60405180910390f35b3480156108da57600080fd5b506108e3611846565b005b3480156108f157600080fd5b5061090c60048036038101906109079190614958565b6118ce565b604051610919919061538b565b60405180910390f35b34801561092e57600080fd5b50610937611974565b604051610944919061538b565b60405180910390f35b34801561095957600080fd5b5061096261197b565b60405161096f9190614f0c565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a9190614808565b6119a5565b005b3480156109ad57600080fd5b506109b6611a02565b6040516109c39190614fa9565b60405180910390f35b3480156109d857600080fd5b506109e1611a94565b6040516109ee9190614f8e565b60405180910390f35b348015610a0357600080fd5b50610a1e6004803603810190610a1991906146fd565b611aa8565b005b348015610a2c57600080fd5b50610a476004803603810190610a429190614981565b611c29565b005b348015610a5557600080fd5b50610a706004803603810190610a6b91906147c7565b611c4d565b005b348015610a7e57600080fd5b50610a996004803603810190610a949190614682565b611c70565b005b348015610aa757600080fd5b50610ab0611cd2565b604051610abd919061538b565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190614958565b611cd9565b604051610afa9190614fa9565b60405180910390f35b348015610b0f57600080fd5b50610b18611d80565b604051610b259190614fa9565b60405180910390f35b348015610b3a57600080fd5b50610b43611e0f565b604051610b509190614f0c565b60405180910390f35b348015610b6557600080fd5b50610b6e611e36565b604051610b7b9190614fa9565b60405180910390f35b348015610b9057600080fd5b50610b99611ec5565b005b348015610ba757600080fd5b50610bb0611fe8565b604051610bbd9190614f0c565b60405180910390f35b348015610bd257600080fd5b50610bdb61200f565b604051610be8919061538b565b60405180910390f35b348015610bfd57600080fd5b50610c186004803603810190610c1391906145f7565b612016565b604051610c259190614f8e565b60405180910390f35b610c486004803603810190610c4391906145ce565b6120aa565b005b348015610c5657600080fd5b50610c716004803603810190610c6c91906145ce565b61216e565b005b348015610c7f57600080fd5b50610c9a6004803603810190610c95919061489f565b612266565b005b348015610ca857600080fd5b50610cb16124bf565b604051610cbe919061538b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d3a5750610d39826124c4565b5b9050919050565b606060658054610d5090615657565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7c90615657565b8015610dc95780601f10610d9e57610100808354040283529160200191610dc9565b820191906000526020600020905b815481529060010190602001808311610dac57829003601f168201915b5050505050905090565b6000610dde826125a6565b610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e149061520b565b60405180910390fd5b6069600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e638261169b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb9061528b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ef3612612565b73ffffffffffffffffffffffffffffffffffffffff161480610f225750610f2181610f1c612612565b612016565b5b610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f589061516b565b60405180910390fd5b610f6b838361261a565b505050565b610f786126d3565b806101369080519060200190610f8f9291906143f2565b5050565b610f9b612757565b610fa36127d5565b565b610fad612757565b610fb5612877565b806101328190555050565b61013b5481565b6000609980549050905090565b610fdc6126d3565b8061013760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610135805461102f90615657565b80601f016020809104026020016040519081016040528092919081815260200182805461105b90615657565b80156110a85780601f1061107d576101008083540402835291602001916110a8565b820191906000526020600020905b81548152906001019060200180831161108b57829003601f168201915b505050505081565b6110b86128d0565b6110c13361291a565b565b6110d46110ce612612565b82612ab5565b611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a906152eb565b60405180910390fd5b61111e838383612b93565b505050565b61012f805461113190615657565b80601f016020809104026020016040519081016040528092919081815260200182805461115d90615657565b80156111aa5780601f1061117f576101008083540402835291602001916111aa565b820191906000526020600020905b81548152906001019060200180831161118d57829003601f168201915b505050505081565b61013d5481565b60006111c48361178e565b8210611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc9061502b565b60405180910390fd5b609760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611266612757565b61126e612877565b600061012d805461127e90615657565b90501415801561129e5750600061012e805461129990615657565b905014155b80156112ba5750600061012f80546112b590615657565b905014155b6112f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f0906150eb565b60405180910390fd5b600161013060006101000a81548160ff021916908315150217905550565b61133283838360405180602001604052806000815250611c70565b505050565b610136805461134590615657565b80601f016020809104026020016040519081016040528092919081815260200182805461137190615657565b80156113be5780601f10611393576101008083540402835291602001916113be565b820191906000526020600020905b8154815290600101906020018083116113a157829003601f168201915b505050505081565b600061013a549050600061013a8190555061013860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611440573d6000803e3d6000fd5b5050565b61013c5481565b610134805461145990615657565b80601f016020809104026020016040519081016040528092919081815260200182805461148590615657565b80156114d25780601f106114a7576101008083540402835291602001916114d2565b820191906000526020600020905b8154815290600101906020018083116114b557829003601f168201915b505050505081565b60006114e4610fc7565b8210611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c9061530b565b60405180910390fd5b6099828154811061155f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611579612757565b611581612877565b60008114806115ab5750600061013c548261159c919061570d565b141580156115aa5750600281115b5b6115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e1906152ab565b60405180910390fd5b8061013d8190555060006101335414806116045750600081145b61160d57600080fd5b50565b61013860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73d58434f33a20661f186ff67626ea6bdf41b80bca81565b611657612757565b80610134908051906020019061166e9291906143f2565b5050565b61167a612757565b611682612def565b565b600060fb60009054906101000a900460ff16905090565b6000806067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b906151ab565b60405180910390fd5b80915050919050565b611755612757565b61175e3361291a565b565b611768612757565b806101338190555060008114806117825750600061013d54145b61178b57600080fd5b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f69061518b565b60405180910390fd5b606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61184e612612565b73ffffffffffffffffffffffffffffffffffffffff1661186c61197b565b73ffffffffffffffffffffffffffffffffffffffff16146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b99061522b565b60405180910390fd5b6118cc6000612e92565b565b60006118d9826125a6565b611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614fcb565b60405180910390fd5b600061013e6000848152602001908152602001600020548360001b1890506000816040516020016119499190614ecd565b60405160208183030381529060405280519060200120905060008160001c9050809350505050919050565b6101335481565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119ad612757565b6119b5612877565b8261012d90805190602001906119cc9291906143f2565b508161012e90805190602001906119e49291906143f2565b508061012f90805190602001906119fc9291906143f2565b50505050565b606060668054611a1190615657565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3d90615657565b8015611a8a5780601f10611a5f57610100808354040283529160200191611a8a565b820191906000526020600020905b815481529060010190602001808311611a6d57829003601f168201915b5050505050905090565b61013060009054906101000a900460ff1681565b611ab0612612565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b15906150cb565b60405180910390fd5b80606a6000611b2b612612565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bd8612612565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c1d9190614f8e565b60405180910390a35050565b611c316126d3565b611c39612877565b8161013b819055508061013c819055505050565b611c55612757565b806101359080519060200190611c6c9291906143f2565b5050565b611c81611c7b612612565b83612ab5565b611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb7906152eb565b60405180910390fd5b611ccc84848484612f58565b50505050565b6101315481565b6060611ce4826125a6565b611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a9061526b565b60405180910390fd5b6000611d2d612fb4565b90506000815111611d4d5760405180602001604052806000815250611d78565b80611d5784613047565b604051602001611d68929190614ee8565b6040516020818303038152906040525b915050919050565b61012d8054611d8e90615657565b80601f0160208091040260200160405190810160405280929190818152602001828054611dba90615657565b8015611e075780601f10611ddc57610100808354040283529160200191611e07565b820191906000526020600020905b815481529060010190602001808311611dea57829003601f168201915b505050505081565b61013760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61012e8054611e4490615657565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7090615657565b8015611ebd5780601f10611e9257610100808354040283529160200191611ebd565b820191906000526020600020905b815481529060010190602001808311611ea057829003601f168201915b505050505081565b611ecd6131f4565b600261013254611edd9190615551565b610131541015611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f199061512b565b60405180910390fd5b600061013d5414611f975760005b61013254811015611f9557600061013c5482611f4c919061570d565b14611f7f57611f7e61013860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261324d565b5b61013d5481611f8e9190615470565b9050611f30565b505b600061013c5414611fe65760005b61013254811015611fe457611fce73f0be1f2fb8abfa9abf7d218a226ef4f046f09a408261324d565b61013c5481611fdd9190615470565b9050611fa5565b505b565b61013960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6101325481565b6000606a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1661013760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561210757600080fd5b61013760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461216257600080fd5b61216b8161291a565b50565b612176612612565b73ffffffffffffffffffffffffffffffffffffffff1661219461197b565b73ffffffffffffffffffffffffffffffffffffffff16146121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e19061522b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561225a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122519061506b565b60405180910390fd5b61226381612e92565b50565b600060019054906101000a900460ff168061228c575060008054906101000a900460ff16155b6122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c2906151cb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561231b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61232587876132ce565b61232d6133c3565b61233561349c565b61233d613585565b600061013060006101000a81548160ff021916908315150217905550601d61013b81905550601f61013c81905550600061013a8190555060405180602001604052806000815250610134908051906020019061239a9291906143f2565b506123a482611571565b6123ad85610fa5565b6123b684611760565b6000610131819055508261013860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600061013760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061244c61197b565b61013960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612495611672565b80156124b65760008060016101000a81548160ff0219169083151502179055505b50505050505050565b600281565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061258f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061259f575061259e8261366e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166067600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816069600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661268d8361169b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b3373ffffffffffffffffffffffffffffffffffffffff1673f0be1f2fb8abfa9abf7d218a226ef4f046f09a4073ffffffffffffffffffffffffffffffffffffffff1614612755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274c9061536b565b60405180910390fd5b565b61275f612612565b73ffffffffffffffffffffffffffffffffffffffff1661277d61197b565b73ffffffffffffffffffffffffffffffffffffffff16146127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca9061522b565b60405180910390fd5b565b6127dd611684565b61281c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281390614feb565b60405180910390fd5b600060fb60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612860612612565b60405161286d9190614f0c565b60405180910390a1565b6000151561013060009054906101000a900460ff161515146128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c59061534b565b60405180910390fd5b565b6128d8611684565b15612918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290f9061514b565b60405180910390fd5b565b600061013c541415801561293f5750600061013c546101315461293d919061570d565b145b8061296b5750600061013d541415801561296a5750600061013d5461013154612968919061570d565b145b5b15612995576001610131546129809190615470565b610131819055506129908161291a565b612ab2565b6129a2816101315461324d565b6001610131546129b29190615470565b610131819055506101335434146129fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f5906152cb565b60405180910390fd5b600061271034606461013b54612a1491906154f7565b612a1e91906154f7565b612a2891906154c6565b905060008134612a389190615551565b905073f0be1f2fb8abfa9abf7d218a226ef4f046f09a4073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612a94573d6000803e3d6000fd5b508061013a6000828254612aa89190615470565b9250508190555050505b50565b6000612ac0826125a6565b612aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af69061510b565b60405180910390fd5b6000612b0a8361169b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b7957508373ffffffffffffffffffffffffffffffffffffffff16612b6184610dd3565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b8a5750612b898185612016565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bb38261169b565b73ffffffffffffffffffffffffffffffffffffffff1614612c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c009061524b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c70906150ab565b60405180910390fd5b612c848383836136d8565b612c8f60008261261a565b6001606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cdf9190615551565b925050819055506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d369190615470565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612df7611684565b15612e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2e9061514b565b60405180910390fd5b600160fb60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e7b612612565b604051612e889190614f0c565b60405180910390a1565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160c960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f63848484612b93565b612f6f848484846137ec565b612fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa59061504b565b60405180910390fd5b50505050565b60606101348054612fc490615657565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff090615657565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b5050505050905090565b6060600082141561308f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131ef565b600082905060005b600082146130c15780806130aa906156ba565b915050600a826130ba91906154c6565b9150613097565b60008167ffffffffffffffff811115613103577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131355781602001600182028036833780820191505090505b5090505b600085146131e85760018261314e9190615551565b9150600a8561315d919061570d565b60306131699190615470565b60f81b8183815181106131a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131e191906154c6565b9450613139565b8093505050505b919050565b6001151561013060009054906101000a900460ff1615151461324b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132429061500b565b60405180910390fd5b565b6132556131f4565b61013254811061329a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132919061532b565b60405180910390fd5b6132a48282613983565b6001436132b19190615551565b4061013e6000838152602001908152602001600020819055505050565b600060019054906101000a900460ff16806132f4575060008054906101000a900460ff16155b613333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332a906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613383576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61338b6139a1565b613393613a7a565b61339d8383613b53565b80156133be5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806133e9575060008054906101000a900460ff16155b613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341f906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613478576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156134995760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806134c2575060008054906101000a900460ff16155b613501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f8906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613551576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6135596139a1565b613561613c5c565b80156135825760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806135ab575060008054906101000a900460ff16155b6135ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e1906151cb565b60405180910390fd5b60008060019054906101000a900460ff16159050801561363a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6136426139a1565b61364a613d45565b801561366b5760008060016101000a81548160ff0219169083151502179055505b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136e3838383613e39565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137265761372181613e3e565b613765565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613764576137638382613e87565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137a8576137a381613ff4565b6137e7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137e6576137e58282614137565b5b5b505050565b600061380d8473ffffffffffffffffffffffffffffffffffffffff166141b6565b15613976578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613836612612565b8786866040518563ffffffff1660e01b81526004016138589493929190614f42565b602060405180830381600087803b15801561387257600080fd5b505af19250505080156138a357506040513d601f19601f820116820180604052508101906138a0919061479e565b60015b613926573d80600081146138d3576040519150601f19603f3d011682016040523d82523d6000602084013e6138d8565b606091505b5060008151141561391e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139159061504b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061397b565b600190505b949350505050565b61399d8282604051806020016040528060008152506141c9565b5050565b600060019054906101000a900460ff16806139c7575060008054906101000a900460ff16155b613a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fd906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613a56576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8015613a775760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613aa0575060008054906101000a900460ff16155b613adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad6906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613b2f576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8015613b505760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613b79575060008054906101000a900460ff16155b613bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613baf906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613c08576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8260659080519060200190613c1e9291906143f2565b508160669080519060200190613c359291906143f2565b508015613c575760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680613c82575060008054906101000a900460ff16155b613cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cb8906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613d11576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b613d21613d1c612612565b612e92565b8015613d425760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff1680613d6b575060008054906101000a900460ff16155b613daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613da1906151cb565b60405180910390fd5b60008060019054906101000a900460ff161590508015613dfa576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600060fb60006101000a81548160ff0219169083151502179055508015613e365760008060016101000a81548160ff0219169083151502179055505b50565b505050565b609980549050609a600083815260200190815260200160002081905550609981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e948461178e565b613e9e9190615551565b9050600060986000848152602001908152602001600020549050818114613f83576000609760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080609760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816098600083815260200190815260200160002081905550505b6098600084815260200190815260200160002060009055609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016099805490506140089190615551565b90506000609a600084815260200190815260200160002054905060006099838154811061405e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080609983815481106140a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081609a600083815260200190815260200160002081905550609a600085815260200190815260200160002060009055609980548061411b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006141428361178e565b905081609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806098600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6141d38383614224565b6141e060008484846137ec565b61421f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142169061504b565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161428b906151eb565b60405180910390fd5b61429d816125a6565b156142dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142d49061508b565b60405180910390fd5b6142e9600083836136d8565b6001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143399190615470565b92505081905550816067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546143fe90615657565b90600052602060002090601f0160209004810192826144205760008555614467565b82601f1061443957805160ff1916838001178555614467565b82800160010185558215614467579182015b8281111561446657825182559160200191906001019061444b565b5b5090506144749190614478565b5090565b5b80821115614491576000816000905550600101614479565b5090565b60006144a86144a3846153cb565b6153a6565b9050828152602081018484840111156144c057600080fd5b6144cb848285615615565b509392505050565b60006144e66144e1846153fc565b6153a6565b9050828152602081018484840111156144fe57600080fd5b614509848285615615565b509392505050565b60008135905061452081615f39565b92915050565b60008135905061453581615f50565b92915050565b60008135905061454a81615f67565b92915050565b60008151905061455f81615f67565b92915050565b600082601f83011261457657600080fd5b8135614586848260208601614495565b91505092915050565b600082601f8301126145a057600080fd5b81356145b08482602086016144d3565b91505092915050565b6000813590506145c881615f7e565b92915050565b6000602082840312156145e057600080fd5b60006145ee84828501614511565b91505092915050565b6000806040838503121561460a57600080fd5b600061461885828601614511565b925050602061462985828601614511565b9150509250929050565b60008060006060848603121561464857600080fd5b600061465686828701614511565b935050602061466786828701614511565b9250506040614678868287016145b9565b9150509250925092565b6000806000806080858703121561469857600080fd5b60006146a687828801614511565b94505060206146b787828801614511565b93505060406146c8878288016145b9565b925050606085013567ffffffffffffffff8111156146e557600080fd5b6146f187828801614565565b91505092959194509250565b6000806040838503121561471057600080fd5b600061471e85828601614511565b925050602061472f85828601614526565b9150509250929050565b6000806040838503121561474c57600080fd5b600061475a85828601614511565b925050602061476b858286016145b9565b9150509250929050565b60006020828403121561478757600080fd5b60006147958482850161453b565b91505092915050565b6000602082840312156147b057600080fd5b60006147be84828501614550565b91505092915050565b6000602082840312156147d957600080fd5b600082013567ffffffffffffffff8111156147f357600080fd5b6147ff8482850161458f565b91505092915050565b60008060006060848603121561481d57600080fd5b600084013567ffffffffffffffff81111561483757600080fd5b6148438682870161458f565b935050602084013567ffffffffffffffff81111561486057600080fd5b61486c8682870161458f565b925050604084013567ffffffffffffffff81111561488957600080fd5b6148958682870161458f565b9150509250925092565b60008060008060008060c087890312156148b857600080fd5b600087013567ffffffffffffffff8111156148d257600080fd5b6148de89828a0161458f565b965050602087013567ffffffffffffffff8111156148fb57600080fd5b61490789828a0161458f565b955050604061491889828a016145b9565b945050606061492989828a016145b9565b935050608061493a89828a01614511565b92505060a061494b89828a016145b9565b9150509295509295509295565b60006020828403121561496a57600080fd5b6000614978848285016145b9565b91505092915050565b6000806040838503121561499457600080fd5b60006149a2858286016145b9565b92505060206149b3858286016145b9565b9150509250929050565b6149c681615597565b82525050565b6149d581615585565b82525050565b6149e4816155a9565b82525050565b6149fb6149f6826155b5565b615703565b82525050565b6000614a0c8261542d565b614a168185615443565b9350614a26818560208601615624565b614a2f816157fa565b840191505092915050565b6000614a4582615438565b614a4f8185615454565b9350614a5f818560208601615624565b614a68816157fa565b840191505092915050565b6000614a7e82615438565b614a888185615465565b9350614a98818560208601615624565b80840191505092915050565b6000614ab1601183615454565b9150614abc8261580b565b602082019050919050565b6000614ad4601483615454565b9150614adf82615834565b602082019050919050565b6000614af7601183615454565b9150614b028261585d565b602082019050919050565b6000614b1a602b83615454565b9150614b2582615886565b604082019050919050565b6000614b3d603283615454565b9150614b48826158d5565b604082019050919050565b6000614b60602683615454565b9150614b6b82615924565b604082019050919050565b6000614b83601c83615454565b9150614b8e82615973565b602082019050919050565b6000614ba6602483615454565b9150614bb18261599c565b604082019050919050565b6000614bc9601983615454565b9150614bd4826159eb565b602082019050919050565b6000614bec601283615454565b9150614bf782615a14565b602082019050919050565b6000614c0f602c83615454565b9150614c1a82615a3d565b604082019050919050565b6000614c32601a83615454565b9150614c3d82615a8c565b602082019050919050565b6000614c55601083615454565b9150614c6082615ab5565b602082019050919050565b6000614c78603883615454565b9150614c8382615ade565b604082019050919050565b6000614c9b602a83615454565b9150614ca682615b2d565b604082019050919050565b6000614cbe602983615454565b9150614cc982615b7c565b604082019050919050565b6000614ce1602e83615454565b9150614cec82615bcb565b604082019050919050565b6000614d04602083615454565b9150614d0f82615c1a565b602082019050919050565b6000614d27602c83615454565b9150614d3282615c43565b604082019050919050565b6000614d4a602083615454565b9150614d5582615c92565b602082019050919050565b6000614d6d602983615454565b9150614d7882615cbb565b604082019050919050565b6000614d90602f83615454565b9150614d9b82615d0a565b604082019050919050565b6000614db3602183615454565b9150614dbe82615d59565b604082019050919050565b6000614dd6602783615454565b9150614de182615da8565b604082019050919050565b6000614df9601283615454565b9150614e0482615df7565b602082019050919050565b6000614e1c603183615454565b9150614e2782615e20565b604082019050919050565b6000614e3f602c83615454565b9150614e4a82615e6f565b604082019050919050565b6000614e62601b83615454565b9150614e6d82615ebe565b602082019050919050565b6000614e85600d83615454565b9150614e9082615ee7565b602082019050919050565b6000614ea8600d83615454565b9150614eb382615f10565b602082019050919050565b614ec78161560b565b82525050565b6000614ed982846149ea565b60208201915081905092915050565b6000614ef48285614a73565b9150614f008284614a73565b91508190509392505050565b6000602082019050614f2160008301846149cc565b92915050565b6000602082019050614f3c60008301846149bd565b92915050565b6000608082019050614f5760008301876149cc565b614f6460208301866149cc565b614f716040830185614ebe565b8181036060830152614f838184614a01565b905095945050505050565b6000602082019050614fa360008301846149db565b92915050565b60006020820190508181036000830152614fc38184614a3a565b905092915050565b60006020820190508181036000830152614fe481614aa4565b9050919050565b6000602082019050818103600083015261500481614ac7565b9050919050565b6000602082019050818103600083015261502481614aea565b9050919050565b6000602082019050818103600083015261504481614b0d565b9050919050565b6000602082019050818103600083015261506481614b30565b9050919050565b6000602082019050818103600083015261508481614b53565b9050919050565b600060208201905081810360008301526150a481614b76565b9050919050565b600060208201905081810360008301526150c481614b99565b9050919050565b600060208201905081810360008301526150e481614bbc565b9050919050565b6000602082019050818103600083015261510481614bdf565b9050919050565b6000602082019050818103600083015261512481614c02565b9050919050565b6000602082019050818103600083015261514481614c25565b9050919050565b6000602082019050818103600083015261516481614c48565b9050919050565b6000602082019050818103600083015261518481614c6b565b9050919050565b600060208201905081810360008301526151a481614c8e565b9050919050565b600060208201905081810360008301526151c481614cb1565b9050919050565b600060208201905081810360008301526151e481614cd4565b9050919050565b6000602082019050818103600083015261520481614cf7565b9050919050565b6000602082019050818103600083015261522481614d1a565b9050919050565b6000602082019050818103600083015261524481614d3d565b9050919050565b6000602082019050818103600083015261526481614d60565b9050919050565b6000602082019050818103600083015261528481614d83565b9050919050565b600060208201905081810360008301526152a481614da6565b9050919050565b600060208201905081810360008301526152c481614dc9565b9050919050565b600060208201905081810360008301526152e481614dec565b9050919050565b6000602082019050818103600083015261530481614e0f565b9050919050565b6000602082019050818103600083015261532481614e32565b9050919050565b6000602082019050818103600083015261534481614e55565b9050919050565b6000602082019050818103600083015261536481614e78565b9050919050565b6000602082019050818103600083015261538481614e9b565b9050919050565b60006020820190506153a06000830184614ebe565b92915050565b60006153b06153c1565b90506153bc8282615689565b919050565b6000604051905090565b600067ffffffffffffffff8211156153e6576153e56157cb565b5b6153ef826157fa565b9050602081019050919050565b600067ffffffffffffffff821115615417576154166157cb565b5b615420826157fa565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061547b8261560b565b91506154868361560b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154bb576154ba61573e565b5b828201905092915050565b60006154d18261560b565b91506154dc8361560b565b9250826154ec576154eb61576d565b5b828204905092915050565b60006155028261560b565b915061550d8361560b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155465761554561573e565b5b828202905092915050565b600061555c8261560b565b91506155678361560b565b92508282101561557a5761557961573e565b5b828203905092915050565b6000615590826155eb565b9050919050565b60006155a2826155eb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615642578082015181840152602081019050615627565b83811115615651576000848401525b50505050565b6000600282049050600182168061566f57607f821691505b602082108114156156835761568261579c565b5b50919050565b615692826157fa565b810181811067ffffffffffffffff821117156156b1576156b06157cb565b5b80604052505050565b60006156c58261560b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156f8576156f761573e565b5b600182019050919050565b6000819050919050565b60006157188261560b565b91506157238361560b565b9250826157335761573261576d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e6f6e6578697374616e7420746f6b656e000000000000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f417274206973206e6f74207365616c6564000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f417274206e6f742066756c6c79207365742e0000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d617820746f6b656e73206e6f74207965742072656163686564000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53656520726571756972656d656e747320666f7220617274697374546f6b656e60008201527f526f79616c747900000000000000000000000000000000000000000000000000602082015250565b7f54782076616c756520696e636f72726563740000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d6178206e756d626572206f6620746f6b656e73206d696e7465640000000000600082015250565b7f417274206973207365616c656400000000000000000000000000000000000000600082015250565b7f506c6174666f726d206f6e6c7900000000000000000000000000000000000000600082015250565b615f4281615585565b8114615f4d57600080fd5b50565b615f59816155a9565b8114615f6457600080fd5b50565b615f70816155bf565b8114615f7b57600080fd5b50565b615f878161560b565b8114615f9257600080fd5b5056fea2646970667358221220d60f4ba31cf34a3daf639657e0a1a64d98189757ec6b46e05e7bdf32b22da91764736f6c63430008040033
Deployed Bytecode Sourcemap
2370:8797:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1292:255:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2936:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4458:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10784:151:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8070:79;;;;;;;;;;;;;:::i;:::-;;9313:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3266:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1961:111:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8430:184:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2751:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7244:102;;;:::i;:::-;;5322:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2566:28:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3396:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1626:264:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9787:255:18;;;;;;;;;;;;;:::i;:::-;;5718:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2786:33:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7805:159;;;;;;;;;;;;;:::i;:::-;;3324:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2721:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2144:241:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8925:385:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2958:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3434:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10523:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7991:76;;;;;;;;;;;;;:::i;:::-;;1310:84:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2639:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7435:96:18;;;:::i;:::-;;8263:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2377:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1871:92:0;;;;;;;;;;;;;:::i;:::-;;4989:317:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2691:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1239:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9442:277:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3098:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2598:27:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4742:290:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8671:251:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10641:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5963:320:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2630:29:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3266:329:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2486:21:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2912:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2511:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6552:604;;;;;;;;;;;;;:::i;:::-;;3003:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2663:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5098:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7599:203:18;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2112:189:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3872:1013:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3546:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1292:255:6;1416:4;1454:46;1439:61;;;:11;:61;;;;:101;;;;1504:36;1528:11;1504:23;:36::i;:::-;1439:101;1432:108;;1292:255;;;:::o;2936:98:3:-;2990:13;3022:5;3015:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2936:98;:::o;4458:217::-;4534:7;4561:16;4569:7;4561;:16::i;:::-;4553:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4644:15;:24;4660:7;4644:24;;;;;;;;;;;;;;;;;;;;;4637:31;;4458:217;;;:::o;3985:412::-;4065:13;4081:34;4107:7;4081:25;:34::i;:::-;4065:50;;4139:5;4133:11;;:2;:11;;;;4125:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4230:5;4214:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4239:37;4256:5;4263:12;:10;:12::i;:::-;4239:16;:37::i;:::-;4214:62;4193:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;4369:21;4378:2;4382:7;4369:8;:21::i;:::-;3985:412;;;:::o;10784:151:18:-;10865:17;:15;:17::i;:::-;10910:20;10888:19;:42;;;;;;;;;;;;:::i;:::-;;10784:151;:::o;8070:79::-;8114:14;:12;:14::i;:::-;8134:10;:8;:10::i;:::-;8070:79::o;9313:126::-;9368:14;:12;:14::i;:::-;9388:18;:16;:18::i;:::-;9424:10;9412:9;:22;;;;9313:126;:::o;3266:35::-;;;;:::o;1961:111:6:-;2022:7;2048:10;:17;;;;2041:24;;1961:111;:::o;8430:184:18:-;8536:17;:15;:17::i;:::-;8585:24;8559:23;;:50;;;;;;;;;;;;;;;;;;8430:184;:::o;2751:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7244:102::-;7286:25;:23;:25::i;:::-;7317:24;7330:10;7317:12;:24::i;:::-;7244:102::o;5322:330:3:-;5511:41;5530:12;:10;:12::i;:::-;5544:7;5511:18;:41::i;:::-;5503:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5617:28;5627:4;5633:2;5637:7;5617:9;:28::i;:::-;5322:330;;;:::o;2566:28:18:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3396:33::-;;;;:::o;1626:264:6:-;1723:7;1758:34;1786:5;1758:27;:34::i;:::-;1750:5;:42;1742:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;1857:12;:19;1870:5;1857:19;;;;;;;;;;;;;;;:26;1877:5;1857:26;;;;;;;;;;;;1850:33;;1626:264;;;;:::o;9787:255:18:-;9823:14;:12;:14::i;:::-;9843:18;:16;:18::i;:::-;9901:1;9882:7;9876:21;;;;;:::i;:::-;;;:26;;9875:72;;;;;9945:1;9914:19;9908:33;;;;;:::i;:::-;;;:38;;9875:72;:111;;;;;9984:1;9958:14;9952:28;;;;;:::i;:::-;;;:33;;9875:111;9867:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;10033:4;10015:15;;:22;;;;;;;;;;;;;;;;;;9787:255::o;5718:179:3:-;5851:39;5868:4;5874:2;5878:7;5851:39;;;;;;;;;;;;:16;:39::i;:::-;5718:179;;;:::o;2786:33:18:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7805:159::-;7851:21;7875:13;;7851:37;;7910:1;7894:13;:17;;;;7917:18;;;;;;;;;;;:27;;:42;7945:13;7917:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7805:159;:::o;3324:36::-;;;;:::o;2721:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2144:241:6:-;2219:7;2254:41;:39;:41::i;:::-;2246:5;:49;2238:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;2361:10;2372:5;2361:17;;;;;;;;;;;;;;;;;;;;;;;;2354:24;;2144:241;;;:::o;8925:385:18:-;8992:14;:12;:14::i;:::-;9012:18;:16;:18::i;:::-;9068:1;9045:19;:24;9044:113;;;;9125:1;9099:21;;9077:19;:43;;;;:::i;:::-;9076:50;;9075:81;;;;;9154:1;9132:19;:23;9075:81;9044:113;9036:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;9228:19;9207:18;:40;;;;9275:1;9261:10;;:15;:43;;;;9303:1;9280:19;:24;9261:43;9253:52;;;;;;8925:385;:::o;2958:41::-;;;;;;;;;;;;;:::o;3434:108::-;3500:42;3434:108;:::o;10523:115::-;10585:14;:12;:14::i;:::-;10620:13;10605:12;:28;;;;;;;;;;;;:::i;:::-;;10523:115;:::o;7991:76::-;8034:14;:12;:14::i;:::-;8054:8;:6;:8::i;:::-;7991:76::o;1310:84:2:-;1357:4;1380:7;;;;;;;;;;;1373:14;;1310:84;:::o;2639:235:3:-;2711:7;2730:13;2746:7;:16;2754:7;2746:16;;;;;;;;;;;;;;;;;;;;;2730:32;;2797:1;2780:19;;:5;:19;;;;2772:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2862:5;2855:12;;;2639:235;;;:::o;7435:96:18:-;7482:14;:12;:14::i;:::-;7502:24;7515:10;7502:12;:24::i;:::-;7435:96::o;8263:164::-;8320:14;:12;:14::i;:::-;8353:11;8340:10;:24;;;;8393:1;8378:11;:16;:43;;;;8420:1;8398:18;;:23;8378:43;8370:52;;;;;;8263:164;:::o;2377:205:3:-;2449:7;2493:1;2476:19;;:5;:19;;;;2468:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2559:9;:16;2569:5;2559:16;;;;;;;;;;;;;;;;2552:23;;2377:205;;;:::o;1871:92:0:-;1462:12;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1935:21:::1;1953:1;1935:9;:21::i;:::-;1871:92::o:0;4989:317:18:-;5049:7;5072:16;5080:7;5072;:16::i;:::-;5064:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5116:20;5158:17;:26;5176:7;5158:26;;;;;;;;;;;;5147:7;5139:16;;:45;5116:68;;5190:14;5234:12;5217:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;5207:41;;;;;;5190:58;;5254:12;5277:6;5269:15;;5254:30;;5297:4;5290:11;;;;;4989:317;;;:::o;2691:25::-;;;;:::o;1239:85:0:-;1285:7;1311:6;;;;;;;;;;;1304:13;;1239:85;:::o;9442:277:18:-;9566:14;:12;:14::i;:::-;9586:18;:16;:18::i;:::-;9620:8;9610:7;:18;;;;;;;;;;;;:::i;:::-;;9656:20;9634:19;:42;;;;;;;;;;;;:::i;:::-;;9699:15;9682:14;:32;;;;;;;;;;;;:::i;:::-;;9442:277;;;:::o;3098:102:3:-;3154:13;3186:7;3179:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3098:102;:::o;2598:27:18:-;;;;;;;;;;;;;:::o;4742:290:3:-;4856:12;:10;:12::i;:::-;4844:24;;:8;:24;;;;4836:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4954:8;4909:18;:32;4928:12;:10;:12::i;:::-;4909:32;;;;;;;;;;;;;;;:42;4942:8;4909:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;5006:8;4977:48;;4992:12;:10;:12::i;:::-;4977:48;;;5016:8;4977:48;;;;;;:::i;:::-;;;;;;;;4742:290;;:::o;8671:251:18:-;8774:17;:15;:17::i;:::-;8797:18;:16;:18::i;:::-;8844:21;8821:20;:44;;;;8895:22;8871:21;:46;;;;8671:251;;:::o;10641:140::-;10718:14;:12;:14::i;:::-;10758:18;10738:17;:38;;;;;;;;;;;;:::i;:::-;;10641:140;:::o;5963:320:3:-;6132:41;6151:12;:10;:12::i;:::-;6165:7;6132:18;:41::i;:::-;6124:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;6237:39;6251:4;6257:2;6261:7;6270:5;6237:13;:39::i;:::-;5963:320;;;;:::o;2630:29:18:-;;;;:::o;3266:329:3:-;3339:13;3372:16;3380:7;3372;:16::i;:::-;3364:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3451:21;3475:10;:8;:10::i;:::-;3451:34;;3526:1;3508:7;3502:21;:25;:86;;;;;;;;;;;;;;;;;3554:7;3563:18;:7;:16;:18::i;:::-;3537:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3502:86;3495:93;;;3266:329;;;:::o;2486:21:18:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2912:38::-;;;;;;;;;;;;;:::o;2511:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6552:604::-;6590:15;:13;:15::i;:::-;6649:1;6637:9;;:13;;;;:::i;:::-;6619:14;;:31;;6611:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;6713:1;6691:18;;:23;6687:307;;6729:9;6724:264;6745:9;;6743:1;:11;6724:264;;;6922:1;6896:21;;6892:1;:25;;;;:::i;:::-;6891:32;6887:93;;6937:32;6947:18;;;;;;;;;;;6967:1;6937:9;:32::i;:::-;6887:93;6760:18;;6756:22;;;;;:::i;:::-;;;6724:264;;;;6687:307;7028:1;7003:21;;:26;6999:153;;7044:9;7039:107;7060:9;;7058:1;:11;7039:107;;;7108:29;3218:42;7135:1;7108:9;:29::i;:::-;7075:21;;7071:25;;;;;:::i;:::-;;;7039:107;;;;6999:153;6552:604::o;3003:28::-;;;;;;;;;;;;;:::o;2663:24::-;;;;:::o;5098:162:3:-;5195:4;5218:18;:25;5237:5;5218:25;;;;;;;;;;;;;;;:35;5244:8;5218:35;;;;;;;;;;;;;;;;;;;;;;;;;5211:42;;5098:162;;;;:::o;7599:203:18:-;7712:1;7677:37;;:23;;;;;;;;;;;:37;;;;7669:46;;;;;;7743:23;;;;;;;;;;;7729:37;;:10;:37;;;7721:46;;;;;;7773:24;7786:10;7773:12;:24::i;:::-;7599:203;:::o;2112:189:0:-;1462:12;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2220:1:::1;2200:22;;:8;:22;;;;2192:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:19;2285:8;2275:9;:19::i;:::-;2112:189:::0;:::o;3872:1013:18:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;4060:29:18::1;4074:5;4081:7;4060:13;:29::i;:::-;4095:35;:33;:35::i;:::-;4136:16;:14;:16::i;:::-;4158:17;:15;:17::i;:::-;4200:5;4182:15;;:23;;;;;;;;;;;;;;;;;;4317:2;4294:20;:25;;;;4349:2;4325:21;:26;;;;4438:1;4422:13;:17;;;;4446;;;;;;;;;;;::::0;:12:::1;:17;;;;;;;;;;;;:::i;:::-;;4536:36;4552:19;4536:15;:36::i;:::-;4578:24;4591:10;4578:12;:24::i;:::-;4608:26;4622:11;4608:13;:26::i;:::-;4658:1;4641:14;:18;;;;4695:19;4666:18;;:49;;;;;;;;;;;;;;;;;;4755:1;4721:23;;:36;;;;;;;;;;;;;;;;;;4779:7;:5;:7::i;:::-;4763:13;;:23;;;;;;;;;;;;;;;;;;4860:20;:18;:20::i;:::-;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;3872:1013:18;;;;;;;:::o;3546:52::-;3597:1;3546:52;:::o;1974:344:3:-;2098:4;2148:36;2133:51;;;:11;:51;;;;:126;;;;2215:44;2200:59;;;:11;:59;;;;2133:126;:178;;;;2275:36;2299:11;2275:23;:36::i;:::-;2133:178;2114:197;;1974:344;;;:::o;7755:125::-;7820:4;7871:1;7843:30;;:7;:16;7851:7;7843:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7836:37;;7755:125;;;:::o;823:96:10:-;876:7;902:10;895:17;;823:96;:::o;11639:182:3:-;11740:2;11713:15;:24;11729:7;11713:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11806:7;11802:2;11757:57;;11766:34;11792:7;11766:25;:34::i;:::-;11757:57;;;;;;;;;;;;11639:182;;:::o;11058:107:18:-;11132:10;11113:29;;3218:42;11113:29;;;11105:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11058:107::o;11005:50::-;1462:12:0;:10;:12::i;:::-;1451:23;;:7;:5;:7::i;:::-;:23;;;1443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11005:50:18:o;2322:117:2:-;1889:8;:6;:8::i;:::-;1881:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2390:5:::1;2380:7;;:15;;;;;;;;;;;;;;;;;;2410:22;2419:12;:10;:12::i;:::-;2410:22;;;;;;:::i;:::-;;;;;;;;2322:117::o:0;10045:103:18:-;10120:5;10101:24;;:15;;;;;;;;;;;:24;;;10093:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;10045:103::o;8152:65::-;1624:8:2;:6;:8::i;:::-;1623:9;1615:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;8152:65:18:o;5699:850::-;5853:1;5828:21;;:26;;5827:79;;;;;5904:1;5878:21;;5861:14;;:38;;;;:::i;:::-;5860:45;5827:79;5826:160;;;;5935:1;5913:18;;:23;;5912:73;;;;;5983:1;5960:18;;5943:14;;:35;;;;:::i;:::-;5942:42;5912:73;5826:160;5822:262;;;6030:1;6013:14;;:18;;;;:::i;:::-;5996:14;:35;;;;6039:24;6052:10;6039:12;:24::i;:::-;6071:7;;5822:262;6117:37;6127:10;6139:14;;6117:9;:37::i;:::-;6194:1;6177:14;;:18;;;;:::i;:::-;6160:14;:35;;;;6245:10;;6232:9;:23;6224:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;6284:20;6351:7;6337:9;6331:3;6308:20;;:26;;;;:::i;:::-;:38;;;;:::i;:::-;6307:52;;;;:::i;:::-;6284:75;;6365:20;6400:12;6388:9;:24;;;;:::i;:::-;6365:47;;3218:42;6442:24;;:38;6467:12;6442:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6532:12;6515:13;;:29;;;;;;;:::i;:::-;;;;;;;;5699:850;;;;:::o;8038:355:3:-;8131:4;8155:16;8163:7;8155;:16::i;:::-;8147:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8230:13;8246:34;8272:7;8246:25;:34::i;:::-;8230:50;;8309:5;8298:16;;:7;:16;;;:51;;;;8342:7;8318:31;;:20;8330:7;8318:11;:20::i;:::-;:31;;;8298:51;:87;;;;8353:32;8370:5;8377:7;8353:16;:32::i;:::-;8298:87;8290:96;;;8038:355;;;;:::o;10957:571::-;11122:4;11084:42;;:34;11110:7;11084:25;:34::i;:::-;:42;;;11076:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;11204:1;11190:16;;:2;:16;;;;11182:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11258:39;11279:4;11285:2;11289:7;11258:20;:39::i;:::-;11359:29;11376:1;11380:7;11359:8;:29::i;:::-;11418:1;11399:9;:15;11409:4;11399:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11446:1;11429:9;:13;11439:2;11429:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11476:2;11457:7;:16;11465:7;11457:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11513:7;11509:2;11494:27;;11503:4;11494:27;;;;;;;;;;;;10957:571;;;:::o;2075:115:2:-;1624:8;:6;:8::i;:::-;1623:9;1615:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;2144:4:::1;2134:7;;:14;;;;;;;;;;;;;;;;;;2163:20;2170:12;:10;:12::i;:::-;2163:20;;;;;;:::i;:::-;;;;;;;;2075:115::o:0;2307:169:0:-;2362:16;2381:6;;;;;;;;;;;2362:25;;2406:8;2397:6;;:17;;;;;;;;;;;;;;;;;;2460:8;2429:40;;2450:8;2429:40;;;;;;;;;;;;2307:169;;:::o;7145:307:3:-;7296:28;7306:4;7312:2;7316:7;7296:9;:28::i;:::-;7342:48;7365:4;7371:2;7375:7;7384:5;7342:22;:48::i;:::-;7334:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;7145:307;;;;:::o;10423:97:18:-;10475:13;10503:12;10496:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10423:97;:::o;286:703:11:-;342:13;568:1;559:5;:10;555:51;;;585:10;;;;;;;;;;;;;;;;;;;;;555:51;615:12;630:5;615:20;;645:14;669:75;684:1;676:4;:9;669:75;;701:8;;;;;:::i;:::-;;;;731:2;723:10;;;;;:::i;:::-;;;669:75;;;753:19;785:6;775:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;753:39;;802:150;818:1;809:5;:10;802:150;;845:1;835:11;;;;;:::i;:::-;;;911:2;903:5;:10;;;;:::i;:::-;890:2;:24;;;;:::i;:::-;877:39;;860:6;867;860:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;939:2;930:11;;;;;:::i;:::-;;;802:150;;;975:6;961:21;;;;;286:703;;;;:::o;10151:103:18:-;10223:4;10204:23;;:15;;;;;;;;;;;:23;;;10196:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;10151:103::o;5438:258::-;5510:15;:13;:15::i;:::-;5550:9;;5539:8;:20;5531:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5597:31;5607:10;5619:8;5597:9;:31::i;:::-;5689:1;5674:12;:16;;;;:::i;:::-;5664:27;5634:17;:27;5652:8;5634:27;;;;;;;;;;;:57;;;;5438:258;;:::o;1531:215:3:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1629:26:3::1;:24;:26::i;:::-;1665:25;:23;:25::i;:::-;1700:39;1724:5;1731:7;1700:23;:39::i;:::-;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;1531:215:3;;;:::o;691:73:6:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1671:14;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;691:73:6;:::o;934:126:0:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;991:26:0::1;:24;:26::i;:::-;1027;:24;:26::i;:::-;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;934:126:0;:::o;991:128:2:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1049:26:2::1;:24;:26::i;:::-;1085:27;:25;:27::i;:::-;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;991:128:2;:::o;1019:166:12:-;1104:4;1142:36;1127:51;;;:11;:51;;;;1120:58;;1019:166;;;:::o;2981:572:6:-;3120:45;3147:4;3153:2;3157:7;3120:26;:45::i;:::-;3196:1;3180:18;;:4;:18;;;3176:183;;;3214:40;3246:7;3214:31;:40::i;:::-;3176:183;;;3283:2;3275:10;;:4;:10;;;3271:88;;3301:47;3334:4;3340:7;3301:32;:47::i;:::-;3271:88;3176:183;3386:1;3372:16;;:2;:16;;;3368:179;;;3404:45;3441:7;3404:36;:45::i;:::-;3368:179;;;3476:4;3470:10;;:2;:10;;;3466:81;;3496:40;3524:2;3528:7;3496:27;:40::i;:::-;3466:81;3368:179;2981:572;;;:::o;12374:800:3:-;12524:4;12544:15;:2;:13;;;:15::i;:::-;12540:628;;;12606:2;12579:47;;;12627:12;:10;:12::i;:::-;12641:4;12647:7;12656:5;12579:83;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12575:541;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12857:1;12840:6;:13;:18;12836:266;;;12882:60;;;;;;;;;;:::i;:::-;;;;;;;;12836:266;13054:6;13048:13;13039:6;13035:2;13031:15;13024:38;12575:541;12722:52;;;12712:62;;;:6;:62;;;;12705:69;;;;;12540:628;13153:4;13146:11;;12374:800;;;;;;;:::o;8723:108::-;8798:26;8808:2;8812:7;8798:26;;;;;;;;;;;;:9;:26::i;:::-;8723:108;;:::o;754:64:10:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1671:14;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;754:64:10;:::o;890:63:12:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1671:14;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;890:63:12;:::o;1752:155:3:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1868:5:3::1;1860;:13;;;;;;;;;;;;:::i;:::-;;1893:7;1883;:17;;;;;;;;;;;;:::i;:::-;;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;1752:155:3;;;:::o;1066:97:0:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1133:23:0::1;1143:12;:10;:12::i;:::-;1133:9;:23::i;:::-;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;1066:97:0;:::o;1125:90:2:-;1409:13:1;;;;;;;;;;;:30;;;;1427:12;;;;;;;;;;1426:13;1409:30;1401:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:19;1524:13;;;;;;;;;;;1523:14;1501:36;;1551:14;1547:98;;;1597:4;1581:13;;:20;;;;;;;;;;;;;;;;;;1630:4;1615:12;;:19;;;;;;;;;;;;;;;;;;1547:98;1203:5:2::1;1193:7;;:15;;;;;;;;;;;;;;;;;;1671:14:1::0;1667:66;;;1717:5;1701:13;;:21;;;;;;;;;;;;;;;;;;1667:66;1125:90:2;:::o;13730:122:3:-;;;;:::o;4270:161:6:-;4373:10;:17;;;;4346:15;:24;4362:7;4346:24;;;;;;;;;;;:44;;;;4400:10;4416:7;4400:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4270:161;:::o;5048:981::-;5310:22;5371:1;5335:33;5363:4;5335:27;:33::i;:::-;:37;;;;:::i;:::-;5310:62;;5382:18;5403:17;:26;5421:7;5403:26;;;;;;;;;;;;5382:47;;5547:14;5533:10;:28;5529:323;;5577:19;5599:12;:18;5612:4;5599:18;;;;;;;;;;;;;;;:34;5618:14;5599:34;;;;;;;;;;;;5577:56;;5681:11;5648:12;:18;5661:4;5648:18;;;;;;;;;;;;;;;:30;5667:10;5648:30;;;;;;;;;;;:44;;;;5797:10;5764:17;:30;5782:11;5764:30;;;;;;;;;;;:43;;;;5529:323;;5945:17;:26;5963:7;5945:26;;;;;;;;;;;5938:33;;;5988:12;:18;6001:4;5988:18;;;;;;;;;;;;;;;:34;6007:14;5988:34;;;;;;;;;;;5981:41;;;5048:981;;;;:::o;6317:1061::-;6566:22;6611:1;6591:10;:17;;;;:21;;;;:::i;:::-;6566:46;;6622:18;6643:15;:24;6659:7;6643:24;;;;;;;;;;;;6622:45;;6989:19;7011:10;7022:14;7011:26;;;;;;;;;;;;;;;;;;;;;;;;6989:48;;7073:11;7048:10;7059;7048:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;7183:10;7152:15;:28;7168:11;7152:28;;;;;;;;;;;:41;;;;7321:15;:24;7337:7;7321:24;;;;;;;;;;;7314:31;;;7355:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6317:1061;;;;:::o;3847:228::-;3931:14;3948:31;3976:2;3948:27;:31::i;:::-;3931:48;;4016:7;3989:12;:16;4002:2;3989:16;;;;;;;;;;;;;;;:24;4006:6;3989:24;;;;;;;;;;;:34;;;;4062:6;4033:17;:26;4051:7;4033:26;;;;;;;;;;;:35;;;;3847:228;;;:::o;729:377:9:-;789:4;992:12;1057:7;1045:20;1037:28;;1098:1;1091:4;:8;1084:15;;;729:377;;;:::o;9052:311:3:-;9177:18;9183:2;9187:7;9177:5;:18::i;:::-;9226:54;9257:1;9261:2;9265:7;9274:5;9226:22;:54::i;:::-;9205:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;9052:311;;;:::o;9685:372::-;9778:1;9764:16;;:2;:16;;;;9756:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9836:16;9844:7;9836;:16::i;:::-;9835:17;9827:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9896:45;9925:1;9929:2;9933:7;9896:20;:45::i;:::-;9969:1;9952:9;:13;9962:2;9952:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9999:2;9980:7;:16;9988:7;9980:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10042:7;10038:2;10017:33;;10034:1;10017:33;;;;;;;;;;;;9685:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:19:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:891::-;5925:6;5933;5941;5990:2;5978:9;5969:7;5965:23;5961:32;5958:2;;;6006:1;6003;5996:12;5958:2;6077:1;6066:9;6062:17;6049:31;6107:18;6099:6;6096:30;6093:2;;;6139:1;6136;6129:12;6093:2;6167:63;6222:7;6213:6;6202:9;6198:22;6167:63;:::i;:::-;6157:73;;6020:220;6307:2;6296:9;6292:18;6279:32;6338:18;6330:6;6327:30;6324:2;;;6370:1;6367;6360:12;6324:2;6398:63;6453:7;6444:6;6433:9;6429:22;6398:63;:::i;:::-;6388:73;;6250:221;6538:2;6527:9;6523:18;6510:32;6569:18;6561:6;6558:30;6555:2;;;6601:1;6598;6591:12;6555:2;6629:63;6684:7;6675:6;6664:9;6660:22;6629:63;:::i;:::-;6619:73;;6481:221;5948:761;;;;;:::o;6715:1216::-;6839:6;6847;6855;6863;6871;6879;6928:3;6916:9;6907:7;6903:23;6899:33;6896:2;;;6945:1;6942;6935:12;6896:2;7016:1;7005:9;7001:17;6988:31;7046:18;7038:6;7035:30;7032:2;;;7078:1;7075;7068:12;7032:2;7106:63;7161:7;7152:6;7141:9;7137:22;7106:63;:::i;:::-;7096:73;;6959:220;7246:2;7235:9;7231:18;7218:32;7277:18;7269:6;7266:30;7263:2;;;7309:1;7306;7299:12;7263:2;7337:63;7392:7;7383:6;7372:9;7368:22;7337:63;:::i;:::-;7327:73;;7189:221;7449:2;7475:53;7520:7;7511:6;7500:9;7496:22;7475:53;:::i;:::-;7465:63;;7420:118;7577:2;7603:53;7648:7;7639:6;7628:9;7624:22;7603:53;:::i;:::-;7593:63;;7548:118;7705:3;7732:53;7777:7;7768:6;7757:9;7753:22;7732:53;:::i;:::-;7722:63;;7676:119;7834:3;7861:53;7906:7;7897:6;7886:9;7882:22;7861:53;:::i;:::-;7851:63;;7805:119;6886:1045;;;;;;;;:::o;7937:262::-;7996:6;8045:2;8033:9;8024:7;8020:23;8016:32;8013:2;;;8061:1;8058;8051:12;8013:2;8104:1;8129:53;8174:7;8165:6;8154:9;8150:22;8129:53;:::i;:::-;8119:63;;8075:117;8003:196;;;;:::o;8205:407::-;8273:6;8281;8330:2;8318:9;8309:7;8305:23;8301:32;8298:2;;;8346:1;8343;8336:12;8298:2;8389:1;8414:53;8459:7;8450:6;8439:9;8435:22;8414:53;:::i;:::-;8404:63;;8360:117;8516:2;8542:53;8587:7;8578:6;8567:9;8563:22;8542:53;:::i;:::-;8532:63;;8487:118;8288:324;;;;;:::o;8618:142::-;8721:32;8747:5;8721:32;:::i;:::-;8716:3;8709:45;8699:61;;:::o;8766:118::-;8853:24;8871:5;8853:24;:::i;:::-;8848:3;8841:37;8831:53;;:::o;8890:109::-;8971:21;8986:5;8971:21;:::i;:::-;8966:3;8959:34;8949:50;;:::o;9005:157::-;9110:45;9130:24;9148:5;9130:24;:::i;:::-;9110:45;:::i;:::-;9105:3;9098:58;9088:74;;:::o;9168:360::-;9254:3;9282:38;9314:5;9282:38;:::i;:::-;9336:70;9399:6;9394:3;9336:70;:::i;:::-;9329:77;;9415:52;9460:6;9455:3;9448:4;9441:5;9437:16;9415:52;:::i;:::-;9492:29;9514:6;9492:29;:::i;:::-;9487:3;9483:39;9476:46;;9258:270;;;;;:::o;9534:364::-;9622:3;9650:39;9683:5;9650:39;:::i;:::-;9705:71;9769:6;9764:3;9705:71;:::i;:::-;9698:78;;9785:52;9830:6;9825:3;9818:4;9811:5;9807:16;9785:52;:::i;:::-;9862:29;9884:6;9862:29;:::i;:::-;9857:3;9853:39;9846:46;;9626:272;;;;;:::o;9904:377::-;10010:3;10038:39;10071:5;10038:39;:::i;:::-;10093:89;10175:6;10170:3;10093:89;:::i;:::-;10086:96;;10191:52;10236:6;10231:3;10224:4;10217:5;10213:16;10191:52;:::i;:::-;10268:6;10263:3;10259:16;10252:23;;10014:267;;;;;:::o;10287:366::-;10429:3;10450:67;10514:2;10509:3;10450:67;:::i;:::-;10443:74;;10526:93;10615:3;10526:93;:::i;:::-;10644:2;10639:3;10635:12;10628:19;;10433:220;;;:::o;10659:366::-;10801:3;10822:67;10886:2;10881:3;10822:67;:::i;:::-;10815:74;;10898:93;10987:3;10898:93;:::i;:::-;11016:2;11011:3;11007:12;11000:19;;10805:220;;;:::o;11031:366::-;11173:3;11194:67;11258:2;11253:3;11194:67;:::i;:::-;11187:74;;11270:93;11359:3;11270:93;:::i;:::-;11388:2;11383:3;11379:12;11372:19;;11177:220;;;:::o;11403:366::-;11545:3;11566:67;11630:2;11625:3;11566:67;:::i;:::-;11559:74;;11642:93;11731:3;11642:93;:::i;:::-;11760:2;11755:3;11751:12;11744:19;;11549:220;;;:::o;11775:366::-;11917:3;11938:67;12002:2;11997:3;11938:67;:::i;:::-;11931:74;;12014:93;12103:3;12014:93;:::i;:::-;12132:2;12127:3;12123:12;12116:19;;11921:220;;;:::o;12147:366::-;12289:3;12310:67;12374:2;12369:3;12310:67;:::i;:::-;12303:74;;12386:93;12475:3;12386:93;:::i;:::-;12504:2;12499:3;12495:12;12488:19;;12293:220;;;:::o;12519:366::-;12661:3;12682:67;12746:2;12741:3;12682:67;:::i;:::-;12675:74;;12758:93;12847:3;12758:93;:::i;:::-;12876:2;12871:3;12867:12;12860:19;;12665:220;;;:::o;12891:366::-;13033:3;13054:67;13118:2;13113:3;13054:67;:::i;:::-;13047:74;;13130:93;13219:3;13130:93;:::i;:::-;13248:2;13243:3;13239:12;13232:19;;13037:220;;;:::o;13263:366::-;13405:3;13426:67;13490:2;13485:3;13426:67;:::i;:::-;13419:74;;13502:93;13591:3;13502:93;:::i;:::-;13620:2;13615:3;13611:12;13604:19;;13409:220;;;:::o;13635:366::-;13777:3;13798:67;13862:2;13857:3;13798:67;:::i;:::-;13791:74;;13874:93;13963:3;13874:93;:::i;:::-;13992:2;13987:3;13983:12;13976:19;;13781:220;;;:::o;14007:366::-;14149:3;14170:67;14234:2;14229:3;14170:67;:::i;:::-;14163:74;;14246:93;14335:3;14246:93;:::i;:::-;14364:2;14359:3;14355:12;14348:19;;14153:220;;;:::o;14379:366::-;14521:3;14542:67;14606:2;14601:3;14542:67;:::i;:::-;14535:74;;14618:93;14707:3;14618:93;:::i;:::-;14736:2;14731:3;14727:12;14720:19;;14525:220;;;:::o;14751:366::-;14893:3;14914:67;14978:2;14973:3;14914:67;:::i;:::-;14907:74;;14990:93;15079:3;14990:93;:::i;:::-;15108:2;15103:3;15099:12;15092:19;;14897:220;;;:::o;15123:366::-;15265:3;15286:67;15350:2;15345:3;15286:67;:::i;:::-;15279:74;;15362:93;15451:3;15362:93;:::i;:::-;15480:2;15475:3;15471:12;15464:19;;15269:220;;;:::o;15495:366::-;15637:3;15658:67;15722:2;15717:3;15658:67;:::i;:::-;15651:74;;15734:93;15823:3;15734:93;:::i;:::-;15852:2;15847:3;15843:12;15836:19;;15641:220;;;:::o;15867:366::-;16009:3;16030:67;16094:2;16089:3;16030:67;:::i;:::-;16023:74;;16106:93;16195:3;16106:93;:::i;:::-;16224:2;16219:3;16215:12;16208:19;;16013:220;;;:::o;16239:366::-;16381:3;16402:67;16466:2;16461:3;16402:67;:::i;:::-;16395:74;;16478:93;16567:3;16478:93;:::i;:::-;16596:2;16591:3;16587:12;16580:19;;16385:220;;;:::o;16611:366::-;16753:3;16774:67;16838:2;16833:3;16774:67;:::i;:::-;16767:74;;16850:93;16939:3;16850:93;:::i;:::-;16968:2;16963:3;16959:12;16952:19;;16757:220;;;:::o;16983:366::-;17125:3;17146:67;17210:2;17205:3;17146:67;:::i;:::-;17139:74;;17222:93;17311:3;17222:93;:::i;:::-;17340:2;17335:3;17331:12;17324:19;;17129:220;;;:::o;17355:366::-;17497:3;17518:67;17582:2;17577:3;17518:67;:::i;:::-;17511:74;;17594:93;17683:3;17594:93;:::i;:::-;17712:2;17707:3;17703:12;17696:19;;17501:220;;;:::o;17727:366::-;17869:3;17890:67;17954:2;17949:3;17890:67;:::i;:::-;17883:74;;17966:93;18055:3;17966:93;:::i;:::-;18084:2;18079:3;18075:12;18068:19;;17873:220;;;:::o;18099:366::-;18241:3;18262:67;18326:2;18321:3;18262:67;:::i;:::-;18255:74;;18338:93;18427:3;18338:93;:::i;:::-;18456:2;18451:3;18447:12;18440:19;;18245:220;;;:::o;18471:366::-;18613:3;18634:67;18698:2;18693:3;18634:67;:::i;:::-;18627:74;;18710:93;18799:3;18710:93;:::i;:::-;18828:2;18823:3;18819:12;18812:19;;18617:220;;;:::o;18843:366::-;18985:3;19006:67;19070:2;19065:3;19006:67;:::i;:::-;18999:74;;19082:93;19171:3;19082:93;:::i;:::-;19200:2;19195:3;19191:12;19184:19;;18989:220;;;:::o;19215:366::-;19357:3;19378:67;19442:2;19437:3;19378:67;:::i;:::-;19371:74;;19454:93;19543:3;19454:93;:::i;:::-;19572:2;19567:3;19563:12;19556:19;;19361:220;;;:::o;19587:366::-;19729:3;19750:67;19814:2;19809:3;19750:67;:::i;:::-;19743:74;;19826:93;19915:3;19826:93;:::i;:::-;19944:2;19939:3;19935:12;19928:19;;19733:220;;;:::o;19959:366::-;20101:3;20122:67;20186:2;20181:3;20122:67;:::i;:::-;20115:74;;20198:93;20287:3;20198:93;:::i;:::-;20316:2;20311:3;20307:12;20300:19;;20105:220;;;:::o;20331:366::-;20473:3;20494:67;20558:2;20553:3;20494:67;:::i;:::-;20487:74;;20570:93;20659:3;20570:93;:::i;:::-;20688:2;20683:3;20679:12;20672:19;;20477:220;;;:::o;20703:366::-;20845:3;20866:67;20930:2;20925:3;20866:67;:::i;:::-;20859:74;;20942:93;21031:3;20942:93;:::i;:::-;21060:2;21055:3;21051:12;21044:19;;20849:220;;;:::o;21075:366::-;21217:3;21238:67;21302:2;21297:3;21238:67;:::i;:::-;21231:74;;21314:93;21403:3;21314:93;:::i;:::-;21432:2;21427:3;21423:12;21416:19;;21221:220;;;:::o;21447:118::-;21534:24;21552:5;21534:24;:::i;:::-;21529:3;21522:37;21512:53;;:::o;21571:256::-;21683:3;21698:75;21769:3;21760:6;21698:75;:::i;:::-;21798:2;21793:3;21789:12;21782:19;;21818:3;21811:10;;21687:140;;;;:::o;21833:435::-;22013:3;22035:95;22126:3;22117:6;22035:95;:::i;:::-;22028:102;;22147:95;22238:3;22229:6;22147:95;:::i;:::-;22140:102;;22259:3;22252:10;;22017:251;;;;;:::o;22274:222::-;22367:4;22405:2;22394:9;22390:18;22382:26;;22418:71;22486:1;22475:9;22471:17;22462:6;22418:71;:::i;:::-;22372:124;;;;:::o;22502:254::-;22611:4;22649:2;22638:9;22634:18;22626:26;;22662:87;22746:1;22735:9;22731:17;22722:6;22662:87;:::i;:::-;22616:140;;;;:::o;22762:640::-;22957:4;22995:3;22984:9;22980:19;22972:27;;23009:71;23077:1;23066:9;23062:17;23053:6;23009:71;:::i;:::-;23090:72;23158:2;23147:9;23143:18;23134:6;23090:72;:::i;:::-;23172;23240:2;23229:9;23225:18;23216:6;23172:72;:::i;:::-;23291:9;23285:4;23281:20;23276:2;23265:9;23261:18;23254:48;23319:76;23390:4;23381:6;23319:76;:::i;:::-;23311:84;;22962:440;;;;;;;:::o;23408:210::-;23495:4;23533:2;23522:9;23518:18;23510:26;;23546:65;23608:1;23597:9;23593:17;23584:6;23546:65;:::i;:::-;23500:118;;;;:::o;23624:313::-;23737:4;23775:2;23764:9;23760:18;23752:26;;23824:9;23818:4;23814:20;23810:1;23799:9;23795:17;23788:47;23852:78;23925:4;23916:6;23852:78;:::i;:::-;23844:86;;23742:195;;;;:::o;23943:419::-;24109:4;24147:2;24136:9;24132:18;24124:26;;24196:9;24190:4;24186:20;24182:1;24171:9;24167:17;24160:47;24224:131;24350:4;24224:131;:::i;:::-;24216:139;;24114:248;;;:::o;24368:419::-;24534:4;24572:2;24561:9;24557:18;24549:26;;24621:9;24615:4;24611:20;24607:1;24596:9;24592:17;24585:47;24649:131;24775:4;24649:131;:::i;:::-;24641:139;;24539:248;;;:::o;24793:419::-;24959:4;24997:2;24986:9;24982:18;24974:26;;25046:9;25040:4;25036:20;25032:1;25021:9;25017:17;25010:47;25074:131;25200:4;25074:131;:::i;:::-;25066:139;;24964:248;;;:::o;25218:419::-;25384:4;25422:2;25411:9;25407:18;25399:26;;25471:9;25465:4;25461:20;25457:1;25446:9;25442:17;25435:47;25499:131;25625:4;25499:131;:::i;:::-;25491:139;;25389:248;;;:::o;25643:419::-;25809:4;25847:2;25836:9;25832:18;25824:26;;25896:9;25890:4;25886:20;25882:1;25871:9;25867:17;25860:47;25924:131;26050:4;25924:131;:::i;:::-;25916:139;;25814:248;;;:::o;26068:419::-;26234:4;26272:2;26261:9;26257:18;26249:26;;26321:9;26315:4;26311:20;26307:1;26296:9;26292:17;26285:47;26349:131;26475:4;26349:131;:::i;:::-;26341:139;;26239:248;;;:::o;26493:419::-;26659:4;26697:2;26686:9;26682:18;26674:26;;26746:9;26740:4;26736:20;26732:1;26721:9;26717:17;26710:47;26774:131;26900:4;26774:131;:::i;:::-;26766:139;;26664:248;;;:::o;26918:419::-;27084:4;27122:2;27111:9;27107:18;27099:26;;27171:9;27165:4;27161:20;27157:1;27146:9;27142:17;27135:47;27199:131;27325:4;27199:131;:::i;:::-;27191:139;;27089:248;;;:::o;27343:419::-;27509:4;27547:2;27536:9;27532:18;27524:26;;27596:9;27590:4;27586:20;27582:1;27571:9;27567:17;27560:47;27624:131;27750:4;27624:131;:::i;:::-;27616:139;;27514:248;;;:::o;27768:419::-;27934:4;27972:2;27961:9;27957:18;27949:26;;28021:9;28015:4;28011:20;28007:1;27996:9;27992:17;27985:47;28049:131;28175:4;28049:131;:::i;:::-;28041:139;;27939:248;;;:::o;28193:419::-;28359:4;28397:2;28386:9;28382:18;28374:26;;28446:9;28440:4;28436:20;28432:1;28421:9;28417:17;28410:47;28474:131;28600:4;28474:131;:::i;:::-;28466:139;;28364:248;;;:::o;28618:419::-;28784:4;28822:2;28811:9;28807:18;28799:26;;28871:9;28865:4;28861:20;28857:1;28846:9;28842:17;28835:47;28899:131;29025:4;28899:131;:::i;:::-;28891:139;;28789:248;;;:::o;29043:419::-;29209:4;29247:2;29236:9;29232:18;29224:26;;29296:9;29290:4;29286:20;29282:1;29271:9;29267:17;29260:47;29324:131;29450:4;29324:131;:::i;:::-;29316:139;;29214:248;;;:::o;29468:419::-;29634:4;29672:2;29661:9;29657:18;29649:26;;29721:9;29715:4;29711:20;29707:1;29696:9;29692:17;29685:47;29749:131;29875:4;29749:131;:::i;:::-;29741:139;;29639:248;;;:::o;29893:419::-;30059:4;30097:2;30086:9;30082:18;30074:26;;30146:9;30140:4;30136:20;30132:1;30121:9;30117:17;30110:47;30174:131;30300:4;30174:131;:::i;:::-;30166:139;;30064:248;;;:::o;30318:419::-;30484:4;30522:2;30511:9;30507:18;30499:26;;30571:9;30565:4;30561:20;30557:1;30546:9;30542:17;30535:47;30599:131;30725:4;30599:131;:::i;:::-;30591:139;;30489:248;;;:::o;30743:419::-;30909:4;30947:2;30936:9;30932:18;30924:26;;30996:9;30990:4;30986:20;30982:1;30971:9;30967:17;30960:47;31024:131;31150:4;31024:131;:::i;:::-;31016:139;;30914:248;;;:::o;31168:419::-;31334:4;31372:2;31361:9;31357:18;31349:26;;31421:9;31415:4;31411:20;31407:1;31396:9;31392:17;31385:47;31449:131;31575:4;31449:131;:::i;:::-;31441:139;;31339:248;;;:::o;31593:419::-;31759:4;31797:2;31786:9;31782:18;31774:26;;31846:9;31840:4;31836:20;31832:1;31821:9;31817:17;31810:47;31874:131;32000:4;31874:131;:::i;:::-;31866:139;;31764:248;;;:::o;32018:419::-;32184:4;32222:2;32211:9;32207:18;32199:26;;32271:9;32265:4;32261:20;32257:1;32246:9;32242:17;32235:47;32299:131;32425:4;32299:131;:::i;:::-;32291:139;;32189:248;;;:::o;32443:419::-;32609:4;32647:2;32636:9;32632:18;32624:26;;32696:9;32690:4;32686:20;32682:1;32671:9;32667:17;32660:47;32724:131;32850:4;32724:131;:::i;:::-;32716:139;;32614:248;;;:::o;32868:419::-;33034:4;33072:2;33061:9;33057:18;33049:26;;33121:9;33115:4;33111:20;33107:1;33096:9;33092:17;33085:47;33149:131;33275:4;33149:131;:::i;:::-;33141:139;;33039:248;;;:::o;33293:419::-;33459:4;33497:2;33486:9;33482:18;33474:26;;33546:9;33540:4;33536:20;33532:1;33521:9;33517:17;33510:47;33574:131;33700:4;33574:131;:::i;:::-;33566:139;;33464:248;;;:::o;33718:419::-;33884:4;33922:2;33911:9;33907:18;33899:26;;33971:9;33965:4;33961:20;33957:1;33946:9;33942:17;33935:47;33999:131;34125:4;33999:131;:::i;:::-;33991:139;;33889:248;;;:::o;34143:419::-;34309:4;34347:2;34336:9;34332:18;34324:26;;34396:9;34390:4;34386:20;34382:1;34371:9;34367:17;34360:47;34424:131;34550:4;34424:131;:::i;:::-;34416:139;;34314:248;;;:::o;34568:419::-;34734:4;34772:2;34761:9;34757:18;34749:26;;34821:9;34815:4;34811:20;34807:1;34796:9;34792:17;34785:47;34849:131;34975:4;34849:131;:::i;:::-;34841:139;;34739:248;;;:::o;34993:419::-;35159:4;35197:2;35186:9;35182:18;35174:26;;35246:9;35240:4;35236:20;35232:1;35221:9;35217:17;35210:47;35274:131;35400:4;35274:131;:::i;:::-;35266:139;;35164:248;;;:::o;35418:419::-;35584:4;35622:2;35611:9;35607:18;35599:26;;35671:9;35665:4;35661:20;35657:1;35646:9;35642:17;35635:47;35699:131;35825:4;35699:131;:::i;:::-;35691:139;;35589:248;;;:::o;35843:419::-;36009:4;36047:2;36036:9;36032:18;36024:26;;36096:9;36090:4;36086:20;36082:1;36071:9;36067:17;36060:47;36124:131;36250:4;36124:131;:::i;:::-;36116:139;;36014:248;;;:::o;36268:419::-;36434:4;36472:2;36461:9;36457:18;36449:26;;36521:9;36515:4;36511:20;36507:1;36496:9;36492:17;36485:47;36549:131;36675:4;36549:131;:::i;:::-;36541:139;;36439:248;;;:::o;36693:222::-;36786:4;36824:2;36813:9;36809:18;36801:26;;36837:71;36905:1;36894:9;36890:17;36881:6;36837:71;:::i;:::-;36791:124;;;;:::o;36921:129::-;36955:6;36982:20;;:::i;:::-;36972:30;;37011:33;37039:4;37031:6;37011:33;:::i;:::-;36962:88;;;:::o;37056:75::-;37089:6;37122:2;37116:9;37106:19;;37096:35;:::o;37137:307::-;37198:4;37288:18;37280:6;37277:30;37274:2;;;37310:18;;:::i;:::-;37274:2;37348:29;37370:6;37348:29;:::i;:::-;37340:37;;37432:4;37426;37422:15;37414:23;;37203:241;;;:::o;37450:308::-;37512:4;37602:18;37594:6;37591:30;37588:2;;;37624:18;;:::i;:::-;37588:2;37662:29;37684:6;37662:29;:::i;:::-;37654:37;;37746:4;37740;37736:15;37728:23;;37517:241;;;:::o;37764:98::-;37815:6;37849:5;37843:12;37833:22;;37822:40;;;:::o;37868:99::-;37920:6;37954:5;37948:12;37938:22;;37927:40;;;:::o;37973:168::-;38056:11;38090:6;38085:3;38078:19;38130:4;38125:3;38121:14;38106:29;;38068:73;;;;:::o;38147:169::-;38231:11;38265:6;38260:3;38253:19;38305:4;38300:3;38296:14;38281:29;;38243:73;;;;:::o;38322:148::-;38424:11;38461:3;38446:18;;38436:34;;;;:::o;38476:305::-;38516:3;38535:20;38553:1;38535:20;:::i;:::-;38530:25;;38569:20;38587:1;38569:20;:::i;:::-;38564:25;;38723:1;38655:66;38651:74;38648:1;38645:81;38642:2;;;38729:18;;:::i;:::-;38642:2;38773:1;38770;38766:9;38759:16;;38520:261;;;;:::o;38787:185::-;38827:1;38844:20;38862:1;38844:20;:::i;:::-;38839:25;;38878:20;38896:1;38878:20;:::i;:::-;38873:25;;38917:1;38907:2;;38922:18;;:::i;:::-;38907:2;38964:1;38961;38957:9;38952:14;;38829:143;;;;:::o;38978:348::-;39018:7;39041:20;39059:1;39041:20;:::i;:::-;39036:25;;39075:20;39093:1;39075:20;:::i;:::-;39070:25;;39263:1;39195:66;39191:74;39188:1;39185:81;39180:1;39173:9;39166:17;39162:105;39159:2;;;39270:18;;:::i;:::-;39159:2;39318:1;39315;39311:9;39300:20;;39026:300;;;;:::o;39332:191::-;39372:4;39392:20;39410:1;39392:20;:::i;:::-;39387:25;;39426:20;39444:1;39426:20;:::i;:::-;39421:25;;39465:1;39462;39459:8;39456:2;;;39470:18;;:::i;:::-;39456:2;39515:1;39512;39508:9;39500:17;;39377:146;;;;:::o;39529:96::-;39566:7;39595:24;39613:5;39595:24;:::i;:::-;39584:35;;39574:51;;;:::o;39631:104::-;39676:7;39705:24;39723:5;39705:24;:::i;:::-;39694:35;;39684:51;;;:::o;39741:90::-;39775:7;39818:5;39811:13;39804:21;39793:32;;39783:48;;;:::o;39837:77::-;39874:7;39903:5;39892:16;;39882:32;;;:::o;39920:149::-;39956:7;39996:66;39989:5;39985:78;39974:89;;39964:105;;;:::o;40075:126::-;40112:7;40152:42;40145:5;40141:54;40130:65;;40120:81;;;:::o;40207:77::-;40244:7;40273:5;40262:16;;40252:32;;;:::o;40290:154::-;40374:6;40369:3;40364;40351:30;40436:1;40427:6;40422:3;40418:16;40411:27;40341:103;;;:::o;40450:307::-;40518:1;40528:113;40542:6;40539:1;40536:13;40528:113;;;40627:1;40622:3;40618:11;40612:18;40608:1;40603:3;40599:11;40592:39;40564:2;40561:1;40557:10;40552:15;;40528:113;;;40659:6;40656:1;40653:13;40650:2;;;40739:1;40730:6;40725:3;40721:16;40714:27;40650:2;40499:258;;;;:::o;40763:320::-;40807:6;40844:1;40838:4;40834:12;40824:22;;40891:1;40885:4;40881:12;40912:18;40902:2;;40968:4;40960:6;40956:17;40946:27;;40902:2;41030;41022:6;41019:14;40999:18;40996:38;40993:2;;;41049:18;;:::i;:::-;40993:2;40814:269;;;;:::o;41089:281::-;41172:27;41194:4;41172:27;:::i;:::-;41164:6;41160:40;41302:6;41290:10;41287:22;41266:18;41254:10;41251:34;41248:62;41245:2;;;41313:18;;:::i;:::-;41245:2;41353:10;41349:2;41342:22;41132:238;;;:::o;41376:233::-;41415:3;41438:24;41456:5;41438:24;:::i;:::-;41429:33;;41484:66;41477:5;41474:77;41471:2;;;41554:18;;:::i;:::-;41471:2;41601:1;41594:5;41590:13;41583:20;;41419:190;;;:::o;41615:79::-;41654:7;41683:5;41672:16;;41662:32;;;:::o;41700:176::-;41732:1;41749:20;41767:1;41749:20;:::i;:::-;41744:25;;41783:20;41801:1;41783:20;:::i;:::-;41778:25;;41822:1;41812:2;;41827:18;;:::i;:::-;41812:2;41868:1;41865;41861:9;41856:14;;41734:142;;;;:::o;41882:180::-;41930:77;41927:1;41920:88;42027:4;42024:1;42017:15;42051:4;42048:1;42041:15;42068:180;42116:77;42113:1;42106:88;42213:4;42210:1;42203:15;42237:4;42234:1;42227:15;42254:180;42302:77;42299:1;42292:88;42399:4;42396:1;42389:15;42423:4;42420:1;42413:15;42440:180;42488:77;42485:1;42478:88;42585:4;42582:1;42575:15;42609:4;42606:1;42599:15;42626:102;42667:6;42718:2;42714:7;42709:2;42702:5;42698:14;42694:28;42684:38;;42674:54;;;:::o;42734:167::-;42874:19;42870:1;42862:6;42858:14;42851:43;42840:61;:::o;42907:170::-;43047:22;43043:1;43035:6;43031:14;43024:46;43013:64;:::o;43083:167::-;43223:19;43219:1;43211:6;43207:14;43200:43;43189:61;:::o;43256:230::-;43396:34;43392:1;43384:6;43380:14;43373:58;43465:13;43460:2;43452:6;43448:15;43441:38;43362:124;:::o;43492:237::-;43632:34;43628:1;43620:6;43616:14;43609:58;43701:20;43696:2;43688:6;43684:15;43677:45;43598:131;:::o;43735:225::-;43875:34;43871:1;43863:6;43859:14;43852:58;43944:8;43939:2;43931:6;43927:15;43920:33;43841:119;:::o;43966:178::-;44106:30;44102:1;44094:6;44090:14;44083:54;44072:72;:::o;44150:223::-;44290:34;44286:1;44278:6;44274:14;44267:58;44359:6;44354:2;44346:6;44342:15;44335:31;44256:117;:::o;44379:175::-;44519:27;44515:1;44507:6;44503:14;44496:51;44485:69;:::o;44560:168::-;44700:20;44696:1;44688:6;44684:14;44677:44;44666:62;:::o;44734:231::-;44874:34;44870:1;44862:6;44858:14;44851:58;44943:14;44938:2;44930:6;44926:15;44919:39;44840:125;:::o;44971:176::-;45111:28;45107:1;45099:6;45095:14;45088:52;45077:70;:::o;45153:166::-;45293:18;45289:1;45281:6;45277:14;45270:42;45259:60;:::o;45325:243::-;45465:34;45461:1;45453:6;45449:14;45442:58;45534:26;45529:2;45521:6;45517:15;45510:51;45431:137;:::o;45574:229::-;45714:34;45710:1;45702:6;45698:14;45691:58;45783:12;45778:2;45770:6;45766:15;45759:37;45680:123;:::o;45809:228::-;45949:34;45945:1;45937:6;45933:14;45926:58;46018:11;46013:2;46005:6;46001:15;45994:36;45915:122;:::o;46043:233::-;46183:34;46179:1;46171:6;46167:14;46160:58;46252:16;46247:2;46239:6;46235:15;46228:41;46149:127;:::o;46282:182::-;46422:34;46418:1;46410:6;46406:14;46399:58;46388:76;:::o;46470:231::-;46610:34;46606:1;46598:6;46594:14;46587:58;46679:14;46674:2;46666:6;46662:15;46655:39;46576:125;:::o;46707:182::-;46847:34;46843:1;46835:6;46831:14;46824:58;46813:76;:::o;46895:228::-;47035:34;47031:1;47023:6;47019:14;47012:58;47104:11;47099:2;47091:6;47087:15;47080:36;47001:122;:::o;47129:234::-;47269:34;47265:1;47257:6;47253:14;47246:58;47338:17;47333:2;47325:6;47321:15;47314:42;47235:128;:::o;47369:220::-;47509:34;47505:1;47497:6;47493:14;47486:58;47578:3;47573:2;47565:6;47561:15;47554:28;47475:114;:::o;47595:226::-;47735:34;47731:1;47723:6;47719:14;47712:58;47804:9;47799:2;47791:6;47787:15;47780:34;47701:120;:::o;47827:168::-;47967:20;47963:1;47955:6;47951:14;47944:44;47933:62;:::o;48001:236::-;48141:34;48137:1;48129:6;48125:14;48118:58;48210:19;48205:2;48197:6;48193:15;48186:44;48107:130;:::o;48243:231::-;48383:34;48379:1;48371:6;48367:14;48360:58;48452:14;48447:2;48439:6;48435:15;48428:39;48349:125;:::o;48480:177::-;48620:29;48616:1;48608:6;48604:14;48597:53;48586:71;:::o;48663:163::-;48803:15;48799:1;48791:6;48787:14;48780:39;48769:57;:::o;48832:163::-;48972:15;48968:1;48960:6;48956:14;48949:39;48938:57;:::o;49001:122::-;49074:24;49092:5;49074:24;:::i;:::-;49067:5;49064:35;49054:2;;49113:1;49110;49103:12;49054:2;49044:79;:::o;49129:116::-;49199:21;49214:5;49199:21;:::i;:::-;49192:5;49189:32;49179:2;;49235:1;49232;49225:12;49179:2;49169:76;:::o;49251:120::-;49323:23;49340:5;49323:23;:::i;:::-;49316:5;49313:34;49303:2;;49361:1;49358;49351:12;49303:2;49293:78;:::o;49377:122::-;49450:24;49468:5;49450:24;:::i;:::-;49443:5;49440:35;49430:2;;49489:1;49486;49479:12;49430:2;49420:79;:::o
Swarm Source
ipfs://d60f4ba31cf34a3daf639657e0a1a64d98189757ec6b46e05e7bdf32b22da917
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.