ETH Price: $3,418.35 (+3.09%)

Contract

0x06A00715E6F92210Af9d7680B584931FAF71A833
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Chronicle (XNL) (@$0.0085)
Transaction Hash
Method
Block
From
To
Transfer214660782024-12-23 15:27:5914 hrs ago1734967679IN
Chronicle: XNL Token
0 ETH0.0013257422.28260025
Transfer214618952024-12-23 1:25:2328 hrs ago1734917123IN
Chronicle: XNL Token
0 ETH0.00015294.06558064
Transfer214614942024-12-23 0:04:3529 hrs ago1734912275IN
Chronicle: XNL Token
0 ETH0.00032535.46656347
Approve214491112024-12-21 6:32:112 days ago1734762731IN
Chronicle: XNL Token
0 ETH0.000510519.09790318
Transfer214491072024-12-21 6:31:232 days ago1734762683IN
Chronicle: XNL Token
0 ETH0.000492488.27740368
Transfer214455152024-12-20 18:27:113 days ago1734719231IN
Chronicle: XNL Token
0 ETH0.0009815617.93765621
Transfer214248742024-12-17 21:14:236 days ago1734470063IN
Chronicle: XNL Token
0 ETH0.0009700916.30487865
Transfer214124602024-12-16 3:41:598 days ago1734320519IN
Chronicle: XNL Token
0 ETH0.0005320512.5494552
Approve214124302024-12-16 3:35:598 days ago1734320159IN
Chronicle: XNL Token
0 ETH0.0006733612
Approve214119072024-12-16 1:50:358 days ago1734313835IN
Chronicle: XNL Token
0 ETH0.0006771512.06493354
Transfer214119052024-12-16 1:50:118 days ago1734313811IN
Chronicle: XNL Token
0 ETH0.0007019811.79633077
Transfer214049222024-12-15 2:25:239 days ago1734229523IN
Chronicle: XNL Token
0 ETH0.000296447.87972874
Transfer214046442024-12-15 1:29:479 days ago1734226187IN
Chronicle: XNL Token
0 ETH0.00047147.92004067
Approve214045722024-12-15 1:15:119 days ago1734225311IN
Chronicle: XNL Token
0 ETH0.000246866.81243103
Approve214045722024-12-15 1:15:119 days ago1734225311IN
Chronicle: XNL Token
0 ETH0.000265946.81243103
Transfer214045712024-12-15 1:14:599 days ago1734225299IN
Chronicle: XNL Token
0 ETH0.000303037.1455317
Transfer214045712024-12-15 1:14:599 days ago1734225299IN
Chronicle: XNL Token
0 ETH0.000303037.1455317
Transfer214040712024-12-14 23:34:599 days ago1734219299IN
Chronicle: XNL Token
0 ETH0.000253326.73349462
Transfer214040352024-12-14 23:27:479 days ago1734218867IN
Chronicle: XNL Token
0 ETH0.000245556.52712604
Transfer214040352024-12-14 23:27:479 days ago1734218867IN
Chronicle: XNL Token
0 ETH0.000245476.52712604
Transfer214040272024-12-14 23:26:119 days ago1734218771IN
Chronicle: XNL Token
0 ETH0.000495178.32444283
Transfer214037922024-12-14 22:39:119 days ago1734215951IN
Chronicle: XNL Token
0 ETH0.0004456111.85228788
Transfer214037512024-12-14 22:30:479 days ago1734215447IN
Chronicle: XNL Token
0 ETH0.0008617714.48134084
Approve214036762024-12-14 22:15:479 days ago1734214547IN
Chronicle: XNL Token
0 ETH0.0004025411.10840129
Approve214036762024-12-14 22:15:479 days ago1734214547IN
Chronicle: XNL Token
0 ETH0.0004336411.10840129
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XNLToken

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-27
*/

// File: @openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.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: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity ^0.8.0;



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The defaut value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overloaded;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/VerifiedAccount.sol



pragma solidity 0.8.3;



abstract contract VerifiedAccount is ERC20, Ownable {

    mapping(address => bool) private _isRegistered;

    constructor () {
        // The smart contract starts off registering itself, since address is known.
        registerAccount();
    }

    event AccountRegistered(address indexed account);

    /**
     * This registers the calling wallet address as a known address. Operations that transfer responsibility
     * may require the target account to be a registered account, to protect the system from getting into a
     * state where administration or a large amount of funds can become forever inaccessible.
     */
    function registerAccount() public {
        _isRegistered[msg.sender] = true;
        emit AccountRegistered(msg.sender);
    }

    function isRegistered(address account) public view returns (bool) {
        return _isRegistered[account];
    }

    function _accountExists(address account) internal view returns (bool) {
        return account == msg.sender || _isRegistered[account];
    }

    modifier onlyExistingAccount(address account) {
        require(_accountExists(account), "account not registered");
        _;
    }
    
    modifier onlyOwnerOrSelf(address account) {
        require(owner() == _msgSender() || msg.sender == account, "onlyOwnerOrSelf");
        _;
    }

    // =========================================================================
    // === Safe ERC20 methods
    // =========================================================================

    function safeTransfer(address to, uint256 value) public onlyExistingAccount(to) returns (bool) {
        if(value == 0) return false;
        require(transfer(to, value), "error in transfer");
        return true;
    }

    function safeApprove(address spender, uint256 value) public onlyExistingAccount(spender) returns (bool) {
        require(approve(spender, value), "error in approve");
        return true;
    }

    function safeTransferFrom(address from, address to, uint256 value) public onlyExistingAccount(to) returns (bool) {
        if(value == 0) return false;
        require(transferFrom(from, to, value), "error in transferFrom");
        return true;
    }


    // =========================================================================
    // === Safe ownership transfer
    // =========================================================================

    /**
     * @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) public override onlyExistingAccount(newOwner) onlyOwner {
        super.transferOwnership(newOwner);
    }
}

// File: contracts/IERC20Vestable.sol



pragma solidity 0.8.3;

interface IERC20Vestable {

    function grantVestingTokens(
        address beneficiary,
        uint256 totalAmount,
        uint256 vestingAmount,
        uint32 startDay,
        uint32 duration,
        uint32 cliffDuration,
        uint32 interval
    ) external returns (bool ok);

    function today() external view returns (uint32 dayNumber);

    function vestingForAccountAsOf(
        address grantHolder,
        uint32 onDayOrToday
    )
    external
    view
    returns (
        uint256 amountVested,
        uint256 amountNotVested,
        uint256 amountOfGrant,
        uint32 vestStartDay,
        uint32 cliffDuration,
        uint32 vestDuration,
        uint32 vestIntervalDays
    );

    function vestingAsOf(uint32 onDayOrToday) external view returns (
        uint256 amountVested,
        uint256 amountNotVested,
        uint256 amountOfGrant,
        uint32 vestStartDay,
        uint32 cliffDuration,
        uint32 vestDuration,
        uint32 vestIntervalDays
    );

    event VestingScheduleCreated(
        address indexed vestingLocation,
        uint32 cliffDuration, 
        uint32 indexed duration, 
        uint32 interval);

    event VestingTokensGranted(
        address indexed beneficiary,
        uint256 indexed vestingAmount,
        uint32 startDay,
        address vestingLocation,
        address indexed grantor);
}

// File: contracts/ERC20Vestable.sol



pragma solidity 0.8.3;




/**
 * @title Contract for grantable ERC20 token vesting schedules
 *
 * @notice Adds to an ERC20 support for grantor wallets, which are able to grant vesting tokens to
 *   beneficiary wallets, following per-wallet custom vesting schedules.
 *
 * @dev Contract which gives subclass contracts the ability to act as a pool of funds for allocating
 *   tokens to any number of other addresses. Token grants support the ability to vest over time in
 *   accordance a predefined vesting schedule. A given wallet can receive no more than one token grant.
 *
 *   Tokens are transferred from the pool to the recipient at the time of grant, but the recipient
 *   will only able to transfer tokens out of their wallet after they have vested. Transfers of non-
 *   vested tokens are prevented.
 *
 *   Two types of toke grants are supported:
 *   - Irrevocable grants, intended for use in cases when vesting tokens have been issued in exchange
 *     for value, such as with tokens that have been purchased in an ICO.
 *   - Revocable grants, intended for use in cases when vesting tokens have been gifted to the holder,
 *     such as with employee grants that are given as compensation.
 */
abstract contract ERC20Vestable is ERC20, IERC20Vestable, VerifiedAccount {

    // Date-related constants for sanity-checking dates to reject obvious erroneous inputs
    // and conversions from seconds to days and years that are more or less leap year-aware.
    uint32 private constant THOUSAND_YEARS_DAYS = 365243;                   /* See https://www.timeanddate.com/date/durationresult.html?m1=1&d1=1&y1=2000&m2=1&d2=1&y2=3000 */
    uint32 private constant TEN_YEARS_DAYS = THOUSAND_YEARS_DAYS / 100;     /* Includes leap years (though it doesn't really matter) */
    uint32 private constant SECONDS_PER_DAY = 24 * 60 * 60;                 /* 86400 seconds in a day */
    uint32 private constant JAN_1_3000_DAYS = 4102444800;  /* Wednesday, January 1, 2100 0:00:00 (GMT) (see https://www.epochconverter.com/) */

    struct vestingSchedule {
        bool isValid;               /* true if an entry exists and is valid */
        uint32 cliffDuration;       /* Duration of the cliff, with respect to the grant start day, in days. */
        uint32 duration;            /* Duration of the vesting schedule, with respect to the grant start day, in days. */
        uint32 interval;            /* Duration in days of the vesting interval. */
    }

    struct tokenGrant {
        bool isActive;              /* true if this vesting entry is active and in-effect entry. */
        uint32 startDay;            /* Start day of the grant, in days since the UNIX epoch (start of day). */
        address vestingLocation;    /* Address of wallet that is holding the vesting schedule. */
        address grantor;            /* Grantor that made the grant */
        uint256 amount;             /* Total number of tokens that vest. */
    }

    mapping(address => vestingSchedule) private _vestingSchedules;
    mapping(address => tokenGrant) private _tokenGrants;

    // =========================================================================
    // === Methods for administratively creating a vesting schedule for an account.
    // =========================================================================

    /**
     * @dev This one-time operation permanently establishes a vesting schedule in the given account.
     *
     * For standard grants, this establishes the vesting schedule in the beneficiary's account.
     *
     * @param vestingLocation = Account into which to store the vesting schedule. Can be the account
     *   of the beneficiary (for one-off grants) or the account of the grantor (for uniform grants
     *   made from grant pools).
     * @param cliffDuration = Duration of the cliff, with respect to the grant start day, in days.
     * @param duration = Duration of the vesting schedule, with respect to the grant start day, in days.
     * @param interval = Number of days between vesting increases.
     *   be revoked (i.e. tokens were purchased).
     */
    function _setVestingSchedule(
        address vestingLocation,
        uint32 cliffDuration, 
        uint32 duration, 
        uint32 interval
        ) internal returns (bool) {

        // Check for a valid vesting schedule given (disallow absurd values to reject likely bad input).
        require(
            duration > 0 && duration <= TEN_YEARS_DAYS
            && cliffDuration < duration
            && interval >= 1,
            "invalid vesting schedule"
        );

        // Make sure the duration values are in harmony with interval (both should be an exact multiple of interval).
        require(
            duration % interval == 0 && cliffDuration % interval == 0,
            "invalid cliff/duration for interval"
        );

        // Create and populate a vesting schedule.
        _vestingSchedules[vestingLocation] = vestingSchedule(
            true,cliffDuration, duration, interval
        );

        // Emit the event and return success.
        emit VestingScheduleCreated(
            vestingLocation,
            cliffDuration, duration, interval);
        return true;
    }

    function _hasVestingSchedule(address account) internal view returns (bool) {
        return _vestingSchedules[account].isValid;
    }

    // =========================================================================
    // === Token grants (general-purpose)
    // === Methods to be used for administratively creating one-off token grants with vesting schedules.
    // =========================================================================

    /**
     * @dev Immediately grants tokens to an account, referencing a vesting schedule which may be
     * stored in the same account (individual/one-off) or in a different account (shared/uniform).
     *
     * @param beneficiary = Address to which tokens will be granted.
     * @param totalAmount = Total number of tokens to deposit into the account.
     * @param vestingAmount = Out of totalAmount, the number of tokens subject to vesting.
     * @param startDay = Start day of the grant's vesting schedule, in days since the UNIX epoch
     *   (start of day). The startDay may be given as a date in the future or in the past, going as far
     *   back as year 2000.
     * @param vestingLocation = Account where the vesting schedule is held (must already exist).
     * @param grantor = Account which performed the grant. Also the account from where the granted
     *   funds will be withdrawn.
     */
    function _grantVestingTokens(
        address beneficiary,
        uint256 totalAmount,
        uint256 vestingAmount,
        uint32 startDay,
        address vestingLocation,
        address grantor
    )
    internal returns (bool)
    {
        // Make sure no prior grant is in effect.
        require(!_tokenGrants[beneficiary].isActive, "grant already exists");

        // Check for valid vestingAmount
        require(
            vestingAmount <= totalAmount && vestingAmount > 0
            && startDay >= this.today() && startDay < JAN_1_3000_DAYS,
            "invalid vesting params");

        // Make sure the vesting schedule we are about to use is valid.
        require(_hasVestingSchedule(vestingLocation), "no such vesting schedule");

        // Transfer the total number of tokens from grantor into the account's holdings.
        _transfer(grantor, beneficiary, totalAmount);
        /* Emits a Transfer event. */

        // Create and populate a token grant, referencing vesting schedule.
        _tokenGrants[beneficiary] = tokenGrant(
            true/*isActive*/,
            startDay,
            vestingLocation, /* The wallet address where the vesting schedule is kept. */
            grantor,             /* The account that performed the grant (where revoked funds would be sent) */
            vestingAmount
        );

        // Emit the event and return success.
        emit VestingTokensGranted(beneficiary, vestingAmount, startDay, vestingLocation, grantor);
        return true;
    }

    /**
     * @dev Immediately grants tokens to an address, including a portion that will vest over time
     * according to a set vesting schedule. The overall duration and cliff duration of the grant must
     * be an even multiple of the vesting interval.
     *
     * @param beneficiary = Address to which tokens will be granted.
     * @param totalAmount = Total number of tokens to deposit into the account.
     * @param vestingAmount = Out of totalAmount, the number of tokens subject to vesting.
     * @param startDay = Start day of the grant's vesting schedule, in days since the UNIX epoch
     *   (start of day). The startDay may be given as a date in the future or in the past, going as far
     *   back as year 2000.
     * @param duration = Duration of the vesting schedule, with respect to the grant start day, in days.
     * @param cliffDuration = Duration of the cliff, with respect to the grant start day, in days.
     * @param interval = Number of days between vesting increases.
     *   be revoked (i.e. tokens were purchased).
     */
    function grantVestingTokens(
        address beneficiary,
        uint256 totalAmount,
        uint256 vestingAmount,
        uint32 startDay,
        uint32 duration,
        uint32 cliffDuration,
        uint32 interval
    ) public onlyOwner override returns (bool) {
        // Make sure no prior vesting schedule has been set.
        require(!_tokenGrants[beneficiary].isActive, "grant already exists");

        // The vesting schedule is unique to this wallet and so will be stored here,
        require(_setVestingSchedule(beneficiary, cliffDuration, duration, interval), "error in establishing a vesting schedule");

        // Issue grantor tokens to the beneficiary, using beneficiary's own vesting schedule.
        require(_grantVestingTokens(beneficiary, totalAmount, vestingAmount, startDay, beneficiary, msg.sender), "error in granting tokens");

        return true;
    }

    /**
     * @dev This variant only grants tokens if the beneficiary account has previously self-registered.
     */
    function safeGrantVestingTokens(
        address beneficiary, 
        uint256 totalAmount, 
        uint256 vestingAmount,
        uint32 startDay, 
        uint32 duration, 
        uint32 cliffDuration, 
        uint32 interval
        ) public onlyOwner onlyExistingAccount(beneficiary) returns (bool) {

        return grantVestingTokens(
            beneficiary, totalAmount, vestingAmount,
            startDay, duration, cliffDuration, interval);
    }


    // =========================================================================
    // === Check vesting.
    // =========================================================================

    /**
     * @dev returns the day number of the current day, in days since the UNIX epoch.
     */
    function today() public view override returns (uint32) {
        return uint32(block.timestamp / SECONDS_PER_DAY);
    }

    function _effectiveDay(uint32 onDayOrToday) internal view returns (uint32) {
        return onDayOrToday == 0 ? today() : onDayOrToday;
    }

    /**
     * @dev Determines the amount of tokens that have not vested in the given account.
     *
     * The math is: not vested amount = vesting amount * (end date - on date)/(end date - start date)
     *
     * @param grantHolder = The account to check.
     * @param onDayOrToday = The day to check for, in days since the UNIX epoch. Can pass
     *   the special value 0 to indicate today.
     */
    function _getNotVestedAmount(address grantHolder, uint32 onDayOrToday) internal view returns (uint256) {
        tokenGrant storage grant = _tokenGrants[grantHolder];
        vestingSchedule storage vesting = _vestingSchedules[grant.vestingLocation];
        uint32 onDay = _effectiveDay(onDayOrToday);

        // If there's no schedule, or before the vesting cliff, then the full amount is not vested.
        if (!grant.isActive || onDay < grant.startDay + vesting.cliffDuration)
        {
            // None are vested (all are not vested)
            return grant.amount;
        }
        // If after end of vesting, then the not vested amount is zero (all are vested).
        else if (onDay >= grant.startDay + vesting.duration)
        {
            // All are vested (none are not vested)
            return uint256(0);
        }
        // Otherwise a fractional amount is vested.
        else
        {
            // Compute the exact number of days vested.
            uint32 daysVested = onDay - grant.startDay;
            // Adjust result rounding down to take into consideration the interval.
            // Examples for vesting interval = 30 days
            // Example 1 - daysVested = 15: (15 / 30) * 30 = 0 * 30 = 0; 
            // Example 2 - daysVested = 30: (30 / 30) * 30 = 1 * 30 = 30; 
            // Example 3 - daysVested = 65: (65 / 30) * 30 = 2 * 30 = 60; 
            uint32 effectiveDaysVested = (daysVested / vesting.interval) * vesting.interval;

            // Compute the fraction vested from schedule using 224.32 fixed point math for date range ratio.
            // Note: This is safe in 256-bit math because max value of X billion tokens = X*10^27 wei, and
            // typical token amounts can fit into 90 bits. Scaling using a 32 bits value results in only 125
            // bits before reducing back to 90 bits by dividing. There is plenty of room left, even for token
            // amounts many orders of magnitude greater than mere billions.
            // uint256 vested = grant.amount.mul(effectiveDaysVested).div(vesting.duration);
            uint256 vested = (grant.amount * effectiveDaysVested) / vesting.duration;
            return grant.amount - vested;
        }
    }

    /**
     * @dev Computes the amount of funds in the given account which are available for use as of
     * the given day. If there's no vesting schedule then 0 tokens are considered to be vested and
     * this just returns the full account balance.
     *
     * The math is: available amount = total funds - notVestedAmount.
     *
     * @param grantHolder = The account to check.
     * @param onDay = The day to check for, in days since the UNIX epoch.
     */
    function _getAvailableAmount(address grantHolder, uint32 onDay) internal view returns (uint256) {
        uint256 totalTokens = balanceOf(grantHolder);
        return totalTokens - _getNotVestedAmount(grantHolder, onDay);
    }

    /*
     * @dev returns all information about the grant's vesting as of the given day
     * for the given account. Only callable by the account holder or a grantor, so
     * this is mainly intended for administrative use.
     *
     * @param grantHolder = The address to do this for.
     * @param onDayOrToday = The day to check for, in days since the UNIX epoch. Can pass
     *   the special value 0 to indicate today.
     * @return = A tuple with the following values:
     *   amountVested = the amount out of vestingAmount that is vested
     *   amountNotVested = the amount that is vested (equal to vestingAmount - vestedAmount)
     *   amountOfGrant = the amount of tokens subject to vesting.
     *   vestStartDay = starting day of the grant (in days since the UNIX epoch).
     *   vestDuration = grant duration in days.
     *   cliffDuration = duration of the cliff.
     *   vestIntervalDays = number of days between vesting periods.
     */
    function vestingForAccountAsOf(
        address grantHolder,
        uint32 onDayOrToday
    )
    public
    view
    override
    onlyOwnerOrSelf(grantHolder)
    returns (
        uint256 amountVested,
        uint256 amountNotVested,
        uint256 amountOfGrant,
        uint32 vestStartDay,
        uint32 vestDuration,
        uint32 cliffDuration,
        uint32 vestIntervalDays
    )
    {
        tokenGrant storage grant = _tokenGrants[grantHolder];
        vestingSchedule storage vesting = _vestingSchedules[grant.vestingLocation];
        uint256 notVestedAmount = _getNotVestedAmount(grantHolder, onDayOrToday);
        uint256 grantAmount = grant.amount;

        return (
        grantAmount - notVestedAmount,
        notVestedAmount,
        grantAmount,
        grant.startDay,
        vesting.duration,
        vesting.cliffDuration,
        vesting.interval
        );
    }

    /*
     * @dev returns all information about the grant's vesting as of the given day
     * for the current account, to be called by the account holder.
     *
     * @param onDayOrToday = The day to check for, in days since the UNIX epoch. Can pass
     *   the special value 0 to indicate today.
     * @return = A tuple with the following values:
     *   amountVested = the amount out of vestingAmount that is vested
     *   amountNotVested = the amount that is vested (equal to vestingAmount - vestedAmount)
     *   amountOfGrant = the amount of tokens subject to vesting.
     *   vestStartDay = starting day of the grant (in days since the UNIX epoch).
     *   cliffDuration = duration of the cliff.
     *   vestDuration = grant duration in days.
     *   vestIntervalDays = number of days between vesting periods.
     */
    function vestingAsOf(uint32 onDayOrToday) public override view returns (
        uint256 amountVested,
        uint256 amountNotVested,
        uint256 amountOfGrant,
        uint32 vestStartDay,
        uint32 vestDuration,
        uint32 cliffDuration,
        uint32 vestIntervalDays
    )
    {
        return vestingForAccountAsOf(msg.sender, onDayOrToday);
    }

    /**
     * @dev returns true if the account has sufficient funds available to cover the given amount,
     *   including consideration for vesting tokens.
     *
     * @param account = The account to check.
     * @param amount = The required amount of vested funds.
     * @param onDay = The day to check for, in days since the UNIX epoch.
     */
    function _fundsAreAvailableOn(address account, uint256 amount, uint32 onDay) internal view returns (bool) {
        return (amount <= _getAvailableAmount(account, onDay));
    }

    /**
     * @dev Modifier to make a function callable only when the amount is sufficiently vested right now.
     *
     * @param account = The account to check.
     * @param amount = The required amount of vested funds.
     */
    modifier onlyIfFundsAvailableNow(address account, uint256 amount) {
        // Distinguish insufficient overall balance from insufficient vested funds balance in failure msg.
        require(_fundsAreAvailableOn(account, amount, today()),
            balanceOf(account) < amount ? "insufficient funds" : "insufficient vested funds");
        _;
    }

    // =========================================================================
    // === Overridden ERC20 functionality
    // =========================================================================

    /**
     * @dev Methods transfer() and approve() require an additional available funds check to
     * prevent spending held but non-vested tokens. Note that transferFrom() does NOT have this
     * additional check because approved funds come from an already set-aside allowance, not from the wallet.
     */
    function transfer(address to, uint256 value) public override onlyIfFundsAvailableNow(msg.sender, value) returns (bool) {
        return super.transfer(to, value);
    }

    /**
     * @dev Additional available funds check to prevent spending held but non-vested tokens.
     */
    function approve(address spender, uint256 value) public override virtual onlyIfFundsAvailableNow(msg.sender, value) returns (bool) {
        return super.approve(spender, value);
    }
}

// File: contracts/XNLToken.sol



pragma solidity 0.8.3;



/**
 * @title XNLToken
 * @dev Implementation of ERC20Token using Standard token from OpenZeppelin library
 * with ability to pause transfers, approvals and set vesting period for owner until ownership is renounced. 
 * All token are assigned to owner.
 */
 
contract XNLToken is ERC20Vestable, Pausable {

    uint public INITIAL_SUPPLY = 100000000 * (uint(10) ** 18); // 100,000,000 XNL

    constructor() ERC20("Chronicle","XNL") {
        _mint(_msgSender(), INITIAL_SUPPLY);
    }

    function pause() onlyOwner() external  {
        _pause();
    }

    function unpause() onlyOwner() external {
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override whenNotPaused {
        require(to != address(this), "ERC20: transfer to the contract address");
        super._beforeTokenTransfer(from, to, amount);
    }

    function approve(address spender, uint256 amount) public virtual override whenNotPaused returns (bool) {
        return super.approve(spender, amount);
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual override whenNotPaused returns (bool)  {
        return super.increaseAllowance(spender, addedValue);
    }

    function decreaseAllowance(address spender, uint256 addedValue) public virtual override whenNotPaused returns (bool)  {
        return super.decreaseAllowance(spender, addedValue);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vestingLocation","type":"address"},{"indexed":false,"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"indexed":true,"internalType":"uint32","name":"duration","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"interval","type":"uint32"}],"name":"VestingScheduleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"vestingAmount","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"startDay","type":"uint32"},{"indexed":false,"internalType":"address","name":"vestingLocation","type":"address"},{"indexed":true,"internalType":"address","name":"grantor","type":"address"}],"name":"VestingTokensGranted","type":"event"},{"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"vestingAmount","type":"uint256"},{"internalType":"uint32","name":"startDay","type":"uint32"},{"internalType":"uint32","name":"duration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"interval","type":"uint32"}],"name":"grantVestingTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registerAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"safeApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"vestingAmount","type":"uint256"},{"internalType":"uint32","name":"startDay","type":"uint32"},{"internalType":"uint32","name":"duration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"interval","type":"uint32"}],"name":"safeGrantVestingTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"safeTransfer","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":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"today","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"onDayOrToday","type":"uint32"}],"name":"vestingAsOf","outputs":[{"internalType":"uint256","name":"amountVested","type":"uint256"},{"internalType":"uint256","name":"amountNotVested","type":"uint256"},{"internalType":"uint256","name":"amountOfGrant","type":"uint256"},{"internalType":"uint32","name":"vestStartDay","type":"uint32"},{"internalType":"uint32","name":"vestDuration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"vestIntervalDays","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"grantHolder","type":"address"},{"internalType":"uint32","name":"onDayOrToday","type":"uint32"}],"name":"vestingForAccountAsOf","outputs":[{"internalType":"uint256","name":"amountVested","type":"uint256"},{"internalType":"uint256","name":"amountNotVested","type":"uint256"},{"internalType":"uint256","name":"amountOfGrant","type":"uint256"},{"internalType":"uint32","name":"vestStartDay","type":"uint32"},{"internalType":"uint32","name":"vestDuration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"vestIntervalDays","type":"uint32"}],"stateMutability":"view","type":"function"}]

6080604052620000126012600a62000445565b62000022906305f5e1006200053d565b600a553480156200003257600080fd5b50604051806040016040528060098152602001684368726f6e69636c6560b81b8152506040518060400160405280600381526020016216139360ea1b81525081600390805190602001906200008992919062000337565b5080516200009f90600490602084019062000337565b5050506000620000b46200012a60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200010c6200012e565b6009805460ff191690556200012433600a5462000170565b620005b2565b3390565b33600081815260066020526040808220805460ff19166001179055517fcd822dc9688e20acea68724a2fbcfe4f3e526d20ecaa37b18fe3047ab377d6a59190a2565b6001600160a01b038216620001cc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620001da6000838362000267565b8060026000828254620001ee9190620003dd565b90915550506001600160a01b038216600090815260208190526040812080548392906200021d908490620003dd565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60095460ff1615620002af5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620001c3565b6001600160a01b0382163014156200031a5760405162461bcd60e51b815260206004820152602760248201527f45524332303a207472616e7366657220746f2074686520636f6e7472616374206044820152666164647265737360c81b6064820152608401620001c3565b620003328383836200033260201b62000d361760201c565b505050565b82805462000345906200055f565b90600052602060002090601f016020900481019282620003695760008555620003b4565b82601f106200038457805160ff1916838001178555620003b4565b82800160010185558215620003b4579182015b82811115620003b457825182559160200191906001019062000397565b50620003c2929150620003c6565b5090565b5b80821115620003c25760008155600101620003c7565b60008219821115620003f357620003f36200059c565b500190565b80825b60018086116200040c57506200043c565b8187048211156200042157620004216200059c565b808616156200042f57918102915b9490941c938002620003fb565b94509492505050565b60006200045960001960ff85168462000460565b9392505050565b600082620004715750600162000459565b81620004805750600062000459565b8160018114620004995760028114620004a457620004d8565b600191505062000459565b60ff841115620004b857620004b86200059c565b6001841b915084821115620004d157620004d16200059c565b5062000459565b5060208310610133831016604e8410600b841016171562000510575081810a838111156200050a576200050a6200059c565b62000459565b6200051f8484846001620003f8565b8086048211156200053457620005346200059c565b02949350505050565b60008160001904831182151516156200055a576200055a6200059c565b500290565b600181811c908216806200057457607f821691505b602082108114156200059657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b61201880620005c26000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063c3c5a54711610097578063dd62ed3e11610071578063dd62ed3e146103cb578063f2fde38b14610404578063f3132ef014610417578063fbc6d1cb1461042a576101c4565b8063c3c5a54714610384578063d56ad0ba146103b0578063d9f226e9146103c3576101c4565b806395d89b41116100d357806395d89b4114610339578063a457c2d714610341578063a9059cbb14610354578063b74e452b14610367576101c4565b8063715018a61461030e5780638456cb59146103165780638da5cb5b1461031e576101c4565b8063313ce56711610166578063423f6cef11610140578063423f6cef146102ca57806342842e0e146102dd5780635c975abb146102f057806370a08231146102fb576101c4565b8063313ce5671461029e57806339509351146102ad5780633f4ba83a146102c0576101c4565b806318160ddd116101a257806318160ddd1461021d57806323b872dd1461022f5780632455a035146102425780632ff2e9dc14610295576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630abeb6681461020a575b600080fd5b6101d161043d565b6040516101de9190611d63565b60405180910390f35b6101fa6101f5366004611c44565b6104cf565b60405190151581526020016101de565b6101fa610218366004611c6d565b610516565b6002545b6040519081526020016101de565b6101fa61023d366004611c09565b610674565b610255610250366004611d24565b610725565b6040805197885260208801969096529486019390935263ffffffff91821660608601528116608085015290811660a08401521660c082015260e0016101de565b610221600a5481565b604051601281526020016101de565b6101fa6102bb366004611c44565b610751565b6102c8610786565b005b6101fa6102d8366004611c44565b6107ba565b6101fa6102eb366004611c09565b610846565b60095460ff166101fa565b610221610309366004611bbd565b6108d3565b6102c86108f2565b6102c8610966565b6005546040516001600160a01b0390911681526020016101de565b6101d1610998565b6101fa61034f366004611c44565b6109a7565b6101fa610362366004611c44565b6109dc565b61036f610a96565b60405163ffffffff90911681526020016101de565b6101fa610392366004611bbd565b6001600160a01b031660009081526006602052604090205460ff1690565b6102556103be366004611cee565b610aaa565b6102c8610bb7565b6102216103d9366004611bd7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102c8610412366004611bbd565b610bf9565b6101fa610425366004611c6d565b610c56565b6101fa610438366004611c44565b610cc5565b60606003805461044c90611f43565b80601f016020809104026020016040519081016040528092919081815260200182805461047890611f43565b80156104c55780601f1061049a576101008083540402835291602001916104c5565b820191906000526020600020905b8154815290600101906020018083116104a857829003601f168201915b5050505050905090565b60006104dd60095460ff1690565b156105035760405162461bcd60e51b81526004016104fa90611de6565b60405180910390fd5b61050d8383610d3b565b90505b92915050565b6005546000906001600160a01b031633146105435760405162461bcd60e51b81526004016104fa90611e10565b6001600160a01b03881660009081526008602052604090205460ff16156105a35760405162461bcd60e51b81526020600482015260146024820152736772616e7420616c72656164792065786973747360601b60448201526064016104fa565b6105af88848685610de7565b61060c5760405162461bcd60e51b815260206004820152602860248201527f6572726f7220696e2065737461626c697368696e6720612076657374696e67206044820152677363686564756c6560c01b60648201526084016104fa565b61061a888888888c33611008565b6106665760405162461bcd60e51b815260206004820152601860248201527f6572726f7220696e206772616e74696e6720746f6b656e73000000000000000060448201526064016104fa565b506001979650505050505050565b6000610681848484611357565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107065760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016104fa565b61071a85336107158685611f07565b61153a565b506001949350505050565b600080600080600080600061073a3389610aaa565b959e949d50929b5090995097509550909350915050565b600061075f60095460ff1690565b1561077c5760405162461bcd60e51b81526004016104fa90611de6565b61050d838361165e565b6005546001600160a01b031633146107b05760405162461bcd60e51b81526004016104fa90611e10565b6107b861169e565b565b6000826107c681611731565b6107e25760405162461bcd60e51b81526004016104fa90611db6565b826107f0576000915061083f565b6107fa84846109dc565b61083a5760405162461bcd60e51b815260206004820152601160248201527032b93937b91034b7103a3930b739b332b960791b60448201526064016104fa565b600191505b5092915050565b60008261085281611731565b61086e5760405162461bcd60e51b81526004016104fa90611db6565b8261087c57600091506108cb565b610887858585610674565b61071a5760405162461bcd60e51b81526020600482015260156024820152746572726f7220696e207472616e7366657246726f6d60581b60448201526064016104fa565b509392505050565b6001600160a01b0381166000908152602081905260409020545b919050565b6005546001600160a01b0316331461091c5760405162461bcd60e51b81526004016104fa90611e10565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146109905760405162461bcd60e51b81526004016104fa90611e10565b6107b8611764565b60606004805461044c90611f43565b60006109b560095460ff1690565b156109d25760405162461bcd60e51b81526004016104fa90611de6565b61050d83836117bc565b600033826109f282826109ed610a96565b61184d565b816109fc846108d3565b10610a385760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b815250610a64565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b90610a825760405162461bcd60e51b81526004016104fa9190611d63565b50610a8d8585611864565b95945050505050565b6000610aa56201518042611e85565b905090565b600080808080808088336001600160a01b0316610acf6005546001600160a01b031690565b6001600160a01b03161480610aec5750336001600160a01b038216145b610b2a5760405162461bcd60e51b815260206004820152600f60248201526e37b7363ca7bbb732b927b929b2b63360891b60448201526064016104fa565b6001600160a01b03808b1660009081526008602090815260408083208054600160281b900490941683526007909152812090610b668d8d611871565b6002840154909150610b788282611f07565b93549254939e919d509b5063ffffffff6101009283900481169b50600160281b840481169a5091830482169850600160481b9092041695509350505050565b33600081815260066020526040808220805460ff19166001179055517fcd822dc9688e20acea68724a2fbcfe4f3e526d20ecaa37b18fe3047ab377d6a59190a2565b80610c0381611731565b610c1f5760405162461bcd60e51b81526004016104fa90611db6565b6005546001600160a01b03163314610c495760405162461bcd60e51b81526004016104fa90611e10565b610c52826119d7565b5050565b6005546000906001600160a01b03163314610c835760405162461bcd60e51b81526004016104fa90611e10565b87610c8d81611731565b610ca95760405162461bcd60e51b81526004016104fa90611db6565b610cb889898989898989610516565b9998505050505050505050565b600082610cd181611731565b610ced5760405162461bcd60e51b81526004016104fa90611db6565b610cf784846104cf565b61083a5760405162461bcd60e51b815260206004820152601060248201526f6572726f7220696e20617070726f766560801b60448201526064016104fa565b505050565b60003382610d4c82826109ed610a96565b81610d56846108d3565b10610d925760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b815250610dbe565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b90610ddc5760405162461bcd60e51b81526004016104fa9190611d63565b50610a8d8585611ac2565b6000808363ffffffff16118015610e175750610e076064620592bb611e99565b63ffffffff168363ffffffff1611155b8015610e2e57508263ffffffff168463ffffffff16105b8015610e41575060018263ffffffff1610155b610e8d5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642076657374696e67207363686564756c65000000000000000060448201526064016104fa565b610e978284611f7e565b63ffffffff16158015610eb75750610eaf8285611f7e565b63ffffffff16155b610f0f5760405162461bcd60e51b815260206004820152602360248201527f696e76616c696420636c6966662f6475726174696f6e20666f7220696e7465726044820152621d985b60ea1b60648201526084016104fa565b604080516080810182526001815263ffffffff8681166020808401828152888416858701818152898616606088018181526001600160a01b038f166000818152600788528b902099518a5496519451925164ffffffffff1990971690151564ffffffff00191617610100948a1694909402939093176cffffffffffffffff00000000001916600160281b918916919091026cffffffff000000000000000000191617600160481b949097169390930295909517909555855192835290820152919290917f9555f76172de1035c7935d5913b3977fda26aa5eaedec4a0a1b291d4aab0c3ca910160405180910390a3506001949350505050565b6001600160a01b03861660009081526008602052604081205460ff16156110685760405162461bcd60e51b81526020600482015260146024820152736772616e7420616c72656164792065786973747360601b60448201526064016104fa565b8585111580156110785750600085115b80156111005750306001600160a01b031663b74e452b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b857600080fd5b505afa1580156110cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f09190611d47565b63ffffffff168463ffffffff1610155b8015611115575063f486570063ffffffff8516105b61115a5760405162461bcd60e51b8152602060048201526016602482015275696e76616c69642076657374696e6720706172616d7360501b60448201526064016104fa565b6001600160a01b03831660009081526007602052604090205460ff166111c25760405162461bcd60e51b815260206004820152601860248201527f6e6f20737563682076657374696e67207363686564756c65000000000000000060448201526064016104fa565b6111cd828888611357565b6040518060a001604052806001151581526020018563ffffffff168152602001846001600160a01b03168152602001836001600160a01b031681526020018681525060086000896001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160056101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160020155905050816001600160a01b031685886001600160a01b03167fce19dc9f3460f5845c81c7fa52526977d7e7275df4b1d0e40ea09653252e0c75878760405161134292919063ffffffff9290921682526001600160a01b0316602082015260400190565b60405180910390a45060019695505050505050565b6001600160a01b0383166113bb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104fa565b6001600160a01b03821661141d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104fa565b611428838383611acf565b6001600160a01b038316600090815260208190526040902054818110156114a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104fa565b6114aa8282611f07565b6001600160a01b0380861660009081526020819052604080822093909355908516815290812080548492906114e0908490611e45565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161152c91815260200190565b60405180910390a350505050565b6001600160a01b03831661159c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104fa565b6001600160a01b0382166115fd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104fa565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091611695918590610715908690611e45565b50600192915050565b60095460ff166116e75760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016104fa565b6009805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60006001600160a01b0382163314806105105750506001600160a01b031660009081526006602052604090205460ff1690565b60095460ff16156117875760405162461bcd60e51b81526004016104fa90611de6565b6009805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117143390565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561183e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104fa565b61083a33856107158685611f07565b60006118598483611b60565b909211159392505050565b6000611695338484611357565b6001600160a01b0380831660009081526008602090815260408083208054600160281b9004909416835260079091528120909190826118af85611b8a565b835490915060ff1615806118ee5750815483546118df9163ffffffff610100918290048116929190910416611e5d565b63ffffffff168163ffffffff16105b15611900575050600201549050610510565b815483546119239163ffffffff600160281b909104811691610100900416611e5d565b63ffffffff168163ffffffff16106119415760009350505050610510565b825460009061195b90610100900463ffffffff1683611f1e565b8354909150600090600160481b900463ffffffff1661197a8184611e99565b6119849190611edb565b8454600287015491925060009163ffffffff600160281b9092048216916119ae9190851690611ebc565b6119b89190611e85565b90508086600201546119ca9190611f07565b9650505050505050610510565b6005546001600160a01b03163314611a015760405162461bcd60e51b81526004016104fa90611e10565b6001600160a01b038116611a665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104fa565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600061169533848461153a565b60095460ff1615611af25760405162461bcd60e51b81526004016104fa90611de6565b6001600160a01b038216301415611b5b5760405162461bcd60e51b815260206004820152602760248201527f45524332303a207472616e7366657220746f2074686520636f6e7472616374206044820152666164647265737360c81b60648201526084016104fa565b610d36565b600080611b6c846108d3565b9050611b788484611871565b611b829082611f07565b949350505050565b600063ffffffff821615611b9e5781610510565b610510610a96565b80356001600160a01b03811681146108ed57600080fd5b600060208284031215611bce578081fd5b61050d82611ba6565b60008060408385031215611be9578081fd5b611bf283611ba6565b9150611c0060208401611ba6565b90509250929050565b600080600060608486031215611c1d578081fd5b611c2684611ba6565b9250611c3460208501611ba6565b9150604084013590509250925092565b60008060408385031215611c56578182fd5b611c5f83611ba6565b946020939093013593505050565b600080600080600080600060e0888a031215611c87578283fd5b611c9088611ba6565b965060208801359550604088013594506060880135611cae81611fcd565b93506080880135611cbe81611fcd565b925060a0880135611cce81611fcd565b915060c0880135611cde81611fcd565b8091505092959891949750929550565b60008060408385031215611d00578182fd5b611d0983611ba6565b91506020830135611d1981611fcd565b809150509250929050565b600060208284031215611d35578081fd5b8135611d4081611fcd565b9392505050565b600060208284031215611d58578081fd5b8151611d4081611fcd565b6000602080835283518082850152825b81811015611d8f57858101830151858201604001528201611d73565b81811115611da05783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601690820152751858d8dbdd5b9d081b9bdd081c9959da5cdd195c995960521b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611e5857611e58611fa1565b500190565b600063ffffffff808316818516808303821115611e7c57611e7c611fa1565b01949350505050565b600082611e9457611e94611fb7565b500490565b600063ffffffff80841680611eb057611eb0611fb7565b92169190910492915050565b6000816000190483118215151615611ed657611ed6611fa1565b500290565b600063ffffffff80831681851681830481118215151615611efe57611efe611fa1565b02949350505050565b600082821015611f1957611f19611fa1565b500390565b600063ffffffff83811690831681811015611f3b57611f3b611fa1565b039392505050565b600181811c90821680611f5757607f821691505b60208210811415611f7857634e487b7160e01b600052602260045260246000fd5b50919050565b600063ffffffff80841680611f9557611f95611fb7565b92169190910692915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b63ffffffff81168114611fdf57600080fd5b5056fea26469706673582212204b21a9e43c994d71107b14ae9f913041442ce52628f70113ba0b1021f5e760c864736f6c63430008030033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063c3c5a54711610097578063dd62ed3e11610071578063dd62ed3e146103cb578063f2fde38b14610404578063f3132ef014610417578063fbc6d1cb1461042a576101c4565b8063c3c5a54714610384578063d56ad0ba146103b0578063d9f226e9146103c3576101c4565b806395d89b41116100d357806395d89b4114610339578063a457c2d714610341578063a9059cbb14610354578063b74e452b14610367576101c4565b8063715018a61461030e5780638456cb59146103165780638da5cb5b1461031e576101c4565b8063313ce56711610166578063423f6cef11610140578063423f6cef146102ca57806342842e0e146102dd5780635c975abb146102f057806370a08231146102fb576101c4565b8063313ce5671461029e57806339509351146102ad5780633f4ba83a146102c0576101c4565b806318160ddd116101a257806318160ddd1461021d57806323b872dd1461022f5780632455a035146102425780632ff2e9dc14610295576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630abeb6681461020a575b600080fd5b6101d161043d565b6040516101de9190611d63565b60405180910390f35b6101fa6101f5366004611c44565b6104cf565b60405190151581526020016101de565b6101fa610218366004611c6d565b610516565b6002545b6040519081526020016101de565b6101fa61023d366004611c09565b610674565b610255610250366004611d24565b610725565b6040805197885260208801969096529486019390935263ffffffff91821660608601528116608085015290811660a08401521660c082015260e0016101de565b610221600a5481565b604051601281526020016101de565b6101fa6102bb366004611c44565b610751565b6102c8610786565b005b6101fa6102d8366004611c44565b6107ba565b6101fa6102eb366004611c09565b610846565b60095460ff166101fa565b610221610309366004611bbd565b6108d3565b6102c86108f2565b6102c8610966565b6005546040516001600160a01b0390911681526020016101de565b6101d1610998565b6101fa61034f366004611c44565b6109a7565b6101fa610362366004611c44565b6109dc565b61036f610a96565b60405163ffffffff90911681526020016101de565b6101fa610392366004611bbd565b6001600160a01b031660009081526006602052604090205460ff1690565b6102556103be366004611cee565b610aaa565b6102c8610bb7565b6102216103d9366004611bd7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102c8610412366004611bbd565b610bf9565b6101fa610425366004611c6d565b610c56565b6101fa610438366004611c44565b610cc5565b60606003805461044c90611f43565b80601f016020809104026020016040519081016040528092919081815260200182805461047890611f43565b80156104c55780601f1061049a576101008083540402835291602001916104c5565b820191906000526020600020905b8154815290600101906020018083116104a857829003601f168201915b5050505050905090565b60006104dd60095460ff1690565b156105035760405162461bcd60e51b81526004016104fa90611de6565b60405180910390fd5b61050d8383610d3b565b90505b92915050565b6005546000906001600160a01b031633146105435760405162461bcd60e51b81526004016104fa90611e10565b6001600160a01b03881660009081526008602052604090205460ff16156105a35760405162461bcd60e51b81526020600482015260146024820152736772616e7420616c72656164792065786973747360601b60448201526064016104fa565b6105af88848685610de7565b61060c5760405162461bcd60e51b815260206004820152602860248201527f6572726f7220696e2065737461626c697368696e6720612076657374696e67206044820152677363686564756c6560c01b60648201526084016104fa565b61061a888888888c33611008565b6106665760405162461bcd60e51b815260206004820152601860248201527f6572726f7220696e206772616e74696e6720746f6b656e73000000000000000060448201526064016104fa565b506001979650505050505050565b6000610681848484611357565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107065760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016104fa565b61071a85336107158685611f07565b61153a565b506001949350505050565b600080600080600080600061073a3389610aaa565b959e949d50929b5090995097509550909350915050565b600061075f60095460ff1690565b1561077c5760405162461bcd60e51b81526004016104fa90611de6565b61050d838361165e565b6005546001600160a01b031633146107b05760405162461bcd60e51b81526004016104fa90611e10565b6107b861169e565b565b6000826107c681611731565b6107e25760405162461bcd60e51b81526004016104fa90611db6565b826107f0576000915061083f565b6107fa84846109dc565b61083a5760405162461bcd60e51b815260206004820152601160248201527032b93937b91034b7103a3930b739b332b960791b60448201526064016104fa565b600191505b5092915050565b60008261085281611731565b61086e5760405162461bcd60e51b81526004016104fa90611db6565b8261087c57600091506108cb565b610887858585610674565b61071a5760405162461bcd60e51b81526020600482015260156024820152746572726f7220696e207472616e7366657246726f6d60581b60448201526064016104fa565b509392505050565b6001600160a01b0381166000908152602081905260409020545b919050565b6005546001600160a01b0316331461091c5760405162461bcd60e51b81526004016104fa90611e10565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146109905760405162461bcd60e51b81526004016104fa90611e10565b6107b8611764565b60606004805461044c90611f43565b60006109b560095460ff1690565b156109d25760405162461bcd60e51b81526004016104fa90611de6565b61050d83836117bc565b600033826109f282826109ed610a96565b61184d565b816109fc846108d3565b10610a385760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b815250610a64565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b90610a825760405162461bcd60e51b81526004016104fa9190611d63565b50610a8d8585611864565b95945050505050565b6000610aa56201518042611e85565b905090565b600080808080808088336001600160a01b0316610acf6005546001600160a01b031690565b6001600160a01b03161480610aec5750336001600160a01b038216145b610b2a5760405162461bcd60e51b815260206004820152600f60248201526e37b7363ca7bbb732b927b929b2b63360891b60448201526064016104fa565b6001600160a01b03808b1660009081526008602090815260408083208054600160281b900490941683526007909152812090610b668d8d611871565b6002840154909150610b788282611f07565b93549254939e919d509b5063ffffffff6101009283900481169b50600160281b840481169a5091830482169850600160481b9092041695509350505050565b33600081815260066020526040808220805460ff19166001179055517fcd822dc9688e20acea68724a2fbcfe4f3e526d20ecaa37b18fe3047ab377d6a59190a2565b80610c0381611731565b610c1f5760405162461bcd60e51b81526004016104fa90611db6565b6005546001600160a01b03163314610c495760405162461bcd60e51b81526004016104fa90611e10565b610c52826119d7565b5050565b6005546000906001600160a01b03163314610c835760405162461bcd60e51b81526004016104fa90611e10565b87610c8d81611731565b610ca95760405162461bcd60e51b81526004016104fa90611db6565b610cb889898989898989610516565b9998505050505050505050565b600082610cd181611731565b610ced5760405162461bcd60e51b81526004016104fa90611db6565b610cf784846104cf565b61083a5760405162461bcd60e51b815260206004820152601060248201526f6572726f7220696e20617070726f766560801b60448201526064016104fa565b505050565b60003382610d4c82826109ed610a96565b81610d56846108d3565b10610d925760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b815250610dbe565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b90610ddc5760405162461bcd60e51b81526004016104fa9190611d63565b50610a8d8585611ac2565b6000808363ffffffff16118015610e175750610e076064620592bb611e99565b63ffffffff168363ffffffff1611155b8015610e2e57508263ffffffff168463ffffffff16105b8015610e41575060018263ffffffff1610155b610e8d5760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642076657374696e67207363686564756c65000000000000000060448201526064016104fa565b610e978284611f7e565b63ffffffff16158015610eb75750610eaf8285611f7e565b63ffffffff16155b610f0f5760405162461bcd60e51b815260206004820152602360248201527f696e76616c696420636c6966662f6475726174696f6e20666f7220696e7465726044820152621d985b60ea1b60648201526084016104fa565b604080516080810182526001815263ffffffff8681166020808401828152888416858701818152898616606088018181526001600160a01b038f166000818152600788528b902099518a5496519451925164ffffffffff1990971690151564ffffffff00191617610100948a1694909402939093176cffffffffffffffff00000000001916600160281b918916919091026cffffffff000000000000000000191617600160481b949097169390930295909517909555855192835290820152919290917f9555f76172de1035c7935d5913b3977fda26aa5eaedec4a0a1b291d4aab0c3ca910160405180910390a3506001949350505050565b6001600160a01b03861660009081526008602052604081205460ff16156110685760405162461bcd60e51b81526020600482015260146024820152736772616e7420616c72656164792065786973747360601b60448201526064016104fa565b8585111580156110785750600085115b80156111005750306001600160a01b031663b74e452b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b857600080fd5b505afa1580156110cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f09190611d47565b63ffffffff168463ffffffff1610155b8015611115575063f486570063ffffffff8516105b61115a5760405162461bcd60e51b8152602060048201526016602482015275696e76616c69642076657374696e6720706172616d7360501b60448201526064016104fa565b6001600160a01b03831660009081526007602052604090205460ff166111c25760405162461bcd60e51b815260206004820152601860248201527f6e6f20737563682076657374696e67207363686564756c65000000000000000060448201526064016104fa565b6111cd828888611357565b6040518060a001604052806001151581526020018563ffffffff168152602001846001600160a01b03168152602001836001600160a01b031681526020018681525060086000896001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160056101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160020155905050816001600160a01b031685886001600160a01b03167fce19dc9f3460f5845c81c7fa52526977d7e7275df4b1d0e40ea09653252e0c75878760405161134292919063ffffffff9290921682526001600160a01b0316602082015260400190565b60405180910390a45060019695505050505050565b6001600160a01b0383166113bb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104fa565b6001600160a01b03821661141d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104fa565b611428838383611acf565b6001600160a01b038316600090815260208190526040902054818110156114a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104fa565b6114aa8282611f07565b6001600160a01b0380861660009081526020819052604080822093909355908516815290812080548492906114e0908490611e45565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161152c91815260200190565b60405180910390a350505050565b6001600160a01b03831661159c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104fa565b6001600160a01b0382166115fd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104fa565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091611695918590610715908690611e45565b50600192915050565b60095460ff166116e75760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016104fa565b6009805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60006001600160a01b0382163314806105105750506001600160a01b031660009081526006602052604090205460ff1690565b60095460ff16156117875760405162461bcd60e51b81526004016104fa90611de6565b6009805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117143390565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561183e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104fa565b61083a33856107158685611f07565b60006118598483611b60565b909211159392505050565b6000611695338484611357565b6001600160a01b0380831660009081526008602090815260408083208054600160281b9004909416835260079091528120909190826118af85611b8a565b835490915060ff1615806118ee5750815483546118df9163ffffffff610100918290048116929190910416611e5d565b63ffffffff168163ffffffff16105b15611900575050600201549050610510565b815483546119239163ffffffff600160281b909104811691610100900416611e5d565b63ffffffff168163ffffffff16106119415760009350505050610510565b825460009061195b90610100900463ffffffff1683611f1e565b8354909150600090600160481b900463ffffffff1661197a8184611e99565b6119849190611edb565b8454600287015491925060009163ffffffff600160281b9092048216916119ae9190851690611ebc565b6119b89190611e85565b90508086600201546119ca9190611f07565b9650505050505050610510565b6005546001600160a01b03163314611a015760405162461bcd60e51b81526004016104fa90611e10565b6001600160a01b038116611a665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104fa565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600061169533848461153a565b60095460ff1615611af25760405162461bcd60e51b81526004016104fa90611de6565b6001600160a01b038216301415611b5b5760405162461bcd60e51b815260206004820152602760248201527f45524332303a207472616e7366657220746f2074686520636f6e7472616374206044820152666164647265737360c81b60648201526084016104fa565b610d36565b600080611b6c846108d3565b9050611b788484611871565b611b829082611f07565b949350505050565b600063ffffffff821615611b9e5781610510565b610510610a96565b80356001600160a01b03811681146108ed57600080fd5b600060208284031215611bce578081fd5b61050d82611ba6565b60008060408385031215611be9578081fd5b611bf283611ba6565b9150611c0060208401611ba6565b90509250929050565b600080600060608486031215611c1d578081fd5b611c2684611ba6565b9250611c3460208501611ba6565b9150604084013590509250925092565b60008060408385031215611c56578182fd5b611c5f83611ba6565b946020939093013593505050565b600080600080600080600060e0888a031215611c87578283fd5b611c9088611ba6565b965060208801359550604088013594506060880135611cae81611fcd565b93506080880135611cbe81611fcd565b925060a0880135611cce81611fcd565b915060c0880135611cde81611fcd565b8091505092959891949750929550565b60008060408385031215611d00578182fd5b611d0983611ba6565b91506020830135611d1981611fcd565b809150509250929050565b600060208284031215611d35578081fd5b8135611d4081611fcd565b9392505050565b600060208284031215611d58578081fd5b8151611d4081611fcd565b6000602080835283518082850152825b81811015611d8f57858101830151858201604001528201611d73565b81811115611da05783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601690820152751858d8dbdd5b9d081b9bdd081c9959da5cdd195c995960521b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611e5857611e58611fa1565b500190565b600063ffffffff808316818516808303821115611e7c57611e7c611fa1565b01949350505050565b600082611e9457611e94611fb7565b500490565b600063ffffffff80841680611eb057611eb0611fb7565b92169190910492915050565b6000816000190483118215151615611ed657611ed6611fa1565b500290565b600063ffffffff80831681851681830481118215151615611efe57611efe611fa1565b02949350505050565b600082821015611f1957611f19611fa1565b500390565b600063ffffffff83811690831681811015611f3b57611f3b611fa1565b039392505050565b600181811c90821680611f5757607f821691505b60208210811415611f7857634e487b7160e01b600052602260045260246000fd5b50919050565b600063ffffffff80841680611f9557611f95611fb7565b92169190910692915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b63ffffffff81168114611fdf57600080fd5b5056fea26469706673582212204b21a9e43c994d71107b14ae9f913041442ce52628f70113ba0b1021f5e760c864736f6c63430008030033

Deployed Bytecode Sourcemap

44108:1212:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8116:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44764:159;;;;;;:::i;:::-;;:::i;:::-;;;3402:14:1;;3395:22;3377:41;;3365:2;3350:18;44764:159:0;3332:92:1;32940:909:0;;;;;;:::i;:::-;;:::i;9209:108::-;9297:12;;9209:108;;;13201:25:1;;;13189:2;13174:18;9209:108:0;13156:76:1;10907:422:0;;;;;;:::i;:::-;;:::i;41224:379::-;;;;;;:::i;:::-;;:::i;:::-;;;;13544:25:1;;;13600:2;13585:18;;13578:34;;;;13628:18;;;13621:34;;;;13674:10;13720:15;;;13715:2;13700:18;;13693:43;13773:15;;13767:3;13752:19;;13745:44;13826:15;;;13820:3;13805:19;;13798:44;13879:15;13873:3;13858:19;;13851:44;13531:3;13516:19;41224:379:0;13498:403:1;44162:57:0;;;;;;9060:84;;;9134:2;14835:36:1;;14823:2;14808:18;9060:84:0;14790:87:1;44931:188:0;;;;;;:::i;:::-;;:::i;44422:69::-;;;:::i;:::-;;20797:223;;;;;;:::i;:::-;;:::i;21233:255::-;;;;;;:::i;:::-;;:::i;2078:86::-;2149:7;;;;2078:86;;9380:127;;;;;;:::i;:::-;;:::i;18605:148::-;;;:::i;44348:66::-;;;:::i;17954:87::-;18027:6;;17954:87;;-1:-1:-1;;;;;18027:6:0;;;3175:51:1;;3163:2;3148:18;17954:87:0;3130:102:1;8326:95:0;;;:::i;45127:188::-;;;;;;:::i;:::-;;:::i;43290:170::-;;;;;;:::i;:::-;;:::i;34759:122::-;;;:::i;:::-;;;14080:10:1;14068:23;;;14050:42;;14038:2;14023:18;34759:122:0;14005:93:1;20023:114:0;;;;;;:::i;:::-;-1:-1:-1;;;;;20107:22:0;20083:4;20107:22;;;:13;:22;;;;;;;;;20023:114;39433:930;;;;;;:::i;:::-;;:::i;19885:130::-;;;:::i;9958:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;10074:18:0;;;10047:7;10074:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9958:151;21869:153;;;;;;:::i;:::-;;:::i;33979:473::-;;;;;;:::i;:::-;;:::i;21028:197::-;;;;;;:::i;:::-;;:::i;8116:91::-;8161:13;8194:5;8187:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8116:91;:::o;44764:159::-;44861:4;2404:8;2149:7;;;;2078:86;;2404:8;2403:9;2395:38;;;;-1:-1:-1;;;2395:38:0;;;;;;;:::i;:::-;;;;;;;;;44885:30:::1;44899:7;44908:6;44885:13;:30::i;:::-;44878:37;;2444:1;44764:159:::0;;;;:::o;32940:909::-;18027:6;;33211:4;;-1:-1:-1;;;;;18027:6:0;735:10;18174:23;18166:68;;;;-1:-1:-1;;;18166:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33299:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:34;::::1;;33298:35;33290:68;;;::::0;-1:-1:-1;;;33290:68:0;;12149:2:1;33290:68:0::1;::::0;::::1;12131:21:1::0;12188:2;12168:18;;;12161:30;-1:-1:-1;;;12207:18:1;;;12200:50;12267:18;;33290:68:0::1;12121:170:1::0;33290:68:0::1;33465:67;33485:11;33498:13;33513:8;33523;33465:19;:67::i;:::-;33457:120;;;::::0;-1:-1:-1;;;33457:120:0;;9066:2:1;33457:120:0::1;::::0;::::1;9048:21:1::0;9105:2;9085:18;;;9078:30;9144:34;9124:18;;;9117:62;-1:-1:-1;;;9195:18:1;;;9188:38;9243:19;;33457:120:0::1;9038:230:1::0;33457:120:0::1;33693:95;33713:11;33726;33739:13;33754:8;33764:11;33777:10;33693:19;:95::i;:::-;33685:132;;;::::0;-1:-1:-1;;;33685:132:0;;6504:2:1;33685:132:0::1;::::0;::::1;6486:21:1::0;6543:2;6523:18;;;6516:30;6582:26;6562:18;;;6555:54;6626:18;;33685:132:0::1;6476:174:1::0;33685:132:0::1;-1:-1:-1::0;33837:4:0::1;32940:909:::0;;;;;;;;;:::o;10907:422::-;11013:4;11030:36;11040:6;11048:9;11059:6;11030:9;:36::i;:::-;-1:-1:-1;;;;;11106:19:0;;11079:24;11106:19;;;:11;:19;;;;;;;;735:10;11106:33;;;;;;;;11158:26;;;;11150:79;;;;-1:-1:-1;;;11150:79:0;;9819:2:1;11150:79:0;;;9801:21:1;9858:2;9838:18;;;9831:30;9897:34;9877:18;;;9870:62;-1:-1:-1;;;9948:18:1;;;9941:38;9996:19;;11150:79:0;9791:230:1;11150:79:0;11240:57;11249:6;735:10;11271:25;11290:6;11271:16;:25;:::i;:::-;11240:8;:57::i;:::-;-1:-1:-1;11317:4:0;;10907:422;-1:-1:-1;;;;10907:422:0:o;41224:379::-;41306:20;41337:23;41371:21;41403:19;41433;41463:20;41494:23;41548:47;41570:10;41582:12;41548:21;:47::i;:::-;41541:54;;;;-1:-1:-1;41541:54:0;;-1:-1:-1;41541:54:0;;-1:-1:-1;41541:54:0;-1:-1:-1;41541:54:0;-1:-1:-1;41541:54:0;;-1:-1:-1;41224:379:0;-1:-1:-1;;41224:379:0:o;44931:188::-;45042:4;2404:8;2149:7;;;;2078:86;;2404:8;2403:9;2395:38;;;;-1:-1:-1;;;2395:38:0;;;;;;;:::i;:::-;45067:44:::1;45091:7;45100:10;45067:23;:44::i;44422:69::-:0;18027:6;;-1:-1:-1;;;;;18027:6:0;735:10;18174:23;18166:68;;;;-1:-1:-1;;;18166:68:0;;;;;;;:::i;:::-;44473:10:::1;:8;:10::i;:::-;44422:69::o:0;20797:223::-;20886:4;20873:2;20361:23;20376:7;20361:14;:23::i;:::-;20353:58;;;;-1:-1:-1;;;20353:58:0;;;;;;;:::i;:::-;20906:10;20903:27:::1;;20925:5;20918:12;;;;20903:27;20949:19;20958:2;20962:5;20949:8;:19::i;:::-;20941:49;;;::::0;-1:-1:-1;;;20941:49:0;;6857:2:1;20941:49:0::1;::::0;::::1;6839:21:1::0;6896:2;6876:18;;;6869:30;-1:-1:-1;;;6915:18:1;;;6908:47;6972:18;;20941:49:0::1;6829:167:1::0;20941:49:0::1;21008:4;21001:11;;20422:1;20797:223:::0;;;;;:::o;21233:255::-;21340:4;21327:2;20361:23;20376:7;20361:14;:23::i;:::-;20353:58;;;;-1:-1:-1;;;20353:58:0;;;;;;;:::i;:::-;21360:10;21357:27:::1;;21379:5;21372:12;;;;21357:27;21403:29;21416:4;21422:2;21426:5;21403:12;:29::i;:::-;21395:63;;;::::0;-1:-1:-1;;;21395:63:0;;7963:2:1;21395:63:0::1;::::0;::::1;7945:21:1::0;8002:2;7982:18;;;7975:30;-1:-1:-1;;;8021:18:1;;;8014:51;8082:18;;21395:63:0::1;7935:171:1::0;20422:1:0::1;21233:255:::0;;;;;;:::o;9380:127::-;-1:-1:-1;;;;;9481:18:0;;9454:7;9481:18;;;;;;;;;;;9380:127;;;;:::o;18605:148::-;18027:6;;-1:-1:-1;;;;;18027:6:0;735:10;18174:23;18166:68;;;;-1:-1:-1;;;18166:68:0;;;;;;;:::i;:::-;18696:6:::1;::::0;18675:40:::1;::::0;18712:1:::1;::::0;-1:-1:-1;;;;;18696:6:0::1;::::0;18675:40:::1;::::0;18712:1;;18675:40:::1;18726:6;:19:::0;;-1:-1:-1;;;;;;18726:19:0::1;::::0;;18605:148::o;44348:66::-;18027:6;;-1:-1:-1;;;;;18027:6:0;735:10;18174:23;18166:68;;;;-1:-1:-1;;;18166:68:0;;;;;;;:::i;:::-;44398:8:::1;:6;:8::i;8326:95::-:0;8373:13;8406:7;8399:14;;;;;:::i;45127:188::-;45238:4;2404:8;2149:7;;;;2078:86;;2404:8;2403:9;2395:38;;;;-1:-1:-1;;;2395:38:0;;;;;;;:::i;:::-;45263:44:::1;45287:7;45296:10;45263:23;:44::i;43290:170::-:0;43403:4;43375:10;43387:5;42592:46;42613:7;42622:6;42630:7;:5;:7::i;:::-;42592:20;:46::i;:::-;42674:6;42653:18;42663:7;42653:9;:18::i;:::-;:27;:80;;;;;;;;;;;;;;;-1:-1:-1;;;42653:80:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42653:80:0;;;;42584:150;;;;;-1:-1:-1;;;42584:150:0;;;;;;;;:::i;:::-;;43427:25:::1;43442:2;43446:5;43427:14;:25::i;:::-;43420:32:::0;43290:170;-1:-1:-1;;;;;43290:170:0:o;34759:122::-;34806:6;34839:33;25432:12;34839:15;:33;:::i;:::-;34825:48;;34759:122;:::o;39433:930::-;39625:20;;;;;;;39588:11;735:10;-1:-1:-1;;;;;20504:23:0;:7;18027:6;;-1:-1:-1;;;;;18027:6:0;17954:87;;20504:7;-1:-1:-1;;;;;20504:23:0;;:48;;;-1:-1:-1;20531:10:0;-1:-1:-1;;;;;20531:21:0;;;20504:48;20496:76;;;;-1:-1:-1;;;20496:76:0;;9475:2:1;20496:76:0;;;9457:21:1;9514:2;9494:18;;;9487:30;-1:-1:-1;;;9533:18:1;;;9526:45;9588:18;;20496:76:0;9447:165:1;20496:76:0;-1:-1:-1;;;;;39887:25:0;;::::1;39860:24;39887:25:::0;;;:12:::1;:25;::::0;;;;;;;39975:21;;-1:-1:-1;;;39975:21:0;::::1;::::0;;::::1;39957:40:::0;;:17:::1;:40:::0;;;;;;40034:46:::1;39900:11:::0;40067:12;40034:19:::1;:46::i;:::-;40113:12;::::0;::::1;::::0;40008:72;;-1:-1:-1;40156:29:0::1;40008:72:::0;40113:12;40156:29:::1;:::i;:::-;40244:14:::0;;40269:16;;40244:14;;40196:15;;-1:-1:-1;40196:15:0;-1:-1:-1;40244:14:0::1;;::::0;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;40269:16:0;::::1;::::0;::::1;::::0;-1:-1:-1;40296:21:0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;40328:16:0;;::::1;;::::0;-1:-1:-1;40244:14:0;-1:-1:-1;;;;39433:930:0:o;19885:130::-;19944:10;19930:25;;;;:13;:25;;;;;;:32;;-1:-1:-1;;19930:32:0;19958:4;19930:32;;;19978:29;;;19930:25;19978:29;19885:130::o;21869:153::-;21950:8;20361:23;20376:7;20361:14;:23::i;:::-;20353:58;;;;-1:-1:-1;;;20353:58:0;;;;;;;:::i;:::-;18027:6;;-1:-1:-1;;;;;18027:6:0;735:10;18174:23:::1;18166:68;;;;-1:-1:-1::0;;;18166:68:0::1;;;;;;;:::i;:::-;21981:33:::2;22005:8;21981:23;:33::i;:::-;21869:153:::0;;:::o;33979:473::-;18027:6;;34287:4;;-1:-1:-1;;;;;18027:6:0;735:10;18174:23;18166:68;;;;-1:-1:-1;;;18166:68:0;;;;;;;:::i;:::-;34265:11:::1;20361:23;20376:7;20361:14;:23::i;:::-;20353:58;;;;-1:-1:-1::0;;;20353:58:0::1;;;;;;;:::i;:::-;34313:131:::2;34346:11;34359;34372:13;34400:8;34410;34420:13;34435:8;34313:18;:131::i;:::-;34306:138:::0;33979:473;-1:-1:-1;;;;;;;;;33979:473:0:o;21028:197::-;21126:4;21108:7;20361:23;20376:7;20361:14;:23::i;:::-;20353:58;;;;-1:-1:-1;;;20353:58:0;;;;;;;:::i;:::-;21151:23:::1;21159:7;21168:5;21151:7;:23::i;:::-;21143:52;;;::::0;-1:-1:-1;;;21143:52:0;;10995:2:1;21143:52:0::1;::::0;::::1;10977:21:1::0;11034:2;11014:18;;;11007:30;-1:-1:-1;;;11053:18:1;;;11046:46;11109:18;;21143:52:0::1;10967:166:1::0;16761:92:0;;;;:::o;43580:186::-;43705:4;43677:10;43689:5;42592:46;42613:7;42622:6;42630:7;:5;:7::i;42592:46::-;42674:6;42653:18;42663:7;42653:9;:18::i;:::-;:27;:80;;;;;;;;;;;;;;;-1:-1:-1;;;42653:80:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42653:80:0;;;;42584:150;;;;;-1:-1:-1;;;42584:150:0;;;;;;;;:::i;:::-;;43729:29:::1;43743:7;43752:5;43729:13;:29::i;27749:1140::-:0;27926:4;28084:1;28073:8;:12;;;:42;;;;-1:-1:-1;25294:25:0;25316:3;25123:6;25294:25;:::i;:::-;28089:26;;:8;:26;;;;28073:42;:83;;;;;28148:8;28132:24;;:13;:24;;;28073:83;:113;;;;;28185:1;28173:8;:13;;;;28073:113;28051:187;;;;-1:-1:-1;;;28051:187:0;;12498:2:1;28051:187:0;;;12480:21:1;12537:2;12517:18;;;12510:30;12576:26;12556:18;;;12549:54;12620:18;;28051:187:0;12470:174:1;28051:187:0;28392:19;28403:8;28392;:19;:::i;:::-;:24;;;:57;;;;-1:-1:-1;28420:24:0;28436:8;28420:13;:24;:::i;:::-;:29;;;28392:57;28370:142;;;;-1:-1:-1;;;28370:142:0;;11745:2:1;28370:142:0;;;11727:21:1;11784:2;11764:18;;;11757:30;11823:34;11803:18;;;11796:62;-1:-1:-1;;;11874:18:1;;;11867:33;11917:19;;28370:142:0;11717:225:1;28370:142:0;28614:79;;;;;;;;28644:4;28614:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28577:34:0;;-1:-1:-1;28577:34:0;;;:17;:34;;;;;:116;;;;;;;;;;-1:-1:-1;;28577:116:0;;;;;;-1:-1:-1;;28577:116:0;;;;;;;;;;;;;;-1:-1:-1;;28577:116:0;-1:-1:-1;;;28577:116:0;;;;;;;-1:-1:-1;;28577:116:0;;-1:-1:-1;;;28577:116:0;;;;;;;;;;;;;;;28758:101;;14596:34:1;;;14646:18;;;14639:43;28614:79:0;;28577:34;;28758:101;;14540:18:1;28758:101:0;;;;;;;-1:-1:-1;28877:4:0;27749:1140;;;;;;:::o;30287:1564::-;-1:-1:-1;;;;;30606:25:0;;30524:4;30606:25;;;:12;:25;;;;;:34;;;30605:35;30597:68;;;;-1:-1:-1;;;30597:68:0;;12149:2:1;30597:68:0;;;12131:21:1;12188:2;12168:18;;;12161:30;-1:-1:-1;;;12207:18:1;;;12200:50;12267:18;;30597:68:0;12121:170:1;30597:68:0;30759:11;30742:13;:28;;:49;;;;;30790:1;30774:13;:17;30742:49;:90;;;;;30820:4;-1:-1:-1;;;;;30820:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30808:24;;:8;:24;;;;30742:90;:120;;;;-1:-1:-1;25538:10:0;30836:26;;;;30742:120;30720:182;;;;-1:-1:-1;;;30720:182:0;;4643:2:1;30720:182:0;;;4625:21:1;4682:2;4662:18;;;4655:30;-1:-1:-1;;;4701:18:1;;;4694:52;4763:18;;30720:182:0;4615:172:1;30720:182:0;-1:-1:-1;;;;;28990:26:0;;28966:4;28990:26;;;:17;:26;;;;;:34;;;30988:73;;;;-1:-1:-1;;;30988:73:0;;7203:2:1;30988:73:0;;;7185:21:1;7242:2;7222:18;;;7215:30;7281:26;7261:18;;;7254:54;7325:18;;30988:73:0;7175:174:1;30988:73:0;31164:44;31174:7;31183:11;31196;31164:9;:44::i;:::-;31365:307;;;;;;;;31390:4;31365:307;;;;;;31421:8;31365:307;;;;;;31444:15;-1:-1:-1;;;;;31365:307:0;;;;;31535:7;-1:-1:-1;;;;;31365:307:0;;;;;31648:13;31365:307;;;31337:12;:25;31350:11;-1:-1:-1;;;;;31337:25:0;-1:-1:-1;;;;;31337:25:0;;;;;;;;;;;;:335;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31337:335:0;;;;;-1:-1:-1;;;;;31337:335:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31337:335:0;;;;;-1:-1:-1;;;;;31337:335:0;;;;;;;;;;;;;;;;;31813:7;-1:-1:-1;;;;;31737:84:0;31771:13;31758:11;-1:-1:-1;;;;;31737:84:0;;31786:8;31796:15;31737:84;;;;;;14305:10:1;14293:23;;;;14275:42;;-1:-1:-1;;;;;14353:32:1;14348:2;14333:18;;14326:60;14263:2;14248:18;;14230:162;31737:84:0;;;;;;;;-1:-1:-1;31839:4:0;30287:1564;;;;;;;;:::o;13323:604::-;-1:-1:-1;;;;;13429:20:0;;13421:70;;;;-1:-1:-1;;;13421:70:0;;10589:2:1;13421:70:0;;;10571:21:1;10628:2;10608:18;;;10601:30;10667:34;10647:18;;;10640:62;-1:-1:-1;;;10718:18:1;;;10711:35;10763:19;;13421:70:0;10561:227:1;13421:70:0;-1:-1:-1;;;;;13510:23:0;;13502:71;;;;-1:-1:-1;;;13502:71:0;;4239:2:1;13502:71:0;;;4221:21:1;4278:2;4258:18;;;4251:30;4317:34;4297:18;;;4290:62;-1:-1:-1;;;4368:18:1;;;4361:33;4411:19;;13502:71:0;4211:225:1;13502:71:0;13586:47;13607:6;13615:9;13626:6;13586:20;:47::i;:::-;-1:-1:-1;;;;;13670:17:0;;13646:21;13670:17;;;;;;;;;;;13706:23;;;;13698:74;;;;-1:-1:-1;;;13698:74:0;;7556:2:1;13698:74:0;;;7538:21:1;7595:2;7575:18;;;7568:30;7634:34;7614:18;;;7607:62;-1:-1:-1;;;7685:18:1;;;7678:36;7731:19;;13698:74:0;7528:228:1;13698:74:0;13803:22;13819:6;13803:13;:22;:::i;:::-;-1:-1:-1;;;;;13783:17:0;;;:9;:17;;;;;;;;;;;:42;;;;13836:20;;;;;;;;:30;;13860:6;;13783:9;13836:30;;13860:6;;13836:30;:::i;:::-;;;;;;;;13901:9;-1:-1:-1;;;;;13884:35:0;13893:6;-1:-1:-1;;;;;13884:35:0;;13912:6;13884:35;;;;13201:25:1;;13189:2;13174:18;;13156:76;13884:35:0;;;;;;;;13323:604;;;;:::o;15812:346::-;-1:-1:-1;;;;;15914:19:0;;15906:68;;;;-1:-1:-1;;;15906:68:0;;11340:2:1;15906:68:0;;;11322:21:1;11379:2;11359:18;;;11352:30;11418:34;11398:18;;;11391:62;-1:-1:-1;;;11469:18:1;;;11462:34;11513:19;;15906:68:0;11312:226:1;15906:68:0;-1:-1:-1;;;;;15993:21:0;;15985:68;;;;-1:-1:-1;;;15985:68:0;;6101:2:1;15985:68:0;;;6083:21:1;6140:2;6120:18;;;6113:30;6179:34;6159:18;;;6152:62;-1:-1:-1;;;6230:18:1;;;6223:32;6272:19;;15985:68:0;6073:224:1;15985:68:0;-1:-1:-1;;;;;16066:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16118:32;;13201:25:1;;;16118:32:0;;13174:18:1;16118:32:0;;;;;;;15812:346;;;:::o;11738:215::-;735:10;11826:4;11875:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11875:34:0;;;;;;;;;;11826:4;;11843:80;;11866:7;;11875:47;;11912:10;;11875:47;:::i;11843:80::-;-1:-1:-1;11941:4:0;11738:215;;;;:::o;3137:120::-;2149:7;;;;2673:41;;;;-1:-1:-1;;;2673:41:0;;4994:2:1;2673:41:0;;;4976:21:1;5033:2;5013:18;;;5006:30;-1:-1:-1;;;5052:18:1;;;5045:50;5112:18;;2673:41:0;4966:170:1;2673:41:0;3196:7:::1;:15:::0;;-1:-1:-1;;3196:15:0::1;::::0;;3227:22:::1;735:10:::0;3236:12:::1;3227:22;::::0;-1:-1:-1;;;;;3193:32:1;;;3175:51;;3163:2;3148:18;3227:22:0::1;;;;;;;3137:120::o:0;20145:143::-;20209:4;-1:-1:-1;;;;;20233:21:0;;20244:10;20233:21;;:47;;-1:-1:-1;;;;;;;20258:22:0;;;;;:13;:22;;;;;;;;;20145:143::o;2878:118::-;2149:7;;;;2403:9;2395:38;;;;-1:-1:-1;;;2395:38:0;;;;;;;:::i;:::-;2938:7:::1;:14:::0;;-1:-1:-1;;2938:14:0::1;2948:4;2938:14;::::0;;2968:20:::1;2975:12;735:10:::0;655:98;;12456:377;735:10;12549:4;12593:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12593:34:0;;;;;;;;;;12646:35;;;;12638:85;;;;-1:-1:-1;;;12638:85:0;;12851:2:1;12638:85:0;;;12833:21:1;12890:2;12870:18;;;12863:30;12929:34;12909:18;;;12902:62;-1:-1:-1;;;12980:18:1;;;12973:35;13025:19;;12638:85:0;12823:227:1;12638:85:0;12734:67;735:10;12757:7;12766:34;12785:15;12766:16;:34;:::i;41973:179::-;42073:4;42108:35;42128:7;42137:5;42108:19;:35::i;:::-;42098:45;;;;;41973:179;-1:-1:-1;;;41973:179:0:o;9720:175::-;9806:4;9823:42;735:10;9847:9;9858:6;9823:9;:42::i;35456:2270::-;-1:-1:-1;;;;;35597:25:0;;;35550:7;35597:25;;;:12;:25;;;;;;;;35685:21;;-1:-1:-1;;;35685:21:0;;;;;35667:40;;:17;:40;;;;;35550:7;;35597:25;35550:7;35733:27;35747:12;35733:13;:27::i;:::-;35879:14;;35718:42;;-1:-1:-1;35879:14:0;;35878:15;;:65;;-1:-1:-1;35922:21:0;;35905:14;;:38;;35922:21;;;;;;;;;35905:14;;;;;:38;:::i;:::-;35897:46;;:5;:46;;;35878:65;35874:1845;;;-1:-1:-1;;36029:12:0;;;;-1:-1:-1;36022:19:0;;35874:1845;36188:16;;36171:14;;:33;;36188:16;-1:-1:-1;;;36188:16:0;;;;;;;36171:14;;;:33;:::i;:::-;36162:42;;:5;:42;;;36158:1561;;36298:1;36283:17;;;;;;;36158:1561;36489:14;;36461:17;;36481:22;;36489:14;;;;;36481:5;:22;:::i;:::-;36949:16;;36461:42;;-1:-1:-1;36886:26:0;;-1:-1:-1;;;36949:16:0;;;;36916:29;36949:16;36461:42;36916:29;:::i;:::-;36915:50;;;;:::i;:::-;37648:16;;37610:12;;;;36886:79;;-1:-1:-1;37592:14:0;;37648:16;-1:-1:-1;;;37648:16:0;;;;;;37610:34;;;;;;;:::i;:::-;37609:55;;;;:::i;:::-;37592:72;;37701:6;37686:5;:12;;;:21;;;;:::i;:::-;37679:28;;;;;;;;;;18908:244;18027:6;;-1:-1:-1;;;;;18027:6:0;735:10;18174:23;18166:68;;;;-1:-1:-1;;;18166:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18997:22:0;::::1;18989:73;;;::::0;-1:-1:-1;;;18989:73:0;;5694:2:1;18989:73:0::1;::::0;::::1;5676:21:1::0;5733:2;5713:18;;;5706:30;5772:34;5752:18;;;5745:62;-1:-1:-1;;;5823:18:1;;;5816:36;5869:19;;18989:73:0::1;5666:228:1::0;18989:73:0::1;19099:6;::::0;19078:38:::1;::::0;-1:-1:-1;;;;;19078:38:0;;::::1;::::0;19099:6:::1;::::0;19078:38:::1;::::0;19099:6:::1;::::0;19078:38:::1;19127:6;:17:::0;;-1:-1:-1;;;;;;19127:17:0::1;-1:-1:-1::0;;;;;19127:17:0;;;::::1;::::0;;;::::1;::::0;;18908:244::o;10256:169::-;10339:4;10356:39;735:10;10379:7;10388:6;10356:8;:39::i;44499:257::-;2149:7;;;;2403:9;2395:38;;;;-1:-1:-1;;;2395:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44630:19:0;::::1;44644:4;44630:19;;44622:71;;;::::0;-1:-1:-1;;;44622:71:0;;8658:2:1;44622:71:0::1;::::0;::::1;8640:21:1::0;8697:2;8677:18;;;8670:30;8736:34;8716:18;;;8709:62;-1:-1:-1;;;8787:18:1;;;8780:37;8834:19;;44622:71:0::1;8630:229:1::0;44622:71:0::1;44704:44;16761:92:::0;38214:230;38301:7;38321:19;38343:22;38353:11;38343:9;:22::i;:::-;38321:44;;38397:39;38417:11;38430:5;38397:19;:39::i;:::-;38383:53;;:11;:53;:::i;:::-;38376:60;38214:230;-1:-1:-1;;;;38214:230:0:o;34889:143::-;34956:6;34982:17;;;;:42;;35012:12;34982:42;;;35002:7;:5;:7::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:196;;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;;;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;;;;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:264::-;;;1140:2;1128:9;1119:7;1115:23;1111:32;1108:2;;;1161:6;1153;1146:22;1108:2;1189:29;1208:9;1189:29;:::i;:::-;1179:39;1265:2;1250:18;;;;1237:32;;-1:-1:-1;;;1098:177:1:o;1280:886::-;;;;;;;;1490:3;1478:9;1469:7;1465:23;1461:33;1458:2;;;1512:6;1504;1497:22;1458:2;1540:29;1559:9;1540:29;:::i;:::-;1530:39;;1616:2;1605:9;1601:18;1588:32;1578:42;;1667:2;1656:9;1652:18;1639:32;1629:42;;1721:2;1710:9;1706:18;1693:32;1734:30;1758:5;1734:30;:::i;:::-;1783:5;-1:-1:-1;1840:3:1;1825:19;;1812:33;1854:32;1812:33;1854:32;:::i;:::-;1905:7;-1:-1:-1;1964:3:1;1949:19;;1936:33;1978:32;1936:33;1978:32;:::i;:::-;2029:7;-1:-1:-1;2088:3:1;2073:19;;2060:33;2102:32;2060:33;2102:32;:::i;:::-;2153:7;2143:17;;;1448:718;;;;;;;;;;:::o;2171:329::-;;;2299:2;2287:9;2278:7;2274:23;2270:32;2267:2;;;2320:6;2312;2305:22;2267:2;2348:29;2367:9;2348:29;:::i;:::-;2338:39;;2427:2;2416:9;2412:18;2399:32;2440:30;2464:5;2440:30;:::i;:::-;2489:5;2479:15;;;2257:243;;;;;:::o;2505:255::-;;2616:2;2604:9;2595:7;2591:23;2587:32;2584:2;;;2637:6;2629;2622:22;2584:2;2681:9;2668:23;2700:30;2724:5;2700:30;:::i;:::-;2749:5;2574:186;-1:-1:-1;;;2574:186:1:o;2765:259::-;;2887:2;2875:9;2866:7;2862:23;2858:32;2855:2;;;2908:6;2900;2893:22;2855:2;2945:9;2939:16;2964:30;2988:5;2964:30;:::i;3429:603::-;;3570:2;3599;3588:9;3581:21;3631:6;3625:13;3674:6;3669:2;3658:9;3654:18;3647:34;3699:4;3712:140;3726:6;3723:1;3720:13;3712:140;;;3821:14;;;3817:23;;3811:30;3787:17;;;3806:2;3783:26;3776:66;3741:10;;3712:140;;;3870:6;3867:1;3864:13;3861:2;;;3940:4;3935:2;3926:6;3915:9;3911:22;3907:31;3900:45;3861:2;-1:-1:-1;4016:2:1;3995:15;-1:-1:-1;;3991:29:1;3976:45;;;;4023:2;3972:54;;3550:482;-1:-1:-1;;;3550:482:1:o;5141:346::-;5343:2;5325:21;;;5382:2;5362:18;;;5355:30;-1:-1:-1;;;5416:2:1;5401:18;;5394:52;5478:2;5463:18;;5315:172::o;8111:340::-;8313:2;8295:21;;;8352:2;8332:18;;;8325:30;-1:-1:-1;;;8386:2:1;8371:18;;8364:46;8442:2;8427:18;;8285:166::o;10026:356::-;10228:2;10210:21;;;10247:18;;;10240:30;10306:34;10301:2;10286:18;;10279:62;10373:2;10358:18;;10200:182::o;14882:128::-;;14953:1;14949:6;14946:1;14943:13;14940:2;;;14959:18;;:::i;:::-;-1:-1:-1;14995:9:1;;14930:80::o;15015:228::-;;15082:10;15119:2;15116:1;15112:10;15149:2;15146:1;15142:10;15180:3;15176:2;15172:12;15167:3;15164:21;15161:2;;;15188:18;;:::i;:::-;15224:13;;15062:181;-1:-1:-1;;;;15062:181:1:o;15248:120::-;;15314:1;15304:2;;15319:18;;:::i;:::-;-1:-1:-1;15353:9:1;;15294:74::o;15373:191::-;;15438:10;15475:2;15472:1;15468:10;15497:3;15487:2;;15504:18;;:::i;:::-;15542:10;;15538:20;;;;;15418:146;-1:-1:-1;;15418:146:1:o;15569:168::-;;15675:1;15671;15667:6;15663:14;15660:1;15657:21;15652:1;15645:9;15638:17;15634:45;15631:2;;;15682:18;;:::i;:::-;-1:-1:-1;15722:9:1;;15621:116::o;15742:262::-;;15813:10;15850:2;15847:1;15843:10;15880:2;15877:1;15873:10;15936:3;15932:2;15928:12;15923:3;15920:21;15913:3;15906:11;15899:19;15895:47;15892:2;;;15945:18;;:::i;:::-;15985:13;;15793:211;-1:-1:-1;;;;15793:211:1:o;16009:125::-;;16077:1;16074;16071:8;16068:2;;;16082:18;;:::i;:::-;-1:-1:-1;16119:9:1;;16058:76::o;16139:221::-;;16207:10;16267;;;;16237;;16289:12;;;16286:2;;;16304:18;;:::i;:::-;16341:13;;16187:173;-1:-1:-1;;;16187:173:1:o;16365:380::-;16444:1;16440:12;;;;16487;;;16508:2;;16562:4;16554:6;16550:17;16540:27;;16508:2;16615;16607:6;16604:14;16584:18;16581:38;16578:2;;;16661:10;16656:3;16652:20;16649:1;16642:31;16696:4;16693:1;16686:15;16724:4;16721:1;16714:15;16578:2;;16420:325;;;:::o;16750:183::-;;16807:10;16844:2;16841:1;16837:10;16866:3;16856:2;;16873:18;;:::i;:::-;16911:10;;16907:20;;;;;16787:146;-1:-1:-1;;16787:146:1:o;16938:127::-;16999:10;16994:3;16990:20;16987:1;16980:31;17030:4;17027:1;17020:15;17054:4;17051:1;17044:15;17070:127;17131:10;17126:3;17122:20;17119:1;17112:31;17162:4;17159:1;17152:15;17186:4;17183:1;17176:15;17202:121;17287:10;17280:5;17276:22;17269:5;17266:33;17256:2;;17313:1;17310;17303:12;17256:2;17246:77;:::o

Swarm Source

ipfs://4b21a9e43c994d71107b14ae9f913041442ce52628f70113ba0b1021f5e760c8

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Chronicle is a world-class design studio and community-driven marketplace digital platform built to connect brands with fans, featuring officially licensed digital collectibles, also more commonly known as NFTs.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.