Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 38 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 18336307 | 885 days ago | IN | 0 ETH | 0.00027789 | ||||
| Permit | 17915866 | 944 days ago | IN | 0 ETH | 0.00089583 | ||||
| Approve | 16940781 | 1081 days ago | IN | 0 ETH | 0.00224443 | ||||
| Transfer From | 16904861 | 1086 days ago | IN | 0 ETH | 0.00071393 | ||||
| Approve | 16895506 | 1088 days ago | IN | 0 ETH | 0.00098407 | ||||
| Approve | 16870201 | 1091 days ago | IN | 0 ETH | 0.00351145 | ||||
| Approve | 16517262 | 1141 days ago | IN | 0 ETH | 0.00076194 | ||||
| Approve | 15556662 | 1275 days ago | IN | 0 ETH | 0.00022014 | ||||
| Approve | 15543194 | 1277 days ago | IN | 0 ETH | 0.00037062 | ||||
| Approve | 15543141 | 1277 days ago | IN | 0 ETH | 0.00036501 | ||||
| Transfer From | 15488331 | 1286 days ago | IN | 0 ETH | 0.00049677 | ||||
| Approve | 15467959 | 1289 days ago | IN | 0 ETH | 0.00031618 | ||||
| Approve | 15457540 | 1291 days ago | IN | 0 ETH | 0.00040654 | ||||
| Approve | 14839716 | 1391 days ago | IN | 0 ETH | 0.00138339 | ||||
| Approve | 14839589 | 1391 days ago | IN | 0 ETH | 0.00112087 | ||||
| Approve | 13720965 | 1565 days ago | IN | 0 ETH | 0.00695938 | ||||
| Approve | 13321575 | 1628 days ago | IN | 0 ETH | 0.0045072 | ||||
| Approve | 12667259 | 1730 days ago | IN | 0 ETH | 0.00106843 | ||||
| Approve | 12520449 | 1753 days ago | IN | 0 ETH | 0.00192789 | ||||
| Approve | 11929739 | 1844 days ago | IN | 0 ETH | 0.00581685 | ||||
| Transfer | 11831005 | 1859 days ago | IN | 0 ETH | 0.025608 | ||||
| Transfer | 11831005 | 1859 days ago | IN | 0 ETH | 0.025608 | ||||
| Transfer | 11830946 | 1859 days ago | IN | 0 ETH | 0.025608 | ||||
| Transfer | 11830945 | 1859 days ago | IN | 0 ETH | 0.025608 | ||||
| Transfer | 11830928 | 1859 days ago | IN | 0 ETH | 0.006402 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FiatTokenV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-08-20
*/
// File: @openzeppelin/contracts/math/SafeMath.sol
// License: MIT
pragma solidity ^0.6.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// License: MIT
pragma solidity ^0.6.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount)
external
returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender)
external
view
returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @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
);
}
// File: contracts/v1/AbstractFiatTokenV1.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
abstract contract AbstractFiatTokenV1 is IERC20 {
function _approve(
address owner,
address spender,
uint256 value
) internal virtual;
function _transfer(
address from,
address to,
uint256 value
) internal virtual;
}
// File: contracts/v1/Ownable.sol
/**
* License: MIT
*
* Copyright (c) 2018 zOS Global Limited.
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @notice The Ownable contract has an owner address, and provides basic
* authorization control functions
* @dev Forked from https://github.com/OpenZeppelin/openzeppelin-labs/blob/3887ab77b8adafba4a26ace002f3a684c1a3388b/upgradeability_ownership/contracts/ownership/Ownable.sol
* Modifications:
* 1. Consolidate OwnableStorage into this contract (7/13/18)
* 2. Reformat, conform to Solidity 0.6 syntax, and add error messages (5/13/20)
* 3. Make public functions external (5/27/20)
*/
contract Ownable {
// Owner of the contract
address private _owner;
/**
* @dev Event to show ownership has been transferred
* @param previousOwner representing the address of the previous owner
* @param newOwner representing the address of the new owner
*/
event OwnershipTransferred(address previousOwner, address newOwner);
/**
* @dev The constructor sets the original owner of the contract to the sender account.
*/
constructor() public {
setOwner(msg.sender);
}
/**
* @dev Tells the address of the owner
* @return the address of the owner
*/
function owner() external view returns (address) {
return _owner;
}
/**
* @dev Sets a new owner address
*/
function setOwner(address newOwner) internal {
_owner = newOwner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == _owner, "Ownable: caller is not the owner");
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) external onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
emit OwnershipTransferred(_owner, newOwner);
setOwner(newOwner);
}
}
// File: contracts/v1/Pausable.sol
/**
* License: MIT
*
* Copyright (c) 2016 Smart Contract Solutions, Inc.
* Copyright (c) 2018-2020 CENTRE SECZ0
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @notice Base contract which allows children to implement an emergency stop
* mechanism
* @dev Forked from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/feb665136c0dae9912e08397c1a21c4af3651ef3/contracts/lifecycle/Pausable.sol
* Modifications:
* 1. Added pauser role, switched pause/unpause to be onlyPauser (6/14/2018)
* 2. Removed whenNotPause/whenPaused from pause/unpause (6/14/2018)
* 3. Removed whenPaused (6/14/2018)
* 4. Switches ownable library to use ZeppelinOS (7/12/18)
* 5. Remove constructor (7/13/18)
* 6. Reformat, conform to Solidity 0.6 syntax and add error messages (5/13/20)
* 7. Make public functions external (5/27/20)
*/
contract Pausable is Ownable {
event Pause();
event Unpause();
event PauserChanged(address indexed newAddress);
address public pauser;
bool public paused = false;
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!paused, "Pausable: paused");
_;
}
/**
* @dev throws if called by any account other than the pauser
*/
modifier onlyPauser() {
require(msg.sender == pauser, "Pausable: caller is not the pauser");
_;
}
/**
* @dev called by the owner to pause, triggers stopped state
*/
function pause() external onlyPauser {
paused = true;
emit Pause();
}
/**
* @dev called by the owner to unpause, returns to normal state
*/
function unpause() external onlyPauser {
paused = false;
emit Unpause();
}
/**
* @dev update the pauser role
*/
function updatePauser(address _newPauser) external onlyOwner {
require(
_newPauser != address(0),
"Pausable: new pauser is the zero address"
);
pauser = _newPauser;
emit PauserChanged(pauser);
}
}
// File: contracts/v1/Blacklistable.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @title Blacklistable Token
* @dev Allows accounts to be blacklisted by a "blacklister" role
*/
contract Blacklistable is Ownable {
address public blacklister;
mapping(address => bool) internal blacklisted;
event Blacklisted(address indexed _account);
event UnBlacklisted(address indexed _account);
event BlacklisterChanged(address indexed newBlacklister);
/**
* @dev Throws if called by any account other than the blacklister
*/
modifier onlyBlacklister() {
require(
msg.sender == blacklister,
"Blacklistable: caller is not the blacklister"
);
_;
}
/**
* @dev Throws if argument account is blacklisted
* @param _account The address to check
*/
modifier notBlacklisted(address _account) {
require(
!blacklisted[_account],
"Blacklistable: account is blacklisted"
);
_;
}
/**
* @dev Checks if account is blacklisted
* @param _account The address to check
*/
function isBlacklisted(address _account) external view returns (bool) {
return blacklisted[_account];
}
/**
* @dev Adds account to blacklist
* @param _account The address to blacklist
*/
function blacklist(address _account) external onlyBlacklister {
blacklisted[_account] = true;
emit Blacklisted(_account);
}
/**
* @dev Removes account from blacklist
* @param _account The address to remove from the blacklist
*/
function unBlacklist(address _account) external onlyBlacklister {
blacklisted[_account] = false;
emit UnBlacklisted(_account);
}
function updateBlacklister(address _newBlacklister) external onlyOwner {
require(
_newBlacklister != address(0),
"Blacklistable: new blacklister is the zero address"
);
blacklister = _newBlacklister;
emit BlacklisterChanged(blacklister);
}
}
// File: contracts/v1/FiatTokenV1.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @title FiatToken
* @dev ERC20 Token backed by fiat reserves
*/
contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable {
using SafeMath for uint256;
string public name;
string public symbol;
uint8 public decimals;
string public currency;
address public masterMinter;
bool internal initialized;
mapping(address => uint256) internal balances;
mapping(address => mapping(address => uint256)) internal allowed;
uint256 internal totalSupply_ = 0;
mapping(address => bool) internal minters;
mapping(address => uint256) internal minterAllowed;
event Mint(address indexed minter, address indexed to, uint256 amount);
event Burn(address indexed burner, uint256 amount);
event MinterConfigured(address indexed minter, uint256 minterAllowedAmount);
event MinterRemoved(address indexed oldMinter);
event MasterMinterChanged(address indexed newMasterMinter);
function initialize(
string memory tokenName,
string memory tokenSymbol,
string memory tokenCurrency,
uint8 tokenDecimals,
address newMasterMinter,
address newPauser,
address newBlacklister,
address newOwner
) public {
require(!initialized, "FiatToken: contract is already initialized");
require(
newMasterMinter != address(0),
"FiatToken: new masterMinter is the zero address"
);
require(
newPauser != address(0),
"FiatToken: new pauser is the zero address"
);
require(
newBlacklister != address(0),
"FiatToken: new blacklister is the zero address"
);
require(
newOwner != address(0),
"FiatToken: new owner is the zero address"
);
name = tokenName;
symbol = tokenSymbol;
currency = tokenCurrency;
decimals = tokenDecimals;
masterMinter = newMasterMinter;
pauser = newPauser;
blacklister = newBlacklister;
setOwner(newOwner);
initialized = true;
}
/**
* @dev Throws if called by any account other than a minter
*/
modifier onlyMinters() {
require(minters[msg.sender], "FiatToken: caller is not a minter");
_;
}
/**
* @dev Function to mint tokens
* @param _to The address that will receive the minted tokens.
* @param _amount The amount of tokens to mint. Must be less than or equal
* to the minterAllowance of the caller.
* @return A boolean that indicates if the operation was successful.
*/
function mint(address _to, uint256 _amount)
external
whenNotPaused
onlyMinters
notBlacklisted(msg.sender)
notBlacklisted(_to)
returns (bool)
{
require(_to != address(0), "FiatToken: mint to the zero address");
require(_amount > 0, "FiatToken: mint amount not greater than 0");
uint256 mintingAllowedAmount = minterAllowed[msg.sender];
require(
_amount <= mintingAllowedAmount,
"FiatToken: mint amount exceeds minterAllowance"
);
totalSupply_ = totalSupply_.add(_amount);
balances[_to] = balances[_to].add(_amount);
minterAllowed[msg.sender] = mintingAllowedAmount.sub(_amount);
emit Mint(msg.sender, _to, _amount);
emit Transfer(address(0), _to, _amount);
return true;
}
/**
* @dev Throws if called by any account other than the masterMinter
*/
modifier onlyMasterMinter() {
require(
msg.sender == masterMinter,
"FiatToken: caller is not the masterMinter"
);
_;
}
/**
* @dev Get minter allowance for an account
* @param minter The address of the minter
*/
function minterAllowance(address minter) external view returns (uint256) {
return minterAllowed[minter];
}
/**
* @dev Checks if account is a minter
* @param account The address to check
*/
function isMinter(address account) external view returns (bool) {
return minters[account];
}
/**
* @notice Amount of remaining tokens spender is allowed to transfer on
* behalf of the token owner
* @param owner Token owner's address
* @param spender Spender's address
* @return Allowance amount
*/
function allowance(address owner, address spender)
external
override
view
returns (uint256)
{
return allowed[owner][spender];
}
/**
* @dev Get totalSupply of token
*/
function totalSupply() external override view returns (uint256) {
return totalSupply_;
}
/**
* @dev Get token balance of an account
* @param account address The account
*/
function balanceOf(address account)
external
override
view
returns (uint256)
{
return balances[account];
}
/**
* @notice Set spender's allowance over the caller's tokens to be a given
* value.
* @param spender Spender's address
* @param value Allowance amount
* @return True if successful
*/
function approve(address spender, uint256 value)
external
override
whenNotPaused
notBlacklisted(msg.sender)
notBlacklisted(spender)
returns (bool)
{
_approve(msg.sender, spender, value);
return true;
}
/**
* @dev Internal function to set allowance
* @param owner Token owner's address
* @param spender Spender's address
* @param value Allowance amount
*/
function _approve(
address owner,
address spender,
uint256 value
) internal override {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
allowed[owner][spender] = value;
emit Approval(owner, spender, value);
}
/**
* @notice Transfer tokens by spending allowance
* @param from Payer's address
* @param to Payee's address
* @param value Transfer amount
* @return True if successful
*/
function transferFrom(
address from,
address to,
uint256 value
)
external
override
whenNotPaused
notBlacklisted(msg.sender)
notBlacklisted(from)
notBlacklisted(to)
returns (bool)
{
require(
value <= allowed[from][msg.sender],
"ERC20: transfer amount exceeds allowance"
);
_transfer(from, to, value);
allowed[from][msg.sender] = allowed[from][msg.sender].sub(value);
return true;
}
/**
* @notice Transfer tokens from the caller
* @param to Payee's address
* @param value Transfer amount
* @return True if successful
*/
function transfer(address to, uint256 value)
external
override
whenNotPaused
notBlacklisted(msg.sender)
notBlacklisted(to)
returns (bool)
{
_transfer(msg.sender, to, value);
return true;
}
/**
* @notice Internal function to process transfers
* @param from Payer's address
* @param to Payee's address
* @param value Transfer amount
*/
function _transfer(
address from,
address to,
uint256 value
) internal override {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(
value <= balances[from],
"ERC20: transfer amount exceeds balance"
);
balances[from] = balances[from].sub(value);
balances[to] = balances[to].add(value);
emit Transfer(from, to, value);
}
/**
* @dev Function to add/update a new minter
* @param minter The address of the minter
* @param minterAllowedAmount The minting amount allowed for the minter
* @return True if the operation was successful.
*/
function configureMinter(address minter, uint256 minterAllowedAmount)
external
whenNotPaused
onlyMasterMinter
returns (bool)
{
minters[minter] = true;
minterAllowed[minter] = minterAllowedAmount;
emit MinterConfigured(minter, minterAllowedAmount);
return true;
}
/**
* @dev Function to remove a minter
* @param minter The address of the minter to remove
* @return True if the operation was successful.
*/
function removeMinter(address minter)
external
onlyMasterMinter
returns (bool)
{
minters[minter] = false;
minterAllowed[minter] = 0;
emit MinterRemoved(minter);
return true;
}
/**
* @dev allows a minter to burn some of its own tokens
* Validates that caller is a minter and that sender is not blacklisted
* amount is less than or equal to the minter's account balance
* @param _amount uint256 the amount of tokens to be burned
*/
function burn(uint256 _amount)
external
whenNotPaused
onlyMinters
notBlacklisted(msg.sender)
{
uint256 balance = balances[msg.sender];
require(_amount > 0, "FiatToken: burn amount not greater than 0");
require(balance >= _amount, "FiatToken: burn amount exceeds balance");
totalSupply_ = totalSupply_.sub(_amount);
balances[msg.sender] = balance.sub(_amount);
emit Burn(msg.sender, _amount);
emit Transfer(msg.sender, address(0), _amount);
}
function updateMasterMinter(address _newMasterMinter) external onlyOwner {
require(
_newMasterMinter != address(0),
"FiatToken: new masterMinter is the zero address"
);
masterMinter = _newMasterMinter;
emit MasterMinterChanged(masterMinter);
}
}
// File: @openzeppelin/contracts/utils/Address.sol
// License: MIT
pragma solidity ^0.6.2;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash
= 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly {
codehash := extcodehash(account)
}
return (codehash != accountHash && codehash != 0x0);
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
"Address: insufficient balance"
);
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(
success,
"Address: unable to send value, recipient may have reverted"
);
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"Address: low-level call with value failed"
);
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(
address(this).balance >= value,
"Address: insufficient balance for call"
);
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 weiValue,
string memory errorMessage
) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{
value: weiValue
}(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
// License: MIT
pragma solidity ^0.6.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transfer.selector, to, value)
);
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
);
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(
token,
abi.encodeWithSelector(token.approve.selector, spender, value)
);
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(
value
);
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(
value,
"SafeERC20: decreased allowance below zero"
);
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(
data,
"SafeERC20: low-level call failed"
);
if (returndata.length > 0) {
// Return data is optional
// solhint-disable-next-line max-line-length
require(
abi.decode(returndata, (bool)),
"SafeERC20: ERC20 operation did not succeed"
);
}
}
}
// File: contracts/v1.1/Rescuable.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
contract Rescuable is Ownable {
using SafeERC20 for IERC20;
address private _rescuer;
event RescuerChanged(address indexed newRescuer);
/**
* @notice Returns current rescuer
* @return Rescuer's address
*/
function rescuer() external view returns (address) {
return _rescuer;
}
/**
* @notice Revert if called by any account other than the rescuer.
*/
modifier onlyRescuer() {
require(msg.sender == _rescuer, "Rescuable: caller is not the rescuer");
_;
}
/**
* @notice Rescue ERC20 tokens locked up in this contract.
* @param tokenContract ERC20 token contract address
* @param to Recipient address
* @param amount Amount to withdraw
*/
function rescueERC20(
IERC20 tokenContract,
address to,
uint256 amount
) external onlyRescuer {
tokenContract.safeTransfer(to, amount);
}
/**
* @notice Assign the rescuer role to a given address.
* @param newRescuer New rescuer's address
*/
function updateRescuer(address newRescuer) external onlyOwner {
require(
newRescuer != address(0),
"Rescuable: new rescuer is the zero address"
);
_rescuer = newRescuer;
emit RescuerChanged(newRescuer);
}
}
// File: contracts/v1.1/FiatTokenV1_1.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @title FiatTokenV1_1
* @dev ERC20 Token backed by fiat reserves
*/
contract FiatTokenV1_1 is FiatTokenV1, Rescuable {
}
// File: contracts/v2/AbstractFiatTokenV2.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
abstract contract AbstractFiatTokenV2 is AbstractFiatTokenV1 {
function _increaseAllowance(
address owner,
address spender,
uint256 increment
) internal virtual;
function _decreaseAllowance(
address owner,
address spender,
uint256 decrement
) internal virtual;
}
// File: contracts/util/ECRecover.sol
/**
* License: MIT
*
* Copyright (c) 2016-2019 zOS Global Limited
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @title ECRecover
* @notice A library that provides a safe ECDSA recovery function
*/
library ECRecover {
/**
* @notice Recover signer's address from a signed message
* @dev Adapted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/65e4ffde586ec89af3b7e9140bdc9235d1254853/contracts/cryptography/ECDSA.sol
* Modifications: Accept v, r, and s as separate arguments
* @param digest Keccak-256 hash digest of the signed message
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
* @return Signer address
*/
function recover(
bytes32 digest,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (
uint256(s) >
0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
) {
revert("ECRecover: invalid signature 's' value");
}
if (v != 27 && v != 28) {
revert("ECRecover: invalid signature 'v' value");
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(digest, v, r, s);
require(signer != address(0), "ECRecover: invalid signature");
return signer;
}
}
// File: contracts/util/EIP712.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @title EIP712
* @notice A library that provides EIP712 helper functions
*/
library EIP712 {
/**
* @notice Make EIP712 domain separator
* @param name Contract name
* @param version Contract version
* @return Domain separator
*/
function makeDomainSeparator(string memory name, string memory version)
internal
view
returns (bytes32)
{
uint256 chainId;
assembly {
chainId := chainid()
}
return
keccak256(
abi.encode(
0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f,
// = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
keccak256(bytes(name)),
keccak256(bytes(version)),
chainId,
address(this)
)
);
}
/**
* @notice Recover signer's address from a EIP712 signature
* @param domainSeparator Domain separator
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
* @param typeHashAndData Type hash concatenated with data
* @return Signer's address
*/
function recover(
bytes32 domainSeparator,
uint8 v,
bytes32 r,
bytes32 s,
bytes memory typeHashAndData
) internal pure returns (address) {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
domainSeparator,
keccak256(typeHashAndData)
)
);
return ECRecover.recover(digest, v, r, s);
}
}
// File: contracts/v2/EIP712Domain.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @title EIP712 Domain
*/
contract EIP712Domain {
/**
* @dev EIP712 Domain Separator
*/
bytes32 public DOMAIN_SEPARATOR;
}
// File: contracts/v2/GasAbstraction.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @title Gas Abstraction
* @notice Provide internal implementation for gas-abstracted transfers and
* approvals
* @dev Contracts that inherit from this must wrap these with publicly
* accessible functions, optionally adding modifiers where necessary
*/
abstract contract GasAbstraction is AbstractFiatTokenV2, EIP712Domain {
bytes32
public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = 0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267;
// = keccak256("TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)")
bytes32
public constant APPROVE_WITH_AUTHORIZATION_TYPEHASH = 0x808c10407a796f3ef2c7ea38c0638ea9d2b8a1c63e3ca9e1f56ce84ae59df73c;
// = keccak256("ApproveWithAuthorization(address owner,address spender,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)")
bytes32
public constant INCREASE_ALLOWANCE_WITH_AUTHORIZATION_TYPEHASH = 0x424222bb050a1f7f14017232a5671f2680a2d3420f504bd565cf03035c53198a;
// = keccak256("IncreaseAllowanceWithAuthorization(address owner,address spender,uint256 increment,uint256 validAfter,uint256 validBefore,bytes32 nonce)")
bytes32
public constant DECREASE_ALLOWANCE_WITH_AUTHORIZATION_TYPEHASH = 0xb70559e94cbda91958ebec07f9b65b3b490097c8d25c8dacd71105df1015b6d8;
// = keccak256("DecreaseAllowanceWithAuthorization(address owner,address spender,uint256 decrement,uint256 validAfter,uint256 validBefore,bytes32 nonce)")
bytes32
public constant CANCEL_AUTHORIZATION_TYPEHASH = 0x158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429;
// = keccak256("CancelAuthorization(address authorizer,bytes32 nonce)")
enum AuthorizationState { Unused, Used, Canceled }
/**
* @dev authorizer address => nonce => authorization state
*/
mapping(address => mapping(bytes32 => AuthorizationState))
private _authorizationStates;
event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce);
event AuthorizationCanceled(
address indexed authorizer,
bytes32 indexed nonce
);
/**
* @notice Returns the state of an authorization
* @param authorizer Authorizer's address
* @param nonce Nonce of the authorization
* @return Authorization state
*/
function authorizationState(address authorizer, bytes32 nonce)
external
view
returns (AuthorizationState)
{
return _authorizationStates[authorizer][nonce];
}
/**
* @notice Verify a signed transfer authorization and execute if valid
* @param from Payer's address (Authorizer)
* @param to Payee's address
* @param value Amount to be transferred
* @param validAfter The time after which this is valid (unix time)
* @param validBefore The time before which this is valid (unix time)
* @param nonce Unique nonce
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function _transferWithAuthorization(
address from,
address to,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) internal {
_requireValidAuthorization(from, nonce, validAfter, validBefore);
bytes memory data = abi.encode(
TRANSFER_WITH_AUTHORIZATION_TYPEHASH,
from,
to,
value,
validAfter,
validBefore,
nonce
);
require(
EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == from,
"FiatTokenV2: invalid signature"
);
_markAuthorizationAsUsed(from, nonce);
_transfer(from, to, value);
}
/**
* @notice Verify a signed authorization for an increase in the allowance
* granted to the spender and execute if valid
* @param owner Token owner's address (Authorizer)
* @param spender Spender's address
* @param increment Amount of increase in allowance
* @param validAfter The time after which this is valid (unix time)
* @param validBefore The time before which this is valid (unix time)
* @param nonce Unique nonce
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function _increaseAllowanceWithAuthorization(
address owner,
address spender,
uint256 increment,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) internal {
_requireValidAuthorization(owner, nonce, validAfter, validBefore);
bytes memory data = abi.encode(
INCREASE_ALLOWANCE_WITH_AUTHORIZATION_TYPEHASH,
owner,
spender,
increment,
validAfter,
validBefore,
nonce
);
require(
EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == owner,
"FiatTokenV2: invalid signature"
);
_markAuthorizationAsUsed(owner, nonce);
_increaseAllowance(owner, spender, increment);
}
/**
* @notice Verify a signed authorization for a decrease in the allowance
* granted to the spender and execute if valid
* @param owner Token owner's address (Authorizer)
* @param spender Spender's address
* @param decrement Amount of decrease in allowance
* @param validAfter The time after which this is valid (unix time)
* @param validBefore The time before which this is valid (unix time)
* @param nonce Unique nonce
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function _decreaseAllowanceWithAuthorization(
address owner,
address spender,
uint256 decrement,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) internal {
_requireValidAuthorization(owner, nonce, validAfter, validBefore);
bytes memory data = abi.encode(
DECREASE_ALLOWANCE_WITH_AUTHORIZATION_TYPEHASH,
owner,
spender,
decrement,
validAfter,
validBefore,
nonce
);
require(
EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == owner,
"FiatTokenV2: invalid signature"
);
_markAuthorizationAsUsed(owner, nonce);
_decreaseAllowance(owner, spender, decrement);
}
/**
* @notice Verify a signed approval authorization and execute if valid
* @param owner Token owner's address (Authorizer)
* @param spender Spender's address
* @param value Amount of allowance
* @param validAfter The time after which this is valid (unix time)
* @param validBefore The time before which this is valid (unix time)
* @param nonce Unique nonce
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function _approveWithAuthorization(
address owner,
address spender,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) internal {
_requireValidAuthorization(owner, nonce, validAfter, validBefore);
bytes memory data = abi.encode(
APPROVE_WITH_AUTHORIZATION_TYPEHASH,
owner,
spender,
value,
validAfter,
validBefore,
nonce
);
require(
EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == owner,
"FiatTokenV2: invalid signature"
);
_markAuthorizationAsUsed(owner, nonce);
_approve(owner, spender, value);
}
/**
* @notice Attempt to cancel an authorization
* @param authorizer Authorizer's address
* @param nonce Nonce of the authorization
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function _cancelAuthorization(
address authorizer,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) internal {
_requireUnusedAuthorization(authorizer, nonce);
bytes memory data = abi.encode(
CANCEL_AUTHORIZATION_TYPEHASH,
authorizer,
nonce
);
require(
EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == authorizer,
"FiatTokenV2: invalid signature"
);
_authorizationStates[authorizer][nonce] = AuthorizationState.Canceled;
emit AuthorizationCanceled(authorizer, nonce);
}
/**
* @notice Check that an authorization is unused
* @param authorizer Authorizer's address
* @param nonce Nonce of the authorization
*/
function _requireUnusedAuthorization(address authorizer, bytes32 nonce)
private
view
{
require(
_authorizationStates[authorizer][nonce] ==
AuthorizationState.Unused,
"FiatTokenV2: authorization is used or canceled"
);
}
/**
* @notice Check that authorization is valid
* @param authorizer Authorizer's address
* @param nonce Nonce of the authorization
* @param validAfter The time after which this is valid (unix time)
* @param validBefore The time before which this is valid (unix time)
*/
function _requireValidAuthorization(
address authorizer,
bytes32 nonce,
uint256 validAfter,
uint256 validBefore
) private view {
require(
now > validAfter,
"FiatTokenV2: authorization is not yet valid"
);
require(now < validBefore, "FiatTokenV2: authorization is expired");
_requireUnusedAuthorization(authorizer, nonce);
}
/**
* @notice Mark an authorization as used
* @param authorizer Authorizer's address
* @param nonce Nonce of the authorization
*/
function _markAuthorizationAsUsed(address authorizer, bytes32 nonce)
private
{
_authorizationStates[authorizer][nonce] = AuthorizationState.Used;
emit AuthorizationUsed(authorizer, nonce);
}
}
// File: contracts/v2/Permit.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @title Permit
* @notice An alternative to approveWithAuthorization, provided for
* compatibility with the draft EIP2612 proposed by Uniswap.
* @dev Differences:
* - Uses sequential nonce, which restricts transaction submission to one at a
* time, or else it will revert
* - Has deadline (= validBefore - 1) but does not have validAfter
* - Doesn't have a way to change allowance atomically to prevent ERC20 multiple
* withdrawal attacks
*/
abstract contract Permit is AbstractFiatTokenV2, EIP712Domain {
bytes32
public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
// = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")
mapping(address => uint256) private _permitNonces;
/**
* @notice Nonces for permit
* @param owner Token owner's address (Authorizer)
* @return Next nonce
*/
function nonces(address owner) external view returns (uint256) {
return _permitNonces[owner];
}
/**
* @notice Verify a signed approval permit and execute if valid
* @param owner Token owner's address (Authorizer)
* @param spender Spender's address
* @param value Amount of allowance
* @param deadline The time at which this expires (unix time)
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function _permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
require(deadline >= now, "FiatTokenV2: permit is expired");
bytes memory data = abi.encode(
PERMIT_TYPEHASH,
owner,
spender,
value,
_permitNonces[owner]++,
deadline
);
require(
EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) == owner,
"FiatTokenV2: invalid signature"
);
_approve(owner, spender, value);
}
}
// File: contracts/v2/FiatTokenV2.sol
/**
* License: MIT
*
* Copyright (c) 2018-2020 CENTRE SECZ
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.6.12;
/**
* @title FiatToken V2
* @notice ERC20 Token backed by fiat reserves, version 2
*/
contract FiatTokenV2 is FiatTokenV1_1, GasAbstraction, Permit {
bool internal _initializedV2;
/**
* @notice Initialize V2 contract
* @dev When upgrading to V2, this function must also be invoked by using
* upgradeToAndCall instead of upgradeTo, or by calling both from a contract
* in a single transaction.
* @param newName New token name
*/
function initializeV2(string calldata newName) external {
require(
!_initializedV2,
"FiatTokenV2: contract is already initialized"
);
name = newName;
DOMAIN_SEPARATOR = EIP712.makeDomainSeparator(newName, "2");
_initializedV2 = true;
}
/**
* @notice Increase the allowance by a given increment
* @param spender Spender's address
* @param increment Amount of increase in allowance
* @return True if successful
*/
function increaseAllowance(address spender, uint256 increment)
external
whenNotPaused
notBlacklisted(msg.sender)
notBlacklisted(spender)
returns (bool)
{
_increaseAllowance(msg.sender, spender, increment);
return true;
}
/**
* @notice Decrease the allowance by a given decrement
* @param spender Spender's address
* @param decrement Amount of decrease in allowance
* @return True if successful
*/
function decreaseAllowance(address spender, uint256 decrement)
external
whenNotPaused
notBlacklisted(msg.sender)
notBlacklisted(spender)
returns (bool)
{
_decreaseAllowance(msg.sender, spender, decrement);
return true;
}
/**
* @notice Execute a transfer with a signed authorization
* @param from Payer's address (Authorizer)
* @param to Payee's address
* @param value Amount to be transferred
* @param validAfter The time after which this is valid (unix time)
* @param validBefore The time before which this is valid (unix time)
* @param nonce Unique nonce
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function transferWithAuthorization(
address from,
address to,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) external whenNotPaused notBlacklisted(from) notBlacklisted(to) {
_transferWithAuthorization(
from,
to,
value,
validAfter,
validBefore,
nonce,
v,
r,
s
);
}
/**
* @notice Update allowance with a signed authorization
* @param owner Token owner's address (Authorizer)
* @param spender Spender's address
* @param value Amount of allowance
* @param validAfter The time after which this is valid (unix time)
* @param validBefore The time before which this is valid (unix time)
* @param nonce Unique nonce
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function approveWithAuthorization(
address owner,
address spender,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) external whenNotPaused notBlacklisted(owner) notBlacklisted(spender) {
_approveWithAuthorization(
owner,
spender,
value,
validAfter,
validBefore,
nonce,
v,
r,
s
);
}
/**
* @notice Increase allowance with a signed authorization
* @param owner Token owner's address (Authorizer)
* @param spender Spender's address
* @param increment Amount of increase in allowance
* @param validAfter The time after which this is valid (unix time)
* @param validBefore The time before which this is valid (unix time)
* @param nonce Unique nonce
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function increaseAllowanceWithAuthorization(
address owner,
address spender,
uint256 increment,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) external whenNotPaused notBlacklisted(owner) notBlacklisted(spender) {
_increaseAllowanceWithAuthorization(
owner,
spender,
increment,
validAfter,
validBefore,
nonce,
v,
r,
s
);
}
/**
* @notice Decrease allowance with a signed authorization
* @param owner Token owner's address (Authorizer)
* @param spender Spender's address
* @param decrement Amount of decrease in allowance
* @param validAfter The time after which this is valid (unix time)
* @param validBefore The time before which this is valid (unix time)
* @param nonce Unique nonce
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function decreaseAllowanceWithAuthorization(
address owner,
address spender,
uint256 decrement,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) external whenNotPaused notBlacklisted(owner) notBlacklisted(spender) {
_decreaseAllowanceWithAuthorization(
owner,
spender,
decrement,
validAfter,
validBefore,
nonce,
v,
r,
s
);
}
/**
* @notice Attempt to cancel an authorization
* @dev Works only if the authorization is not yet used.
* @param authorizer Authorizer's address
* @param nonce Nonce of the authorization
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function cancelAuthorization(
address authorizer,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) external whenNotPaused {
_cancelAuthorization(authorizer, nonce, v, r, s);
}
/**
* @notice Update allowance with a signed permit
* @param owner Token owner's address (Authorizer)
* @param spender Spender's address
* @param value Amount of allowance
* @param deadline Expiration time, seconds since the epoch
* @param v v of the signature
* @param r r of the signature
* @param s s of the signature
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external whenNotPaused notBlacklisted(owner) notBlacklisted(spender) {
_permit(owner, spender, value, deadline, v, r, s);
}
/**
* @notice Internal function to increase the allowance by a given increment
* @param owner Token owner's address
* @param spender Spender's address
* @param increment Amount of increase
*/
function _increaseAllowance(
address owner,
address spender,
uint256 increment
) internal override {
_approve(owner, spender, allowed[owner][spender].add(increment));
}
/**
* @notice Internal function to decrease the allowance by a given decrement
* @param owner Token owner's address
* @param spender Spender's address
* @param decrement Amount of decrease
*/
function _decreaseAllowance(
address owner,
address spender,
uint256 decrement
) internal override {
_approve(
owner,
spender,
allowed[owner][spender].sub(
decrement,
"ERC20: decreased allowance below zero"
)
);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"Blacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBlacklister","type":"address"}],"name":"BlacklisterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMasterMinter","type":"address"}],"name":"MasterMinterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"minterAllowedAmount","type":"uint256"}],"name":"MinterConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMinter","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"PauserChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRescuer","type":"address"}],"name":"RescuerChanged","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"UnBlacklisted","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[],"name":"APPROVE_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CANCEL_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECREASE_ALLOWANCE_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INCREASE_ALLOWANCE_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"approveWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"authorizationState","outputs":[{"internalType":"enum GasAbstraction.AuthorizationState","name":"","type":"uint8"}],"stateMutability":"view","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":"_account","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blacklister","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"cancelAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"minterAllowedAmount","type":"uint256"}],"name":"configureMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"decrement","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"decreaseAllowanceWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"increment","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"increaseAllowanceWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"string","name":"tokenCurrency","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"address","name":"newMasterMinter","type":"address"},{"internalType":"address","name":"newPauser","type":"address"},{"internalType":"address","name":"newBlacklister","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"initializeV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"minterAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenContract","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescuer","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":[{"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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"unBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newBlacklister","type":"address"}],"name":"updateBlacklister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMasterMinter","type":"address"}],"name":"updateMasterMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPauser","type":"address"}],"name":"updatePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRescuer","type":"address"}],"name":"updateRescuer","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526001805460ff60a01b191690556000600b553480156200002357600080fd5b506200002f3362000035565b62000057565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b615a6980620000676000396000f3fe608060405234801561001057600080fd5b506004361061034c5760003560e01c80638a6db9c3116101bd578063c237108f116100f9578063e1560fd3116100a2578063e94a01021161007c578063e94a010214610db7578063f2fde38b14610e11578063f9f92be414610e44578063fe575a8714610e775761034c565b8063e1560fd314610cd7578063e3ee160e14610d43578063e5a6b10f14610daf5761034c565b8063d608ea64116100d3578063d608ea6414610c24578063d916948714610c94578063dd62ed3e14610c9c5761034c565b8063c237108f14610b52578063c7b84f8d14610bbe578063d505accf14610bc65761034c565b8063a9059cbb11610166578063ad38bf2211610140578063ad38bf2214610a68578063b008609514610a9b578063b2118a8d14610b07578063bd10243014610b4a5761034c565b8063a9059cbb146109c9578063aa20e1e414610a02578063aa271e1a14610a355761034c565b80639fd0506d116101975780639fd0506d14610980578063a0cc6a6814610988578063a457c2d7146109905761034c565b80638a6db9c31461093d5780638da5cb5b1461097057806395d89b41146109785761034c565b806338a631831161028c5780634e44d956116102355780635c975abb1161020f5780635c975abb146108c757806370a08231146108cf5780637ecebe00146109025780638456cb59146109355761034c565b80634e44d9561461080d578063554bab3c146108465780635a049a70146108795761034c565b806340c10f191161026657806340c10f19146107af57806342966c68146107e85780634b71f5c3146108055761034c565b806338a6318314610766578063395093511461076e5780633f4ba83a146107a75761034c565b80632ab60045116102f9578063313ce567116102d3578063313ce567146105235780633357162b1461054157806335d99f351461072d5780633644e5151461075e5761034c565b80632ab60045146104b55780633092afd5146104e857806330adf81f1461051b5761034c565b806318160ddd1161032a57806318160ddd146104355780631a8952661461043d57806323b872dd146104725761034c565b806306fdde0314610351578063095ea7b3146103ce57806310c8b4041461041b575b600080fd5b610359610eaa565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561039357818101518382015260200161037b565b50505050905090810190601f1680156103c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610407600480360360408110156103e457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f56565b604080519115158252519081900360200190f35b6104236110e3565b60408051918252519081900360200190f35b610423611107565b6104706004803603602081101561045357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661110d565b005b6104076004803603606081101561048857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356111f1565b610470600480360360208110156104cb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166114f7565b610407600480360360208110156104fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611658565b610423611751565b61052b611775565b6040805160ff9092168252519081900360200190f35b610470600480360361010081101561055857600080fd5b81019060208101813564010000000081111561057357600080fd5b82018360208201111561058557600080fd5b803590602001918460018302840111640100000000831117156105a757600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105fa57600080fd5b82018360208201111561060c57600080fd5b8035906020019184600183028401116401000000008311171561062e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561068157600080fd5b82018360208201111561069357600080fd5b803590602001918460018302840111640100000000831117156106b557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602081013573ffffffffffffffffffffffffffffffffffffffff9081169160408101358216916060820135811691608001351661177e565b610735611ac0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610423611adc565b610735611ae2565b6104076004803603604081101561078457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611afe565b610470611c80565b610407600480360360408110156107c557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d43565b610470600480360360208110156107fe57600080fd5b5035612178565b610423612432565b6104076004803603604081101561082357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612456565b6104706004803603602081101561085c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125e9565b610470600480360360a081101561088f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060ff6040820135169060608101359060800135612750565b6104076127ee565b610423600480360360208110156108e557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661280f565b6104236004803603602081101561091857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612837565b61047061285f565b6104236004803603602081101561095357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612939565b610735612961565b61035961297d565b6107356129f6565b610423612a12565b610407600480360360408110156109a657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612a36565b610407600480360360408110156109df57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612bb8565b61047060048036036020811015610a1857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612d3a565b61040760048036036020811015610a4b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ea1565b61047060048036036020811015610a7e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ecc565b6104706004803603610120811015610ab257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135613033565b61047060048036036060811015610b1d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356131dd565b610735613273565b6104706004803603610120811015610b6957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e081013590610100013561328f565b61042361342c565b610470600480360360e0811015610bdc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135613450565b61047060048036036020811015610c3a57600080fd5b810190602081018135640100000000811115610c5557600080fd5b820183602082011115610c6757600080fd5b80359060200191846001830284011164010000000083111715610c8957600080fd5b5090925090506135f6565b610423613705565b61042360048036036040811015610cb257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516613729565b6104706004803603610120811015610cee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135613761565b6104706004803603610120811015610d5a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e08101359061010001356138fe565b610359613a9b565b610df060048036036040811015610dcd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135613b14565b60405180826002811115610e0057fe5b815260200191505060405180910390f35b61047060048036036020811015610e2757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613b4c565b61047060048036036020811015610e5a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613c9f565b61040760048036036020811015610e8d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613d86565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b820191906000526020600020905b815481529060010190602001808311610f3157829003601f168201915b505050505081565b60015460009074010000000000000000000000000000000000000000900460ff1615610fe357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff161561104c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff16156110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6110d8338686613db1565b506001949350505050565b7f808c10407a796f3ef2c7ea38c0638ea9d2b8a1c63e3ca9e1f56ce84ae59df73c81565b600b5490565b60025473ffffffffffffffffffffffffffffffffffffffff16331461117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806156e2602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60015460009074010000000000000000000000000000000000000000900460ff161561127e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff16156112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff1615611368576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff16156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a60209081526040808320338452909152902054851115611472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806157a86028913960400191505060405180910390fd5b61147d878787613ef8565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602090815260408083203384529091529020546114b89086614123565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320338452909152902055600193505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461157d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166115e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615640602a913960400191505060405180910390fd5b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b60085460009073ffffffffffffffffffffffffffffffffffffffff1633146116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806156b96029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600d909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a2506001919050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460ff1681565b60085474010000000000000000000000000000000000000000900460ff16156117f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806157fe602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615755602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806156176029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806157d0602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061593d6028913960400191505060405180910390fd5b87516119b59060049060208b01906153c7565b5086516119c99060059060208a01906153c7565b5085516119dd9060079060208901906153c7565b50600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8716179055600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560018054821686841617905560028054909116918416919091179055611a778161416c565b5050600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b600e5473ffffffffffffffffffffffffffffffffffffffff1690565b60015460009074010000000000000000000000000000000000000000900460ff1615611b8b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615611bf4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611c75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6110d83386866141b3565b60015473ffffffffffffffffffffffffffffffffffffffff163314611cf0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158cb6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60015460009074010000000000000000000000000000000000000000900460ff1615611dd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff16611e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157346021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615611ea1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611f8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806155866023913960400191505060405180910390fd5b60008411611fe7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061566a6029913960400191505060405180910390fd5b336000908152600d602052604090205480851115612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061589d602e913960400191505060405180910390fd5b600b5461205d90866141fd565b600b5573ffffffffffffffffffffffffffffffffffffffff861660009081526009602052604090205461209090866141fd565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600960205260409020556120c08186614123565b336000818152600d6020908152604091829020939093558051888152905173ffffffffffffffffffffffffffffffffffffffff8a16937fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8928290030190a360408051868152905173ffffffffffffffffffffffffffffffffffffffff8816916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600195945050505050565b60015474010000000000000000000000000000000000000000900460ff161561220257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff1661226a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157346021913960400191505060405180910390fd5b3360008181526003602052604090205460ff16156122d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b3360009081526009602052604090205482612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061555d6029913960400191505060405180910390fd5b82811015612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061570e6026913960400191505060405180910390fd5b600b5461239f9084614123565b600b556123ac8184614123565b33600081815260096020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a260408051848152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b7fb70559e94cbda91958ebec07f9b65b3b490097c8d25c8dacd71105df1015b6d881565b60015460009074010000000000000000000000000000000000000000900460ff16156124e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60085473ffffffffffffffffffffffffffffffffffffffff163314612553576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806156b96029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d825291829020859055815185815291517f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d209281900390910190a250600192915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461266f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166126db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061550a6028913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b60015474010000000000000000000000000000000000000000900460ff16156127da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6127e78585858585614271565b5050505050565b60015474010000000000000000000000000000000000000000900460ff1681565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b60015473ffffffffffffffffffffffffffffffffffffffff1633146128cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158cb6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b60015460009074010000000000000000000000000000000000000000900460ff1615612ac357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612b2c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612bad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6110d83386866143fa565b60015460009074010000000000000000000000000000000000000000900460ff1615612c4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612cae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612d2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6110d8338686613ef8565b60005473ffffffffffffffffffffffffffffffffffffffff163314612dc057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612e2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615755602f913960400191505060405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314612f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612fbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806159936032913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b60015474010000000000000000000000000000000000000000900460ff16156130bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff161561313e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff16156131bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6131d08b8b8b8b8b8b8b8b8b614456565b5050505050505050505050565b600e5473ffffffffffffffffffffffffffffffffffffffff16331461324d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806157846024913960400191505060405180910390fd5b61326e73ffffffffffffffffffffffffffffffffffffffff84168383614598565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60015474010000000000000000000000000000000000000000900460ff161561331957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff161561339a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff161561341b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6131d08b8b8b8b8b8b8b8b8b614625565b7f424222bb050a1f7f14017232a5671f2680a2d3420f504bd565cf03035c53198a81565b60015474010000000000000000000000000000000000000000900460ff16156134da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561355b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff16156135dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6135eb8989898989898961475b565b505050505050505050565b60125460ff1615613652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615828602c913960400191505060405180910390fd5b61365e60048383615445565b506136d382828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015291506149049050565b600f555050601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600a6020908152604080832093909416825291909152205490565b60015474010000000000000000000000000000000000000000900460ff16156137eb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff161561386c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff16156138ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6131d08b8b8b8b8b8b8b8b8b614976565b60015474010000000000000000000000000000000000000000900460ff161561398857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613a09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613a8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6131d08b8b8b8b8b8b8b8b8b614aac565b6007805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152601060209081526040808320938352929052205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314613bd257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613c3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155cf6026913960400191505060405180910390fd5b6000546040805173ffffffffffffffffffffffffffffffffffffffff9283168152918316602083015280517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09281900390910190a1613c9c8161416c565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314613d0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806156e2602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8316613e1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158796024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613e89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806155f56022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600a6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316613f64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806158546025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613fd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154e76023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205481111561404e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806156936026913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205461407e9082614123565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526009602052604080822093909355908416815220546140ba90826141fd565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526009602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600061416583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614be2565b9392505050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600a602090815260408083209386168352929052205461326e90849084906141f890856141fd565b613db1565b60008282018381101561416557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61427b8585614c93565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff87168183018190526060828101889052835180840390910181526080909201909252600f549091906142ef9086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff161461437157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616600081815260106020908152604080832089845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b61326e83836141f884604051806060016040528060258152602001615a0f6025913973ffffffffffffffffffffffffffffffffffffffff808a166000908152600a60209081526040808320938c16835292905220549190614be2565b61446289858888614d9e565b604080517fb70559e94cbda91958ebec07f9b65b3b490097c8d25c8dacd71105df1015b6d8602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906144f59086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff161461457757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6145818a86614e5e565b61458c8a8a8a6143fa565b50505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261326e908490614ee3565b61463189858888614d9e565b604080517f424222bb050a1f7f14017232a5671f2680a2d3420f504bd565cf03035c53198a602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906146c49086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff161461474657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6147508a86614e5e565b61458c8a8a8a6141b3565b428410156147ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a207065726d697420697320657870697265640000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80881660008181526011602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c992810192909252818301849052938a1660608201526080810189905260a081019390935260c08084018890528151808503909101815260e09093019052600f5461486d9086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff16146148ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6148fa888888613db1565b5050505050505050565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b61498289858888614d9e565b604080517f808c10407a796f3ef2c7ea38c0638ea9d2b8a1c63e3ca9e1f56ce84ae59df73c602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f54909190614a159086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff1614614a9757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b614aa18a86614e5e565b61458c8a8a8a613db1565b614ab889858888614d9e565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f54909190614b4b9086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff1614614bcd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b614bd78a86614e5e565b61458c8a8a8a613ef8565b60008184841115614c8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614c50578181015183820152602001614c38565b50505050905090810190601f168015614c7d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260106020908152604080832084845290915281205460ff166002811115614cd257fe5b14614d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615965602e913960400191505060405180910390fd5b5050565b8051602080830191909120604080517f190100000000000000000000000000000000000000000000000000000000000081850152602281018990526042808201939093528151808203909301835260620190528051910120600090614d9381878787614fbb565b979650505050505050565b814211614df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615532602b913960400191505060405180910390fd5b804210614e4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159ea6025913960400191505060405180910390fd5b614e588484614c93565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260106020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b6060614f45826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166151b89092919063ffffffff16565b80519091501561326e57808060200190516020811015614f6457600080fd5b505161326e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615913602a913960400191505060405180910390fd5b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115615036576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806158ed6026913960400191505060405180910390fd5b8360ff16601b1415801561504e57508360ff16601c14155b156150a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155a96026913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015615100573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166151ad57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e617475726500000000604482015290519081900360640190fd5b90505b949350505050565b60606151b0848460008560606151cd8561538e565b61523857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106152a257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101615265565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615304576040519150601f19603f3d011682016040523d82523d6000602084013e615309565b606091505b5091509150811561531d5791506151b09050565b80511561532d5780518082602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152865160248401528651879391928392604401919085019080838360008315614c50578181015183820152602001614c38565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906151b0575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061540857805160ff1916838001178555615435565b82800160010185558215615435579182015b8281111561543557825182559160200191906001019061541a565b506154419291506154d1565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106154a4578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555615435565b82800160010185558215615435579182015b828111156154355782358255916020019190600101906154b6565b5b8082111561544157600081556001016154d256fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735061757361626c653a206e65772070617573657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e206973206e6f74207965742076616c696446696174546f6b656e3a206275726e20616d6f756e74206e6f742067726561746572207468616e203046696174546f6b656e3a206d696e7420746f20746865207a65726f206164647265737345435265636f7665723a20696e76616c6964207369676e6174757265202776272076616c75654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737346696174546f6b656e3a206e65772070617573657220697320746865207a65726f2061646472657373526573637561626c653a206e6577207265736375657220697320746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e74206e6f742067726561746572207468616e203045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d61737465724d696e746572426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686520626c61636b6c697374657246696174546f6b656e3a206275726e20616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e74657246696174546f6b656e3a206e6577206d61737465724d696e74657220697320746865207a65726f2061646472657373526573637561626c653a2063616c6c6572206973206e6f7420746865207265736375657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636546696174546f6b656e3a206e657720626c61636b6c697374657220697320746865207a65726f206164647265737346696174546f6b656e3a20636f6e747261637420697320616c726561647920696e697469616c697a656446696174546f6b656e56323a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d696e746572416c6c6f77616e63655061757361626c653a2063616c6c6572206973206e6f74207468652070617573657245435265636f7665723a20696e76616c6964207369676e6174757265202773272076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656446696174546f6b656e3a206e6577206f776e657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e2069732075736564206f722063616e63656c6564426c61636b6c69737461626c653a206e657720626c61636b6c697374657220697320746865207a65726f2061646472657373426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c697374656446696174546f6b656e56323a20617574686f72697a6174696f6e206973206578706972656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c597a662f3eab19e5d6fa8c5be1a17afe3947c109efd3c3e947f445f8ccaedf164736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061034c5760003560e01c80638a6db9c3116101bd578063c237108f116100f9578063e1560fd3116100a2578063e94a01021161007c578063e94a010214610db7578063f2fde38b14610e11578063f9f92be414610e44578063fe575a8714610e775761034c565b8063e1560fd314610cd7578063e3ee160e14610d43578063e5a6b10f14610daf5761034c565b8063d608ea64116100d3578063d608ea6414610c24578063d916948714610c94578063dd62ed3e14610c9c5761034c565b8063c237108f14610b52578063c7b84f8d14610bbe578063d505accf14610bc65761034c565b8063a9059cbb11610166578063ad38bf2211610140578063ad38bf2214610a68578063b008609514610a9b578063b2118a8d14610b07578063bd10243014610b4a5761034c565b8063a9059cbb146109c9578063aa20e1e414610a02578063aa271e1a14610a355761034c565b80639fd0506d116101975780639fd0506d14610980578063a0cc6a6814610988578063a457c2d7146109905761034c565b80638a6db9c31461093d5780638da5cb5b1461097057806395d89b41146109785761034c565b806338a631831161028c5780634e44d956116102355780635c975abb1161020f5780635c975abb146108c757806370a08231146108cf5780637ecebe00146109025780638456cb59146109355761034c565b80634e44d9561461080d578063554bab3c146108465780635a049a70146108795761034c565b806340c10f191161026657806340c10f19146107af57806342966c68146107e85780634b71f5c3146108055761034c565b806338a6318314610766578063395093511461076e5780633f4ba83a146107a75761034c565b80632ab60045116102f9578063313ce567116102d3578063313ce567146105235780633357162b1461054157806335d99f351461072d5780633644e5151461075e5761034c565b80632ab60045146104b55780633092afd5146104e857806330adf81f1461051b5761034c565b806318160ddd1161032a57806318160ddd146104355780631a8952661461043d57806323b872dd146104725761034c565b806306fdde0314610351578063095ea7b3146103ce57806310c8b4041461041b575b600080fd5b610359610eaa565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561039357818101518382015260200161037b565b50505050905090810190601f1680156103c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610407600480360360408110156103e457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f56565b604080519115158252519081900360200190f35b6104236110e3565b60408051918252519081900360200190f35b610423611107565b6104706004803603602081101561045357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661110d565b005b6104076004803603606081101561048857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356111f1565b610470600480360360208110156104cb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166114f7565b610407600480360360208110156104fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611658565b610423611751565b61052b611775565b6040805160ff9092168252519081900360200190f35b610470600480360361010081101561055857600080fd5b81019060208101813564010000000081111561057357600080fd5b82018360208201111561058557600080fd5b803590602001918460018302840111640100000000831117156105a757600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105fa57600080fd5b82018360208201111561060c57600080fd5b8035906020019184600183028401116401000000008311171561062e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561068157600080fd5b82018360208201111561069357600080fd5b803590602001918460018302840111640100000000831117156106b557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602081013573ffffffffffffffffffffffffffffffffffffffff9081169160408101358216916060820135811691608001351661177e565b610735611ac0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610423611adc565b610735611ae2565b6104076004803603604081101561078457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611afe565b610470611c80565b610407600480360360408110156107c557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d43565b610470600480360360208110156107fe57600080fd5b5035612178565b610423612432565b6104076004803603604081101561082357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612456565b6104706004803603602081101561085c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125e9565b610470600480360360a081101561088f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060ff6040820135169060608101359060800135612750565b6104076127ee565b610423600480360360208110156108e557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661280f565b6104236004803603602081101561091857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612837565b61047061285f565b6104236004803603602081101561095357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612939565b610735612961565b61035961297d565b6107356129f6565b610423612a12565b610407600480360360408110156109a657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612a36565b610407600480360360408110156109df57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612bb8565b61047060048036036020811015610a1857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612d3a565b61040760048036036020811015610a4b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ea1565b61047060048036036020811015610a7e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ecc565b6104706004803603610120811015610ab257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135613033565b61047060048036036060811015610b1d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356131dd565b610735613273565b6104706004803603610120811015610b6957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e081013590610100013561328f565b61042361342c565b610470600480360360e0811015610bdc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135613450565b61047060048036036020811015610c3a57600080fd5b810190602081018135640100000000811115610c5557600080fd5b820183602082011115610c6757600080fd5b80359060200191846001830284011164010000000083111715610c8957600080fd5b5090925090506135f6565b610423613705565b61042360048036036040811015610cb257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516613729565b6104706004803603610120811015610cee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135613761565b6104706004803603610120811015610d5a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e08101359061010001356138fe565b610359613a9b565b610df060048036036040811015610dcd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135613b14565b60405180826002811115610e0057fe5b815260200191505060405180910390f35b61047060048036036020811015610e2757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613b4c565b61047060048036036020811015610e5a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613c9f565b61040760048036036020811015610e8d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613d86565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b820191906000526020600020905b815481529060010190602001808311610f3157829003601f168201915b505050505081565b60015460009074010000000000000000000000000000000000000000900460ff1615610fe357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff161561104c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff16156110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6110d8338686613db1565b506001949350505050565b7f808c10407a796f3ef2c7ea38c0638ea9d2b8a1c63e3ca9e1f56ce84ae59df73c81565b600b5490565b60025473ffffffffffffffffffffffffffffffffffffffff16331461117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806156e2602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60015460009074010000000000000000000000000000000000000000900460ff161561127e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff16156112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff1615611368576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff16156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a60209081526040808320338452909152902054851115611472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806157a86028913960400191505060405180910390fd5b61147d878787613ef8565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602090815260408083203384529091529020546114b89086614123565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320338452909152902055600193505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461157d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166115e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615640602a913960400191505060405180910390fd5b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b60085460009073ffffffffffffffffffffffffffffffffffffffff1633146116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806156b96029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600d909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a2506001919050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460ff1681565b60085474010000000000000000000000000000000000000000900460ff16156117f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806157fe602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615755602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806156176029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806157d0602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061593d6028913960400191505060405180910390fd5b87516119b59060049060208b01906153c7565b5086516119c99060059060208a01906153c7565b5085516119dd9060079060208901906153c7565b50600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8716179055600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560018054821686841617905560028054909116918416919091179055611a778161416c565b5050600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b600e5473ffffffffffffffffffffffffffffffffffffffff1690565b60015460009074010000000000000000000000000000000000000000900460ff1615611b8b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615611bf4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611c75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6110d83386866141b3565b60015473ffffffffffffffffffffffffffffffffffffffff163314611cf0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158cb6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60015460009074010000000000000000000000000000000000000000900460ff1615611dd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff16611e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157346021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615611ea1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611f22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611f8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806155866023913960400191505060405180910390fd5b60008411611fe7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061566a6029913960400191505060405180910390fd5b336000908152600d602052604090205480851115612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061589d602e913960400191505060405180910390fd5b600b5461205d90866141fd565b600b5573ffffffffffffffffffffffffffffffffffffffff861660009081526009602052604090205461209090866141fd565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600960205260409020556120c08186614123565b336000818152600d6020908152604091829020939093558051888152905173ffffffffffffffffffffffffffffffffffffffff8a16937fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8928290030190a360408051868152905173ffffffffffffffffffffffffffffffffffffffff8816916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600195945050505050565b60015474010000000000000000000000000000000000000000900460ff161561220257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff1661226a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157346021913960400191505060405180910390fd5b3360008181526003602052604090205460ff16156122d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b3360009081526009602052604090205482612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061555d6029913960400191505060405180910390fd5b82811015612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061570e6026913960400191505060405180910390fd5b600b5461239f9084614123565b600b556123ac8184614123565b33600081815260096020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a260408051848152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b7fb70559e94cbda91958ebec07f9b65b3b490097c8d25c8dacd71105df1015b6d881565b60015460009074010000000000000000000000000000000000000000900460ff16156124e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60085473ffffffffffffffffffffffffffffffffffffffff163314612553576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806156b96029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d825291829020859055815185815291517f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d209281900390910190a250600192915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461266f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166126db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061550a6028913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b60015474010000000000000000000000000000000000000000900460ff16156127da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6127e78585858585614271565b5050505050565b60015474010000000000000000000000000000000000000000900460ff1681565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b60015473ffffffffffffffffffffffffffffffffffffffff1633146128cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158cb6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b60015460009074010000000000000000000000000000000000000000900460ff1615612ac357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612b2c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612bad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6110d83386866143fa565b60015460009074010000000000000000000000000000000000000000900460ff1615612c4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612cae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612d2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6110d8338686613ef8565b60005473ffffffffffffffffffffffffffffffffffffffff163314612dc057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612e2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615755602f913960400191505060405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314612f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612fbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806159936032913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b60015474010000000000000000000000000000000000000000900460ff16156130bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff161561313e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff16156131bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6131d08b8b8b8b8b8b8b8b8b614456565b5050505050505050505050565b600e5473ffffffffffffffffffffffffffffffffffffffff16331461324d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806157846024913960400191505060405180910390fd5b61326e73ffffffffffffffffffffffffffffffffffffffff84168383614598565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60015474010000000000000000000000000000000000000000900460ff161561331957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff161561339a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff161561341b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6131d08b8b8b8b8b8b8b8b8b614625565b7f424222bb050a1f7f14017232a5671f2680a2d3420f504bd565cf03035c53198a81565b60015474010000000000000000000000000000000000000000900460ff16156134da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561355b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff16156135dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6135eb8989898989898961475b565b505050505050505050565b60125460ff1615613652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615828602c913960400191505060405180910390fd5b61365e60048383615445565b506136d382828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015291506149049050565b600f555050601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600a6020908152604080832093909416825291909152205490565b60015474010000000000000000000000000000000000000000900460ff16156137eb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff161561386c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff16156138ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6131d08b8b8b8b8b8b8b8b8b614976565b60015474010000000000000000000000000000000000000000900460ff161561398857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613a09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613a8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159c56025913960400191505060405180910390fd5b6131d08b8b8b8b8b8b8b8b8b614aac565b6007805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152601060209081526040808320938352929052205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314613bd257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613c3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155cf6026913960400191505060405180910390fd5b6000546040805173ffffffffffffffffffffffffffffffffffffffff9283168152918316602083015280517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09281900390910190a1613c9c8161416c565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314613d0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806156e2602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8316613e1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158796024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613e89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806155f56022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600a6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316613f64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806158546025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613fd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154e76023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205481111561404e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806156936026913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205461407e9082614123565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526009602052604080822093909355908416815220546140ba90826141fd565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526009602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600061416583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614be2565b9392505050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600a602090815260408083209386168352929052205461326e90849084906141f890856141fd565b613db1565b60008282018381101561416557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61427b8585614c93565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff87168183018190526060828101889052835180840390910181526080909201909252600f549091906142ef9086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff161461437157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616600081815260106020908152604080832089845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b61326e83836141f884604051806060016040528060258152602001615a0f6025913973ffffffffffffffffffffffffffffffffffffffff808a166000908152600a60209081526040808320938c16835292905220549190614be2565b61446289858888614d9e565b604080517fb70559e94cbda91958ebec07f9b65b3b490097c8d25c8dacd71105df1015b6d8602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906144f59086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff161461457757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6145818a86614e5e565b61458c8a8a8a6143fa565b50505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261326e908490614ee3565b61463189858888614d9e565b604080517f424222bb050a1f7f14017232a5671f2680a2d3420f504bd565cf03035c53198a602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906146c49086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff161461474657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6147508a86614e5e565b61458c8a8a8a6141b3565b428410156147ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a207065726d697420697320657870697265640000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80881660008181526011602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c992810192909252818301849052938a1660608201526080810189905260a081019390935260c08084018890528151808503909101815260e09093019052600f5461486d9086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff16146148ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6148fa888888613db1565b5050505050505050565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b61498289858888614d9e565b604080517f808c10407a796f3ef2c7ea38c0638ea9d2b8a1c63e3ca9e1f56ce84ae59df73c602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f54909190614a159086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff1614614a9757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b614aa18a86614e5e565b61458c8a8a8a613db1565b614ab889858888614d9e565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f54909190614b4b9086868686614d2c565b73ffffffffffffffffffffffffffffffffffffffff1614614bcd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b614bd78a86614e5e565b61458c8a8a8a613ef8565b60008184841115614c8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614c50578181015183820152602001614c38565b50505050905090810190601f168015614c7d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260106020908152604080832084845290915281205460ff166002811115614cd257fe5b14614d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615965602e913960400191505060405180910390fd5b5050565b8051602080830191909120604080517f190100000000000000000000000000000000000000000000000000000000000081850152602281018990526042808201939093528151808203909301835260620190528051910120600090614d9381878787614fbb565b979650505050505050565b814211614df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615532602b913960400191505060405180910390fd5b804210614e4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806159ea6025913960400191505060405180910390fd5b614e588484614c93565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260106020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b6060614f45826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166151b89092919063ffffffff16565b80519091501561326e57808060200190516020811015614f6457600080fd5b505161326e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615913602a913960400191505060405180910390fd5b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115615036576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806158ed6026913960400191505060405180910390fd5b8360ff16601b1415801561504e57508360ff16601c14155b156150a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155a96026913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015615100573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166151ad57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e617475726500000000604482015290519081900360640190fd5b90505b949350505050565b60606151b0848460008560606151cd8561538e565b61523857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106152a257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101615265565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615304576040519150601f19603f3d011682016040523d82523d6000602084013e615309565b606091505b5091509150811561531d5791506151b09050565b80511561532d5780518082602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152865160248401528651879391928392604401919085019080838360008315614c50578181015183820152602001614c38565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906151b0575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061540857805160ff1916838001178555615435565b82800160010185558215615435579182015b8281111561543557825182559160200191906001019061541a565b506154419291506154d1565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106154a4578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555615435565b82800160010185558215615435579182015b828111156154355782358255916020019190600101906154b6565b5b8082111561544157600081556001016154d256fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735061757361626c653a206e65772070617573657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e206973206e6f74207965742076616c696446696174546f6b656e3a206275726e20616d6f756e74206e6f742067726561746572207468616e203046696174546f6b656e3a206d696e7420746f20746865207a65726f206164647265737345435265636f7665723a20696e76616c6964207369676e6174757265202776272076616c75654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737346696174546f6b656e3a206e65772070617573657220697320746865207a65726f2061646472657373526573637561626c653a206e6577207265736375657220697320746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e74206e6f742067726561746572207468616e203045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d61737465724d696e746572426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686520626c61636b6c697374657246696174546f6b656e3a206275726e20616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e74657246696174546f6b656e3a206e6577206d61737465724d696e74657220697320746865207a65726f2061646472657373526573637561626c653a2063616c6c6572206973206e6f7420746865207265736375657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636546696174546f6b656e3a206e657720626c61636b6c697374657220697320746865207a65726f206164647265737346696174546f6b656e3a20636f6e747261637420697320616c726561647920696e697469616c697a656446696174546f6b656e56323a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d696e746572416c6c6f77616e63655061757361626c653a2063616c6c6572206973206e6f74207468652070617573657245435265636f7665723a20696e76616c6964207369676e6174757265202773272076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656446696174546f6b656e3a206e6577206f776e657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e2069732075736564206f722063616e63656c6564426c61636b6c69737461626c653a206e657720626c61636b6c697374657220697320746865207a65726f2061646472657373426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c697374656446696174546f6b656e56323a20617574686f72697a6174696f6e206973206578706972656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c597a662f3eab19e5d6fa8c5be1a17afe3947c109efd3c3e947f445f8ccaedf164736f6c634300060c0033
Deployed Bytecode Sourcemap
73437:8829:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21318:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26562:283;;;;;;;;;;;;;;;;-1:-1:-1;26562:283:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;58143:137;;;:::i;:::-;;;;;;;;;;;;;;;;25945:102;;;:::i;19420:151::-;;;;;;;;;;;;;;;;-1:-1:-1;19420:151:0;;;;:::i;:::-;;27649:556;;;;;;;;;;;;;;;;-1:-1:-1;27649:556:0;;;;;;;;;;;;;;;;;;:::i;45049:271::-;;;;;;;;;;;;;;;;-1:-1:-1;45049:271:0;;;;:::i;30168:248::-;;;;;;;;;;;;;;;;-1:-1:-1;30168:248:0;;;;:::i;70464:117::-;;;:::i;21370:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22101:1197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22101:1197:0;;;;;;;;-1:-1:-1;22101:1197:0;;-1:-1:-1;;22101:1197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22101:1197:0;;;;;;;;-1:-1:-1;22101:1197:0;;-1:-1:-1;;22101:1197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22101:1197:0;;-1:-1:-1;;;22101:1197:0;;;;;-1:-1:-1;;22101:1197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21427:27::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56238:31;;;:::i;44189:85::-;;;:::i;74366:293::-;;;;;;;;;;;;;;;;-1:-1:-1;74366:293:0;;;;;;;;;:::i;16154:97::-;;;:::i;23839:863::-;;;;;;;;;;;;;;;;-1:-1:-1;23839:863:0;;;;;;;;;:::i;30713:552::-;;;;;;;;;;;;;;;;-1:-1:-1;30713:552:0;;:::i;58748:148::-;;;:::i;29645:344::-;;;;;;;;;;;;;;;;-1:-1:-1;29645:344:0;;;;;;;;;:::i;16313:261::-;;;;;;;;;;;;;;;;-1:-1:-1;16313:261:0;;;;:::i;80217:237::-;;;;;;;;;;;;;;;;-1:-1:-1;80217:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15429:26::-;;;:::i;26161:161::-;;;;;;;;;;;;;;;;-1:-1:-1;26161:161:0;;;;:::i;70889:109::-;;;;;;;;;;;;;;;;-1:-1:-1;70889:109:0;;;;:::i;15967:92::-;;;:::i;25100:120::-;;;;;;;;;;;;;;;;-1:-1:-1;25100:120:0;;;;:::i;12401:81::-;;;:::i;21343:20::-;;;:::i;15401:21::-;;;:::i;57857:138::-;;;:::i;74880:293::-;;;;;;;;;;;;;;;;-1:-1:-1;74880:293:0;;;;;;;;;:::i;28388:270::-;;;;;;;;;;;;;;;;-1:-1:-1;28388:270:0;;;;;;;;;:::i;31273:310::-;;;;;;;;;;;;;;;;-1:-1:-1;31273:310:0;;;;:::i;25333:106::-;;;;;;;;;;;;;;;;-1:-1:-1;25333:106:0;;;;:::i;19579:306::-;;;;;;;;;;;;;;;;-1:-1:-1;19579:306:0;;;;:::i;79239:589::-;;;;;;;;;;;;;;;;-1:-1:-1;79239:589:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44732:183::-;;;;;;;;;;;;;;;;-1:-1:-1;44732:183:0;;;;;;;;;;;;;;;;;;:::i;17962:26::-;;;:::i;78050:589::-;;;;;;;;;;;;;;;;-1:-1:-1;78050:589:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58433:148::-;;;:::i;80894:319::-;;;;;;;;;;;;;;;;-1:-1:-1;80894:319:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;73834:311::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73834:311:0;;-1:-1:-1;73834:311:0;-1:-1:-1;73834:311:0;:::i;59063:131::-;;;:::i;25699:182::-;;;;;;;;;;;;;;;;-1:-1:-1;25699:182:0;;;;;;;;;;;:::i;76889:561::-;;;;;;;;;;;;;;;;-1:-1:-1;76889:561:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;75758:545::-;;;;;;;;;;;;;;;;-1:-1:-1;75758:545:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21398:22::-;;;:::i;59932:203::-;;;;;;;;;;;;;;;;-1:-1:-1;59932:203:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;13014:276;;;;;;;;;;;;;;;;-1:-1:-1;13014:276:0;;;;:::i;19139:146::-;;;;;;;;;;;;;;;;-1:-1:-1;19139:146:0;;;;:::i;18908:117::-;;;;;;;;;;;;;;;;-1:-1:-1;18908:117:0;;;;:::i;21318:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26562:283::-;15615:6;;26757:4;;15615:6;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26694:10:::1;18685:21;::::0;;;:11:::1;:21;::::0;;;;;::::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;26730:7;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26779:36:::3;26788:10;26800:7;26809:5;26779:8;:36::i;:::-;-1:-1:-1::0;26833:4:0::3;::::0;26562:283;-1:-1:-1;;;;26562:283:0:o;58143:137::-;58214:66;58143:137;:::o;25945:102::-;26027:12;;25945:102;:::o;19420:151::-;18380:11;;;;18366:10;:25;18344:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19495:21:::1;::::0;::::1;19519:5;19495:21:::0;;;:11:::1;:21;::::0;;;;;:29;;;::::1;::::0;;19540:23;::::1;::::0;19519:5;19540:23:::1;19420:151:::0;:::o;27649:556::-;15615:6;;27917:4;;15615:6;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27829:10:::1;18685:21;::::0;;;:11:::1;:21;::::0;;;;;::::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;27865:4;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::3;::::0;::::3;;::::0;;;:11:::3;:21;::::0;;;;;27895:2;;18685:21:::3;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27970:13:::4;::::0;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;27984:10:::4;27970:25:::0;;;;;;;;27961:34;::::4;;27939:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28074:26;28084:4;28090:2;28094:5;28074:9;:26::i;:::-;28139:13;::::0;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;28153:10:::4;28139:25:::0;;;;;;;;:36:::4;::::0;28169:5;28139:29:::4;:36::i;:::-;28111:13;::::0;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;28125:10:::4;28111:25:::0;;;;;;;:64;28193:4:::4;::::0;-1:-1:-1;18782:1:0::3;::::2;15653::::1;27649:556:::0;;;;;:::o;45049:271::-;12774:6;;;;12760:10;:20;12752:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45144:24:::1;::::0;::::1;45122:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45249:8;:21:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;45286:26:::1;::::0;::::1;::::0;-1:-1:-1;;45286:26:0::1;45049:271:::0;:::o;30168:248::-;24876:12;;30268:4;;24876:12;;24862:10;:26;24840:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30290:15:::1;::::0;::::1;30308:5;30290:15:::0;;;:7:::1;:15;::::0;;;;;;;:23;;;::::1;::::0;;30324:13:::1;:21:::0;;;;;;:25;;;30365:21;::::1;::::0;30308:5;30365:21:::1;-1:-1:-1::0;30404:4:0::1;30168:248:::0;;;:::o;70464:117::-;70515:66;70464:117;:::o;21370:21::-;;;;;;:::o;22101:1197::-;22415:11;;;;;;;22414:12;22406:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22506:29;;;22484:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22643:23;;;22621:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22768:28;;;22746:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22903:22;;;22881:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23006:16;;;;:4;;:16;;;;;:::i;:::-;-1:-1:-1;23033:20:0;;;;:6;;:20;;;;;:::i;:::-;-1:-1:-1;23064:24:0;;;;:8;;:24;;;;;:::i;:::-;-1:-1:-1;23099:8:0;:24;;;;;;;;;;23134:12;:30;;;;;;;;;;;;;;;;;-1:-1:-1;23175:18:0;;;;;;;;;;23204:11;:28;;;;;;;;;;;;;;23243:18;23252:8;23243;:18::i;:::-;-1:-1:-1;;23272:11:0;:18;;;;;;;;-1:-1:-1;;;;;;22101:1197:0:o;21427:27::-;;;;;;:::o;56238:31::-;;;;:::o;44189:85::-;44258:8;;;;44189:85;:::o;74366:293::-;15615:6;;74557:4;;15615:6;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74494:10:::1;18685:21;::::0;;;:11:::1;:21;::::0;;;;;::::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;74530:7;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74579:50:::3;74598:10;74610:7;74619:9;74579:18;:50::i;16154:97::-:0;15810:6;;;;15796:10;:20;15788:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16204:6:::1;:14:::0;;;::::1;::::0;;16234:9:::1;::::0;::::1;::::0;16213:5:::1;::::0;16234:9:::1;16154:97::o:0;23839:863::-;15615:6;;24028:4;;15615:6;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23439:10:::1;23431:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;23423:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23969:10:::2;18685:21;::::0;;;:11:::2;:21;::::0;;;;;::::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::3;::::0;::::3;;::::0;;;:11:::3;:21;::::0;;;;;24005:3;;18685:21:::3;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24058:17:::4;::::0;::::4;24050:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24144:1;24134:7;:11;24126:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24249:10;24204:28;24235:25:::0;;;:13:::4;:25;::::0;;;;;24293:31;;::::4;;24271:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24426:12;::::0;:25:::4;::::0;24443:7;24426:16:::4;:25::i;:::-;24411:12;:40:::0;24478:13:::4;::::0;::::4;;::::0;;;:8:::4;:13;::::0;;;;;:26:::4;::::0;24496:7;24478:17:::4;:26::i;:::-;24462:13;::::0;::::4;;::::0;;;:8:::4;:13;::::0;;;;:42;24543:33:::4;:20:::0;24568:7;24543:24:::4;:33::i;:::-;24529:10;24515:25;::::0;;;:13:::4;:25;::::0;;;;;;;;:61;;;;24592:30;;;;;;;24515:25:::4;24592:30:::0;::::4;::::0;::::4;::::0;;;;;;::::4;24638:34;::::0;;;;;;;::::4;::::0;::::4;::::0;24655:1:::4;::::0;24638:34:::4;::::0;;;;::::4;::::0;;::::4;-1:-1:-1::0;24690:4:0::4;::::0;23839:863;-1:-1:-1;;;;;23839:863:0:o;30713:552::-;15615:6;;;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23439:10:::1;23431:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;23423:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30830:10:::2;18685:21;::::0;;;:11:::2;:21;::::0;;;;;::::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30885:10:::3;30858:15;30876:20:::0;;;:8:::3;:20;::::0;;;;;30915:11;30907:65:::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31002:7;30991;:18;;30983:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31080:12;::::0;:25:::3;::::0;31097:7;31080:16:::3;:25::i;:::-;31065:12;:40:::0;31139:20:::3;:7:::0;31151;31139:11:::3;:20::i;:::-;31125:10;31116:20;::::0;;;:8:::3;:20;::::0;;;;;;;;:43;;;;31175:25;;;;;;;31125:10;;31175:25:::3;::::0;;;;;;;::::3;31216:41;::::0;;;;;;;31245:1:::3;::::0;31225:10:::3;::::0;31216:41:::3;::::0;;;;::::3;::::0;;::::3;18782:1;23499::::2;30713:552:::0;:::o;58748:148::-;58830:66;58748:148;:::o;29645:344::-;15615:6;;29800:4;;15615:6;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24876:12:::1;::::0;::::1;;24862:10;:26;24840:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29822:15:::2;::::0;::::2;;::::0;;;:7:::2;:15;::::0;;;;;;;:22;;;::::2;29840:4;29822:22;::::0;;29855:13:::2;:21:::0;;;;;;:43;;;29914:45;;;;;;;::::2;::::0;;;;;;;;::::2;-1:-1:-1::0;29977:4:0::2;29645:344:::0;;;;:::o;16313:261::-;12774:6;;;;12760:10;:20;12752:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16407:24:::1;::::0;::::1;16385:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16510:6;:19:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;16545:21:::1;::::0;16559:6;::::1;::::0;16545:21:::1;::::0;-1:-1:-1;;16545:21:0::1;16313:261:::0;:::o;80217:237::-;15615:6;;;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80398:48:::1;80419:10;80431:5;80438:1;80441;80444;80398:20;:48::i;:::-;80217:237:::0;;;;;:::o;15429:26::-;;;;;;;;;:::o;26161:161::-;26297:17;;26265:7;26297:17;;;:8;:17;;;;;;;26161:161::o;70889:109::-;70970:20;;70943:7;70970:20;;;:13;:20;;;;;;;70889:109::o;15967:92::-;15810:6;;;;15796:10;:20;15788:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16024:4:::1;16015:13:::0;;;::::1;::::0;::::1;::::0;;16044:7:::1;::::0;::::1;::::0;16015:13;;16044:7:::1;15967:92::o:0;25100:120::-;25191:21;;25164:7;25191:21;;;:13;:21;;;;;;;25100:120::o;12401:81::-;12441:7;12468:6;;;12401:81;:::o;21343:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15401:21;;;;;;:::o;57857:138::-;57929:66;57857:138;:::o;74880:293::-;15615:6;;75071:4;;15615:6;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75008:10:::1;18685:21;::::0;;;:11:::1;:21;::::0;;;;;::::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;75044:7;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75093:50:::3;75112:10;75124:7;75133:9;75093:18;:50::i;28388:270::-:0;15615:6;;28574:4;;15615:6;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28516:10:::1;18685:21;::::0;;;:11:::1;:21;::::0;;;;;::::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;28552:2;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28596:32:::3;28606:10;28618:2;28622:5;28596:9;:32::i;31273:310::-:0;12774:6;;;;12760:10;:20;12752:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31379:30:::1;::::0;::::1;31357:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31495:12;:31:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;31542:33:::1;::::0;31562:12;::::1;::::0;31542:33:::1;::::0;-1:-1:-1;;31542:33:0::1;31273:310:::0;:::o;25333:106::-;25415:16;;25391:4;25415:16;;;:7;:16;;;;;;;;;25333:106::o;19579:306::-;12774:6;;;;12760:10;:20;12752:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19683:29:::1;::::0;::::1;19661:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19801:11;:29:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;19846:31:::1;::::0;19865:11;::::1;::::0;19846:31:::1;::::0;-1:-1:-1;;19846:31:0::1;19579:306:::0;:::o;79239:589::-;15615:6;;;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;79547:5;;18685:21:::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;79569:7;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79589:231:::3;79639:5;79659:7;79681:9;79705:10;79730:11;79756:5;79776:1;79792;79808;79589:35;:231::i;:::-;18782:1:::2;15653::::1;79239:589:::0;;;;;;;;;:::o;44732:183::-;44428:8;;;;44414:10;:22;44406:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44869:38:::1;:26;::::0;::::1;44896:2:::0;44900:6;44869:26:::1;:38::i;:::-;44732:183:::0;;;:::o;17962:26::-;;;;;;:::o;78050:589::-;15615:6;;;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;78358:5;;18685:21:::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;78380:7;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78400:231:::3;78450:5;78470:7;78492:9;78516:10;78541:11;78567:5;78587:1;78603;78619;78400:35;:231::i;58433:148::-:0;58515:66;58433:148;:::o;80894:319::-;15615:6;;;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;81114:5;;18685:21:::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;81136:7;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81156:49:::3;81164:5;81171:7;81180:5;81187:8;81197:1;81200;81203;81156:7;:49::i;:::-;18782:1:::2;15653::::1;80894:319:::0;;;;;;;:::o;73834:311::-;73924:14;;;;73923:15;73901:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74021:14;:4;74028:7;;74021:14;:::i;:::-;;74065:40;74092:7;;74065:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74065:40:0;;;;;;;;;;;;;;;;;;-1:-1:-1;74065:26:0;;-1:-1:-1;74065:40:0:i;:::-;74046:16;:59;-1:-1:-1;;74116:14:0;:21;;;;74133:4;74116:21;;;73834:311::o;59063:131::-;59128:66;59063:131;:::o;25699:182::-;25850:14;;;;25818:7;25850:14;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;25699:182::o;76889:561::-;15615:6;;;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;77183:5;;18685:21:::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;77205:7;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77225:217:::3;77265:5;77285:7;77307:5;77327:10;77352:11;77378:5;77398:1;77414;77430;77225:25;:217::i;75758:545::-:0;15615:6;;;;;;;15614:7;15606:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;76047:4;;18685:21:::1;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18685:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;76068:2;;18685:21:::2;;18684:22;18662:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76083:212:::3;76124:4;76143:2;76160:5;76180:10;76205:11;76231:5;76251:1;76267;76283;76083:26;:212::i;21398:22::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59932:203;60088:32;;;;;60045:18;60088:32;;;:20;:32;;;;;;;;:39;;;;;;;;;;;59932:203::o;13014:276::-;12774:6;;;;12760:10;:20;12752:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13111:22:::1;::::0;::::1;13089:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13236:6;::::0;13215:38:::1;::::0;;13236:6:::1;::::0;;::::1;13215:38:::0;;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;13264:18;13273:8;13264;:18::i;:::-;13014:276:::0;:::o;19139:146::-;18380:11;;;;18366:10;:25;18344:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19212:21:::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;:28;;;::::1;19236:4;19212:28;::::0;;19256:21;::::1;::::0;19212;19256::::1;19139:146:::0;:::o;18908:117::-;18996:21;;18972:4;18996:21;;;:11;:21;;;;;;;;;18908:117::o;27051:372::-;27187:19;;;27179:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27266:21;;;27258:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27337:14;;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;:31;;;27384;;;;;;;;;;;;;;;;;27051:372;;;:::o;28850:541::-;28981:18;;;28973:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29060:16;;;29052:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29158:14;;;;;;;:8;:14;;;;;;29149:23;;;29127:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29268:14;;;;;;;:8;:14;;;;;;:25;;29287:5;29268:18;:25::i;:::-;29251:14;;;;;;;;:8;:14;;;;;;:42;;;;29319:12;;;;;;;:23;;29336:5;29319:16;:23::i;:::-;29304:12;;;;;;;;:8;:12;;;;;;;;;:38;;;;29358:25;;;;;;;29304:12;;29358:25;;;;;;;;;;;;;28850:541;;;:::o;1404:136::-;1462:7;1489:43;1493:1;1496;1489:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1482:50;1404:136;-1:-1:-1;;;1404:136:0:o;12546:81::-;12602:6;:17;;;;;;;;;;;;;;;12546:81::o;81454:214::-;81621:14;;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;81596:64;;81605:5;;81612:7;;81621:38;;81649:9;81621:27;:38::i;:::-;81596:8;:64::i;940:181::-;998:7;1030:5;;;1054:6;;;;1046:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66372:655;66540:46;66568:10;66580:5;66540:27;:46::i;:::-;66619:110;;;59128:66;66619:110;;;;;;;;;;;;;66599:17;66619:110;;;;;;;;;;;;;;;;;;;;;;;66777:16;;66619:110;;;66762:47;;66795:1;66798;66801;66619:110;66762:14;:47::i;:::-;:61;;;66740:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66894:32;;;;;;;:20;:32;;;;;;;;:39;;;;;;;;;:69;;;;66936:27;66894:69;;;66979:40;66894:39;;:32;66979:40;;;66372:655;;;;;;:::o;81909:354::-;82051:204;82074:5;82094:7;82116:128;82162:9;82116:128;;;;;;;;;;;;;;;;;:14;;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;;:128;:27;:128::i;63747:870::-;64038:65;64065:5;64072;64079:10;64091:11;64038:26;:65::i;:::-;64136:219;;;58830:66;64136:219;;;;;;;;;;;;;;;;;64116:17;64136:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64403:16;;64136:219;;;64388:47;;64421:1;64424;64427;64136:219;64388:14;:47::i;:::-;:56;;;64366:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64515:38;64540:5;64547;64515:24;:38::i;:::-;64564:45;64583:5;64590:7;64599:9;64564:18;:45::i;:::-;63747:870;;;;;;;;;;:::o;38962:248::-;39133:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39156:23;39133:58;;;39079:123;;39113:5;;39079:19;:123::i;62210:870::-;62501:65;62528:5;62535;62542:10;62554:11;62501:26;:65::i;:::-;62599:219;;;58515:66;62599:219;;;;;;;;;;;;;;;;;62579:17;62599:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62866:16;;62599:219;;;62851:47;;62884:1;62887;62890;62599:219;62851:14;:47::i;:::-;:56;;;62829:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62978:38;63003:5;63010;62978:24;:38::i;:::-;63027:45;63046:5;63053:7;63062:9;63027:18;:45::i;71441:666::-;71664:3;71652:8;:15;;71644:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71852:20;;;;71760:15;71852:20;;;:13;:20;;;;;;;;;:22;;;;;;;;71735:173;;70515:66;71735:173;;;;;;;;;;;;;;;;71715:17;71735:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71956:16;;71941:47;;71974:1;71977;71980;71735:173;71941:14;:47::i;:::-;:56;;;71919:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72068:31;72077:5;72084:7;72093:5;72068:8;:31::i;:::-;71441:666;;;;;;;;:::o;53328:708::-;53858:22;;;;;;;53903:25;;;;;;;;;53614:399;;;53647:66;53614:399;;;;;;;;;;;;;;;;;;53536:9;53614:399;;;;53989:4;53614:399;;;;;;;;;;;;;;;;;;;;;;;;53586:442;;;;;;53328:708::o;65218:827::-;65495:65;65522:5;65529;65536:10;65548:11;65495:26;:65::i;:::-;65593:204;;;58214:66;65593:204;;;;;;;;;;;;;;;;;65573:17;65593:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65845:16;;65593:204;;;65830:47;;65863:1;65866;65869;65593:204;65830:14;:47::i;:::-;:56;;;65808:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65957:38;65982:5;65989;65957:24;:38::i;:::-;66006:31;66015:5;66022:7;66031:5;66006:8;:31::i;60733:809::-;61005:64;61032:4;61038:5;61045:10;61057:11;61005:26;:64::i;:::-;61102:199;;;57929:66;61102:199;;;;;;;;;;;;;;;;;61082:17;61102:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61349:16;;61102:199;;;61334:47;;61367:1;61370;61373;61102:199;61334:14;:47::i;:::-;:55;;;61312:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61460:37;61485:4;61491:5;61460:24;:37::i;:::-;61508:26;61518:4;61524:2;61528:5;61508:9;:26::i;1843:226::-;1963:7;1999:12;1991:6;;;;1983:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2035:5:0;;;1843:226::o;67213:308::-;67354:32;;;67414:25;67354:32;;;:20;:32;;;;;;;;:39;;;;;;;;;;;:85;;;;;;;;;67332:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67213:308;;:::o;54432:449::-;54769:26;;;;;;;;;;54671:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54647:174;;;;;54610:7;;54839:34;54647:174;54865:1;54868;54871;54839:17;:34::i;:::-;54832:41;54432:449;-1:-1:-1;;;;;;;54432:449:0:o;67856:431::-;68063:10;68057:3;:16;68035:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68169:11;68163:3;:17;68155:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68233:46;68261:10;68273:5;68233:27;:46::i;:::-;67856:431;;;;:::o;68465:227::-;68567:32;;;;;;;:20;:32;;;;;;;;:39;;;;;;;;;:65;;;;68609:23;68567:65;;;68648:36;68567:39;;:32;68648:36;;;68465:227;;:::o;41838:860::-;42262:23;42288:106;42330:4;42288:106;;;;;;;;;;;;;;;;;42296:5;42288:27;;;;:106;;;;;:::i;:::-;42409:17;;42262:132;;-1:-1:-1;42409:21:0;42405:286;;42582:10;42571:30;;;;;;;;;;;;;;;-1:-1:-1;42571:30:0;42545:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50220:1587;50350:7;51297:66;51271:92;;51253:197;;;51390:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51253:197;51466:1;:7;;51471:2;51466:7;;:18;;;;;51477:1;:7;;51482:2;51477:7;;51466:18;51462:99;;;51501:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51462:99;51658:14;51675:26;51685:6;51693:1;51696;51699;51675:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51675:26:0;;;;;;-1:-1:-1;;51720:20:0;;;51712:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51793:6;-1:-1:-1;50220:1587:0;;;;;;;:::o;35623:230::-;35760:12;35792:53;35815:6;35823:4;35829:1;35832:12;37417;37450:18;37461:6;37450:10;:18::i;:::-;37442:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37576:12;37590:23;37617:6;:11;;37650:8;37670:4;37617:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37575:100;;;;37690:7;37686:595;;;37721:10;-1:-1:-1;37714:17:0;;-1:-1:-1;37714:17:0;37686:595;37835:17;;:21;37831:439;;38098:10;38092:17;38159:15;38146:10;38142:2;38138:19;38131:44;38046:148;38234:20;;;;;;;;;;;;;;;;;;;;38241:12;;38234:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32371:657;32431:4;32928:20;;32758:66;32977:23;;;;;;:42;;-1:-1:-1;;33004:15:0;;;32969:51;-1:-1:-1;;32371:657:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://c597a662f3eab19e5d6fa8c5be1a17afe3947c109efd3c3e947f445f8ccaedf1
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.76
Net Worth in ETH
0.000331
Token Allocations
CUSDC
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.025322 | 30 | $0.7596 |
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.