BscScan - Sponsored slots available. Book your slot here!
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 78,287 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 92564419 | 27 mins ago | IN | 0 BNB | 0.0000048 | ||||
| Transfer | 92562842 | 39 mins ago | IN | 0 BNB | 0.0000048 | ||||
| Transfer | 92552070 | 2 hrs ago | IN | 0 BNB | 0.00000342 | ||||
| Transfer | 92542613 | 3 hrs ago | IN | 0 BNB | 0.0000048 | ||||
| Approve | 92531248 | 4 hrs ago | IN | 0 BNB | 0.0000067 | ||||
| Transfer | 92512244 | 6 hrs ago | IN | 0 BNB | 0.00000359 | ||||
| Transfer | 92512126 | 7 hrs ago | IN | 0 BNB | 0.00000359 | ||||
| Transfer | 92509302 | 7 hrs ago | IN | 0 BNB | 0.00000481 | ||||
| Transfer | 92509011 | 7 hrs ago | IN | 0 BNB | 0.00000393 | ||||
| Transfer | 92508726 | 7 hrs ago | IN | 0 BNB | 0.00000393 | ||||
| Transfer | 92508726 | 7 hrs ago | IN | 0 BNB | 0.00000456 | ||||
| Transfer | 92503854 | 8 hrs ago | IN | 0 BNB | 0.00000362 | ||||
| Transfer | 92503536 | 8 hrs ago | IN | 0 BNB | 0.00000359 | ||||
| Transfer | 92500908 | 8 hrs ago | IN | 0 BNB | 0.0000034 | ||||
| Transfer | 92500786 | 8 hrs ago | IN | 0 BNB | 0.00000438 | ||||
| Transfer | 92500719 | 8 hrs ago | IN | 0 BNB | 0.00000452 | ||||
| Transfer | 92500615 | 8 hrs ago | IN | 0 BNB | 0.00000641 | ||||
| Transfer | 92500615 | 8 hrs ago | IN | 0 BNB | 0.00000438 | ||||
| Transfer | 92500547 | 8 hrs ago | IN | 0 BNB | 0.00000457 | ||||
| Transfer | 92500367 | 8 hrs ago | IN | 0 BNB | 0.00000438 | ||||
| Transfer | 92500291 | 8 hrs ago | IN | 0 BNB | 0.00000471 | ||||
| Transfer | 92498602 | 8 hrs ago | IN | 0 BNB | 0.00000438 | ||||
| Transfer | 92498186 | 8 hrs ago | IN | 0 BNB | 0.0000048 | ||||
| Transfer | 92497564 | 8 hrs ago | IN | 0 BNB | 0.00000372 | ||||
| Transfer | 92497556 | 8 hrs ago | IN | 0 BNB | 0.00000494 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BHToken
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at BscScan.com on 2026-03-13
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC-20
* applications.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* Both values are immutable: they can only be set once during construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/// @inheritdoc IERC20
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/// @inheritdoc IERC20
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/// @inheritdoc IERC20
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal virtual{
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
*
* ```solidity
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner`'s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance < type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @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.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File: @openzeppelin/contracts/utils/Errors.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of common custom errors used in multiple contracts
*
* IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
* It is recommended to avoid relying on the error API for critical functionality.
*
* _Available since v5.1._
*/
library Errors {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error InsufficientBalance(uint256 balance, uint256 needed);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedCall();
/**
* @dev The deployment failed.
*/
error FailedDeployment();
/**
* @dev A necessary precompile is missing.
*/
error MissingPrecompile(address);
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert Errors.InsufficientBalance(address(this).balance, amount);
}
(bool success, bytes memory returndata) = recipient.call{value: amount}("");
if (!success) {
_revert(returndata);
}
}
/**
* @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 or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {Errors.FailedCall} error.
*
* 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.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @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`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case
* of an unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {Errors.FailedCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.
*/
function _revert(bytes memory returndata) private pure {
// 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 ("memory-safe") {
revert(add(returndata, 0x20), mload(returndata))
}
} else {
revert Errors.FailedCall();
}
}
}
// File: BNNN.sol
pragma solidity ^0.8.0;
interface IUniswapFactory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapPair {
function sync() external;
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function totalSupply() external view returns (uint256);
}
contract BHToken is ERC20, Ownable, ReentrancyGuard {
using Address for address;
uint256 public immutable TOTAL_SUPPLY;
address public liquidityPool;
address public USDTAddress = 0x55d398326f99059fF775485246999027B3197955;
mapping(address => bool) private isExcludedFromFee;
mapping(address => bool) public isSpecialRemoveUser;
address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
// 开盘时间
uint256 public openTime;
// 特殊用户限购额度,已买额度
mapping(address => uint256) public specialBuyLimit;
mapping(address => uint256) public specialBuyAmount;
// 绑定上下级关系
mapping(address => address) public superior;
mapping(address => mapping(address => bool)) public transferIntent;
event SuperiorBound(address indexed user, address indexed superior);
// 直推人数
mapping(address => address[]) public referrals;
// 普通节点
address[] public normalNodes;
mapping(address => bool) public isNormalNode;
// 超级节点
address[] public superNodes;
mapping(address => bool) public isSuperNode;
// 股东节点
address[] public shareholderNodes;
mapping(address => bool) public isShareholderNode;
// 记录每个地址转入本合约的累计数量
mapping(address => uint256) public depositedToContract;
// 记录每个地址最近一次转入合约的时间
mapping(address => uint256) public lastDepositTime;
// 买卖税分红 记录分红到第几个人
uint256 public normalNodeDividendIndex;
// 出入金分钟 记录分红到第几个人
uint256 public depositNodeDividendIndex;
// 同区块最大交易限制
uint256 public tradeAmountThisBlock;
uint256 public lastBlockNumber;
uint256 public constant BLOCK_LIMIT_AMOUNT = 7_500_000 * 10 ** 18; // 750万个代币
// 单地址每天买卖额度限制
mapping(address => uint256) public dailyTradeAmount;
mapping(address => uint256) public lastTradeDay;
uint256 public constant DAILY_TOTAL_LIMIT = 15_000_000 * 10 ** 18; // 1500万个代币
address public isOperator = 0x9f3289c22E717DA0A846b2Cb7eF47baD28178bec; // 权限地址
constructor() ERC20("BH", "BH") Ownable(msg.sender) {
address factory = 0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73;
TOTAL_SUPPLY = 210_000_000 * 10 ** decimals();
_mint(0x0315F8234721d47ca9B1b4Cb9141d54a7d20536d, TOTAL_SUPPLY);
liquidityPool = IUniswapFactory(factory).createPair(USDTAddress, address(this));
isExcludedFromFee[0x2CB8677EB1e1D6aDBB2C65119c70531B602fbCda] = true;
// 部署时即开盘,如需手动可加setOpenTime接口
// openTime = block.timestamp;
}
// 获取当前日期
function _currentDay() internal view returns (uint256) {
return block.timestamp / 1 days;
}
modifier onlyOperator() {
require(msg.sender == isOperator, "Not Operator");
_;
}
function _checkAndAddDailyTrade(address user, uint256 amount) internal {
uint256 today = _currentDay();
if (lastTradeDay[user] != today) {
dailyTradeAmount[user] = 0;
lastTradeDay[user] = today;
}
require(dailyTradeAmount[user] + amount <= DAILY_TOTAL_LIMIT, "Exceeds daily trade limit");
dailyTradeAmount[user] += amount;
}
// 管理特殊用户限额
function setSpecialBuyLimit(address user, uint256 limit) external onlyOwner {
specialBuyLimit[user] = limit;
}
function batchSetSpecialBuyLimit(address[] calldata users, uint256[] calldata limits) external onlyOwner {
require(users.length == limits.length, "Length mismatch");
for (uint256 i = 0; i < users.length; i++) {
specialBuyLimit[users[i]] = limits[i];
}
}
// 设置开盘时间
function setOpenTime(uint256 _openTime) external onlyOwner {
openTime = _openTime;
}
// 查询已买额度
function getSpecialBuyAmount(address user) external view returns (uint256) {
return specialBuyAmount[user];
}
// 查询当前买入的USDT数量(估算)
function getAmountInUSDT(uint256 tokenAmount) public view returns (uint256) {
(uint256 rOther, uint256 rThis) = _getReserves();
if (rThis == 0) return 0;
return (tokenAmount * rOther) / rThis;
}
// Uniswap池储备
function _getReserves() internal view returns (uint256 rOther, uint256 rThis) {
(uint256 r0, uint256 r1, ) = IUniswapPair(liquidityPool).getReserves();
if (USDTAddress < address(this)) {
rOther = r0;
rThis = r1;
} else {
rOther = r1;
rThis = r0;
}
}
function _isRemoveLiquidity(uint256 amount) internal view returns (uint256) {
(uint256 rOther, ) = _getReserves();
uint256 balanceOther = IERC20(USDTAddress).balanceOf(liquidityPool);
if (balanceOther <= rOther) {
uint256 liquidity = (amount * IUniswapPair(liquidityPool).totalSupply()) / (balanceOf(liquidityPool) - amount);
return liquidity;
}
return 0;
}
// 主逻辑
function _transfer(address from, address recipient, uint256 amount) internal override {
// 同区块限制买卖
if (block.number != lastBlockNumber) {
tradeAmountThisBlock = 0;
lastBlockNumber = block.number;
}
// 绑定上下级逻辑
_bindSuperior(from, recipient, amount);
// 白名单
if (isExcludedFromFee[from] || isExcludedFromFee[recipient]) {
super._transfer(from, recipient, amount);
return;
}
// 买入或卖出处理
if (from == liquidityPool || recipient == liquidityPool) {
// 开盘时间
require(block.timestamp >= openTime, "Trading not started");
// 同区块最大交易限制
require(tradeAmountThisBlock + amount <= BLOCK_LIMIT_AMOUNT, "Exceeds block trade limit");
tradeAmountThisBlock += amount;
}
// 买入处理(从池子买出)
if (from == liquidityPool) {
//单地址买卖限制
_checkAndAddDailyTrade(recipient, amount);
// 处理手续费
uint256 feeAmount = amount * 3 / 100;
// 3%的10% 超级节点分红
uint256 feeAmountCj = feeAmount * 10 / 100;
distributeToSuperNodes(feeAmountCj, from); // 超级节点分红
// 3%的10% 股东节点分红
uint256 feeAmountGd = feeAmount * 10 / 100;
distributeToShareholderNodes(feeAmountGd, from); // 股东分红
// 3%的30% 给到营销钱包
uint256 feeAmountYx = feeAmount * 10 / 100;
super._transfer(from, 0xa17313b81ad11e002753A1DE01ea0133818325f1, feeAmountYx);
// 3%的10% 黑洞
uint256 feeAmountHd = feeAmount * 10 / 100;
super._transfer(from, address(0xdead), feeAmountHd);
// 3%的40% lp分红
uint256 feeAmountLp = feeAmount * 60 / 100;
distributeToNormalNodesWeighted(feeAmountLp, from);
// 剩余正常执行
uint256 recipientAmount = amount - feeAmount;
// 撤池特殊处理
bool isRemove;
uint256 removeLPLiquidity = _isRemoveLiquidity(recipientAmount);
if (removeLPLiquidity > 0) {
isRemove = true;
}
if (isRemove) {
if (isSpecialRemoveUser[recipient]) {
super._transfer(from, BURN_ADDRESS, recipientAmount);
} else {
super._transfer(from, recipient, recipientAmount);
}
return;
}
// 开盘5分钟内
// if (block.timestamp < openTime + 1 * 60) {
// if (specialBuyLimit[recipient] > 0) {
// uint256 usdtAmount = getAmountInUSDT(recipientAmount);
// require(specialBuyAmount[recipient] + usdtAmount <= specialBuyLimit[recipient], "Exceeds special buy limit");
// specialBuyAmount[recipient] += usdtAmount;
// } else {
// revert("Not allowed to buy within first 5 minutes");
// }
// }
super._transfer(from, recipient, recipientAmount);
return;
}
// 卖出处理
if (recipient == liquidityPool) {
//单地址买卖限制
_checkAndAddDailyTrade(from, amount);
// 处理手续费
uint256 feeAmount = amount * 8 / 100;
// 3%的10% 超级节点分红
uint256 feeAmountCj = feeAmount * 10 / 100;
distributeToSuperNodes(feeAmountCj, from); // 超级节点分红
// 3%的10% 股东节点分红
uint256 feeAmountGd = feeAmount * 10 / 100;
distributeToShareholderNodes(feeAmountGd, from); // 股东分红
// 3%的30% 给到营销钱包
uint256 feeAmountYx = feeAmount * 10 / 100;
super._transfer(from, 0xa17313b81ad11e002753A1DE01ea0133818325f1, feeAmountYx);
// 3%的10% 黑洞
uint256 feeAmountHd = feeAmount * 10 / 100;
super._transfer(from, address(0xdead), feeAmountHd);
// 3%的40% lp分红
uint256 feeAmountLp = feeAmount * 60 / 100;
distributeToNormalNodesWeighted(feeAmountLp, from);
// 剩余正常执行
uint256 recipientAmount = amount - feeAmount;
super._transfer(from, recipient, recipientAmount);
return;
}
super._transfer(from, recipient, amount);
// 如果是转账到合约本身,记录下
if (recipient == address(this)) {
require(amount >= 100 * 10 ** decimals(), "Minimum deposit is 100 tokens");
_recordDeposit(from, amount);
}
}
// 记录存款的内部函数
function _recordDeposit(address from, uint256 amount) internal {
if (lastDepositTime[from] != 0) {
require(block.timestamp >= lastDepositTime[from] + 24 hours, "You can only deposit once every 24 hours");
// require(block.timestamp >= lastDepositTime[from] + 5 minutes, "You can only deposit once every 5 minutes");
uint256 previousAmount = depositedToContract[from];
if (previousAmount > 0) {
// 判断底池余额 触发熔断机制 底池数量小于等于500万的时候 不发奖励 只返还之前入金的金额
uint256 poolBalance = balanceOf(liquidityPool);
uint256 MIN_POOL_AMOUNT = 5_000_000 * 10 ** decimals();
if (poolBalance > MIN_POOL_AMOUNT) {
uint256 amountJt = previousAmount * 15 / 1000; // 静态1.5%
super._transfer(liquidityPool, from, amountJt);
uint256 amountXm = previousAmount * 2 / 1000; // 0.2% 给到项目方
super._transfer(liquidityPool, 0xa17313b81ad11e002753A1DE01ea0133818325f1, amountXm);
// uint256 amountJd = previousAmount * 5 / 1000; // 0.5% 给到节点均分
uint256 amountJd = previousAmount * 20 / 1000; // 2% 给到节点均分
_distributeNodeDividend(amountJd, liquidityPool);
uint256 amountDt = previousAmount * 15 / 1000; // 动态1.5%
distributeDynamicDividendToSuperior(from, amountDt); // 团队分红
IUniswapPair(liquidityPool).sync();
}
// 返还之前的金额
super._transfer(address(this), from, previousAmount);
}
}
depositedToContract[from] = amount;
lastDepositTime[from] = block.timestamp;
}
// 团队奖励
function distributeDynamicDividendToSuperior(address from, uint256 amountDt) internal {
address current = superior[from];
uint256 minDeposit = 100 * 10 ** decimals();
uint256[19] memory rates = [
uint256(20), uint256(15), uint256(10), uint256(10), uint256(10),
uint256(4), uint256(4), uint256(4), uint256(4), uint256(4),
uint256(4), uint256(4), uint256(4), uint256(1), uint256(1),
uint256(1), uint256(1), uint256(1), uint256(1)
];
uint256 totalDistributed = 0;
for (uint256 i = 0; i < 19 && current != address(0); i++) {
uint256 rate = rates[i];
bool eligible = false;
if (i == 0) {
// 直推:推荐人数不限,入金≥10000
eligible = depositedToContract[current] >= minDeposit;
} else if (i == 1) {
// 第二层:推荐≥2,入金≥10000
eligible = referrals[current].length >= 2 && depositedToContract[current] >= minDeposit;
} else if (i >= 2 && i <= 4) {
// 第3-5层:推荐≥3,入金≥10000
eligible = referrals[current].length >= 3 && depositedToContract[current] >= minDeposit;
} else if (i >= 5 && i <= 12) {
// 第6-13层:推荐≥5,入金≥10000
eligible = referrals[current].length >= 5 && depositedToContract[current] >= minDeposit;
} else if (i >= 13 && i <= 18) {
// 第14-19层:推荐≥6,入金≥10000
eligible = referrals[current].length >= 5 && depositedToContract[current] >= minDeposit;
}
if (eligible) {
uint256 share = amountDt * rate / 100;
super._transfer(liquidityPool, current, share);
totalDistributed += share;
}
current = superior[current];
}
// 剩余部分不发放
}
// 出入金分红
function _distributeNodeDividend(uint256 amount, address from) internal {
uint256 shareholderCount = shareholderNodes.length;
uint256 superNodeCount = superNodes.length;
uint256 normalNodeCount = normalNodes.length;
uint256 batchSize = 50;
uint256 startIndex = depositNodeDividendIndex;
uint256 endIndex = startIndex + batchSize;
if (endIndex > normalNodeCount) endIndex = normalNodeCount;
uint256 batchNormalCount = endIndex - startIndex;
uint256 totalCount = shareholderCount + superNodeCount + batchNormalCount;
if (totalCount == 0 || amount == 0) return;
uint256 perPersonAmount = amount / totalCount;
uint256 remainder = amount - perPersonAmount * totalCount;
uint256 sentCount = 0;
// 股东节点
for (uint i = 0; i < shareholderCount; i++) {
uint256 sendAmount = perPersonAmount;
if (sentCount == totalCount - 1) sendAmount += remainder; // 最后一个人补余数
if (sendAmount > 0) super._transfer(from, shareholderNodes[i], sendAmount);
sentCount++;
}
// 超级节点
for (uint i = 0; i < superNodeCount; i++) {
uint256 sendAmount = perPersonAmount;
if (sentCount == totalCount - 1) sendAmount += remainder;
if (sendAmount > 0) super._transfer(from, superNodes[i], sendAmount);
sentCount++;
}
// 普通节点(本批次最多50个)
for (uint256 i = startIndex; i < endIndex; i++) {
uint256 sendAmount = perPersonAmount;
if (sentCount == totalCount - 1) sendAmount += remainder;
if (sendAmount > 0) super._transfer(from, normalNodes[i], sendAmount);
sentCount++;
}
// 更新分红索引
depositNodeDividendIndex = endIndex % normalNodeCount;
}
function _bindSuperior(address from, address to, uint256 amount) internal {
if (from == to) return; // 不能自己给自己
if (!transferIntent[from][to]) {
if (superior[to] == address(0) && amount == 2 * 10 ** decimals()) {
transferIntent[from][to] = true;
}
}
if (transferIntent[to][from]) {
if (superior[from] == address(0) && amount == 1 * 10 ** decimals()) {
superior[from] = to;
referrals[to].push(from);
emit SuperiorBound(from, to);
}
}
}
// 查询直推人数
function getReferralCount(address user) external view returns (uint256) {
return referrals[user].length;
}
// 普通节点分红
function distributeToNormalNodesWeighted(uint256 amount, address from) internal {
uint256 nodeCount = normalNodes.length;
if (nodeCount == 0 || amount == 0) return;
uint256 batchSize = 50;
uint256 startIndex = normalNodeDividendIndex;
uint256 endIndex = startIndex + batchSize;
if (endIndex > nodeCount) {
endIndex = nodeCount;
}
// 计算本批次的总转入
uint256 totalDeposited = 0;
for (uint256 i = startIndex; i < endIndex; i++) {
totalDeposited += depositedToContract[normalNodes[i]];
}
// 如果本批次总转入为0则不分发
if (totalDeposited == 0) {
normalNodeDividendIndex = endIndex % nodeCount;
return;
}
uint256 distributed = 0;
for (uint256 i = startIndex; i < endIndex; i++) {
uint256 nodeDeposit = depositedToContract[normalNodes[i]];
uint256 nodeShare = (amount * nodeDeposit) / totalDeposited;
// 最后一个节点分到余数
if (i == endIndex - 1) {
nodeShare = amount - distributed;
}
if (nodeShare > 0) {
super._transfer(from, normalNodes[i], nodeShare);
distributed += nodeShare;
}
}
// 更新分红索引
normalNodeDividendIndex = endIndex % nodeCount;
}
// 批量设置普通节点
function addNormalNodes(address[] calldata users) external onlyOperator {
for (uint i = 0; i < users.length; i++) {
if (!isNormalNode[users[i]]) {
normalNodes.push(users[i]);
isNormalNode[users[i]] = true;
}
}
}
// 超级节点分红
function distributeToSuperNodes(uint256 amount, address from) internal {
uint256 nodeCount = superNodes.length;
if (nodeCount == 0 || amount == 0) return;
uint256 avg = amount / nodeCount;
uint256 remainder = amount % nodeCount;
for (uint256 i = 0; i < nodeCount; i++) {
// 最后一个节点分到余数
uint256 sendAmount = avg;
if (i == nodeCount - 1) {
sendAmount += remainder;
}
if (sendAmount > 0) {
super._transfer(from, superNodes[i], sendAmount);
}
}
}
// 批量设置超级节点
function addSuperNodes(address[] calldata users) external onlyOperator {
for (uint i = 0; i < users.length; i++) {
if (!isSuperNode[users[i]]) {
superNodes.push(users[i]);
isSuperNode[users[i]] = true;
}
}
}
// 股东分红
function distributeToShareholderNodes(uint256 amount, address from) internal {
uint256 nodeCount = shareholderNodes.length;
if (nodeCount == 0 || amount == 0) return;
uint256 avg = amount / nodeCount;
uint256 remainder = amount % nodeCount;
for (uint256 i = 0; i < nodeCount; i++) {
uint256 sendAmount = avg;
if (i == nodeCount - 1) {
sendAmount += remainder;
}
if (sendAmount > 0) {
super._transfer(from, shareholderNodes[i], sendAmount);
}
}
}
// 批量设置股东节点
function addShareholderNodes(address[] calldata users) external onlyOperator {
for (uint i = 0; i < users.length; i++) {
if (!isShareholderNode[users[i]]) {
shareholderNodes.push(users[i]);
isShareholderNode[users[i]] = true;
}
}
}
function getDepositedToContract(address user) external view returns (uint256) {
return depositedToContract[user];
}
function getNormalNodes() external view returns (address[] memory) {
return normalNodes;
}
function getSuperNodes() external view returns (address[] memory) {
return superNodes;
}
function getShareholderNodes() external view returns (address[] memory) {
return shareholderNodes;
}
function setSpecialRemoveUser(address user, bool isSpecial) external onlyOperator {
isSpecialRemoveUser[user] = isSpecial;
}
function getLiquidityPool() external view returns (address) {
return liquidityPool;
}
function excludeFromFee(address account, bool excluded) external onlyOperator {
isExcludedFromFee[account] = excluded;
}
function isAddressExcludedFromFee(address account) external view returns (bool) {
return isExcludedFromFee[account];
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"superior","type":"address"}],"name":"SuperiorBound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BLOCK_LIMIT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAILY_TOTAL_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDTAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"addNormalNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"addShareholderNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"addSuperNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"limits","type":"uint256[]"}],"name":"batchSetSpecialBuyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dailyTradeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositNodeDividendIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedToContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getAmountInUSDT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getDepositedToContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNormalNodes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getReferralCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getShareholderNodes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getSpecialBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSuperNodes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAddressExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNormalNode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isShareholderNode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSpecialRemoveUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSuperNode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDepositTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastTradeDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalNodeDividendIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"normalNodes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"referrals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_openTime","type":"uint256"}],"name":"setOpenTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setSpecialBuyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"isSpecial","type":"bool"}],"name":"setSpecialRemoveUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"shareholderNodes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"specialBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"specialBuyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"superNodes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"superior","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeAmountThisBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"transferIntent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040527355d398326f99059ff775485246999027b3197955600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739f3289c22e717da0a846b2cb7ef47bad28178bec601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156100ba57600080fd5b50336040518060400160405280600281526020017f42480000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f424800000000000000000000000000000000000000000000000000000000000081525081600390816101379190610961565b5080600490816101479190610961565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101bc5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101b39190610a74565b60405180910390fd5b6101cb8161039560201b60201c565b506001600681905550600073ca143ce32fe78f1f7019d7d551a6402fc5350c7390506101fb61045b60201b60201c565b600a6102079190610bfe565b630c8458806102169190610c49565b60808181525050610243730315f8234721d47ca9b1b4cb9141d54a7d20536d60805161046460201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1663c9c65396600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306040518363ffffffff1660e01b81526004016102a0929190610c8b565b6020604051808303816000875af11580156102bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e39190610ce5565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160096000732cb8677eb1e1d6adbb2c65119c70531b602fbcda73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050610da7565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036104d65760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016104cd9190610a74565b60405180910390fd5b6104e8600083836104ec60201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361053e5780600260008282546105329190610d12565b92505081905550610611565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156105ca578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016105c193929190610d55565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361065a57806002600082825403925050819055506106a7565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107049190610d8c565b60405180910390a3505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061079257607f821691505b6020821081036107a5576107a461074b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261080d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826107d0565b61081786836107d0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061085e6108596108548461082f565b610839565b61082f565b9050919050565b6000819050919050565b61087883610843565b61088c61088482610865565b8484546107dd565b825550505050565b600090565b6108a1610894565b6108ac81848461086f565b505050565b5b818110156108d0576108c5600082610899565b6001810190506108b2565b5050565b601f821115610915576108e6816107ab565b6108ef846107c0565b810160208510156108fe578190505b61091261090a856107c0565b8301826108b1565b50505b505050565b600082821c905092915050565b60006109386000198460080261091a565b1980831691505092915050565b60006109518383610927565b9150826002028217905092915050565b61096a82610711565b67ffffffffffffffff8111156109835761098261071c565b5b61098d825461077a565b6109988282856108d4565b600060209050601f8311600181146109cb57600084156109b9578287015190505b6109c38582610945565b865550610a2b565b601f1984166109d9866107ab565b60005b82811015610a01578489015182556001820191506020850194506020810190506109dc565b86831015610a1e5784890151610a1a601f891682610927565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a5e82610a33565b9050919050565b610a6e81610a53565b82525050565b6000602082019050610a896000830184610a65565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115610b1557808604811115610af157610af0610a8f565b5b6001851615610b005780820291505b8081029050610b0e85610abe565b9450610ad5565b94509492505050565b600082610b2e5760019050610bea565b81610b3c5760009050610bea565b8160018114610b525760028114610b5c57610b8b565b6001915050610bea565b60ff841115610b6e57610b6d610a8f565b5b8360020a915084821115610b8557610b84610a8f565b5b50610bea565b5060208310610133831016604e8410600b8410161715610bc05782820a905083811115610bbb57610bba610a8f565b5b610bea565b610bcd8484846001610acb565b92509050818404811115610be457610be3610a8f565b5b81810290505b9392505050565b600060ff82169050919050565b6000610c098261082f565b9150610c1483610bf1565b9250610c417fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610b1e565b905092915050565b6000610c548261082f565b9150610c5f8361082f565b9250828202610c6d8161082f565b91508282048414831517610c8457610c83610a8f565b5b5092915050565b6000604082019050610ca06000830185610a65565b610cad6020830184610a65565b9392505050565b600080fd5b610cc281610a53565b8114610ccd57600080fd5b50565b600081519050610cdf81610cb9565b92915050565b600060208284031215610cfb57610cfa610cb4565b5b6000610d0984828501610cd0565b91505092915050565b6000610d1d8261082f565b9150610d288361082f565b9250828201905080821115610d4057610d3f610a8f565b5b92915050565b610d4f8161082f565b82525050565b6000606082019050610d6a6000830186610a65565b610d776020830185610d46565b610d846040830184610d46565b949350505050565b6000602082019050610da16000830184610d46565b92915050565b608051615556610dc2600039600061149701526155566000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c8063850404a1116101de578063b67a31981161010f578063e0cca4c4116100ad578063f60ba3381161007c578063f60ba33814610b5c578063f61656e114610b78578063fccc281314610ba8578063ff920c7414610bc657610383565b8063e0cca4c414610ab0578063e697b5d814610ae0578063f2ef459e14610b10578063f2fde38b14610b4057610383565b8063d60bad0c116100e9578063d60bad0c14610a04578063da1f988814610a34578063dd62ed3e14610a64578063df8408fe14610a9457610383565b8063b67a31981461099c578063bcd14597146109b8578063cce23efa146109e857610383565b8063a6943bde1161017c578063abc275b011610156578063abc275b014610914578063b2f085a514610932578063b42568881461094e578063b46471d71461096c57610383565b8063a6943bde146108aa578063a9059cbb146108c6578063a958e6b0146108f657610383565b8063902d55a5116101b8578063902d55a51461082057806395d89b411461083e57806395ddbe891461085c578063a14f29dd1461087a57610383565b8063850404a1146107a257806389e750ec146107d25780638da5cb5b1461080257610383565b80633a9aea6d116102b85780636f096da31161025657806373a210851161023057806373a21085146106f6578063767fe0b2146107265780637d0e81bf1461075657806384ad537f1461078657610383565b80636f096da31461068c57806370a08231146106bc578063715018a6146106ec57610383565b80634456eda2116102925780634456eda21461061457806353895a9f146106325780635560e53314610650578063665a11ca1461066e57610383565b80633a9aea6d146105a857806340a75ed2146105d857806341131da3146105f657610383565b80631fac8430116103255780632552317c116102ff5780632552317c1461051e5780632c0fb38e1461053c5780632f0e3e711461056c578063313ce5671461058a57610383565b80631fac84301461048e57806323b872dd146104be57806324acbd69146104ee57610383565b80630c173335116103615780630c173335146104065780630f9f17301461043657806318160ddd146104525780631f087eee1461047057610383565b8063025277531461038857806306fdde03146103b8578063095ea7b3146103d6575b600080fd5b6103a2600480360381019061039d919061474e565b610be4565b6040516103af9190614794565b60405180910390f35b6103c0610bfc565b6040516103cd919061483f565b60405180910390f35b6103f060048036038101906103eb919061488d565b610c8e565b6040516103fd91906148e8565b60405180910390f35b610420600480360381019061041b9190614903565b610cb1565b60405161042d919061493f565b60405180910390f35b610450600480360381019061044b91906149bf565b610cf0565b005b61045a610f22565b6040516104679190614794565b60405180910390f35b610478610f2c565b6040516104859190614aca565b60405180910390f35b6104a860048036038101906104a3919061474e565b610fba565b6040516104b59190614794565b60405180910390f35b6104d860048036038101906104d39190614aec565b611003565b6040516104e591906148e8565b60405180910390f35b6105086004803603810190610503919061474e565b611032565b6040516105159190614794565b60405180910390f35b61052661107e565b6040516105339190614794565b60405180910390f35b61055660048036038101906105519190614903565b611084565b604051610563919061493f565b60405180910390f35b6105746110c3565b6040516105819190614794565b60405180910390f35b6105926110d2565b60405161059f9190614b5b565b60405180910390f35b6105c260048036038101906105bd9190614903565b6110db565b6040516105cf919061493f565b60405180910390f35b6105e061111a565b6040516105ed9190614794565b60405180910390f35b6105fe611120565b60405161060b9190614aca565b60405180910390f35b61061c6111ae565b604051610629919061493f565b60405180910390f35b61063a6111d4565b6040516106479190614794565b60405180910390f35b6106586111da565b6040516106659190614794565b60405180910390f35b6106766111e0565b604051610683919061493f565b60405180910390f35b6106a660048036038101906106a1919061474e565b611206565b6040516106b391906148e8565b60405180910390f35b6106d660048036038101906106d1919061474e565b611226565b6040516106e39190614794565b60405180910390f35b6106f461126e565b005b610710600480360381019061070b919061474e565b611282565b60405161071d91906148e8565b60405180910390f35b610740600480360381019061073b919061474e565b6112d8565b60405161074d91906148e8565b60405180910390f35b610770600480360381019061076b919061474e565b6112f8565b60405161077d91906148e8565b60405180910390f35b6107a0600480360381019061079b9190614bcc565b611318565b005b6107bc60048036038101906107b7919061474e565b61140e565b6040516107c99190614794565b60405180910390f35b6107ec60048036038101906107e79190614903565b611426565b6040516107f99190614794565b60405180910390f35b61080a61146b565b604051610817919061493f565b60405180910390f35b610828611495565b6040516108359190614794565b60405180910390f35b6108466114b9565b604051610853919061483f565b60405180910390f35b61086461154b565b604051610871919061493f565b60405180910390f35b610894600480360381019061088f919061474e565b611575565b6040516108a19190614794565b60405180910390f35b6108c460048036038101906108bf9190614c79565b61158d565b005b6108e060048036038101906108db919061488d565b611678565b6040516108ed91906148e8565b60405180910390f35b6108fe61169b565b60405161090b9190614794565b60405180910390f35b61091c6116aa565b6040516109299190614aca565b60405180910390f35b61094c600480360381019061094791906149bf565b611738565b005b61095661196a565b6040516109639190614794565b60405180910390f35b6109866004803603810190610981919061474e565b611970565b6040516109939190614794565b60405180910390f35b6109b660048036038101906109b191906149bf565b6119b9565b005b6109d260048036038101906109cd919061474e565b611beb565b6040516109df9190614794565b60405180910390f35b610a0260048036038101906109fd919061488d565b611c03565b005b610a1e6004803603810190610a19919061474e565b611c53565b604051610a2b9190614794565b60405180910390f35b610a4e6004803603810190610a49919061474e565b611c6b565b604051610a5b919061493f565b60405180910390f35b610a7e6004803603810190610a799190614cb9565b611c9e565b604051610a8b9190614794565b60405180910390f35b610aae6004803603810190610aa99190614c79565b611d25565b005b610aca6004803603810190610ac5919061474e565b611e10565b604051610ad791906148e8565b60405180910390f35b610afa6004803603810190610af5919061488d565b611e30565b604051610b07919061493f565b60405180910390f35b610b2a6004803603810190610b259190614cb9565b611e7e565b604051610b3791906148e8565b60405180910390f35b610b5a6004803603810190610b55919061474e565b611ead565b005b610b766004803603810190610b719190614903565b611f33565b005b610b926004803603810190610b8d919061474e565b611f45565b604051610b9f9190614794565b60405180910390f35b610bb0611f5d565b604051610bbd919061493f565b60405180910390f35b610bce611f63565b604051610bdb919061493f565b60405180910390f35b60186020528060005260406000206000915090505481565b606060038054610c0b90614d28565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3790614d28565b8015610c845780601f10610c5957610100808354040283529160200191610c84565b820191906000526020600020905b815481529060010190602001808311610c6757829003601f168201915b5050505050905090565b600080610c99611f89565b9050610ca6818585611f91565b600191505092915050565b60158181548110610cc157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790614da5565b60405180910390fd5b60005b82829050811015610f1d5760126000848484818110610da557610da4614dc5565b5b9050602002016020810190610dba919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f10576011838383818110610e1b57610e1a614dc5565b5b9050602002016020810190610e30919061474e565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160126000858585818110610ea957610ea8614dc5565b5b9050602002016020810190610ebe919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080600101915050610d83565b505050565b6000600254905090565b60606015805480602002602001604051908101604052809291908181526020018280548015610fb057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f66575b5050505050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008061100e611f89565b905061101b858285611fa3565b611026858585612038565b60019150509392505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b601c5481565b6013818154811061109457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6a06342fd08f00f63780000081565b60006012905090565b601181815481106110eb57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60195481565b606060118054806020026020016040519081016040528092919081815260200182805480156111a457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161115a575b5050505050905090565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601b5481565b601a5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112766126c9565b6112806000612750565b565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60126020528060005260406000206000915054906101000a900460ff1681565b60146020528060005260406000206000915054906101000a900460ff1681565b6113206126c9565b818190508484905014611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90614e40565b60405180910390fd5b60005b848490508110156114075782828281811061138957611388614dc5565b5b90506020020135600c60008787858181106113a7576113a6614dc5565b5b90506020020160208101906113bc919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808060010191505061136b565b5050505050565b601d6020528060005260406000206000915090505481565b6000806000611433612816565b915091506000810361144a57600092505050611466565b8082856114579190614e8f565b6114619190614f00565b925050505b919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060600480546114c890614d28565b80601f01602080910402602001604051908101604052809291908181526020018280546114f490614d28565b80156115415780601f1061151657610100808354040283529160200191611541565b820191906000526020600020905b81548152906001019060200180831161152457829003601f168201915b5050505050905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d6020528060005260406000206000915090505481565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490614da5565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080611683611f89565b9050611690818585612038565b600191505092915050565b6a0c685fa11e01ec6f00000081565b6060601380548060200260200160405190810160405280929190818152602001828054801561172e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116e4575b5050505050905090565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614da5565b60405180910390fd5b60005b8282905081101561196557601460008484848181106117ed576117ec614dc5565b5b9050602002016020810190611802919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661195857601383838381811061186357611862614dc5565b5b9050602002016020810190611878919061474e565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601460008585858181106118f1576118f0614dc5565b5b9050602002016020810190611906919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80806001019150506117cb565b505050565b600b5481565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090614da5565b60405180910390fd5b60005b82829050811015611be65760166000848484818110611a6e57611a6d614dc5565b5b9050602002016020810190611a83919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bd9576015838383818110611ae457611ae3614dc5565b5b9050602002016020810190611af9919061474e565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160166000858585818110611b7257611b71614dc5565b5b9050602002016020810190611b87919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080600101915050611a4c565b505050565b60176020528060005260406000206000915090505481565b611c0b6126c9565b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600c6020528060005260406000206000915090505481565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614da5565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60166020528060005260406000206000915054906101000a900460ff1681565b60106020528160005260406000208181548110611e4c57600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b611eb56126c9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f275760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611f1e919061493f565b60405180910390fd5b611f3081612750565b50565b611f3b6126c9565b80600b8190555050565b601e6020528060005260406000206000915090505481565b61dead81565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b611f9e8383836001612940565b505050565b6000611faf8484611c9e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156120325781811015612022578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161201993929190614f31565b60405180910390fd5b61203184848484036000612940565b5b50505050565b601c544314612051576000601b8190555043601c819055505b61205c838383612b17565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806120fd5750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156121125761210d838383612ffb565b6126c4565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806121bb5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561227a57600b54421015612205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fc90614fb4565b60405180910390fd5b6a06342fd08f00f63780000081601b5461221f9190614fd4565b1115612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790615054565b60405180910390fd5b80601b60008282546122729190614fd4565b925050819055505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361249a576122d982826130ef565b600060646003836122ea9190614e8f565b6122f49190614f00565b905060006064600a836123079190614e8f565b6123119190614f00565b905061231d81866132be565b60006064600a8461232e9190614e8f565b6123389190614f00565b9050612344818761339e565b60006064600a856123559190614e8f565b61235f9190614f00565b90506123808773a17313b81ad11e002753a1de01ea0133818325f183612ffb565b60006064600a866123919190614e8f565b61239b9190614f00565b90506123aa8861dead83612ffb565b60006064603c876123bb9190614e8f565b6123c59190614f00565b90506123d1818a61347e565b600086886123df9190615074565b90506000806123ed836136f3565b905060008111156123fd57600191505b811561248157600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612467576124628c61dead85612ffb565b612473565b6124728c8c85612ffb565b5b5050505050505050506126c4565b61248c8c8c85612ffb565b5050505050505050506126c4565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612618576124f983826130ef565b6000606460088361250a9190614e8f565b6125149190614f00565b905060006064600a836125279190614e8f565b6125319190614f00565b905061253d81866132be565b60006064600a8461254e9190614e8f565b6125589190614f00565b9050612564818761339e565b60006064600a856125759190614e8f565b61257f9190614f00565b90506125a08773a17313b81ad11e002753a1de01ea0133818325f183612ffb565b60006064600a866125b19190614e8f565b6125bb9190614f00565b90506125ca8861dead83612ffb565b60006064603c876125db9190614e8f565b6125e59190614f00565b90506125f1818a61347e565b600086886125ff9190615074565b905061260c8a8a83612ffb565b505050505050506126c4565b612623838383612ffb565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126c35761265e6110d2565b600a61266a91906151db565b60646126769190614e8f565b8110156126b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126af90615272565b60405180910390fd5b6126c283826138c1565b5b5b505050565b6126d1611f89565b73ffffffffffffffffffffffffffffffffffffffff166126ef61146b565b73ffffffffffffffffffffffffffffffffffffffff161461274e57612712611f89565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612745919061493f565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ad9190615314565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691503073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1610156129335781935080925061293a565b8093508192505b50509091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129b25760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016129a9919061493f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a245760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612a1b919061493f565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015612b11578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b089190614794565b60405180910390a35b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160315612ff657600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d2e57600073ffffffffffffffffffffffffffffffffffffffff16600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015612c925750612c776110d2565b600a612c8391906151db565b6002612c8f9190614e8f565b81145b15612d2d576001600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ff557600073ffffffffffffffffffffffffffffffffffffffff16600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015612e765750612e5b6110d2565b600a612e6791906151db565b6001612e739190614e8f565b81145b15612ff45781600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f1033b06c3baa4b2b6f6591b9c724d57a287e0f0168e3919ebe34ceffbc2e3a5a60405160405180910390a35b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361306d5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401613064919061493f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130df5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016130d6919061493f565b60405180910390fd5b6130ea838383613c81565b505050565b60006130f9613ea6565b905080601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146131cb576000601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6a0c685fa11e01ec6f00000082601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132229190614fd4565b1115613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a906153b3565b60405180910390fd5b81601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132b29190614fd4565b92505081905550505050565b6000601380549050905060008114806132d75750600083145b156132e2575061339a565b600081846132f09190614f00565b90506000828561330091906153d3565b905060005b8381101561339557600083905060018561331f9190615074565b82036133345782816133319190614fd4565b90505b600081111561338757613386866013848154811061335557613354614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b508080600101915050613305565b505050505b5050565b6000601580549050905060008114806133b75750600083145b156133c2575061347a565b600081846133d09190614f00565b9050600082856133e091906153d3565b905060005b838110156134755760008390506001856133ff9190615074565b82036134145782816134119190614fd4565b90505b600081111561346757613466866015848154811061343557613434614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b5080806001019150506133e5565b505050505b5050565b6000601180549050905060008114806134975750600083145b156134a257506136ef565b60006032905060006019549050600082826134bd9190614fd4565b9050838111156134cb578390505b6000808390505b828110156135725760176000601183815481106134f2576134f1614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826135639190614fd4565b915080806001019150506134d2565b506000810361359757848261358791906153d3565b60198190555050505050506136ef565b6000808490505b838110156136d557600060176000601184815481106135c0576135bf614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084828c6136379190614e8f565b6136419190614f00565b90506001866136509190615074565b830361366557838b6136629190615074565b90505b60008111156136c6576136b78a6011858154811061368657613685614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b80846136c39190614fd4565b93505b5050808060010191505061359e565b5085836136e291906153d3565b6019819055505050505050505b5050565b6000806136fe612816565b5090506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401613780919061493f565b602060405180830381865afa15801561379d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c19190615419565b90508181116138b5576000846137f8600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611226565b6138029190615074565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561386f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138939190615419565b8661389e9190614e8f565b6138a89190614f00565b90508093505050506138bc565b6000925050505b919050565b6000601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414613bf55762015180601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139569190614fd4565b421015613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398f906154b8565b60405180910390fd5b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115613bf3576000613a12600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611226565b90506000613a1e6110d2565b600a613a2a91906151db565b624c4b40613a389190614e8f565b905080821115613be55760006103e8600f85613a549190614e8f565b613a5e9190614f00565b9050613a8d600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168783612ffb565b60006103e8600286613a9f9190614e8f565b613aa99190614f00565b9050613aec600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673a17313b81ad11e002753a1de01ea0133818325f183612ffb565b60006103e8601487613afe9190614e8f565b613b089190614f00565b9050613b3681600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613ebc565b60006103e8600f88613b489190614e8f565b613b529190614f00565b9050613b5e8982614186565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613bc857600080fd5b505af1158015613bdc573d6000803e3d6000fd5b50505050505050505b613bf0308685612ffb565b50505b505b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613cd3578060026000828254613cc79190614fd4565b92505081905550613da6565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613d5f578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401613d5693929190614f31565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613def5780600260008282540392505081905550613e3c565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613e999190614794565b60405180910390a3505050565b60006201518042613eb79190614f00565b905090565b6000601580549050905060006013805490509050600060118054905090506000603290506000601a54905060008282613ef59190614fd4565b905083811115613f03578390505b60008282613f119190615074565b90506000818789613f229190614fd4565b613f2c9190614fd4565b90506000811480613f3d575060008a145b15613f4f575050505050505050614182565b6000818b613f5d9190614f00565b905060008282613f6d9190614e8f565b8c613f789190615074565b90506000805b8b81101561401c576000849050600186613f989190615074565b8303613fad578381613faa9190614fd4565b90505b600081111561400057613fff8e60158481548110613fce57613fcd614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b828061400b906154d8565b935050508080600101915050613f7e565b5060005b8a8110156140be57600084905060018661403a9190615074565b830361404f57838161404c9190614fd4565b90505b60008111156140a2576140a18e601384815481106140705761406f614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b82806140ad906154d8565b935050508080600101915050614020565b5060008790505b868110156141635760008490506001866140df9190615074565b83036140f45783816140f19190614fd4565b90505b6000811115614147576141468e6011848154811061411557614114614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b8280614152906154d8565b9350505080806001019150506140c5565b50888661417091906153d3565b601a8190555050505050505050505050505b5050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006141f46110d2565b600a61420091906151db565b606461420c9190614e8f565b9050600060405180610260016040528060148152602001600f8152602001600a8152602001600a8152602001600a815260200160048152602001600481526020016004815260200160048152602001600481526020016004815260200160048152602001600481526020016001815260200160018152602001600181526020016001815260200160018152602001600181525090506000805b6013811080156142e25750600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b156146dd5760008382601381106142fc576142fb614dc5565b5b6020020151905060008083036143565785601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410159050614607565b600183036143f7576002601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050101580156143f0575085601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b9050614606565b60028310158015614409575060048311155b156144a7576003601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050101580156144a0575085601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b9050614605565b600583101580156144b95750600c8311155b15614557576005601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010158015614550575085601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b9050614604565b600d8310158015614569575060128311155b15614603576005601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010158015614600575085601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b90505b5b5b5b5b80156146665760006064838a61461d9190614e8f565b6146279190614f00565b9050614656600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168983612ffb565b80856146629190614fd4565b9450505b600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169650505080806146d5906154d8565b9150506142a5565b50505050505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061471b826146f0565b9050919050565b61472b81614710565b811461473657600080fd5b50565b60008135905061474881614722565b92915050565b600060208284031215614764576147636146e6565b5b600061477284828501614739565b91505092915050565b6000819050919050565b61478e8161477b565b82525050565b60006020820190506147a96000830184614785565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147e95780820151818401526020810190506147ce565b60008484015250505050565b6000601f19601f8301169050919050565b6000614811826147af565b61481b81856147ba565b935061482b8185602086016147cb565b614834816147f5565b840191505092915050565b600060208201905081810360008301526148598184614806565b905092915050565b61486a8161477b565b811461487557600080fd5b50565b60008135905061488781614861565b92915050565b600080604083850312156148a4576148a36146e6565b5b60006148b285828601614739565b92505060206148c385828601614878565b9150509250929050565b60008115159050919050565b6148e2816148cd565b82525050565b60006020820190506148fd60008301846148d9565b92915050565b600060208284031215614919576149186146e6565b5b600061492784828501614878565b91505092915050565b61493981614710565b82525050565b60006020820190506149546000830184614930565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261497f5761497e61495a565b5b8235905067ffffffffffffffff81111561499c5761499b61495f565b5b6020830191508360208202830111156149b8576149b7614964565b5b9250929050565b600080602083850312156149d6576149d56146e6565b5b600083013567ffffffffffffffff8111156149f4576149f36146eb565b5b614a0085828601614969565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a4181614710565b82525050565b6000614a538383614a38565b60208301905092915050565b6000602082019050919050565b6000614a7782614a0c565b614a818185614a17565b9350614a8c83614a28565b8060005b83811015614abd578151614aa48882614a47565b9750614aaf83614a5f565b925050600181019050614a90565b5085935050505092915050565b60006020820190508181036000830152614ae48184614a6c565b905092915050565b600080600060608486031215614b0557614b046146e6565b5b6000614b1386828701614739565b9350506020614b2486828701614739565b9250506040614b3586828701614878565b9150509250925092565b600060ff82169050919050565b614b5581614b3f565b82525050565b6000602082019050614b706000830184614b4c565b92915050565b60008083601f840112614b8c57614b8b61495a565b5b8235905067ffffffffffffffff811115614ba957614ba861495f565b5b602083019150836020820283011115614bc557614bc4614964565b5b9250929050565b60008060008060408587031215614be657614be56146e6565b5b600085013567ffffffffffffffff811115614c0457614c036146eb565b5b614c1087828801614969565b9450945050602085013567ffffffffffffffff811115614c3357614c326146eb565b5b614c3f87828801614b76565b925092505092959194509250565b614c56816148cd565b8114614c6157600080fd5b50565b600081359050614c7381614c4d565b92915050565b60008060408385031215614c9057614c8f6146e6565b5b6000614c9e85828601614739565b9250506020614caf85828601614c64565b9150509250929050565b60008060408385031215614cd057614ccf6146e6565b5b6000614cde85828601614739565b9250506020614cef85828601614739565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d4057607f821691505b602082108103614d5357614d52614cf9565b5b50919050565b7f4e6f74204f70657261746f720000000000000000000000000000000000000000600082015250565b6000614d8f600c836147ba565b9150614d9a82614d59565b602082019050919050565b60006020820190508181036000830152614dbe81614d82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b6000614e2a600f836147ba565b9150614e3582614df4565b602082019050919050565b60006020820190508181036000830152614e5981614e1d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e9a8261477b565b9150614ea58361477b565b9250828202614eb38161477b565b91508282048414831517614eca57614ec9614e60565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f0b8261477b565b9150614f168361477b565b925082614f2657614f25614ed1565b5b828204905092915050565b6000606082019050614f466000830186614930565b614f536020830185614785565b614f606040830184614785565b949350505050565b7f54726164696e67206e6f74207374617274656400000000000000000000000000600082015250565b6000614f9e6013836147ba565b9150614fa982614f68565b602082019050919050565b60006020820190508181036000830152614fcd81614f91565b9050919050565b6000614fdf8261477b565b9150614fea8361477b565b925082820190508082111561500257615001614e60565b5b92915050565b7f4578636565647320626c6f636b207472616465206c696d697400000000000000600082015250565b600061503e6019836147ba565b915061504982615008565b602082019050919050565b6000602082019050818103600083015261506d81615031565b9050919050565b600061507f8261477b565b915061508a8361477b565b92508282039050818111156150a2576150a1614e60565b5b92915050565b60008160011c9050919050565b6000808291508390505b60018511156150ff578086048111156150db576150da614e60565b5b60018516156150ea5780820291505b80810290506150f8856150a8565b94506150bf565b94509492505050565b60008261511857600190506151d4565b8161512657600090506151d4565b816001811461513c576002811461514657615175565b60019150506151d4565b60ff84111561515857615157614e60565b5b8360020a91508482111561516f5761516e614e60565b5b506151d4565b5060208310610133831016604e8410600b84101617156151aa5782820a9050838111156151a5576151a4614e60565b5b6151d4565b6151b784848460016150b5565b925090508184048111156151ce576151cd614e60565b5b81810290505b9392505050565b60006151e68261477b565b91506151f183614b3f565b925061521e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615108565b905092915050565b7f4d696e696d756d206465706f7369742069732031303020746f6b656e73000000600082015250565b600061525c601d836147ba565b915061526782615226565b602082019050919050565b6000602082019050818103600083015261528b8161524f565b9050919050565b60006dffffffffffffffffffffffffffff82169050919050565b6152b581615292565b81146152c057600080fd5b50565b6000815190506152d2816152ac565b92915050565b600063ffffffff82169050919050565b6152f1816152d8565b81146152fc57600080fd5b50565b60008151905061530e816152e8565b92915050565b60008060006060848603121561532d5761532c6146e6565b5b600061533b868287016152c3565b935050602061534c868287016152c3565b925050604061535d868287016152ff565b9150509250925092565b7f45786365656473206461696c79207472616465206c696d697400000000000000600082015250565b600061539d6019836147ba565b91506153a882615367565b602082019050919050565b600060208201905081810360008301526153cc81615390565b9050919050565b60006153de8261477b565b91506153e98361477b565b9250826153f9576153f8614ed1565b5b828206905092915050565b60008151905061541381614861565b92915050565b60006020828403121561542f5761542e6146e6565b5b600061543d84828501615404565b91505092915050565b7f596f752063616e206f6e6c79206465706f736974206f6e63652065766572792060008201527f323420686f757273000000000000000000000000000000000000000000000000602082015250565b60006154a26028836147ba565b91506154ad82615446565b604082019050919050565b600060208201905081810360008301526154d181615495565b9050919050565b60006154e38261477b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361551557615514614e60565b5b60018201905091905056fea2646970667358221220ca40c875819e6bc65f399a495998f0181180baff42eae881b270dc819b3068d864736f6c634300081a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103835760003560e01c8063850404a1116101de578063b67a31981161010f578063e0cca4c4116100ad578063f60ba3381161007c578063f60ba33814610b5c578063f61656e114610b78578063fccc281314610ba8578063ff920c7414610bc657610383565b8063e0cca4c414610ab0578063e697b5d814610ae0578063f2ef459e14610b10578063f2fde38b14610b4057610383565b8063d60bad0c116100e9578063d60bad0c14610a04578063da1f988814610a34578063dd62ed3e14610a64578063df8408fe14610a9457610383565b8063b67a31981461099c578063bcd14597146109b8578063cce23efa146109e857610383565b8063a6943bde1161017c578063abc275b011610156578063abc275b014610914578063b2f085a514610932578063b42568881461094e578063b46471d71461096c57610383565b8063a6943bde146108aa578063a9059cbb146108c6578063a958e6b0146108f657610383565b8063902d55a5116101b8578063902d55a51461082057806395d89b411461083e57806395ddbe891461085c578063a14f29dd1461087a57610383565b8063850404a1146107a257806389e750ec146107d25780638da5cb5b1461080257610383565b80633a9aea6d116102b85780636f096da31161025657806373a210851161023057806373a21085146106f6578063767fe0b2146107265780637d0e81bf1461075657806384ad537f1461078657610383565b80636f096da31461068c57806370a08231146106bc578063715018a6146106ec57610383565b80634456eda2116102925780634456eda21461061457806353895a9f146106325780635560e53314610650578063665a11ca1461066e57610383565b80633a9aea6d146105a857806340a75ed2146105d857806341131da3146105f657610383565b80631fac8430116103255780632552317c116102ff5780632552317c1461051e5780632c0fb38e1461053c5780632f0e3e711461056c578063313ce5671461058a57610383565b80631fac84301461048e57806323b872dd146104be57806324acbd69146104ee57610383565b80630c173335116103615780630c173335146104065780630f9f17301461043657806318160ddd146104525780631f087eee1461047057610383565b8063025277531461038857806306fdde03146103b8578063095ea7b3146103d6575b600080fd5b6103a2600480360381019061039d919061474e565b610be4565b6040516103af9190614794565b60405180910390f35b6103c0610bfc565b6040516103cd919061483f565b60405180910390f35b6103f060048036038101906103eb919061488d565b610c8e565b6040516103fd91906148e8565b60405180910390f35b610420600480360381019061041b9190614903565b610cb1565b60405161042d919061493f565b60405180910390f35b610450600480360381019061044b91906149bf565b610cf0565b005b61045a610f22565b6040516104679190614794565b60405180910390f35b610478610f2c565b6040516104859190614aca565b60405180910390f35b6104a860048036038101906104a3919061474e565b610fba565b6040516104b59190614794565b60405180910390f35b6104d860048036038101906104d39190614aec565b611003565b6040516104e591906148e8565b60405180910390f35b6105086004803603810190610503919061474e565b611032565b6040516105159190614794565b60405180910390f35b61052661107e565b6040516105339190614794565b60405180910390f35b61055660048036038101906105519190614903565b611084565b604051610563919061493f565b60405180910390f35b6105746110c3565b6040516105819190614794565b60405180910390f35b6105926110d2565b60405161059f9190614b5b565b60405180910390f35b6105c260048036038101906105bd9190614903565b6110db565b6040516105cf919061493f565b60405180910390f35b6105e061111a565b6040516105ed9190614794565b60405180910390f35b6105fe611120565b60405161060b9190614aca565b60405180910390f35b61061c6111ae565b604051610629919061493f565b60405180910390f35b61063a6111d4565b6040516106479190614794565b60405180910390f35b6106586111da565b6040516106659190614794565b60405180910390f35b6106766111e0565b604051610683919061493f565b60405180910390f35b6106a660048036038101906106a1919061474e565b611206565b6040516106b391906148e8565b60405180910390f35b6106d660048036038101906106d1919061474e565b611226565b6040516106e39190614794565b60405180910390f35b6106f461126e565b005b610710600480360381019061070b919061474e565b611282565b60405161071d91906148e8565b60405180910390f35b610740600480360381019061073b919061474e565b6112d8565b60405161074d91906148e8565b60405180910390f35b610770600480360381019061076b919061474e565b6112f8565b60405161077d91906148e8565b60405180910390f35b6107a0600480360381019061079b9190614bcc565b611318565b005b6107bc60048036038101906107b7919061474e565b61140e565b6040516107c99190614794565b60405180910390f35b6107ec60048036038101906107e79190614903565b611426565b6040516107f99190614794565b60405180910390f35b61080a61146b565b604051610817919061493f565b60405180910390f35b610828611495565b6040516108359190614794565b60405180910390f35b6108466114b9565b604051610853919061483f565b60405180910390f35b61086461154b565b604051610871919061493f565b60405180910390f35b610894600480360381019061088f919061474e565b611575565b6040516108a19190614794565b60405180910390f35b6108c460048036038101906108bf9190614c79565b61158d565b005b6108e060048036038101906108db919061488d565b611678565b6040516108ed91906148e8565b60405180910390f35b6108fe61169b565b60405161090b9190614794565b60405180910390f35b61091c6116aa565b6040516109299190614aca565b60405180910390f35b61094c600480360381019061094791906149bf565b611738565b005b61095661196a565b6040516109639190614794565b60405180910390f35b6109866004803603810190610981919061474e565b611970565b6040516109939190614794565b60405180910390f35b6109b660048036038101906109b191906149bf565b6119b9565b005b6109d260048036038101906109cd919061474e565b611beb565b6040516109df9190614794565b60405180910390f35b610a0260048036038101906109fd919061488d565b611c03565b005b610a1e6004803603810190610a19919061474e565b611c53565b604051610a2b9190614794565b60405180910390f35b610a4e6004803603810190610a49919061474e565b611c6b565b604051610a5b919061493f565b60405180910390f35b610a7e6004803603810190610a799190614cb9565b611c9e565b604051610a8b9190614794565b60405180910390f35b610aae6004803603810190610aa99190614c79565b611d25565b005b610aca6004803603810190610ac5919061474e565b611e10565b604051610ad791906148e8565b60405180910390f35b610afa6004803603810190610af5919061488d565b611e30565b604051610b07919061493f565b60405180910390f35b610b2a6004803603810190610b259190614cb9565b611e7e565b604051610b3791906148e8565b60405180910390f35b610b5a6004803603810190610b55919061474e565b611ead565b005b610b766004803603810190610b719190614903565b611f33565b005b610b926004803603810190610b8d919061474e565b611f45565b604051610b9f9190614794565b60405180910390f35b610bb0611f5d565b604051610bbd919061493f565b60405180910390f35b610bce611f63565b604051610bdb919061493f565b60405180910390f35b60186020528060005260406000206000915090505481565b606060038054610c0b90614d28565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3790614d28565b8015610c845780601f10610c5957610100808354040283529160200191610c84565b820191906000526020600020905b815481529060010190602001808311610c6757829003601f168201915b5050505050905090565b600080610c99611f89565b9050610ca6818585611f91565b600191505092915050565b60158181548110610cc157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790614da5565b60405180910390fd5b60005b82829050811015610f1d5760126000848484818110610da557610da4614dc5565b5b9050602002016020810190610dba919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f10576011838383818110610e1b57610e1a614dc5565b5b9050602002016020810190610e30919061474e565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160126000858585818110610ea957610ea8614dc5565b5b9050602002016020810190610ebe919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080600101915050610d83565b505050565b6000600254905090565b60606015805480602002602001604051908101604052809291908181526020018280548015610fb057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f66575b5050505050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008061100e611f89565b905061101b858285611fa3565b611026858585612038565b60019150509392505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b601c5481565b6013818154811061109457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6a06342fd08f00f63780000081565b60006012905090565b601181815481106110eb57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60195481565b606060118054806020026020016040519081016040528092919081815260200182805480156111a457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161115a575b5050505050905090565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601b5481565b601a5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112766126c9565b6112806000612750565b565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60126020528060005260406000206000915054906101000a900460ff1681565b60146020528060005260406000206000915054906101000a900460ff1681565b6113206126c9565b818190508484905014611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90614e40565b60405180910390fd5b60005b848490508110156114075782828281811061138957611388614dc5565b5b90506020020135600c60008787858181106113a7576113a6614dc5565b5b90506020020160208101906113bc919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808060010191505061136b565b5050505050565b601d6020528060005260406000206000915090505481565b6000806000611433612816565b915091506000810361144a57600092505050611466565b8082856114579190614e8f565b6114619190614f00565b925050505b919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000adb53acfa41aee1200000081565b6060600480546114c890614d28565b80601f01602080910402602001604051908101604052809291908181526020018280546114f490614d28565b80156115415780601f1061151657610100808354040283529160200191611541565b820191906000526020600020905b81548152906001019060200180831161152457829003601f168201915b5050505050905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d6020528060005260406000206000915090505481565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490614da5565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080611683611f89565b9050611690818585612038565b600191505092915050565b6a0c685fa11e01ec6f00000081565b6060601380548060200260200160405190810160405280929190818152602001828054801561172e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116e4575b5050505050905090565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614da5565b60405180910390fd5b60005b8282905081101561196557601460008484848181106117ed576117ec614dc5565b5b9050602002016020810190611802919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661195857601383838381811061186357611862614dc5565b5b9050602002016020810190611878919061474e565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601460008585858181106118f1576118f0614dc5565b5b9050602002016020810190611906919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80806001019150506117cb565b505050565b600b5481565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090614da5565b60405180910390fd5b60005b82829050811015611be65760166000848484818110611a6e57611a6d614dc5565b5b9050602002016020810190611a83919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bd9576015838383818110611ae457611ae3614dc5565b5b9050602002016020810190611af9919061474e565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160166000858585818110611b7257611b71614dc5565b5b9050602002016020810190611b87919061474e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080600101915050611a4c565b505050565b60176020528060005260406000206000915090505481565b611c0b6126c9565b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600c6020528060005260406000206000915090505481565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614da5565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60166020528060005260406000206000915054906101000a900460ff1681565b60106020528160005260406000208181548110611e4c57600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b611eb56126c9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f275760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611f1e919061493f565b60405180910390fd5b611f3081612750565b50565b611f3b6126c9565b80600b8190555050565b601e6020528060005260406000206000915090505481565b61dead81565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b611f9e8383836001612940565b505050565b6000611faf8484611c9e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156120325781811015612022578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161201993929190614f31565b60405180910390fd5b61203184848484036000612940565b5b50505050565b601c544314612051576000601b8190555043601c819055505b61205c838383612b17565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806120fd5750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156121125761210d838383612ffb565b6126c4565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806121bb5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561227a57600b54421015612205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fc90614fb4565b60405180910390fd5b6a06342fd08f00f63780000081601b5461221f9190614fd4565b1115612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790615054565b60405180910390fd5b80601b60008282546122729190614fd4565b925050819055505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361249a576122d982826130ef565b600060646003836122ea9190614e8f565b6122f49190614f00565b905060006064600a836123079190614e8f565b6123119190614f00565b905061231d81866132be565b60006064600a8461232e9190614e8f565b6123389190614f00565b9050612344818761339e565b60006064600a856123559190614e8f565b61235f9190614f00565b90506123808773a17313b81ad11e002753a1de01ea0133818325f183612ffb565b60006064600a866123919190614e8f565b61239b9190614f00565b90506123aa8861dead83612ffb565b60006064603c876123bb9190614e8f565b6123c59190614f00565b90506123d1818a61347e565b600086886123df9190615074565b90506000806123ed836136f3565b905060008111156123fd57600191505b811561248157600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612467576124628c61dead85612ffb565b612473565b6124728c8c85612ffb565b5b5050505050505050506126c4565b61248c8c8c85612ffb565b5050505050505050506126c4565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612618576124f983826130ef565b6000606460088361250a9190614e8f565b6125149190614f00565b905060006064600a836125279190614e8f565b6125319190614f00565b905061253d81866132be565b60006064600a8461254e9190614e8f565b6125589190614f00565b9050612564818761339e565b60006064600a856125759190614e8f565b61257f9190614f00565b90506125a08773a17313b81ad11e002753a1de01ea0133818325f183612ffb565b60006064600a866125b19190614e8f565b6125bb9190614f00565b90506125ca8861dead83612ffb565b60006064603c876125db9190614e8f565b6125e59190614f00565b90506125f1818a61347e565b600086886125ff9190615074565b905061260c8a8a83612ffb565b505050505050506126c4565b612623838383612ffb565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126c35761265e6110d2565b600a61266a91906151db565b60646126769190614e8f565b8110156126b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126af90615272565b60405180910390fd5b6126c283826138c1565b5b5b505050565b6126d1611f89565b73ffffffffffffffffffffffffffffffffffffffff166126ef61146b565b73ffffffffffffffffffffffffffffffffffffffff161461274e57612712611f89565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612745919061493f565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ad9190615314565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691503073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1610156129335781935080925061293a565b8093508192505b50509091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129b25760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016129a9919061493f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a245760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612a1b919061493f565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015612b11578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b089190614794565b60405180910390a35b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160315612ff657600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d2e57600073ffffffffffffffffffffffffffffffffffffffff16600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015612c925750612c776110d2565b600a612c8391906151db565b6002612c8f9190614e8f565b81145b15612d2d576001600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ff557600073ffffffffffffffffffffffffffffffffffffffff16600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015612e765750612e5b6110d2565b600a612e6791906151db565b6001612e739190614e8f565b81145b15612ff45781600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f1033b06c3baa4b2b6f6591b9c724d57a287e0f0168e3919ebe34ceffbc2e3a5a60405160405180910390a35b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361306d5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401613064919061493f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130df5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016130d6919061493f565b60405180910390fd5b6130ea838383613c81565b505050565b60006130f9613ea6565b905080601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146131cb576000601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6a0c685fa11e01ec6f00000082601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132229190614fd4565b1115613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a906153b3565b60405180910390fd5b81601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132b29190614fd4565b92505081905550505050565b6000601380549050905060008114806132d75750600083145b156132e2575061339a565b600081846132f09190614f00565b90506000828561330091906153d3565b905060005b8381101561339557600083905060018561331f9190615074565b82036133345782816133319190614fd4565b90505b600081111561338757613386866013848154811061335557613354614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b508080600101915050613305565b505050505b5050565b6000601580549050905060008114806133b75750600083145b156133c2575061347a565b600081846133d09190614f00565b9050600082856133e091906153d3565b905060005b838110156134755760008390506001856133ff9190615074565b82036134145782816134119190614fd4565b90505b600081111561346757613466866015848154811061343557613434614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b5080806001019150506133e5565b505050505b5050565b6000601180549050905060008114806134975750600083145b156134a257506136ef565b60006032905060006019549050600082826134bd9190614fd4565b9050838111156134cb578390505b6000808390505b828110156135725760176000601183815481106134f2576134f1614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826135639190614fd4565b915080806001019150506134d2565b506000810361359757848261358791906153d3565b60198190555050505050506136ef565b6000808490505b838110156136d557600060176000601184815481106135c0576135bf614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084828c6136379190614e8f565b6136419190614f00565b90506001866136509190615074565b830361366557838b6136629190615074565b90505b60008111156136c6576136b78a6011858154811061368657613685614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b80846136c39190614fd4565b93505b5050808060010191505061359e565b5085836136e291906153d3565b6019819055505050505050505b5050565b6000806136fe612816565b5090506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401613780919061493f565b602060405180830381865afa15801561379d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c19190615419565b90508181116138b5576000846137f8600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611226565b6138029190615074565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561386f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138939190615419565b8661389e9190614e8f565b6138a89190614f00565b90508093505050506138bc565b6000925050505b919050565b6000601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414613bf55762015180601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139569190614fd4565b421015613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398f906154b8565b60405180910390fd5b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115613bf3576000613a12600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611226565b90506000613a1e6110d2565b600a613a2a91906151db565b624c4b40613a389190614e8f565b905080821115613be55760006103e8600f85613a549190614e8f565b613a5e9190614f00565b9050613a8d600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168783612ffb565b60006103e8600286613a9f9190614e8f565b613aa99190614f00565b9050613aec600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673a17313b81ad11e002753a1de01ea0133818325f183612ffb565b60006103e8601487613afe9190614e8f565b613b089190614f00565b9050613b3681600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613ebc565b60006103e8600f88613b489190614e8f565b613b529190614f00565b9050613b5e8982614186565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613bc857600080fd5b505af1158015613bdc573d6000803e3d6000fd5b50505050505050505b613bf0308685612ffb565b50505b505b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613cd3578060026000828254613cc79190614fd4565b92505081905550613da6565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613d5f578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401613d5693929190614f31565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613def5780600260008282540392505081905550613e3c565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613e999190614794565b60405180910390a3505050565b60006201518042613eb79190614f00565b905090565b6000601580549050905060006013805490509050600060118054905090506000603290506000601a54905060008282613ef59190614fd4565b905083811115613f03578390505b60008282613f119190615074565b90506000818789613f229190614fd4565b613f2c9190614fd4565b90506000811480613f3d575060008a145b15613f4f575050505050505050614182565b6000818b613f5d9190614f00565b905060008282613f6d9190614e8f565b8c613f789190615074565b90506000805b8b81101561401c576000849050600186613f989190615074565b8303613fad578381613faa9190614fd4565b90505b600081111561400057613fff8e60158481548110613fce57613fcd614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b828061400b906154d8565b935050508080600101915050613f7e565b5060005b8a8110156140be57600084905060018661403a9190615074565b830361404f57838161404c9190614fd4565b90505b60008111156140a2576140a18e601384815481106140705761406f614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b82806140ad906154d8565b935050508080600101915050614020565b5060008790505b868110156141635760008490506001866140df9190615074565b83036140f45783816140f19190614fd4565b90505b6000811115614147576141468e6011848154811061411557614114614dc5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612ffb565b5b8280614152906154d8565b9350505080806001019150506140c5565b50888661417091906153d3565b601a8190555050505050505050505050505b5050565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006141f46110d2565b600a61420091906151db565b606461420c9190614e8f565b9050600060405180610260016040528060148152602001600f8152602001600a8152602001600a8152602001600a815260200160048152602001600481526020016004815260200160048152602001600481526020016004815260200160048152602001600481526020016001815260200160018152602001600181526020016001815260200160018152602001600181525090506000805b6013811080156142e25750600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b156146dd5760008382601381106142fc576142fb614dc5565b5b6020020151905060008083036143565785601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410159050614607565b600183036143f7576002601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050101580156143f0575085601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b9050614606565b60028310158015614409575060048311155b156144a7576003601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050101580156144a0575085601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b9050614605565b600583101580156144b95750600c8311155b15614557576005601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010158015614550575085601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b9050614604565b600d8310158015614569575060128311155b15614603576005601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010158015614600575085601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b90505b5b5b5b5b80156146665760006064838a61461d9190614e8f565b6146279190614f00565b9050614656600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168983612ffb565b80856146629190614fd4565b9450505b600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169650505080806146d5906154d8565b9150506142a5565b50505050505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061471b826146f0565b9050919050565b61472b81614710565b811461473657600080fd5b50565b60008135905061474881614722565b92915050565b600060208284031215614764576147636146e6565b5b600061477284828501614739565b91505092915050565b6000819050919050565b61478e8161477b565b82525050565b60006020820190506147a96000830184614785565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147e95780820151818401526020810190506147ce565b60008484015250505050565b6000601f19601f8301169050919050565b6000614811826147af565b61481b81856147ba565b935061482b8185602086016147cb565b614834816147f5565b840191505092915050565b600060208201905081810360008301526148598184614806565b905092915050565b61486a8161477b565b811461487557600080fd5b50565b60008135905061488781614861565b92915050565b600080604083850312156148a4576148a36146e6565b5b60006148b285828601614739565b92505060206148c385828601614878565b9150509250929050565b60008115159050919050565b6148e2816148cd565b82525050565b60006020820190506148fd60008301846148d9565b92915050565b600060208284031215614919576149186146e6565b5b600061492784828501614878565b91505092915050565b61493981614710565b82525050565b60006020820190506149546000830184614930565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261497f5761497e61495a565b5b8235905067ffffffffffffffff81111561499c5761499b61495f565b5b6020830191508360208202830111156149b8576149b7614964565b5b9250929050565b600080602083850312156149d6576149d56146e6565b5b600083013567ffffffffffffffff8111156149f4576149f36146eb565b5b614a0085828601614969565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a4181614710565b82525050565b6000614a538383614a38565b60208301905092915050565b6000602082019050919050565b6000614a7782614a0c565b614a818185614a17565b9350614a8c83614a28565b8060005b83811015614abd578151614aa48882614a47565b9750614aaf83614a5f565b925050600181019050614a90565b5085935050505092915050565b60006020820190508181036000830152614ae48184614a6c565b905092915050565b600080600060608486031215614b0557614b046146e6565b5b6000614b1386828701614739565b9350506020614b2486828701614739565b9250506040614b3586828701614878565b9150509250925092565b600060ff82169050919050565b614b5581614b3f565b82525050565b6000602082019050614b706000830184614b4c565b92915050565b60008083601f840112614b8c57614b8b61495a565b5b8235905067ffffffffffffffff811115614ba957614ba861495f565b5b602083019150836020820283011115614bc557614bc4614964565b5b9250929050565b60008060008060408587031215614be657614be56146e6565b5b600085013567ffffffffffffffff811115614c0457614c036146eb565b5b614c1087828801614969565b9450945050602085013567ffffffffffffffff811115614c3357614c326146eb565b5b614c3f87828801614b76565b925092505092959194509250565b614c56816148cd565b8114614c6157600080fd5b50565b600081359050614c7381614c4d565b92915050565b60008060408385031215614c9057614c8f6146e6565b5b6000614c9e85828601614739565b9250506020614caf85828601614c64565b9150509250929050565b60008060408385031215614cd057614ccf6146e6565b5b6000614cde85828601614739565b9250506020614cef85828601614739565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d4057607f821691505b602082108103614d5357614d52614cf9565b5b50919050565b7f4e6f74204f70657261746f720000000000000000000000000000000000000000600082015250565b6000614d8f600c836147ba565b9150614d9a82614d59565b602082019050919050565b60006020820190508181036000830152614dbe81614d82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b6000614e2a600f836147ba565b9150614e3582614df4565b602082019050919050565b60006020820190508181036000830152614e5981614e1d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e9a8261477b565b9150614ea58361477b565b9250828202614eb38161477b565b91508282048414831517614eca57614ec9614e60565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f0b8261477b565b9150614f168361477b565b925082614f2657614f25614ed1565b5b828204905092915050565b6000606082019050614f466000830186614930565b614f536020830185614785565b614f606040830184614785565b949350505050565b7f54726164696e67206e6f74207374617274656400000000000000000000000000600082015250565b6000614f9e6013836147ba565b9150614fa982614f68565b602082019050919050565b60006020820190508181036000830152614fcd81614f91565b9050919050565b6000614fdf8261477b565b9150614fea8361477b565b925082820190508082111561500257615001614e60565b5b92915050565b7f4578636565647320626c6f636b207472616465206c696d697400000000000000600082015250565b600061503e6019836147ba565b915061504982615008565b602082019050919050565b6000602082019050818103600083015261506d81615031565b9050919050565b600061507f8261477b565b915061508a8361477b565b92508282039050818111156150a2576150a1614e60565b5b92915050565b60008160011c9050919050565b6000808291508390505b60018511156150ff578086048111156150db576150da614e60565b5b60018516156150ea5780820291505b80810290506150f8856150a8565b94506150bf565b94509492505050565b60008261511857600190506151d4565b8161512657600090506151d4565b816001811461513c576002811461514657615175565b60019150506151d4565b60ff84111561515857615157614e60565b5b8360020a91508482111561516f5761516e614e60565b5b506151d4565b5060208310610133831016604e8410600b84101617156151aa5782820a9050838111156151a5576151a4614e60565b5b6151d4565b6151b784848460016150b5565b925090508184048111156151ce576151cd614e60565b5b81810290505b9392505050565b60006151e68261477b565b91506151f183614b3f565b925061521e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615108565b905092915050565b7f4d696e696d756d206465706f7369742069732031303020746f6b656e73000000600082015250565b600061525c601d836147ba565b915061526782615226565b602082019050919050565b6000602082019050818103600083015261528b8161524f565b9050919050565b60006dffffffffffffffffffffffffffff82169050919050565b6152b581615292565b81146152c057600080fd5b50565b6000815190506152d2816152ac565b92915050565b600063ffffffff82169050919050565b6152f1816152d8565b81146152fc57600080fd5b50565b60008151905061530e816152e8565b92915050565b60008060006060848603121561532d5761532c6146e6565b5b600061533b868287016152c3565b935050602061534c868287016152c3565b925050604061535d868287016152ff565b9150509250925092565b7f45786365656473206461696c79207472616465206c696d697400000000000000600082015250565b600061539d6019836147ba565b91506153a882615367565b602082019050919050565b600060208201905081810360008301526153cc81615390565b9050919050565b60006153de8261477b565b91506153e98361477b565b9250826153f9576153f8614ed1565b5b828206905092915050565b60008151905061541381614861565b92915050565b60006020828403121561542f5761542e6146e6565b5b600061543d84828501615404565b91505092915050565b7f596f752063616e206f6e6c79206465706f736974206f6e63652065766572792060008201527f323420686f757273000000000000000000000000000000000000000000000000602082015250565b60006154a26028836147ba565b91506154ad82615446565b604082019050919050565b600060208201905081810360008301526154d181615495565b9050919050565b60006154e38261477b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361551557615514614e60565b5b60018201905091905056fea2646970667358221220ca40c875819e6bc65f399a495998f0181180baff42eae881b270dc819b3068d864736f6c634300081a0033
Deployed Bytecode Sourcemap
36361:21979:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37851:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13019:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15229:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37575:33;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55034:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14092:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57688:114;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40500:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16029:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53371:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38185:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37468:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38222:65;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13972:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37359:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37960:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57466:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38563:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38143:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38057:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36496:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36668:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14227:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24665:103;;;:::i;:::-;;58205:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37394:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37502:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40034:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38357:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40683:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23990:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36452:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13229:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57956:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36974:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57810:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14550:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38469:65;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57578:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56040:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36837:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57329:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57007:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37730:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39902:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36917:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37065:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14768:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58063:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37615:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37283:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37115:66;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24923:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40367:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38415:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36726:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36531:71;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37851:50;;;;;;;;;;;;;;;;;:::o;13019:91::-;13064:13;13097:5;13090:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13019:91;:::o;15229:190::-;15302:4;15319:13;15335:12;:10;:12::i;:::-;15319:28;;15358:31;15367:5;15374:7;15383:5;15358:8;:31::i;:::-;15407:4;15400:11;;;15229:190;;;;:::o;37575:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55034:294::-;39406:10;;;;;;;;;;;39392:24;;:10;:24;;;39384:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;55122:6:::1;55117:204;55138:5;;:12;;55134:1;:16;55117:204;;;55177:12;:22;55190:5;;55196:1;55190:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55177:22;;;;;;;;;;;;;;;;;;;;;;;;;55172:138;;55220:11;55237:5;;55243:1;55237:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55220:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55290:4;55265:12;:22;55278:5;;55284:1;55278:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55265:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55172:138;55152:3;;;;;;;55117:204;;;;55034:294:::0;;:::o;14092:99::-;14144:7;14171:12;;14164:19;;14092:99;:::o;57688:114::-;57742:16;57778;57771:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57688:114;:::o;40500:123::-;40566:7;40593:16;:22;40610:4;40593:22;;;;;;;;;;;;;;;;40586:29;;40500:123;;;:::o;16029:249::-;16116:4;16133:15;16151:12;:10;:12::i;:::-;16133:30;;16174:37;16190:4;16196:7;16205:5;16174:15;:37::i;:::-;16222:26;16232:4;16238:2;16242:5;16222:9;:26::i;:::-;16266:4;16259:11;;;16029:249;;;;;:::o;53371:120::-;53434:7;53461:9;:15;53471:4;53461:15;;;;;;;;;;;;;;;:22;;;;53454:29;;53371:120;;;:::o;38185:30::-;;;;:::o;37468:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38222:65::-;38267:20;38222:65;:::o;13972:84::-;14021:5;14046:2;14039:9;;13972:84;:::o;37359:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37960:38::-;;;;:::o;57466:104::-;57515:16;57551:11;57544:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57466:104;:::o;38563:70::-;;;;;;;;;;;;;:::o;38143:35::-;;;;:::o;38057:39::-;;;;:::o;36496:28::-;;;;;;;;;;;;;:::o;36668:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;14227:118::-;14292:7;14319:9;:18;14329:7;14319:18;;;;;;;;;;;;;;;;14312:25;;14227:118;;;:::o;24665:103::-;23876:13;:11;:13::i;:::-;24730:30:::1;24757:1;24730:18;:30::i;:::-;24665:103::o:0;58205:132::-;58279:4;58303:17;:26;58321:7;58303:26;;;;;;;;;;;;;;;;;;;;;;;;;58296:33;;58205:132;;;:::o;37394:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;37502:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;40034:298::-;23876:13;:11;:13::i;:::-;40174:6:::1;;:13;;40158:5;;:12;;:29;40150:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40223:9;40218:107;40242:5;;:12;;40238:1;:16;40218:107;;;40304:6;;40311:1;40304:9;;;;;;;:::i;:::-;;;;;;;;40276:15;:25;40292:5;;40298:1;40292:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;40276:25;;;;;;;;;;;;;;;:37;;;;40256:3;;;;;;;40218:107;;;;40034:298:::0;;;;:::o;38357:51::-;;;;;;;;;;;;;;;;;:::o;40683:226::-;40750:7;40771:14;40787:13;40804:14;:12;:14::i;:::-;40770:48;;;;40842:1;40833:5;:10;40829:24;;40852:1;40845:8;;;;;;40829:24;40896:5;40886:6;40872:11;:20;;;;:::i;:::-;40871:30;;;;:::i;:::-;40864:37;;;;40683:226;;;;:::o;23990:87::-;24036:7;24063:6;;;;;;;;;;;24056:13;;23990:87;:::o;36452:37::-;;;:::o;13229:95::-;13276:13;13309:7;13302:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13229:95;:::o;57956:99::-;58007:7;58034:13;;;;;;;;;;;58027:20;;57956:99;:::o;36974:51::-;;;;;;;;;;;;;;;;;:::o;57810:138::-;39406:10;;;;;;;;;;;39392:24;;:10;:24;;;39384:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;57931:9:::1;57903:19;:25;57923:4;57903:25;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;57810:138:::0;;:::o;14550:182::-;14619:4;14636:13;14652:12;:10;:12::i;:::-;14636:28;;14675:27;14685:5;14692:2;14696:5;14675:9;:27::i;:::-;14720:4;14713:11;;;14550:182;;;;:::o;38469:65::-;38513:21;38469:65;:::o;57578:102::-;57626:16;57662:10;57655:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57578:102;:::o;56040:290::-;39406:10;;;;;;;;;;;39392:24;;:10;:24;;;39384:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;56127:6:::1;56122:201;56143:5;;:12;;56139:1;:16;56122:201;;;56182:11;:21;56194:5;;56200:1;56194:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56182:21;;;;;;;;;;;;;;;;;;;;;;;;;56177:135;;56224:10;56240:5;;56246:1;56240:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56224:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56292:4;56268:11;:21;56280:5;;56286:1;56280:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56268:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;56177:135;56157:3;;;;;;;56122:201;;;;56040:290:::0;;:::o;36837:23::-;;;;:::o;57329:129::-;57398:7;57425:19;:25;57445:4;57425:25;;;;;;;;;;;;;;;;57418:32;;57329:129;;;:::o;57007:314::-;39406:10;;;;;;;;;;;39392:24;;:10;:24;;;39384:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;57100:6:::1;57095:219;57116:5;;:12;;57112:1;:16;57095:219;;;57155:17;:27;57173:5;;57179:1;57173:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57155:27;;;;;;;;;;;;;;;;;;;;;;;;;57150:153;;57203:16;57225:5;;57231:1;57225:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57203:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57283:4;57253:17;:27;57271:5;;57277:1;57271:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57253:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;57150:153;57130:3;;;;;;;57095:219;;;;57007:314:::0;;:::o;37730:54::-;;;;;;;;;;;;;;;;;:::o;39902:124::-;23876:13;:11;:13::i;:::-;40013:5:::1;39989:15;:21;40005:4;39989:21;;;;;;;;;;;;;;;:29;;;;39902:124:::0;;:::o;36917:50::-;;;;;;;;;;;;;;;;;:::o;37065:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;14768:142::-;14848:7;14875:11;:18;14887:5;14875:18;;;;;;;;;;;;;;;:27;14894:7;14875:27;;;;;;;;;;;;;;;;14868:34;;14768:142;;;;:::o;58063:134::-;39406:10;;;;;;;;;;;39392:24;;:10;:24;;;39384:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;58181:8:::1;58152:17;:26;58170:7;58152:26;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;58063:134:::0;;:::o;37615:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;37283:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37115:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24923:220::-;23876:13;:11;:13::i;:::-;25028:1:::1;25008:22;;:8;:22;;::::0;25004:93:::1;;25082:1;25054:31;;;;;;;;;;;:::i;:::-;;;;;;;;25004:93;25107:28;25126:8;25107:18;:28::i;:::-;24923:220:::0;:::o;40367:98::-;23876:13;:11;:13::i;:::-;40448:9:::1;40437:8;:20;;;;40367:98:::0;:::o;38415:47::-;;;;;;;;;;;;;;;;;:::o;36726:81::-;36765:42;36726:81;:::o;36531:71::-;;;;;;;;;;;;;:::o;4338:98::-;4391:7;4418:10;4411:17;;4338:98;:::o;20095:130::-;20180:37;20189:5;20196:7;20205:5;20212:4;20180:8;:37::i;:::-;20095:130;;;:::o;21827:486::-;21927:24;21954:25;21964:5;21971:7;21954:9;:25::i;:::-;21927:52;;22013:17;21994:16;:36;21990:316;;;22070:5;22051:16;:24;22047:132;;;22130:7;22139:16;22157:5;22103:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;22047:132;22222:57;22231:5;22238:7;22266:5;22247:16;:24;22273:5;22222:8;:57::i;:::-;21990:316;21916:397;21827:486;;;:::o;41751:4981::-;41902:15;;41886:12;:31;41882:133;;41957:1;41934:20;:24;;;;41991:12;41973:15;:30;;;;41882:133;42061:38;42075:4;42081:9;42092:6;42061:13;:38::i;:::-;42138:17;:23;42156:4;42138:23;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;;42165:17;:28;42183:9;42165:28;;;;;;;;;;;;;;;;;;;;;;;;;42138:55;42134:149;;;42210:40;42226:4;42232:9;42243:6;42210:15;:40::i;:::-;42265:7;;42134:149;42341:13;;;;;;;;;;;42333:21;;:4;:21;;;:51;;;;42371:13;;;;;;;;;;;42358:26;;:9;:26;;;42333:51;42329:365;;;42457:8;;42438:15;:27;;42430:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;38267:20;42579:6;42556:20;;:29;;;;:::i;:::-;:51;;42548:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;42676:6;42652:20;;:30;;;;;;;:::i;:::-;;;;;;;;42329:365;42764:13;;;;;;;;;;;42756:21;;:4;:21;;;42752:2384;;42831:41;42854:9;42865:6;42831:22;:41::i;:::-;42920:17;42953:3;42949:1;42940:6;:10;;;;:::i;:::-;:16;;;;:::i;:::-;42920:36;;43015:19;43054:3;43049:2;43037:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;43015:42;;43072:41;43095:11;43108:4;43072:22;:41::i;:::-;43194:19;43233:3;43228:2;43216:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;43194:42;;43251:47;43280:11;43293:4;43251:28;:47::i;:::-;43373:19;43412:3;43407:2;43395:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;43373:42;;43430:78;43446:4;43452:42;43496:11;43430:15;:78::i;:::-;43555:19;43594:3;43589:2;43577:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;43555:42;;43612:51;43628:4;43642:6;43651:11;43612:15;:51::i;:::-;43712:19;43751:3;43746:2;43734:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;43712:42;;43769:50;43801:11;43814:4;43769:31;:50::i;:::-;43869:23;43904:9;43895:6;:18;;;;:::i;:::-;43869:44;;43965:13;43993:25;44021:35;44040:15;44021:18;:35::i;:::-;43993:63;;44095:1;44075:17;:21;44071:77;;;44128:4;44117:15;;44071:77;44166:8;44162:302;;;44199:19;:30;44219:9;44199:30;;;;;;;;;;;;;;;;;;;;;;;;;44195:229;;;44254:52;44270:4;36765:42;44290:15;44254;:52::i;:::-;44195:229;;;44355:49;44371:4;44377:9;44388:15;44355;:49::i;:::-;44195:229;44442:7;;;;;;;;;;;44162:302;45054:49;45070:4;45076:9;45087:15;45054;:49::i;:::-;45118:7;;;;;;;;;;;42752:2384;45190:13;;;;;;;;;;;45177:26;;:9;:26;;;45173:1260;;45257:36;45280:4;45286:6;45257:22;:36::i;:::-;45341:17;45374:3;45370:1;45361:6;:10;;;;:::i;:::-;:16;;;;:::i;:::-;45341:36;;45436:19;45475:3;45470:2;45458:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;45436:42;;45493:41;45516:11;45529:4;45493:22;:41::i;:::-;45615:19;45654:3;45649:2;45637:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;45615:42;;45672:47;45701:11;45714:4;45672:28;:47::i;:::-;45794:19;45833:3;45828:2;45816:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;45794:42;;45851:78;45867:4;45873:42;45917:11;45851:15;:78::i;:::-;45976:19;46015:3;46010:2;45998:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;45976:42;;46033:51;46049:4;46063:6;46072:11;46033:15;:51::i;:::-;46133:19;46172:3;46167:2;46155:9;:14;;;;:::i;:::-;:20;;;;:::i;:::-;46133:42;;46190:50;46222:11;46235:4;46190:31;:50::i;:::-;46290:23;46325:9;46316:6;:18;;;;:::i;:::-;46290:44;;46351:49;46367:4;46373:9;46384:15;46351;:49::i;:::-;46415:7;;;;;;;;;45173:1260;46443:40;46459:4;46465:9;46476:6;46443:15;:40::i;:::-;46574:4;46553:26;;:9;:26;;;46549:176;;46626:10;:8;:10::i;:::-;46620:2;:16;;;;:::i;:::-;46614:3;:22;;;;:::i;:::-;46604:6;:32;;46596:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46685:28;46700:4;46706:6;46685:14;:28::i;:::-;46549:176;41751:4981;;;;:::o;24155:166::-;24226:12;:10;:12::i;:::-;24215:23;;:7;:5;:7::i;:::-;:23;;;24211:103;;24289:12;:10;:12::i;:::-;24262:40;;;;;;;;;;;:::i;:::-;;;;;;;;24211:103;24155:166::o;25303:191::-;25377:16;25396:6;;;;;;;;;;;25377:25;;25422:8;25413:6;;:17;;;;;;;;;;;;;;;;;;25477:8;25446:40;;25467:8;25446:40;;;;;;;;;;;;25366:128;25303:191;:::o;40942:342::-;40989:14;41005:13;41032:10;41044;41073:13;;;;;;;;;;;41060:39;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41031:70;;;;;;;;;41138:4;41116:27;;:11;;;;;;;;;;;:27;;;41112:165;;;41169:2;41160:11;;41194:2;41186:10;;41112:165;;;41238:2;41229:11;;41263:2;41255:10;;41112:165;41020:264;;40942:342;;:::o;21092:443::-;21222:1;21205:19;;:5;:19;;;21201:91;;21277:1;21248:32;;;;;;;;;;;:::i;:::-;;;;;;;;21201:91;21325:1;21306:21;;:7;:21;;;21302:92;;21379:1;21351:31;;;;;;;;;;;:::i;:::-;;;;;;;;21302:92;21434:5;21404:11;:18;21416:5;21404:18;;;;;;;;;;;;;;;:27;21423:7;21404:27;;;;;;;;;;;;;;;:35;;;;21454:9;21450:78;;;21501:7;21485:31;;21494:5;21485:31;;;21510:5;21485:31;;;;;;:::i;:::-;;;;;;;;21450:78;21092:443;;;;:::o;52717:619::-;52814:2;52806:10;;:4;:10;;;52802:23;52818:7;52802:23;52867:14;:20;52882:4;52867:20;;;;;;;;;;;;;;;:24;52888:2;52867:24;;;;;;;;;;;;;;;;;;;;;;;;;52862:189;;52936:1;52912:26;;:8;:12;52921:2;52912:12;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;:60;;;;;52962:10;:8;:10::i;:::-;52956:2;:16;;;;:::i;:::-;52952:1;:20;;;;:::i;:::-;52942:6;:30;52912:60;52908:132;;;53020:4;52993:14;:20;53008:4;52993:20;;;;;;;;;;;;;;;:24;53014:2;52993:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;52908:132;52862:189;53065:14;:18;53080:2;53065:18;;;;;;;;;;;;;;;:24;53084:4;53065:24;;;;;;;;;;;;;;;;;;;;;;;;;53061:268;;;53136:1;53110:28;;:8;:14;53119:4;53110:14;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;:62;;;;;53162:10;:8;:10::i;:::-;53156:2;:16;;;;:::i;:::-;53152:1;:20;;;;:::i;:::-;53142:6;:30;53110:62;53106:212;;;53210:2;53193:8;:14;53202:4;53193:14;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;;;;;;;53231:9;:13;53241:2;53231:13;;;;;;;;;;;;;;;53250:4;53231:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53299:2;53279:23;;53293:4;53279:23;;;;;;;;;;;;53106:212;53061:268;52717:619;;;;:::o;16663:315::-;16770:1;16754:18;;:4;:18;;;16750:88;;16823:1;16796:30;;;;;;;;;;;:::i;:::-;;;;;;;;16750:88;16866:1;16852:16;;:2;:16;;;16848:88;;16921:1;16892:32;;;;;;;;;;;:::i;:::-;;;;;;;;16848:88;16946:24;16954:4;16960:2;16964:5;16946:7;:24::i;:::-;16663:315;;;:::o;39461:400::-;39543:13;39559;:11;:13::i;:::-;39543:29;;39609:5;39587:12;:18;39600:4;39587:18;;;;;;;;;;;;;;;;:27;39583:127;;39656:1;39631:16;:22;39648:4;39631:22;;;;;;;;;;;;;;;:26;;;;39693:5;39672:12;:18;39685:4;39672:18;;;;;;;;;;;;;;;:26;;;;39583:127;38513:21;39753:6;39728:16;:22;39745:4;39728:22;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:52;;39720:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;39847:6;39821:16;:22;39838:4;39821:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;39532:329;39461:400;;:::o;55363:636::-;55445:17;55465:10;:17;;;;55445:37;;55510:1;55497:9;:14;:29;;;;55525:1;55515:6;:11;55497:29;55493:42;;;55528:7;;;55493:42;55547:11;55570:9;55561:6;:18;;;;:::i;:::-;55547:32;;55590:17;55619:9;55610:6;:18;;;;:::i;:::-;55590:38;;55646:9;55641:351;55665:9;55661:1;:13;55641:351;;;55743:18;55764:3;55743:24;;55803:1;55791:9;:13;;;;:::i;:::-;55786:1;:18;55782:82;;55839:9;55825:23;;;;;:::i;:::-;;;55782:82;55895:1;55882:10;:14;55878:103;;;55917:48;55933:4;55939:10;55950:1;55939:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55954:10;55917:15;:48::i;:::-;55878:103;55681:311;55676:3;;;;;;;55641:351;;;;55434:565;;;55363:636;;;:::o;56359:607::-;56447:17;56467:16;:23;;;;56447:43;;56518:1;56505:9;:14;:29;;;;56533:1;56523:6;:11;56505:29;56501:42;;;56536:7;;;56501:42;56555:11;56578:9;56569:6;:18;;;;:::i;:::-;56555:32;;56598:17;56627:9;56618:6;:18;;;;:::i;:::-;56598:38;;56654:9;56649:310;56673:9;56669:1;:13;56649:310;;;56704:18;56725:3;56704:24;;56764:1;56752:9;:13;;;;:::i;:::-;56747:1;:18;56743:82;;56800:9;56786:23;;;;;:::i;:::-;;;56743:82;56856:1;56843:10;:14;56839:109;;;56878:54;56894:4;56900:16;56917:1;56900:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56921:10;56878:15;:54::i;:::-;56839:109;56689:270;56684:3;;;;;;;56649:310;;;;56436:530;;;56359:607;;;:::o;53526:1465::-;53617:17;53637:11;:18;;;;53617:38;;53683:1;53670:9;:14;:29;;;;53698:1;53688:6;:11;53670:29;53666:42;;;53701:7;;;53666:42;53720:17;53740:2;53720:22;;53753:18;53774:23;;53753:44;;53808:16;53840:9;53827:10;:22;;;;:::i;:::-;53808:41;;53875:9;53864:8;:20;53860:73;;;53912:9;53901:20;;53860:73;53985:22;54027:9;54039:10;54027:22;;54022:128;54055:8;54051:1;:12;54022:128;;;54103:19;:35;54123:11;54135:1;54123:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54103:35;;;;;;;;;;;;;;;;54085:53;;;;;:::i;:::-;;;54065:3;;;;;;;54022:128;;;;54235:1;54217:14;:19;54213:119;;54290:9;54279:8;:20;;;;:::i;:::-;54253:23;:46;;;;54314:7;;;;;;;54213:119;54344:19;54383:9;54395:10;54383:22;;54378:516;54411:8;54407:1;:12;54378:516;;;54441:19;54463;:35;54483:11;54495:1;54483:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54463:35;;;;;;;;;;;;;;;;54441:57;;54513:17;54558:14;54543:11;54534:6;:20;;;;:::i;:::-;54533:39;;;;:::i;:::-;54513:59;;54654:1;54643:8;:12;;;;:::i;:::-;54638:1;:17;54634:90;;54697:11;54688:6;:20;;;;:::i;:::-;54676:32;;54634:90;54754:1;54742:9;:13;54738:145;;;54776:48;54792:4;54798:11;54810:1;54798:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54814:9;54776:15;:48::i;:::-;54858:9;54843:24;;;;;:::i;:::-;;;54738:145;54426:468;;54421:3;;;;;;;54378:516;;;;54974:9;54963:8;:20;;;;:::i;:::-;54937:23;:46;;;;53606:1385;;;;;;53526:1465;;;:::o;41292:433::-;41359:7;41380:14;41400;:12;:14::i;:::-;41379:35;;;41425:20;41455:11;;;;;;;;;;;41448:29;;;41478:13;;;;;;;;;;;41448:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41425:67;;41523:6;41507:12;:22;41503:196;;41546:17;41649:6;41622:24;41632:13;;;;;;;;;;;41622:9;:24::i;:::-;:33;;;;:::i;:::-;41589:13;;;;;;;;;;;41576:39;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41567:6;:50;;;;:::i;:::-;41566:90;;;;:::i;:::-;41546:110;;41678:9;41671:16;;;;;;;41503:196;41716:1;41709:8;;;;41292:433;;;;:::o;46776:1894::-;46879:1;46854:15;:21;46870:4;46854:21;;;;;;;;;;;;;;;;:26;46850:1718;;46948:8;46924:15;:21;46940:4;46924:21;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;46905:15;:51;;46897:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;47140:22;47165:19;:25;47185:4;47165:25;;;;;;;;;;;;;;;;47140:50;;47226:1;47209:14;:18;47205:1352;;;47394:19;47416:24;47426:13;;;;;;;;;;;47416:9;:24::i;:::-;47394:46;;47459:23;47503:10;:8;:10::i;:::-;47497:2;:16;;;;:::i;:::-;47485:9;:28;;;;:::i;:::-;47459:54;;47550:15;47536:11;:29;47532:897;;;47590:16;47631:4;47626:2;47609:14;:19;;;;:::i;:::-;:26;;;;:::i;:::-;47590:45;;47672:46;47688:13;;;;;;;;;;;47703:4;47709:8;47672:15;:46::i;:::-;47741:16;47781:4;47777:1;47760:14;:18;;;;:::i;:::-;:25;;;;:::i;:::-;47741:44;;47833:84;47849:13;;;;;;;;;;;47864:42;47908:8;47833:15;:84::i;:::-;48038:16;48079:4;48074:2;48057:14;:19;;;;:::i;:::-;:26;;;;:::i;:::-;48038:45;;48132:48;48156:8;48166:13;;;;;;;;;;;48132:23;:48::i;:::-;48203:16;48244:4;48239:2;48222:14;:19;;;;:::i;:::-;:26;;;;:::i;:::-;48203:45;;48285:51;48321:4;48327:8;48285:35;:51::i;:::-;48388:13;;;;;;;;;;;48375:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47567:862;;;;47532:897;48489:52;48513:4;48520;48526:14;48489:15;:52::i;:::-;47229:1328;;47205:1352;46882:1686;46850:1718;48606:6;48578:19;:25;48598:4;48578:25;;;;;;;;;;;;;;;:34;;;;48647:15;48623;:21;48639:4;48623:21;;;;;;;;;;;;;;;:39;;;;46776:1894;;:::o;17302:1135::-;17408:1;17392:18;;:4;:18;;;17388:552;;17546:5;17530:12;;:21;;;;;;;:::i;:::-;;;;;;;;17388:552;;;17584:19;17606:9;:15;17616:4;17606:15;;;;;;;;;;;;;;;;17584:37;;17654:5;17640:11;:19;17636:117;;;17712:4;17718:11;17731:5;17687:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;17636:117;17908:5;17894:11;:19;17876:9;:15;17886:4;17876:15;;;;;;;;;;;;;;;:37;;;;17569:371;17388:552;17970:1;17956:16;;:2;:16;;;17952:435;;18138:5;18122:12;;:21;;;;;;;;;;;17952:435;;;18355:5;18338:9;:13;18348:2;18338:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;17952:435;18419:2;18404:25;;18413:4;18404:25;;;18423:5;18404:25;;;;;;:::i;:::-;;;;;;;;17302:1135;;;:::o;39236:105::-;39282:7;39327:6;39309:15;:24;;;;:::i;:::-;39302:31;;39236:105;:::o;50760:1947::-;50843:24;50870:16;:23;;;;50843:50;;50904:22;50929:10;:17;;;;50904:42;;50957:23;50983:11;:18;;;;50957:44;;51014:17;51034:2;51014:22;;51047:18;51068:24;;51047:45;;51103:16;51135:9;51122:10;:22;;;;:::i;:::-;51103:41;;51170:15;51159:8;:26;51155:58;;;51198:15;51187:26;;51155:58;51224:24;51262:10;51251:8;:21;;;;:::i;:::-;51224:48;;51285:18;51342:16;51325:14;51306:16;:33;;;;:::i;:::-;:52;;;;:::i;:::-;51285:73;;51387:1;51373:10;:15;:30;;;;51402:1;51392:6;:11;51373:30;51369:43;;;51405:7;;;;;;;;;;51369:43;51424:23;51459:10;51450:6;:19;;;;:::i;:::-;51424:45;;51480:17;51527:10;51509:15;:28;;;;:::i;:::-;51500:6;:37;;;;:::i;:::-;51480:57;;51548:17;51612:6;51607:321;51628:16;51624:1;:20;51607:321;;;51666:18;51687:15;51666:36;;51747:1;51734:10;:14;;;;:::i;:::-;51721:9;:27;51717:56;;51764:9;51750:23;;;;;:::i;:::-;;;51717:56;51833:1;51820:10;:14;51816:74;;;51836:54;51852:4;51858:16;51875:1;51858:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51879:10;51836:15;:54::i;:::-;51816:74;51905:11;;;;;:::i;:::-;;;;51651:277;51646:3;;;;;;;51607:321;;;;51970:6;51965:285;51986:14;51982:1;:18;51965:285;;;52022:18;52043:15;52022:36;;52103:1;52090:10;:14;;;;:::i;:::-;52077:9;:27;52073:56;;52120:9;52106:23;;;;;:::i;:::-;;;52073:56;52161:1;52148:10;:14;52144:68;;;52164:48;52180:4;52186:10;52197:1;52186:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52201:10;52164:15;:48::i;:::-;52144:68;52227:11;;;;;:::i;:::-;;;;52007:243;52002:3;;;;;;;51965:285;;;;52318:9;52330:10;52318:22;;52313:292;52346:8;52342:1;:12;52313:292;;;52376:18;52397:15;52376:36;;52457:1;52444:10;:14;;;;:::i;:::-;52431:9;:27;52427:56;;52474:9;52460:23;;;;;:::i;:::-;;;52427:56;52515:1;52502:10;:14;52498:69;;;52518:49;52534:4;52540:11;52552:1;52540:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52556:10;52518:15;:49::i;:::-;52498:69;52582:11;;;;;:::i;:::-;;;;52361:244;52356:3;;;;;;;52313:292;;;;52684:15;52673:8;:26;;;;:::i;:::-;52646:24;:53;;;;50832:1875;;;;;;;;;;;50760:1947;;;:::o;48699:2027::-;48796:15;48814:8;:14;48823:4;48814:14;;;;;;;;;;;;;;;;;;;;;;;;;48796:32;;48839:18;48872:10;:8;:10::i;:::-;48866:2;:16;;;;:::i;:::-;48860:3;:22;;;;:::i;:::-;48839:43;;48893:24;:326;;;;;;;;48943:2;48893:326;;;;48956:2;48893:326;;;;48969:2;48893:326;;;;48982:2;48893:326;;;;48995:2;48893:326;;;;49022:1;48893:326;;;;49034:1;48893:326;;;;49046:1;48893:326;;;;49058:1;48893:326;;;;49070:1;48893:326;;;;49096:1;48893:326;;;;49108:1;48893:326;;;;49120:1;48893:326;;;;49132:1;48893:326;;;;49144:1;48893:326;;;;49170:1;48893:326;;;;49182:1;48893:326;;;;49194:1;48893:326;;;;49206:1;48893:326;;;;;49230:24;49274:9;49269:1416;49293:2;49289:1;:6;:31;;;;;49318:1;49299:21;;:7;:21;;;;49289:31;49269:1416;;;49342:12;49357:5;49363:1;49357:8;;;;;;;:::i;:::-;;;;;;49342:23;;49380:13;49427:1;49422;:6;49418:1001;;49557:10;49525:19;:28;49545:7;49525:28;;;;;;;;;;;;;;;;:42;;49514:53;;49418:1001;;;49598:1;49593;:6;49589:830;;49720:1;49691:9;:18;49701:7;49691:18;;;;;;;;;;;;;;;:25;;;;:30;;:76;;;;;49757:10;49725:19;:28;49745:7;49725:28;;;;;;;;;;;;;;;;:42;;49691:76;49680:87;;49589:830;;;49798:1;49793;:6;;:16;;;;;49808:1;49803;:6;;49793:16;49789:630;;;49930:1;49901:9;:18;49911:7;49901:18;;;;;;;;;;;;;;;:25;;;;:30;;:76;;;;;49967:10;49935:19;:28;49955:7;49935:28;;;;;;;;;;;;;;;;:42;;49901:76;49890:87;;49789:630;;;50008:1;50003;:6;;:17;;;;;50018:2;50013:1;:7;;50003:17;49999:420;;;50142:1;50113:9;:18;50123:7;50113:18;;;;;;;;;;;;;;;:25;;;;:30;;:76;;;;;50179:10;50147:19;:28;50167:7;50147:28;;;;;;;;;;;;;;;;:42;;50113:76;50102:87;;49999:420;;;50220:2;50215:1;:7;;:18;;;;;50231:2;50226:1;:7;;50215:18;50211:208;;;50356:1;50327:9;:18;50337:7;50327:18;;;;;;;;;;;;;;;:25;;;;:30;;:76;;;;;50393:10;50361:19;:28;50381:7;50361:28;;;;;;;;;;;;;;;;:42;;50327:76;50316:87;;50211:208;49999:420;49789:630;49589:830;49418:1001;50439:8;50435:195;;;50468:13;50502:3;50495:4;50484:8;:15;;;;:::i;:::-;:21;;;;:::i;:::-;50468:37;;50524:46;50540:13;;;;;;;;;;;50555:7;50564:5;50524:15;:46::i;:::-;50609:5;50589:25;;;;;:::i;:::-;;;50449:181;50435:195;50656:8;:17;50665:7;50656:17;;;;;;;;;;;;;;;;;;;;;;;;;50646:27;;49327:1358;;49322:3;;;;;:::i;:::-;;;;49269:1416;;;;48785:1941;;;;48699:2027;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:99::-;1663:6;1697:5;1691:12;1681:22;;1611:99;;;:::o;1716:169::-;1800:11;1834:6;1829:3;1822:19;1874:4;1869:3;1865:14;1850:29;;1716:169;;;;:::o;1891:248::-;1973:1;1983:113;1997:6;1994:1;1991:13;1983:113;;;2082:1;2077:3;2073:11;2067:18;2063:1;2058:3;2054:11;2047:39;2019:2;2016:1;2012:10;2007:15;;1983:113;;;2130:1;2121:6;2116:3;2112:16;2105:27;1953:186;1891:248;;;:::o;2145:102::-;2186:6;2237:2;2233:7;2228:2;2221:5;2217:14;2213:28;2203:38;;2145:102;;;:::o;2253:377::-;2341:3;2369:39;2402:5;2369:39;:::i;:::-;2424:71;2488:6;2483:3;2424:71;:::i;:::-;2417:78;;2504:65;2562:6;2557:3;2550:4;2543:5;2539:16;2504:65;:::i;:::-;2594:29;2616:6;2594:29;:::i;:::-;2589:3;2585:39;2578:46;;2345:285;2253:377;;;;:::o;2636:313::-;2749:4;2787:2;2776:9;2772:18;2764:26;;2836:9;2830:4;2826:20;2822:1;2811:9;2807:17;2800:47;2864:78;2937:4;2928:6;2864:78;:::i;:::-;2856:86;;2636:313;;;;:::o;2955:122::-;3028:24;3046:5;3028:24;:::i;:::-;3021:5;3018:35;3008:63;;3067:1;3064;3057:12;3008:63;2955:122;:::o;3083:139::-;3129:5;3167:6;3154:20;3145:29;;3183:33;3210:5;3183:33;:::i;:::-;3083:139;;;;:::o;3228:474::-;3296:6;3304;3353:2;3341:9;3332:7;3328:23;3324:32;3321:119;;;3359:79;;:::i;:::-;3321:119;3479:1;3504:53;3549:7;3540:6;3529:9;3525:22;3504:53;:::i;:::-;3494:63;;3450:117;3606:2;3632:53;3677:7;3668:6;3657:9;3653:22;3632:53;:::i;:::-;3622:63;;3577:118;3228:474;;;;;:::o;3708:90::-;3742:7;3785:5;3778:13;3771:21;3760:32;;3708:90;;;:::o;3804:109::-;3885:21;3900:5;3885:21;:::i;:::-;3880:3;3873:34;3804:109;;:::o;3919:210::-;4006:4;4044:2;4033:9;4029:18;4021:26;;4057:65;4119:1;4108:9;4104:17;4095:6;4057:65;:::i;:::-;3919:210;;;;:::o;4135:329::-;4194:6;4243:2;4231:9;4222:7;4218:23;4214:32;4211:119;;;4249:79;;:::i;:::-;4211:119;4369:1;4394:53;4439:7;4430:6;4419:9;4415:22;4394:53;:::i;:::-;4384:63;;4340:117;4135:329;;;;:::o;4470:118::-;4557:24;4575:5;4557:24;:::i;:::-;4552:3;4545:37;4470:118;;:::o;4594:222::-;4687:4;4725:2;4714:9;4710:18;4702:26;;4738:71;4806:1;4795:9;4791:17;4782:6;4738:71;:::i;:::-;4594:222;;;;:::o;4822:117::-;4931:1;4928;4921:12;4945:117;5054:1;5051;5044:12;5068:117;5177:1;5174;5167:12;5208:568;5281:8;5291:6;5341:3;5334:4;5326:6;5322:17;5318:27;5308:122;;5349:79;;:::i;:::-;5308:122;5462:6;5449:20;5439:30;;5492:18;5484:6;5481:30;5478:117;;;5514:79;;:::i;:::-;5478:117;5628:4;5620:6;5616:17;5604:29;;5682:3;5674:4;5666:6;5662:17;5652:8;5648:32;5645:41;5642:128;;;5689:79;;:::i;:::-;5642:128;5208:568;;;;;:::o;5782:559::-;5868:6;5876;5925:2;5913:9;5904:7;5900:23;5896:32;5893:119;;;5931:79;;:::i;:::-;5893:119;6079:1;6068:9;6064:17;6051:31;6109:18;6101:6;6098:30;6095:117;;;6131:79;;:::i;:::-;6095:117;6244:80;6316:7;6307:6;6296:9;6292:22;6244:80;:::i;:::-;6226:98;;;;6022:312;5782:559;;;;;:::o;6347:114::-;6414:6;6448:5;6442:12;6432:22;;6347:114;;;:::o;6467:184::-;6566:11;6600:6;6595:3;6588:19;6640:4;6635:3;6631:14;6616:29;;6467:184;;;;:::o;6657:132::-;6724:4;6747:3;6739:11;;6777:4;6772:3;6768:14;6760:22;;6657:132;;;:::o;6795:108::-;6872:24;6890:5;6872:24;:::i;:::-;6867:3;6860:37;6795:108;;:::o;6909:179::-;6978:10;6999:46;7041:3;7033:6;6999:46;:::i;:::-;7077:4;7072:3;7068:14;7054:28;;6909:179;;;;:::o;7094:113::-;7164:4;7196;7191:3;7187:14;7179:22;;7094:113;;;:::o;7243:732::-;7362:3;7391:54;7439:5;7391:54;:::i;:::-;7461:86;7540:6;7535:3;7461:86;:::i;:::-;7454:93;;7571:56;7621:5;7571:56;:::i;:::-;7650:7;7681:1;7666:284;7691:6;7688:1;7685:13;7666:284;;;7767:6;7761:13;7794:63;7853:3;7838:13;7794:63;:::i;:::-;7787:70;;7880:60;7933:6;7880:60;:::i;:::-;7870:70;;7726:224;7713:1;7710;7706:9;7701:14;;7666:284;;;7670:14;7966:3;7959:10;;7367:608;;;7243:732;;;;:::o;7981:373::-;8124:4;8162:2;8151:9;8147:18;8139:26;;8211:9;8205:4;8201:20;8197:1;8186:9;8182:17;8175:47;8239:108;8342:4;8333:6;8239:108;:::i;:::-;8231:116;;7981:373;;;;:::o;8360:619::-;8437:6;8445;8453;8502:2;8490:9;8481:7;8477:23;8473:32;8470:119;;;8508:79;;:::i;:::-;8470:119;8628:1;8653:53;8698:7;8689:6;8678:9;8674:22;8653:53;:::i;:::-;8643:63;;8599:117;8755:2;8781:53;8826:7;8817:6;8806:9;8802:22;8781:53;:::i;:::-;8771:63;;8726:118;8883:2;8909:53;8954:7;8945:6;8934:9;8930:22;8909:53;:::i;:::-;8899:63;;8854:118;8360:619;;;;;:::o;8985:86::-;9020:7;9060:4;9053:5;9049:16;9038:27;;8985:86;;;:::o;9077:112::-;9160:22;9176:5;9160:22;:::i;:::-;9155:3;9148:35;9077:112;;:::o;9195:214::-;9284:4;9322:2;9311:9;9307:18;9299:26;;9335:67;9399:1;9388:9;9384:17;9375:6;9335:67;:::i;:::-;9195:214;;;;:::o;9432:568::-;9505:8;9515:6;9565:3;9558:4;9550:6;9546:17;9542:27;9532:122;;9573:79;;:::i;:::-;9532:122;9686:6;9673:20;9663:30;;9716:18;9708:6;9705:30;9702:117;;;9738:79;;:::i;:::-;9702:117;9852:4;9844:6;9840:17;9828:29;;9906:3;9898:4;9890:6;9886:17;9876:8;9872:32;9869:41;9866:128;;;9913:79;;:::i;:::-;9866:128;9432:568;;;;;:::o;10006:934::-;10128:6;10136;10144;10152;10201:2;10189:9;10180:7;10176:23;10172:32;10169:119;;;10207:79;;:::i;:::-;10169:119;10355:1;10344:9;10340:17;10327:31;10385:18;10377:6;10374:30;10371:117;;;10407:79;;:::i;:::-;10371:117;10520:80;10592:7;10583:6;10572:9;10568:22;10520:80;:::i;:::-;10502:98;;;;10298:312;10677:2;10666:9;10662:18;10649:32;10708:18;10700:6;10697:30;10694:117;;;10730:79;;:::i;:::-;10694:117;10843:80;10915:7;10906:6;10895:9;10891:22;10843:80;:::i;:::-;10825:98;;;;10620:313;10006:934;;;;;;;:::o;10946:116::-;11016:21;11031:5;11016:21;:::i;:::-;11009:5;11006:32;10996:60;;11052:1;11049;11042:12;10996:60;10946:116;:::o;11068:133::-;11111:5;11149:6;11136:20;11127:29;;11165:30;11189:5;11165:30;:::i;:::-;11068:133;;;;:::o;11207:468::-;11272:6;11280;11329:2;11317:9;11308:7;11304:23;11300:32;11297:119;;;11335:79;;:::i;:::-;11297:119;11455:1;11480:53;11525:7;11516:6;11505:9;11501:22;11480:53;:::i;:::-;11470:63;;11426:117;11582:2;11608:50;11650:7;11641:6;11630:9;11626:22;11608:50;:::i;:::-;11598:60;;11553:115;11207:468;;;;;:::o;11681:474::-;11749:6;11757;11806:2;11794:9;11785:7;11781:23;11777:32;11774:119;;;11812:79;;:::i;:::-;11774:119;11932:1;11957:53;12002:7;11993:6;11982:9;11978:22;11957:53;:::i;:::-;11947:63;;11903:117;12059:2;12085:53;12130:7;12121:6;12110:9;12106:22;12085:53;:::i;:::-;12075:63;;12030:118;11681:474;;;;;:::o;12161:180::-;12209:77;12206:1;12199:88;12306:4;12303:1;12296:15;12330:4;12327:1;12320:15;12347:320;12391:6;12428:1;12422:4;12418:12;12408:22;;12475:1;12469:4;12465:12;12496:18;12486:81;;12552:4;12544:6;12540:17;12530:27;;12486:81;12614:2;12606:6;12603:14;12583:18;12580:38;12577:84;;12633:18;;:::i;:::-;12577:84;12398:269;12347:320;;;:::o;12673:162::-;12813:14;12809:1;12801:6;12797:14;12790:38;12673:162;:::o;12841:366::-;12983:3;13004:67;13068:2;13063:3;13004:67;:::i;:::-;12997:74;;13080:93;13169:3;13080:93;:::i;:::-;13198:2;13193:3;13189:12;13182:19;;12841:366;;;:::o;13213:419::-;13379:4;13417:2;13406:9;13402:18;13394:26;;13466:9;13460:4;13456:20;13452:1;13441:9;13437:17;13430:47;13494:131;13620:4;13494:131;:::i;:::-;13486:139;;13213:419;;;:::o;13638:180::-;13686:77;13683:1;13676:88;13783:4;13780:1;13773:15;13807:4;13804:1;13797:15;13824:165;13964:17;13960:1;13952:6;13948:14;13941:41;13824:165;:::o;13995:366::-;14137:3;14158:67;14222:2;14217:3;14158:67;:::i;:::-;14151:74;;14234:93;14323:3;14234:93;:::i;:::-;14352:2;14347:3;14343:12;14336:19;;13995:366;;;:::o;14367:419::-;14533:4;14571:2;14560:9;14556:18;14548:26;;14620:9;14614:4;14610:20;14606:1;14595:9;14591:17;14584:47;14648:131;14774:4;14648:131;:::i;:::-;14640:139;;14367:419;;;:::o;14792:180::-;14840:77;14837:1;14830:88;14937:4;14934:1;14927:15;14961:4;14958:1;14951:15;14978:410;15018:7;15041:20;15059:1;15041:20;:::i;:::-;15036:25;;15075:20;15093:1;15075:20;:::i;:::-;15070:25;;15130:1;15127;15123:9;15152:30;15170:11;15152:30;:::i;:::-;15141:41;;15331:1;15322:7;15318:15;15315:1;15312:22;15292:1;15285:9;15265:83;15242:139;;15361:18;;:::i;:::-;15242:139;15026:362;14978:410;;;;:::o;15394:180::-;15442:77;15439:1;15432:88;15539:4;15536:1;15529:15;15563:4;15560:1;15553:15;15580:185;15620:1;15637:20;15655:1;15637:20;:::i;:::-;15632:25;;15671:20;15689:1;15671:20;:::i;:::-;15666:25;;15710:1;15700:35;;15715:18;;:::i;:::-;15700:35;15757:1;15754;15750:9;15745:14;;15580:185;;;;:::o;15771:442::-;15920:4;15958:2;15947:9;15943:18;15935:26;;15971:71;16039:1;16028:9;16024:17;16015:6;15971:71;:::i;:::-;16052:72;16120:2;16109:9;16105:18;16096:6;16052:72;:::i;:::-;16134;16202:2;16191:9;16187:18;16178:6;16134:72;:::i;:::-;15771:442;;;;;;:::o;16219:169::-;16359:21;16355:1;16347:6;16343:14;16336:45;16219:169;:::o;16394:366::-;16536:3;16557:67;16621:2;16616:3;16557:67;:::i;:::-;16550:74;;16633:93;16722:3;16633:93;:::i;:::-;16751:2;16746:3;16742:12;16735:19;;16394:366;;;:::o;16766:419::-;16932:4;16970:2;16959:9;16955:18;16947:26;;17019:9;17013:4;17009:20;17005:1;16994:9;16990:17;16983:47;17047:131;17173:4;17047:131;:::i;:::-;17039:139;;16766:419;;;:::o;17191:191::-;17231:3;17250:20;17268:1;17250:20;:::i;:::-;17245:25;;17284:20;17302:1;17284:20;:::i;:::-;17279:25;;17327:1;17324;17320:9;17313:16;;17348:3;17345:1;17342:10;17339:36;;;17355:18;;:::i;:::-;17339:36;17191:191;;;;:::o;17388:175::-;17528:27;17524:1;17516:6;17512:14;17505:51;17388:175;:::o;17569:366::-;17711:3;17732:67;17796:2;17791:3;17732:67;:::i;:::-;17725:74;;17808:93;17897:3;17808:93;:::i;:::-;17926:2;17921:3;17917:12;17910:19;;17569:366;;;:::o;17941:419::-;18107:4;18145:2;18134:9;18130:18;18122:26;;18194:9;18188:4;18184:20;18180:1;18169:9;18165:17;18158:47;18222:131;18348:4;18222:131;:::i;:::-;18214:139;;17941:419;;;:::o;18366:194::-;18406:4;18426:20;18444:1;18426:20;:::i;:::-;18421:25;;18460:20;18478:1;18460:20;:::i;:::-;18455:25;;18504:1;18501;18497:9;18489:17;;18528:1;18522:4;18519:11;18516:37;;;18533:18;;:::i;:::-;18516:37;18366:194;;;;:::o;18566:102::-;18608:8;18655:5;18652:1;18648:13;18627:34;;18566:102;;;:::o;18674:848::-;18735:5;18742:4;18766:6;18757:15;;18790:5;18781:14;;18804:712;18825:1;18815:8;18812:15;18804:712;;;18920:4;18915:3;18911:14;18905:4;18902:24;18899:50;;;18929:18;;:::i;:::-;18899:50;18979:1;18969:8;18965:16;18962:451;;;19394:4;19387:5;19383:16;19374:25;;18962:451;19444:4;19438;19434:15;19426:23;;19474:32;19497:8;19474:32;:::i;:::-;19462:44;;18804:712;;;18674:848;;;;;;;:::o;19528:1073::-;19582:5;19773:8;19763:40;;19794:1;19785:10;;19796:5;;19763:40;19822:4;19812:36;;19839:1;19830:10;;19841:5;;19812:36;19908:4;19956:1;19951:27;;;;19992:1;19987:191;;;;19901:277;;19951:27;19969:1;19960:10;;19971:5;;;19987:191;20032:3;20022:8;20019:17;20016:43;;;20039:18;;:::i;:::-;20016:43;20088:8;20085:1;20081:16;20072:25;;20123:3;20116:5;20113:14;20110:40;;;20130:18;;:::i;:::-;20110:40;20163:5;;;19901:277;;20287:2;20277:8;20274:16;20268:3;20262:4;20259:13;20255:36;20237:2;20227:8;20224:16;20219:2;20213:4;20210:12;20206:35;20190:111;20187:246;;;20343:8;20337:4;20333:19;20324:28;;20378:3;20371:5;20368:14;20365:40;;;20385:18;;:::i;:::-;20365:40;20418:5;;20187:246;20458:42;20496:3;20486:8;20480:4;20477:1;20458:42;:::i;:::-;20443:57;;;;20532:4;20527:3;20523:14;20516:5;20513:25;20510:51;;;20541:18;;:::i;:::-;20510:51;20590:4;20583:5;20579:16;20570:25;;19528:1073;;;;;;:::o;20607:281::-;20665:5;20689:23;20707:4;20689:23;:::i;:::-;20681:31;;20733:25;20749:8;20733:25;:::i;:::-;20721:37;;20777:104;20814:66;20804:8;20798:4;20777:104;:::i;:::-;20768:113;;20607:281;;;;:::o;20894:179::-;21034:31;21030:1;21022:6;21018:14;21011:55;20894:179;:::o;21079:366::-;21221:3;21242:67;21306:2;21301:3;21242:67;:::i;:::-;21235:74;;21318:93;21407:3;21318:93;:::i;:::-;21436:2;21431:3;21427:12;21420:19;;21079:366;;;:::o;21451:419::-;21617:4;21655:2;21644:9;21640:18;21632:26;;21704:9;21698:4;21694:20;21690:1;21679:9;21675:17;21668:47;21732:131;21858:4;21732:131;:::i;:::-;21724:139;;21451:419;;;:::o;21876:114::-;21913:7;21953:30;21946:5;21942:42;21931:53;;21876:114;;;:::o;21996:122::-;22069:24;22087:5;22069:24;:::i;:::-;22062:5;22059:35;22049:63;;22108:1;22105;22098:12;22049:63;21996:122;:::o;22124:143::-;22181:5;22212:6;22206:13;22197:22;;22228:33;22255:5;22228:33;:::i;:::-;22124:143;;;;:::o;22273:93::-;22309:7;22349:10;22342:5;22338:22;22327:33;;22273:93;;;:::o;22372:120::-;22444:23;22461:5;22444:23;:::i;:::-;22437:5;22434:34;22424:62;;22482:1;22479;22472:12;22424:62;22372:120;:::o;22498:141::-;22554:5;22585:6;22579:13;22570:22;;22601:32;22627:5;22601:32;:::i;:::-;22498:141;;;;:::o;22645:661::-;22732:6;22740;22748;22797:2;22785:9;22776:7;22772:23;22768:32;22765:119;;;22803:79;;:::i;:::-;22765:119;22923:1;22948:64;23004:7;22995:6;22984:9;22980:22;22948:64;:::i;:::-;22938:74;;22894:128;23061:2;23087:64;23143:7;23134:6;23123:9;23119:22;23087:64;:::i;:::-;23077:74;;23032:129;23200:2;23226:63;23281:7;23272:6;23261:9;23257:22;23226:63;:::i;:::-;23216:73;;23171:128;22645:661;;;;;:::o;23312:175::-;23452:27;23448:1;23440:6;23436:14;23429:51;23312:175;:::o;23493:366::-;23635:3;23656:67;23720:2;23715:3;23656:67;:::i;:::-;23649:74;;23732:93;23821:3;23732:93;:::i;:::-;23850:2;23845:3;23841:12;23834:19;;23493:366;;;:::o;23865:419::-;24031:4;24069:2;24058:9;24054:18;24046:26;;24118:9;24112:4;24108:20;24104:1;24093:9;24089:17;24082:47;24146:131;24272:4;24146:131;:::i;:::-;24138:139;;23865:419;;;:::o;24290:176::-;24322:1;24339:20;24357:1;24339:20;:::i;:::-;24334:25;;24373:20;24391:1;24373:20;:::i;:::-;24368:25;;24412:1;24402:35;;24417:18;;:::i;:::-;24402:35;24458:1;24455;24451:9;24446:14;;24290:176;;;;:::o;24472:143::-;24529:5;24560:6;24554:13;24545:22;;24576:33;24603:5;24576:33;:::i;:::-;24472:143;;;;:::o;24621:351::-;24691:6;24740:2;24728:9;24719:7;24715:23;24711:32;24708:119;;;24746:79;;:::i;:::-;24708:119;24866:1;24891:64;24947:7;24938:6;24927:9;24923:22;24891:64;:::i;:::-;24881:74;;24837:128;24621:351;;;;:::o;24978:227::-;25118:34;25114:1;25106:6;25102:14;25095:58;25187:10;25182:2;25174:6;25170:15;25163:35;24978:227;:::o;25211:366::-;25353:3;25374:67;25438:2;25433:3;25374:67;:::i;:::-;25367:74;;25450:93;25539:3;25450:93;:::i;:::-;25568:2;25563:3;25559:12;25552:19;;25211:366;;;:::o;25583:419::-;25749:4;25787:2;25776:9;25772:18;25764:26;;25836:9;25830:4;25826:20;25822:1;25811:9;25807:17;25800:47;25864:131;25990:4;25864:131;:::i;:::-;25856:139;;25583:419;;;:::o;26008:233::-;26047:3;26070:24;26088:5;26070:24;:::i;:::-;26061:33;;26116:66;26109:5;26106:77;26103:103;;26186:18;;:::i;:::-;26103:103;26233:1;26226:5;26222:13;26215:20;;26008:233;;;:::o
Swarm Source
ipfs://ca40c875819e6bc65f399a495998f0181180baff42eae881b270dc819b3068d8
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.