MATIC Price: $0.355177 (-21.25%)
 

Overview

MATIC Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 MATIC

MATIC Value

$0.00

Token Holdings

Sponsored

Transaction Hash
Method
Block
From
To
Register Identit...602213052024-08-05 11:46:201 min ago1722858380IN
0x87F0F4b7...c92281b51
0 MATIC0.10399106344.60601958
Register Identit...602212522024-08-05 11:44:064 mins ago1722858246IN
0x87F0F4b7...c92281b51
0 MATIC0.09201816285.99361687
Register Identit...602209422024-08-05 11:32:5615 mins ago1722857576IN
0x87F0F4b7...c92281b51
0 MATIC0.07871681260.85208774
Register Identit...602206082024-08-05 11:20:3627 mins ago1722856836IN
0x87F0F4b7...c92281b51
0 MATIC0.09035685299.39316274
Register Identit...602205762024-08-05 11:19:2828 mins ago1722856768IN
0x87F0F4b7...c92281b51
0 MATIC0.08960432296.93117761
Register Identit...602205292024-08-05 11:17:4830 mins ago1722856668IN
0x87F0F4b7...c92281b51
0 MATIC0.08155655270.24451062
Register Identit...602205102024-08-05 11:17:0631 mins ago1722856626IN
0x87F0F4b7...c92281b51
0 MATIC0.09107022283.07557104
Register Identit...602204932024-08-05 11:16:3031 mins ago1722856590IN
0x87F0F4b7...c92281b51
0 MATIC0.09024011299.02614903
Register Identit...602204352024-08-05 11:13:5634 mins ago1722856436IN
0x87F0F4b7...c92281b51
0 MATIC0.08920658277.25521389
Register Identit...602201472024-08-05 11:03:4444 mins ago1722855824IN
0x87F0F4b7...c92281b51
0 MATIC0.06921599229.34391256
Register Identit...602201462024-08-05 11:03:4244 mins ago1722855822IN
0x87F0F4b7...c92281b51
0 MATIC0.06920865229.34391256
Register Identit...602200912024-08-05 11:01:4446 mins ago1722855704IN
0x87F0F4b7...c92281b51
0 MATIC0.07085308234.79323063
Register Identit...602198732024-08-05 10:53:3054 mins ago1722855210IN
0x87F0F4b7...c92281b51
0 MATIC0.06636424219.90352678
Register Identit...602198532024-08-05 10:52:4655 mins ago1722855166IN
0x87F0F4b7...c92281b51
0 MATIC0.06636688219.90352678
Register Identit...602197262024-08-05 10:48:161 hrs ago1722854896IN
0x87F0F4b7...c92281b51
0 MATIC0.06636688219.90352678
Register Identit...602197212024-08-05 10:48:061 hr ago1722854886IN
0x87F0F4b7...c92281b51
0 MATIC0.07075373219.90352678
Register Identit...602197212024-08-05 10:48:061 hr ago1722854886IN
0x87F0F4b7...c92281b51
0 MATIC0.06635984219.90352678
Register Identit...602195072024-08-05 10:40:001 hr ago1722854400IN
0x87F0F4b7...c92281b51
0 MATIC0.06636248219.90352678
Register Identit...602194262024-08-05 10:37:081 hr ago1722854228IN
0x87F0F4b7...c92281b51
0 MATIC0.06635984219.90352678
Register Identit...602192082024-08-05 10:29:101 hr ago1722853750IN
0x87F0F4b7...c92281b51
0 MATIC0.06049348200.45558291
Register Identit...602190472024-08-05 10:23:101 hr ago1722853390IN
0x87F0F4b7...c92281b51
0 MATIC0.10651555352.93425939
Register Identit...602190362024-08-05 10:22:461 hr ago1722853366IN
0x87F0F4b7...c92281b51
0 MATIC0.12627074392.47548536
Register Identit...602189892024-08-05 10:21:061 hr ago1722853266IN
0x87F0F4b7...c92281b51
0 MATIC0.12207931379.44767158
Register Identit...602185112024-08-05 10:03:381 hr ago1722852218IN
0x87F0F4b7...c92281b51
0 MATIC0.05524004171.68677552
Register Identit...602184492024-08-05 10:01:281 hr ago1722852088IN
0x87F0F4b7...c92281b51
0 MATIC0.07501987248.57480415
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
602213052024-08-05 11:46:201 min ago1722858380
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602212522024-08-05 11:44:064 mins ago1722858246
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602209422024-08-05 11:32:5615 mins ago1722857576
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602206082024-08-05 11:20:3627 mins ago1722856836
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602205762024-08-05 11:19:2828 mins ago1722856768
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602205292024-08-05 11:17:4830 mins ago1722856668
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602205102024-08-05 11:17:0631 mins ago1722856626
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602204932024-08-05 11:16:3031 mins ago1722856590
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602204352024-08-05 11:13:5634 mins ago1722856436
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602201472024-08-05 11:03:4444 mins ago1722855824
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602201462024-08-05 11:03:4244 mins ago1722855822
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602200912024-08-05 11:01:4446 mins ago1722855704
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602198732024-08-05 10:53:3054 mins ago1722855210
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602198532024-08-05 10:52:4655 mins ago1722855166
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602197262024-08-05 10:48:161 hrs ago1722854896
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602197212024-08-05 10:48:061 hr ago1722854886
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602197212024-08-05 10:48:061 hr ago1722854886
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602195072024-08-05 10:40:001 hr ago1722854400
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602194262024-08-05 10:37:081 hr ago1722854228
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602192082024-08-05 10:29:101 hr ago1722853750
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602190472024-08-05 10:23:101 hr ago1722853390
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602190362024-08-05 10:22:461 hr ago1722853366
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602189892024-08-05 10:21:061 hr ago1722853266
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602185112024-08-05 10:03:381 hr ago1722852218
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
602184492024-08-05 10:01:281 hr ago1722852088
0x87F0F4b7...c92281b51
 Contract Creation0 MATIC
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Registry

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-11-28
*/

/**
 *Submitted for verification at polygonscan.com on 2021-10-18
*/

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


/**
 * @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);
}


abstract contract IERC20Token is IERC20 {
    function upgrade(uint256 value) public virtual;
}

interface IHermesContract {
    enum Status { Active, Paused, Punishment, Closed }
    function initialize(address _token, address _operator, uint16 _hermesFee, uint256 _minStake, uint256 _maxStake, address payable _routerAddress) external;
    function openChannel(address _party, uint256 _amountToLend) external;
    function getOperator() external view returns (address);
    function getStake() external view returns (uint256);
    function getStatus() external view returns (Status);
}


contract Ownable {
    address private _owner;

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

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender || _owner == address(0x0), "Ownable: caller is not the 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;
    }
}


/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


contract FundsRecovery is Ownable, ReentrancyGuard {
    address payable internal fundsDestination;
    IERC20Token public token;

    event DestinationChanged(address indexed previousDestination, address indexed newDestination);

    /**
     * Setting new destination of funds recovery.
     */
    function setFundsDestination(address payable _newDestination) public virtual onlyOwner {
        require(_newDestination != address(0));
        emit DestinationChanged(fundsDestination, _newDestination);
        fundsDestination = _newDestination;
    }

    /**
     * Getting funds destination address.
     */
    function getFundsDestination() public view returns (address) {
        return fundsDestination;
    }

    /**
     * Possibility to recover funds in case they were sent to this address before smart contract deployment
     */
    function claimEthers() public nonReentrant {
        require(fundsDestination != address(0));
        fundsDestination.transfer(address(this).balance);
    }

    /**
       Transfers selected tokens into owner address.
    */
    function claimTokens(address _token) public nonReentrant {
        require(fundsDestination != address(0));
        require(_token != address(token), "native token funds can't be recovered");
        uint256 _amount = IERC20Token(_token).balanceOf(address(this));
        IERC20Token(_token).transfer(fundsDestination, _amount);
    }
}

contract Utils {
    function getChainID() internal view returns (uint256) {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }
        return chainID;
    }

    function max(uint a, uint b) internal pure returns (uint) {
        return a > b ? a : b;
    }

    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }

    function round(uint a, uint m) internal pure returns (uint ) {
        return ((a + m - 1) / m) * m;
    }
}



interface Channel {
    function initialize(address _token, address _dex, address _identityHash, address _hermesId, uint256 _fee) external;
}

contract Registry is FundsRecovery, Utils {
    using ECDSA for bytes32;

    uint256 public lastNonce;
    address payable public dex;     // Any uniswap v2 compatible DEX router address
    uint256 public minimalHermesStake;
    Registry public parentRegistry; // If there is parent registry, we will check for

    struct Implementation {
        address channelImplAddress;
        address hermesImplAddress;
    }
    Implementation[] internal implementations;

    struct Hermes {
        address operator;   // hermes operator who will sign promises
        uint256 implVer;    // version of hermes implementation smart contract
        function() external view returns(uint256) stake;
        bytes url;          // hermes service URL
    }
    mapping(address => Hermes) private hermeses;

    mapping(address => address) private identities;   // key: identity, value: beneficiary wallet address

    event RegisteredIdentity(address indexed identity, address beneficiary);
    event RegisteredHermes(address indexed hermesId, address hermesOperator, bytes ur);
    event HermesURLUpdated(address indexed hermesId, bytes newURL);
    event ConsumerChannelCreated(address indexed identity, address indexed hermesId, address channelAddress);
    event BeneficiaryChanged(address indexed identity, address newBeneficiary);
    event MinimalHermesStakeChanged(uint256 newMinimalStake);

    // Reject any ethers sent to this smart-contract
    receive() external payable {
        revert("Registry: Rejecting tx with ethers sent");
    }

    // We're using `initialize` instead of `constructor` to ensure easy way to deploy Registry into
    // deterministic address on any EVM compatible chain. Registry should be first be deployed using
    // `deployRegistry` scripts and then initialized with wanted token and implementations.
    function initialize(address _tokenAddress, address payable _dexAddress, uint256 _minimalHermesStake, address _channelImplementation, address _hermesImplementation, address payable _parentRegistry) public onlyOwner {
        require(!isInitialized(), "Registry: is already initialized");

        minimalHermesStake = _minimalHermesStake;

        require(_tokenAddress != address(0));
        token = IERC20Token(_tokenAddress);

        require(_dexAddress != address(0));
        dex = _dexAddress;

        // Set initial channel implementations
        setImplementations(_channelImplementation, _hermesImplementation);

        // We set initial owner to be sure
        transferOwnership(msg.sender);

        // Set parent registry, if `0x0` then this is root registry
        parentRegistry = Registry(_parentRegistry);
    }

    function isInitialized() public view returns (bool) {
        return address(token) != address(0);
    }

    // Register provider and open his channel with given hermes
    // _stakeAmount - it's amount of tokens staked into hermes to guarantee incomming channel's balance.
    // _beneficiary - payout address during settlements in hermes channel, if provided 0x0 then will be set to consumer channel address.
    function registerIdentity(address _hermesId, uint256 _stakeAmount, uint256 _transactorFee, address _beneficiary, bytes memory _signature) public {
        require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active");

        // Check if given signature is valid
        address _identity = keccak256(abi.encodePacked(getChainID(), address(this), _hermesId, _stakeAmount, _transactorFee, _beneficiary)).recover(_signature);
        require(_identity != address(0), "Registry: wrong identity signature");

        // Tokens amount to get from channel to cover tx fee and provider's stake
        uint256 _totalFee = _stakeAmount + _transactorFee;
        require(_totalFee <= token.balanceOf(getChannelAddress(_identity, _hermesId)), "Registry: not enought funds in channel to cover fees");

        // Open consumer channel
        _openChannel(_identity, _hermesId, _beneficiary, _totalFee);

        // If stake is provided we additionally are opening channel with hermes (a.k.a provider channel)
        if (_stakeAmount > 0) {
            IHermesContract(_hermesId).openChannel(_identity, _stakeAmount);
        }

        // Pay fee for transaction maker
        if (_transactorFee > 0) {
            token.transfer(msg.sender, _transactorFee);
        }
    }

    // Deploys consumer channel and sets beneficiary as newly created channel address
    function openConsumerChannel(address _hermesId, uint256 _transactorFee, bytes memory _signature) public {
        require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active");

        // Check if given signature is valid
        address _identity = keccak256(abi.encodePacked(getChainID(), address(this), _hermesId, _transactorFee)).recover(_signature);
        require(_identity != address(0), "Registry: wrong channel openinig signature");

        require(_transactorFee <= token.balanceOf(getChannelAddress(_identity, _hermesId)), "Registry: not enought funds in channel to cover fees");

        _openChannel(_identity, _hermesId, address(0), _transactorFee);
    }

    // Allows to securely deploy channel's smart contract without consumer signature
    function openConsumerChannel(address _identity, address _hermesId) public {
        require(isActiveHermes(_hermesId), "Registry: provided hermes have to be active");
        require(!isChannelOpened(_identity, _hermesId), "Registry: such consumer channel is already opened");

        _openChannel(_identity, _hermesId, address(0), 0);
    }

    // Deploy payment channel for given consumer identity
    // We're using minimal proxy (EIP1167) to save on gas cost and blockchain space.
    function _openChannel(address _identity, address _hermesId, address _beneficiary, uint256 _fee) internal returns (address) {
        bytes32 _salt = keccak256(abi.encodePacked(_identity, _hermesId));
        bytes memory _code = getProxyCode(getChannelImplementation(hermeses[_hermesId].implVer));
        Channel _channel = Channel(deployMiniProxy(uint256(_salt), _code));
        _channel.initialize(address(token), dex, _identity, _hermesId, _fee);

        emit ConsumerChannelCreated(_identity, _hermesId, address(_channel));

        // If beneficiary was not provided, then we're going to use consumer channel for that
        if (_beneficiary == address(0)) {
            _beneficiary = address(_channel);
        }

        // Mark identity as registered (only during first channel opening)
        if (!isRegistered(_identity)) {
            identities[_identity] = _beneficiary;
            emit RegisteredIdentity(_identity, _beneficiary);
        }

        return address(_channel);
    }

    function registerHermes(address _hermesOperator, uint256 _hermesStake, uint16 _hermesFee, uint256 _minChannelStake, uint256 _maxChannelStake, bytes memory _url) public {
        require(isInitialized(), "Registry: only initialized registry can register hermeses");
        require(_hermesOperator != address(0), "Registry: hermes operator can't be zero address");
        require(_hermesStake >= minimalHermesStake, "Registry: hermes have to stake at least minimal stake amount");

        address _hermesId = getHermesAddress(_hermesOperator);
        require(!isHermes(_hermesId), "Registry: hermes already registered");

        // Deploy hermes contract (mini proxy which is pointing to implementation)
        IHermesContract _hermes = IHermesContract(deployMiniProxy(uint256(uint160(_hermesOperator)), getProxyCode(getHermesImplementation())));

        // Transfer stake into hermes smart contract
        token.transferFrom(msg.sender, address(_hermes), _hermesStake);

        // Initialise hermes
        _hermes.initialize(address(token), _hermesOperator, _hermesFee, _minChannelStake, _maxChannelStake, dex);

        // Save info about newly created hermes
        hermeses[_hermesId] = Hermes(_hermesOperator, getLastImplVer(), _hermes.getStake, _url);

        // Approve hermes contract to `transferFrom` registry (used during hermes channel openings)
        token.approve(_hermesId, type(uint256).max);

        emit RegisteredHermes(_hermesId, _hermesOperator, _url);
    }

    function getChannelAddress(address _identity, address _hermesId) public view returns (address) {
        bytes32 _code = keccak256(getProxyCode(getChannelImplementation(hermeses[_hermesId].implVer)));
        bytes32 _salt = keccak256(abi.encodePacked(_identity, _hermesId));
        return getCreate2Address(_salt, _code);
    }

    function getHermes(address _hermesId) public view returns (Hermes memory) {
        return isHermes(_hermesId) || !hasParentRegistry() ? hermeses[_hermesId] : parentRegistry.getHermes(_hermesId);
    }

    function getHermesAddress(address _hermesOperator) public view returns (address) {
        bytes32 _code = keccak256(getProxyCode(getHermesImplementation()));
        return getCreate2Address(bytes32(uint256(uint160(_hermesOperator))), _code);
    }

    function getHermesAddress(address _hermesOperator, uint256 _implVer) public view returns (address) {
        bytes32 _code = keccak256(getProxyCode(getHermesImplementation(_implVer)));
        return getCreate2Address(bytes32(uint256(uint160(_hermesOperator))), _code);
    }

    function getHermesURL(address _hermesId) public view returns (bytes memory) {
        return hermeses[_hermesId].url;
    }

    function updateHermesURL(address _hermesId, bytes memory _url, bytes memory _signature) public {
        require(isActiveHermes(_hermesId), "Registry: provided hermes has to be active");

        // Check if given signature is valid
        address _operator = keccak256(abi.encodePacked(address(this), _hermesId, _url, lastNonce++)).recover(_signature);
        require(_operator == hermeses[_hermesId].operator, "wrong signature");

        // Update URL
        hermeses[_hermesId].url = _url;

        emit HermesURLUpdated(_hermesId, _url);
    }

    // ------------ UTILS ------------
    function getCreate2Address(bytes32 _salt, bytes32 _code) internal view returns (address) {
        return address(uint160(uint256(keccak256(abi.encodePacked(
            bytes1(0xff),
            address(this),
            bytes32(_salt),
            bytes32(_code)
        )))));
    }

    function getProxyCode(address _implementation) public pure returns (bytes memory) {
        // `_code` is EIP 1167 - Minimal Proxy Contract
        // more information: https://eips.ethereum.org/EIPS/eip-1167
        bytes memory _code = hex"3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3";

        bytes20 _targetBytes = bytes20(_implementation);
        for (uint8 i = 0; i < 20; i++) {
            _code[20 + i] = _targetBytes[i];
        }

        return _code;
    }

    function deployMiniProxy(uint256 _salt, bytes memory _code) internal returns (address payable) {
        address payable _addr;

        assembly {
            _addr := create2(0, add(_code, 0x20), mload(_code), _salt)
            if iszero(extcodesize(_addr)) {
                revert(0, 0)
            }
        }

        return _addr;
    }

    function getBeneficiary(address _identity) public view returns (address) {
        if (hasParentRegistry())
            return parentRegistry.getBeneficiary(_identity);

        return identities[_identity];
    }

    function setBeneficiary(address _identity, address _newBeneficiary, bytes memory _signature) public {
        require(_newBeneficiary != address(0), "Registry: beneficiary can't be zero address");

        // Always set beneficiary into root registry
        if (hasParentRegistry()) {
            parentRegistry.setBeneficiary(_identity, _newBeneficiary, _signature);
        } else {
            lastNonce = lastNonce + 1;

            // In signatures we should always use root registry (for backward compatibility)
            address _rootRegistry = hasParentRegistry() ? address(parentRegistry) : address(this);
            address _signer = keccak256(abi.encodePacked(getChainID(), _rootRegistry, _identity, _newBeneficiary, lastNonce)).recover(_signature);
            require(_signer == _identity, "Registry: have to be signed by identity owner");

            identities[_identity] = _newBeneficiary;

            emit BeneficiaryChanged(_identity, _newBeneficiary);
        }
    }

    function setMinimalHermesStake(uint256 _newMinimalStake) public onlyOwner {
        require(isInitialized(), "Registry: only initialized registry can set new minimal hermes stake");
        minimalHermesStake = _newMinimalStake;
        emit MinimalHermesStakeChanged(_newMinimalStake);
    }

    // -------- UTILS TO WORK WITH CHANNEL AND HERMES IMPLEMENTATIONS ---------

    function getChannelImplementation() public view returns (address) {
        return implementations[getLastImplVer()].channelImplAddress;
    }

    function getChannelImplementation(uint256 _implVer) public view returns (address) {
        return implementations[_implVer].channelImplAddress;
    }

    function getHermesImplementation() public view returns (address) {
        return implementations[getLastImplVer()].hermesImplAddress;
    }

    function getHermesImplementation(uint256 _implVer) public view returns (address) {
        return implementations[_implVer].hermesImplAddress;
    }

    function setImplementations(address _newChannelImplAddress, address _newHermesImplAddress) public onlyOwner {
        require(isInitialized(), "Registry: only initialized registry can set new implementations");
        require(isSmartContract(_newChannelImplAddress) && isSmartContract(_newHermesImplAddress), "Registry: implementations have to be smart contracts");
        implementations.push(Implementation(_newChannelImplAddress, _newHermesImplAddress));
    }

    // Version of latest hermes and channel implementations
    function getLastImplVer() public view returns (uint256) {
        return implementations.length-1;
    }

    // ------------------------------------------------------------------------

    function isSmartContract(address _addr) internal view returns (bool) {
        uint _codeLength;

        assembly {
            _codeLength := extcodesize(_addr)
        }

        return _codeLength != 0;
    }

    // If `parentRegistry` is not set, this is root registry and should return false
    function hasParentRegistry() public view returns (bool) {
        return address(parentRegistry) != address(0);
    }

    function isRegistered(address _identity) public view returns (bool) {
        if (hasParentRegistry())
            return parentRegistry.isRegistered(_identity);

        // If we know its beneficiary address it is registered identity
        return identities[_identity] != address(0);
    }

    function isHermes(address _hermesId) public view returns (bool) {
        // To check if it actually properly created hermes address, we need to check if he has operator
        // and if with that operator we'll get proper hermes address which has code deployed there.
        address _hermesOperator = hermeses[_hermesId].operator;
        uint256 _implVer = hermeses[_hermesId].implVer;
        address _addr = getHermesAddress(_hermesOperator, _implVer);
        if (_addr != _hermesId)
            return false; // hermesId should be same as generated address

        return isSmartContract(_addr) || parentRegistry.isHermes(_hermesId);
    }

    function isActiveHermes(address _hermesId) internal view returns (bool) {
        // First we have to ensure that given address is registered hermes and only then check its status
        require(isHermes(_hermesId), "Registry: hermes have to be registered");

        IHermesContract.Status status = IHermesContract(_hermesId).getStatus();
        return status == IHermesContract.Status.Active;
    }

    function isChannelOpened(address _identity, address _hermesId) public view returns (bool) {
        return isSmartContract(getChannelAddress(_identity, _hermesId)) || isSmartContract(parentRegistry.getChannelAddress(_identity, _hermesId));
    }

    function transferCollectedFeeTo(address _beneficiary) public onlyOwner{
        uint256 _collectedFee = token.balanceOf(address(this));
        require(_collectedFee > 0, "collected fee cannot be less than zero");
        token.transfer(_beneficiary, _collectedFee);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":false,"internalType":"address","name":"newBeneficiary","type":"address"}],"name":"BeneficiaryChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"address","name":"channelAddress","type":"address"}],"name":"ConsumerChannelCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousDestination","type":"address"},{"indexed":true,"internalType":"address","name":"newDestination","type":"address"}],"name":"DestinationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"bytes","name":"newURL","type":"bytes"}],"name":"HermesURLUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinimalStake","type":"uint256"}],"name":"MinimalHermesStakeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"hermesId","type":"address"},{"indexed":false,"internalType":"address","name":"hermesOperator","type":"address"},{"indexed":false,"internalType":"bytes","name":"ur","type":"bytes"}],"name":"RegisteredHermes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"identity","type":"address"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"}],"name":"RegisteredIdentity","type":"event"},{"inputs":[],"name":"claimEthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dex","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"getBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getChannelAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getChannelImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChannelImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundsDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getHermes","outputs":[{"components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"implVer","type":"uint256"},{"internalType":"function () view external returns (uint256)","name":"stake","type":"function"},{"internalType":"bytes","name":"url","type":"bytes"}],"internalType":"struct Registry.Hermes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"},{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getHermesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"}],"name":"getHermesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_implVer","type":"uint256"}],"name":"getHermesImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermesImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"getHermesURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastImplVer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"getProxyCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"hasParentRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address payable","name":"_dexAddress","type":"address"},{"internalType":"uint256","name":"_minimalHermesStake","type":"uint256"},{"internalType":"address","name":"_channelImplementation","type":"address"},{"internalType":"address","name":"_hermesImplementation","type":"address"},{"internalType":"address payable","name":"_parentRegistry","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"isChannelOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"}],"name":"isHermes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalHermesStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"openConsumerChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_hermesId","type":"address"}],"name":"openConsumerChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentRegistry","outputs":[{"internalType":"contract Registry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesOperator","type":"address"},{"internalType":"uint256","name":"_hermesStake","type":"uint256"},{"internalType":"uint16","name":"_hermesFee","type":"uint16"},{"internalType":"uint256","name":"_minChannelStake","type":"uint256"},{"internalType":"uint256","name":"_maxChannelStake","type":"uint256"},{"internalType":"bytes","name":"_url","type":"bytes"}],"name":"registerHermes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"uint256","name":"_stakeAmount","type":"uint256"},{"internalType":"uint256","name":"_transactorFee","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"registerIdentity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"},{"internalType":"address","name":"_newBeneficiary","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newDestination","type":"address"}],"name":"setFundsDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newChannelImplAddress","type":"address"},{"internalType":"address","name":"_newHermesImplAddress","type":"address"}],"name":"setImplementations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinimalStake","type":"uint256"}],"name":"setMinimalHermesStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"transferCollectedFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hermesId","type":"address"},{"internalType":"bytes","name":"_url","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"updateHermesURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b5060018055613725806100246000396000f3fe6080604052600436106102295760003560e01c8063acc831d011610123578063d16f38c8116100ab578063e617aaac1161006f578063e617aaac146106c5578063f2fde38b146106e5578063f58c5b6e14610705578063fc0c546a14610723578063ff9935cb1461074357600080fd5b8063d16f38c814610618578063d5929fe314610638578063df8de3e714610658578063e0b6c32314610678578063e3252537146106a557600080fd5b8063c957543b116100f2578063c957543b14610578578063c9b84d4d14610598578063cdd596e0146105b8578063cf10c969146105d8578063d0171d79146105f857600080fd5b8063acc831d0146104f8578063add10dda14610518578063bf1eb88a14610538578063c3c5a5471461055857600080fd5b80636332b080116101b157806385bff3411161017557806385bff341146104585780638cfef547146104785780638da5cb5b146104985780639936a87b146104b6578063ab867213146104cb57600080fd5b80636332b080146103e357806366cf5875146103f8578063692058c21461040e5780636931b5501461042e5780637c671a211461044357600080fd5b806341ca71ab116101f857806341ca71ab146103275780634787d09c1461035f5780634b6bd6be1461037f578063505a1b311461039f57806352631ab4146103bf57600080fd5b806304614e0b146102905780631de9db40146102b2578063238e130a146102e7578063392e53cd1461030757600080fd5b3661028b5760405162461bcd60e51b815260206004820152602760248201527f52656769737472793a2052656a656374696e67207478207769746820657468656044820152661c9cc81cd95b9d60ca1b60648201526084015b60405180910390fd5b600080fd5b34801561029c57600080fd5b506102b06102ab366004612f01565b610763565b005b3480156102be57600080fd5b506102d26102cd366004612f5a565b61091c565b60405190151581526020015b60405180910390f35b3480156102f357600080fd5b506102b0610302366004612f93565b6109c5565b34801561031357600080fd5b506003546001600160a01b031615156102d2565b34801561033357600080fd5b50610347610342366004612fb0565b610a72565b6040516001600160a01b0390911681526020016102de565b34801561036b57600080fd5b506102b061037a366004612f5a565b610aa7565b34801561038b57600080fd5b5061034761039a366004612fc9565b610b4f565b3480156103ab57600080fd5b506103476103ba366004612f93565b610b83565b3480156103cb57600080fd5b506103d560045481565b6040519081526020016102de565b3480156103ef57600080fd5b506103d5610c40565b34801561040457600080fd5b506103d560065481565b34801561041a57600080fd5b50600554610347906001600160a01b031681565b34801561043a57600080fd5b506102b0610c57565b34801561044f57600080fd5b50610347610d04565b34801561046457600080fd5b506102b0610473366004612f5a565b610d3f565b34801561048457600080fd5b50610347610493366004612fb0565b610f16565b3480156104a457600080fd5b506000546001600160a01b0316610347565b3480156104c257600080fd5b50610347610f4e565b3480156104d757600080fd5b506104eb6104e6366004612f93565b610f8c565b6040516102de9190613051565b34801561050457600080fd5b50610347610513366004612f93565b611029565b34801561052457600080fd5b506102b0610533366004613064565b611054565b34801561054457600080fd5b506104eb610553366004612f93565b6111c7565b34801561056457600080fd5b506102d2610573366004612f93565b611276565b34801561058457600080fd5b506102b0610593366004612fb0565b61132f565b3480156105a457600080fd5b50600754610347906001600160a01b031681565b3480156105c457600080fd5b506102d26105d3366004612f93565b611434565b3480156105e457600080fd5b506102b06105f33660046130d0565b61151a565b34801561060457600080fd5b506102b0610613366004613146565b6117c2565b34801561062457600080fd5b506007546001600160a01b031615156102d2565b34801561064457600080fd5b506102b0610653366004613192565b611a10565b34801561066457600080fd5b506102b0610673366004612f93565b611ebc565b34801561068457600080fd5b50610698610693366004612f93565b6120a0565b6040516102de9190613217565b3480156106b157600080fd5b506102b06106c0366004612f93565b612264565b3480156106d157600080fd5b506103476106e0366004612f5a565b612405565b3480156106f157600080fd5b506102b0610700366004612f93565b61248e565b34801561071157600080fd5b506002546001600160a01b0316610347565b34801561072f57600080fd5b50600354610347906001600160a01b031681565b34801561074f57600080fd5b506102b061075e366004613263565b61258c565b61076c836126bb565b6107885760405162461bcd60e51b8152600401610282906132dc565b60006107ec82466040805160208101929092526001600160601b031930606090811b8216928401929092529088901b166054820152606881018690526088015b604051602081830303815290604052805190602001206127b290919063ffffffff16565b90506001600160a01b0381166108575760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2077726f6e67206368616e6e656c206f70656e696e6967604482015269207369676e617475726560b01b6064820152608401610282565b6003546001600160a01b03166370a082316108728387612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156108b157600080fd5b505afa1580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e99190613327565b8311156109085760405162461bcd60e51b815260040161028290613340565b61091581856000866127d6565b5050505050565b600061093161092b8484612405565b3b151590565b806109be5750600754604051633985eaab60e21b81526001600160a01b03858116600483015284811660248301526109be92169063e617aaac9060440160206040518083038186803b15801561098657600080fd5b505afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190613394565b9392505050565b6000546001600160a01b03163314806109e757506000546001600160a01b0316155b610a035760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b038116610a1657600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b600060088281548110610a8757610a876133e6565b60009182526020909120600290910201546001600160a01b031692915050565b610ab0816126bb565b610acc5760405162461bcd60e51b8152600401610282906132dc565b610ad6828261091c565b15610b3d5760405162461bcd60e51b815260206004820152603160248201527f52656769737472793a207375636820636f6e73756d6572206368616e6e656c206044820152701a5cc8185b1c9958591e481bdc195b9959607a1b6064820152608401610282565b610b4a82826000806127d6565b505050565b600080610b5e6104e684610f16565b80516020909101209050610b7b6001600160a01b038516826129b0565b949350505050565b6000610b996007546001600160a01b0316151590565b15610c215760075460405163505a1b3160e01b81526001600160a01b0384811660048301529091169063505a1b319060240160206040518083038186803b158015610be357600080fd5b505afa158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613394565b92915050565b506001600160a01b039081166000908152600a60205260409020541690565b600854600090610c5290600190613412565b905090565b60026001541415610caa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316610cc457600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610cfd573d6000803e3d6000fd5b5060018055565b60006008610d10610c40565b81548110610d2057610d206133e6565b60009182526020909120600290910201546001600160a01b0316919050565b6000546001600160a01b0316331480610d6157506000546001600160a01b0316155b610d7d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316610dfb5760405162461bcd60e51b815260206004820152603f60248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e20736574206e657720696d706c656d656e746174696f6e73006064820152608401610282565b813b15158015610e0b5750803b15155b610e745760405162461bcd60e51b815260206004820152603460248201527f52656769737472793a20696d706c656d656e746174696f6e73206861766520746044820152736f20626520736d61727420636f6e74726163747360601b6064820152608401610282565b604080518082019091526001600160a01b0392831681529082166020820190815260088054600181018255600091909152915160029092027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549385166001600160a01b031994851617905590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee49091018054919093169116179055565b600060088281548110610f2b57610f2b6133e6565b60009182526020909120600160029092020101546001600160a01b031692915050565b60006008610f5a610c40565b81548110610f6a57610f6a6133e6565b60009182526020909120600160029092020101546001600160a01b0316919050565b606060006040518060600160405280603781526020016136b9603791399050606083901b60005b60148160ff16101561102057818160ff1660148110610fd457610fd46133e6565b1a60f81b83610fe4836014613429565b60ff1681518110610ff757610ff76133e6565b60200101906001600160f81b031916908160001a905350806110188161344e565b915050610fb3565b50909392505050565b6000806110376104e6610f4e565b805160209091012090506109be6001600160a01b038416826129b0565b61105d836126bb565b6110bc5760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2070726f7669646564206865726d65732068617320746f6044820152692062652061637469766560b01b6064820152608401610282565b60006110ef82308686600460008154809291906110d89061346e565b919050556040516020016107c89493929190613489565b6001600160a01b038086166000908152600960205260409020549192508083169116146111505760405162461bcd60e51b815260206004820152600f60248201526e77726f6e67207369676e617475726560881b6044820152606401610282565b6001600160a01b0384166000908152600960209081526040909120845161117f92600390920191860190612d65565b50836001600160a01b03167fd8c638c85547b8717e0d5ca292cff6dbe8fc02fa6e6863a047971c39511643c7846040516111b99190613051565b60405180910390a250505050565b6001600160a01b03811660009081526009602052604090206003018054606091906111f1906134d6565b80601f016020809104026020016040519081016040528092919081815260200182805461121d906134d6565b801561126a5780601f1061123f5761010080835404028352916020019161126a565b820191906000526020600020905b81548152906001019060200180831161124d57829003601f168201915b50505050509050919050565b600061128c6007546001600160a01b0316151590565b1561130e5760075460405163c3c5a54760e01b81526001600160a01b0384811660048301529091169063c3c5a5479060240160206040518083038186803b1580156112d657600080fd5b505afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613511565b506001600160a01b039081166000908152600a602052604090205416151590565b6000546001600160a01b031633148061135157506000546001600160a01b0316155b61136d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b03166113f95760405162461bcd60e51b8152602060048201526044602482018190527f52656769737472793a206f6e6c7920696e697469616c697a6564207265676973908201527f7472792063616e20736574206e6577206d696e696d616c206865726d6573207360648201526374616b6560e01b608482015260a401610282565b60068190556040518181527f645a9c74d34a0b1095b113252ad5e9afa0373f15b4b21760fb3a24b4b9d1ec309060200160405180910390a150565b6001600160a01b038082166000908152600960205260408120805460019091015491921690826114648383610b4f565b9050846001600160a01b0316816001600160a01b03161461148a57506000949350505050565b803b151580611511575060075460405163066eacb760e51b81526001600160a01b0387811660048301529091169063cdd596e09060240160206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190613511565b95945050505050565b611523856126bb565b61153f5760405162461bcd60e51b8152600401610282906132dc565b600061159482466040805160208101929092526001600160601b031930606090811b8216928401929092528a821b81166054840152606883018a9052608883018990529087901b1660a882015260bc016107c8565b90506001600160a01b0381166115f75760405162461bcd60e51b815260206004820152602260248201527f52656769737472793a2077726f6e67206964656e74697479207369676e617475604482015261726560f01b6064820152608401610282565b60006116038587613533565b6003549091506001600160a01b03166370a08231611621848a612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116989190613327565b8111156116b75760405162461bcd60e51b815260040161028290613340565b6116c3828886846127d6565b50851561172d576040516324f453d160e01b81526001600160a01b038381166004830152602482018890528816906324f453d190604401600060405180830381600087803b15801561171457600080fd5b505af1158015611728573d6000803e3d6000fd5b505050505b84156117b95760035460405163a9059cbb60e01b8152336004820152602481018790526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561177f57600080fd5b505af1158015611793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b79190613511565b505b50505050505050565b6001600160a01b03821661182c5760405162461bcd60e51b815260206004820152602b60248201527f52656769737472793a2062656e65666963696172792063616e2774206265207a60448201526a65726f206164647265737360a81b6064820152608401610282565b6007546001600160a01b03161561189f5760075460405163d0171d7960e01b81526001600160a01b039091169063d0171d79906118719086908690869060040161354b565b600060405180830381600087803b15801561188b57600080fd5b505af11580156117b9573d6000803e3d6000fd5b6004546118ad906001613533565b60045560006118c66007546001600160a01b0316151590565b6118d057306118dd565b6007546001600160a01b03165b9050600061192d83466004546040805160208101939093526001600160601b0319606088811b8216928501929092528a821b811660548501529089901b166068830152607c820152609c016107c8565b9050846001600160a01b0316816001600160a01b0316146119a65760405162461bcd60e51b815260206004820152602d60248201527f52656769737472793a206861766520746f206265207369676e6564206279206960448201526c3232b73a34ba3c9037bbb732b960991b6064820152608401610282565b6001600160a01b038581166000818152600a602090815260409182902080546001600160a01b0319169489169485179055905192835290917f768099735d1c322a05a5b9d7b76d99682a1833d3f7055e5ede25e0f2eeaa8c6d910160405180910390a25050505050565b6003546001600160a01b0316611a8e5760405162461bcd60e51b815260206004820152603960248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e207265676973746572206865726d65736573000000000000006064820152608401610282565b6001600160a01b038616611afc5760405162461bcd60e51b815260206004820152602f60248201527f52656769737472793a206865726d6573206f70657261746f722063616e27742060448201526e6265207a65726f206164647265737360881b6064820152608401610282565b600654851015611b745760405162461bcd60e51b815260206004820152603c60248201527f52656769737472793a206865726d6573206861766520746f207374616b65206160448201527f74206c65617374206d696e696d616c207374616b6520616d6f756e74000000006064820152608401610282565b6000611b7f87611029565b9050611b8a81611434565b15611be35760405162461bcd60e51b815260206004820152602360248201527f52656769737472793a206865726d657320616c726561647920726567697374656044820152621c995960ea1b6064820152608401610282565b6000611c02886001600160a01b0316611bfd6104e6610f4e565b612a01565b6003546040516323b872dd60e01b81523360048201526001600160a01b038084166024830152604482018b90529293509116906323b872dd90606401602060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613511565b5060035460055460405163699a088560e01b81526001600160a01b0392831660048201528a8316602482015261ffff89166044820152606481018890526084810187905290821660a48201529082169063699a08859060c401600060405180830381600087803b158015611d0357600080fd5b505af1158015611d17573d6000803e3d6000fd5b505050506040518060800160405280896001600160a01b03168152602001611d3d610c40565b815263fc0e3d90602084811b640100000000600160c01b0390811692909217604090811b828501529283018790526001600160a01b03868116600090815260098352849020855181546001600160a01b0319169216919091178155848201516001820155848401516002820180546001600160c01b03191663ffffffff9290961c91821691909416179390931790915560608301518051611de49260038501920190612d65565b505060035460405163095ea7b360e01b81526001600160a01b0385811660048301526000196024830152909116915063095ea7b390604401602060405180830381600087803b158015611e3657600080fd5b505af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e9190613511565b50816001600160a01b03167ff06d60cc2f463635fd237ad87f1d007af54840b82e7e4561707b1be63d91c2608985604051611eaa929190613577565b60405180910390a25050505050505050565b60026001541415611f0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316611f2957600080fd5b6003546001600160a01b0382811691161415611f955760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b6064820152608401610282565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015611fd757600080fd5b505afa158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f9190613327565b60025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561205f57600080fd5b505af1158015612073573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120979190613511565b50506001805550565b60408051608081018252600080825260208201819052918101919091526060808201526120cc82611434565b806120e057506007546001600160a01b0316155b61216a5760075460405163e0b6c32360e01b81526001600160a01b0384811660048301529091169063e0b6c3239060240160006040518083038186803b15801561212957600080fd5b505afa15801561213d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612165919081019061359b565b610c1b565b6001600160a01b038083166000908152600960209081526040918290208251608081018452815490941684526001810154918401919091526002810154640100000000600160c01b03811663ffffffff90911617821b918301919091526003810180546060840191906121dc906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612208906134d6565b80156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b50505050508152505092915050565b6000546001600160a01b031633148061228657506000546001600160a01b0316155b6122a25760405162461bcd60e51b8152600401610282906133b1565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156122e657600080fd5b505afa1580156122fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231e9190613327565b90506000811161237f5760405162461bcd60e51b815260206004820152602660248201527f636f6c6c6563746564206665652063616e6e6f74206265206c657373207468616044820152656e207a65726f60d01b6064820152608401610282565b60035460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156123cd57600080fd5b505af11580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a9190613511565b6001600160a01b0381166000908152600960205260408120600101548190612430906104e690610a72565b8051906020012090506000848460405160200161246c929190606092831b6001600160601b031990811682529190921b16601482015260280190565b60405160208183030381529060405280519060200120905061151181836129b0565b6000546001600160a01b03163314806124b057506000546001600160a01b0316155b6124cc5760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b0381166125315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610282565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806125ae57506000546001600160a01b0316155b6125ca5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316156126235760405162461bcd60e51b815260206004820181905260248201527f52656769737472793a20697320616c726561647920696e697469616c697a65646044820152606401610282565b60068490556001600160a01b03861661263b57600080fd5b600380546001600160a01b0319166001600160a01b0388811691909117909155851661266657600080fd5b600580546001600160a01b0319166001600160a01b03871617905561268b8383610d3f565b6126943361248e565b600780546001600160a01b0319166001600160a01b03929092169190911790555050505050565b60006126c682611434565b6127215760405162461bcd60e51b815260206004820152602660248201527f52656769737472793a206865726d6573206861766520746f20626520726567696044820152651cdd195c995960d21b6064820152608401610282565b6000826001600160a01b0316634e69d5606040518163ffffffff1660e01b815260040160206040518083038186803b15801561275c57600080fd5b505afa158015612770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127949190613681565b905060008160038111156127aa576127aa6136a2565b149392505050565b60008060006127c18585612a1b565b915091506127ce81612a8b565b509392505050565b6040516001600160601b0319606086811b8216602084015285901b1660348201526000908190604801604051602081830303815290604052805190602001209050600061284d6104e660096000896001600160a01b03166001600160a01b0316815260200190815260200160002060010154610a72565b9050600061285b8383612a01565b600354600554604051637b809f7b60e11b81526001600160a01b03928316600482015290821660248201528a8216604482015289821660648201526084810188905291925082169063f7013ef69060a401600060405180830381600087803b1580156128c657600080fd5b505af11580156128da573d6000803e3d6000fd5b50506040516001600160a01b038481168252808b1693508b1691507f2ed7bcf2ff03098102c7003d7ce2a633e4b49b8198b07de5383cdf4c0ab9228b9060200160405180910390a36001600160a01b038616612934578095505b61293d88611276565b6129a5576001600160a01b038881166000818152600a602090815260409182902080546001600160a01b031916948b169485179055905192835290917fefaf768237c22e140a862d5d375ad5c153479fac3f8bcf8b580a1651fd62c3ef910160405180910390a25b979650505050505050565b604080516001600160f81b03196020808301919091523060601b6001600160601b03191660218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b600080838351602085016000f59050803b6109be57600080fd5b600080825160411415612a525760208301516040840151606085015160001a612a4687828585612c49565b94509450505050612a84565b825160401415612a7c5760208301516040840151612a71868383612d36565b935093505050612a84565b506000905060025b9250929050565b6000816004811115612a9f57612a9f6136a2565b1415612aa85750565b6001816004811115612abc57612abc6136a2565b1415612b0a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610282565b6002816004811115612b1e57612b1e6136a2565b1415612b6c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610282565b6003816004811115612b8057612b806136a2565b1415612bd95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610282565b6004816004811115612bed57612bed6136a2565b1415612c465760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610282565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c805750600090506003612d2d565b8460ff16601b14158015612c9857508460ff16601c14155b15612ca95750600090506004612d2d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cfd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d2657600060019250925050612d2d565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612d5787828885612c49565b935093505050935093915050565b828054612d71906134d6565b90600052602060002090601f016020900481019282612d935760008555612dd9565b82601f10612dac57805160ff1916838001178555612dd9565b82800160010185558215612dd9579182015b82811115612dd9578251825591602001919060010190612dbe565b50612de5929150612de9565b5090565b5b80821115612de55760008155600101612dea565b6001600160a01b0381168114612c4657600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715612e4c57612e4c612e13565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e7b57612e7b612e13565b604052919050565b600067ffffffffffffffff821115612e9d57612e9d612e13565b50601f01601f191660200190565b600082601f830112612ebc57600080fd5b8135612ecf612eca82612e83565b612e52565b818152846020838601011115612ee457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215612f1657600080fd5b8335612f2181612dfe565b925060208401359150604084013567ffffffffffffffff811115612f4457600080fd5b612f5086828701612eab565b9150509250925092565b60008060408385031215612f6d57600080fd5b8235612f7881612dfe565b91506020830135612f8881612dfe565b809150509250929050565b600060208284031215612fa557600080fd5b81356109be81612dfe565b600060208284031215612fc257600080fd5b5035919050565b60008060408385031215612fdc57600080fd5b8235612fe781612dfe565b946020939093013593505050565b60005b83811015613010578181015183820152602001612ff8565b8381111561301f576000848401525b50505050565b6000815180845261303d816020860160208601612ff5565b601f01601f19169290920160200192915050565b6020815260006109be6020830184613025565b60008060006060848603121561307957600080fd5b833561308481612dfe565b9250602084013567ffffffffffffffff808211156130a157600080fd5b6130ad87838801612eab565b935060408601359150808211156130c357600080fd5b50612f5086828701612eab565b600080600080600060a086880312156130e857600080fd5b85356130f381612dfe565b94506020860135935060408601359250606086013561311181612dfe565b9150608086013567ffffffffffffffff81111561312d57600080fd5b61313988828901612eab565b9150509295509295909350565b60008060006060848603121561315b57600080fd5b833561316681612dfe565b9250602084013561317681612dfe565b9150604084013567ffffffffffffffff811115612f4457600080fd5b60008060008060008060c087890312156131ab57600080fd5b86356131b681612dfe565b955060208701359450604087013561ffff811681146131d457600080fd5b9350606087013592506080870135915060a087013567ffffffffffffffff8111156131fe57600080fd5b61320a89828a01612eab565b9150509295509295509295565b6020815260018060a01b0382511660208201526020820151604082015267ffffffffffffffff19604083015116606082015260006060830151608080840152610b7b60a0840182613025565b60008060008060008060c0878903121561327c57600080fd5b863561328781612dfe565b9550602087013561329781612dfe565b94506040870135935060608701356132ae81612dfe565b925060808701356132be81612dfe565b915060a08701356132ce81612dfe565b809150509295509295509295565b6020808252602b908201527f52656769737472793a2070726f7669646564206865726d65732068617665207460408201526a6f2062652061637469766560a81b606082015260800190565b60006020828403121561333957600080fd5b5051919050565b60208082526034908201527f52656769737472793a206e6f7420656e6f756768742066756e647320696e206360408201527368616e6e656c20746f20636f766572206665657360601b606082015260800190565b6000602082840312156133a657600080fd5b81516109be81612dfe565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613424576134246133fc565b500390565b600060ff821660ff84168060ff03821115613446576134466133fc565b019392505050565b600060ff821660ff811415613465576134656133fc565b60010192915050565b6000600019821415613482576134826133fc565b5060010190565b60006bffffffffffffffffffffffff19808760601b168352808660601b1660148401525083516134c0816028850160208801612ff5565b6028920191820192909252604801949350505050565b600181811c908216806134ea57607f821691505b6020821081141561350b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561352357600080fd5b815180151581146109be57600080fd5b60008219821115613546576135466133fc565b500190565b6001600160a01b0384811682528316602082015260606040820181905260009061151190830184613025565b6001600160a01b0383168152604060208201819052600090610b7b90830184613025565b600060208083850312156135ae57600080fd5b825167ffffffffffffffff808211156135c657600080fd5b90840190608082870312156135da57600080fd5b6135e2612e29565b82516135ed81612dfe565b81528284015184820152604083015167ffffffffffffffff198116811461361357600080fd5b604082015260608301518281111561362a57600080fd5b80840193505086601f84011261363f57600080fd5b8251915061364f612eca83612e83565b828152878584860101111561366357600080fd5b61367283868301878701612ff5565b60608201529695505050505050565b60006020828403121561369357600080fd5b8151600481106109be57600080fd5b634e487b7160e01b600052602160045260246000fdfe3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3a264697066735822122036219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c7664736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102295760003560e01c8063acc831d011610123578063d16f38c8116100ab578063e617aaac1161006f578063e617aaac146106c5578063f2fde38b146106e5578063f58c5b6e14610705578063fc0c546a14610723578063ff9935cb1461074357600080fd5b8063d16f38c814610618578063d5929fe314610638578063df8de3e714610658578063e0b6c32314610678578063e3252537146106a557600080fd5b8063c957543b116100f2578063c957543b14610578578063c9b84d4d14610598578063cdd596e0146105b8578063cf10c969146105d8578063d0171d79146105f857600080fd5b8063acc831d0146104f8578063add10dda14610518578063bf1eb88a14610538578063c3c5a5471461055857600080fd5b80636332b080116101b157806385bff3411161017557806385bff341146104585780638cfef547146104785780638da5cb5b146104985780639936a87b146104b6578063ab867213146104cb57600080fd5b80636332b080146103e357806366cf5875146103f8578063692058c21461040e5780636931b5501461042e5780637c671a211461044357600080fd5b806341ca71ab116101f857806341ca71ab146103275780634787d09c1461035f5780634b6bd6be1461037f578063505a1b311461039f57806352631ab4146103bf57600080fd5b806304614e0b146102905780631de9db40146102b2578063238e130a146102e7578063392e53cd1461030757600080fd5b3661028b5760405162461bcd60e51b815260206004820152602760248201527f52656769737472793a2052656a656374696e67207478207769746820657468656044820152661c9cc81cd95b9d60ca1b60648201526084015b60405180910390fd5b600080fd5b34801561029c57600080fd5b506102b06102ab366004612f01565b610763565b005b3480156102be57600080fd5b506102d26102cd366004612f5a565b61091c565b60405190151581526020015b60405180910390f35b3480156102f357600080fd5b506102b0610302366004612f93565b6109c5565b34801561031357600080fd5b506003546001600160a01b031615156102d2565b34801561033357600080fd5b50610347610342366004612fb0565b610a72565b6040516001600160a01b0390911681526020016102de565b34801561036b57600080fd5b506102b061037a366004612f5a565b610aa7565b34801561038b57600080fd5b5061034761039a366004612fc9565b610b4f565b3480156103ab57600080fd5b506103476103ba366004612f93565b610b83565b3480156103cb57600080fd5b506103d560045481565b6040519081526020016102de565b3480156103ef57600080fd5b506103d5610c40565b34801561040457600080fd5b506103d560065481565b34801561041a57600080fd5b50600554610347906001600160a01b031681565b34801561043a57600080fd5b506102b0610c57565b34801561044f57600080fd5b50610347610d04565b34801561046457600080fd5b506102b0610473366004612f5a565b610d3f565b34801561048457600080fd5b50610347610493366004612fb0565b610f16565b3480156104a457600080fd5b506000546001600160a01b0316610347565b3480156104c257600080fd5b50610347610f4e565b3480156104d757600080fd5b506104eb6104e6366004612f93565b610f8c565b6040516102de9190613051565b34801561050457600080fd5b50610347610513366004612f93565b611029565b34801561052457600080fd5b506102b0610533366004613064565b611054565b34801561054457600080fd5b506104eb610553366004612f93565b6111c7565b34801561056457600080fd5b506102d2610573366004612f93565b611276565b34801561058457600080fd5b506102b0610593366004612fb0565b61132f565b3480156105a457600080fd5b50600754610347906001600160a01b031681565b3480156105c457600080fd5b506102d26105d3366004612f93565b611434565b3480156105e457600080fd5b506102b06105f33660046130d0565b61151a565b34801561060457600080fd5b506102b0610613366004613146565b6117c2565b34801561062457600080fd5b506007546001600160a01b031615156102d2565b34801561064457600080fd5b506102b0610653366004613192565b611a10565b34801561066457600080fd5b506102b0610673366004612f93565b611ebc565b34801561068457600080fd5b50610698610693366004612f93565b6120a0565b6040516102de9190613217565b3480156106b157600080fd5b506102b06106c0366004612f93565b612264565b3480156106d157600080fd5b506103476106e0366004612f5a565b612405565b3480156106f157600080fd5b506102b0610700366004612f93565b61248e565b34801561071157600080fd5b506002546001600160a01b0316610347565b34801561072f57600080fd5b50600354610347906001600160a01b031681565b34801561074f57600080fd5b506102b061075e366004613263565b61258c565b61076c836126bb565b6107885760405162461bcd60e51b8152600401610282906132dc565b60006107ec82466040805160208101929092526001600160601b031930606090811b8216928401929092529088901b166054820152606881018690526088015b604051602081830303815290604052805190602001206127b290919063ffffffff16565b90506001600160a01b0381166108575760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2077726f6e67206368616e6e656c206f70656e696e6967604482015269207369676e617475726560b01b6064820152608401610282565b6003546001600160a01b03166370a082316108728387612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156108b157600080fd5b505afa1580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e99190613327565b8311156109085760405162461bcd60e51b815260040161028290613340565b61091581856000866127d6565b5050505050565b600061093161092b8484612405565b3b151590565b806109be5750600754604051633985eaab60e21b81526001600160a01b03858116600483015284811660248301526109be92169063e617aaac9060440160206040518083038186803b15801561098657600080fd5b505afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190613394565b9392505050565b6000546001600160a01b03163314806109e757506000546001600160a01b0316155b610a035760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b038116610a1657600080fd5b6002546040516001600160a01b038084169216907fe1a66d77649cf0a57b9937073549f30f1c82bb865aaf066d2f299e37a62c6aad90600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b600060088281548110610a8757610a876133e6565b60009182526020909120600290910201546001600160a01b031692915050565b610ab0816126bb565b610acc5760405162461bcd60e51b8152600401610282906132dc565b610ad6828261091c565b15610b3d5760405162461bcd60e51b815260206004820152603160248201527f52656769737472793a207375636820636f6e73756d6572206368616e6e656c206044820152701a5cc8185b1c9958591e481bdc195b9959607a1b6064820152608401610282565b610b4a82826000806127d6565b505050565b600080610b5e6104e684610f16565b80516020909101209050610b7b6001600160a01b038516826129b0565b949350505050565b6000610b996007546001600160a01b0316151590565b15610c215760075460405163505a1b3160e01b81526001600160a01b0384811660048301529091169063505a1b319060240160206040518083038186803b158015610be357600080fd5b505afa158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613394565b92915050565b506001600160a01b039081166000908152600a60205260409020541690565b600854600090610c5290600190613412565b905090565b60026001541415610caa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316610cc457600080fd5b6002546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610cfd573d6000803e3d6000fd5b5060018055565b60006008610d10610c40565b81548110610d2057610d206133e6565b60009182526020909120600290910201546001600160a01b0316919050565b6000546001600160a01b0316331480610d6157506000546001600160a01b0316155b610d7d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316610dfb5760405162461bcd60e51b815260206004820152603f60248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e20736574206e657720696d706c656d656e746174696f6e73006064820152608401610282565b813b15158015610e0b5750803b15155b610e745760405162461bcd60e51b815260206004820152603460248201527f52656769737472793a20696d706c656d656e746174696f6e73206861766520746044820152736f20626520736d61727420636f6e74726163747360601b6064820152608401610282565b604080518082019091526001600160a01b0392831681529082166020820190815260088054600181018255600091909152915160029092027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549385166001600160a01b031994851617905590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee49091018054919093169116179055565b600060088281548110610f2b57610f2b6133e6565b60009182526020909120600160029092020101546001600160a01b031692915050565b60006008610f5a610c40565b81548110610f6a57610f6a6133e6565b60009182526020909120600160029092020101546001600160a01b0316919050565b606060006040518060600160405280603781526020016136b9603791399050606083901b60005b60148160ff16101561102057818160ff1660148110610fd457610fd46133e6565b1a60f81b83610fe4836014613429565b60ff1681518110610ff757610ff76133e6565b60200101906001600160f81b031916908160001a905350806110188161344e565b915050610fb3565b50909392505050565b6000806110376104e6610f4e565b805160209091012090506109be6001600160a01b038416826129b0565b61105d836126bb565b6110bc5760405162461bcd60e51b815260206004820152602a60248201527f52656769737472793a2070726f7669646564206865726d65732068617320746f6044820152692062652061637469766560b01b6064820152608401610282565b60006110ef82308686600460008154809291906110d89061346e565b919050556040516020016107c89493929190613489565b6001600160a01b038086166000908152600960205260409020549192508083169116146111505760405162461bcd60e51b815260206004820152600f60248201526e77726f6e67207369676e617475726560881b6044820152606401610282565b6001600160a01b0384166000908152600960209081526040909120845161117f92600390920191860190612d65565b50836001600160a01b03167fd8c638c85547b8717e0d5ca292cff6dbe8fc02fa6e6863a047971c39511643c7846040516111b99190613051565b60405180910390a250505050565b6001600160a01b03811660009081526009602052604090206003018054606091906111f1906134d6565b80601f016020809104026020016040519081016040528092919081815260200182805461121d906134d6565b801561126a5780601f1061123f5761010080835404028352916020019161126a565b820191906000526020600020905b81548152906001019060200180831161124d57829003601f168201915b50505050509050919050565b600061128c6007546001600160a01b0316151590565b1561130e5760075460405163c3c5a54760e01b81526001600160a01b0384811660048301529091169063c3c5a5479060240160206040518083038186803b1580156112d657600080fd5b505afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613511565b506001600160a01b039081166000908152600a602052604090205416151590565b6000546001600160a01b031633148061135157506000546001600160a01b0316155b61136d5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b03166113f95760405162461bcd60e51b8152602060048201526044602482018190527f52656769737472793a206f6e6c7920696e697469616c697a6564207265676973908201527f7472792063616e20736574206e6577206d696e696d616c206865726d6573207360648201526374616b6560e01b608482015260a401610282565b60068190556040518181527f645a9c74d34a0b1095b113252ad5e9afa0373f15b4b21760fb3a24b4b9d1ec309060200160405180910390a150565b6001600160a01b038082166000908152600960205260408120805460019091015491921690826114648383610b4f565b9050846001600160a01b0316816001600160a01b03161461148a57506000949350505050565b803b151580611511575060075460405163066eacb760e51b81526001600160a01b0387811660048301529091169063cdd596e09060240160206040518083038186803b1580156114d957600080fd5b505afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190613511565b95945050505050565b611523856126bb565b61153f5760405162461bcd60e51b8152600401610282906132dc565b600061159482466040805160208101929092526001600160601b031930606090811b8216928401929092528a821b81166054840152606883018a9052608883018990529087901b1660a882015260bc016107c8565b90506001600160a01b0381166115f75760405162461bcd60e51b815260206004820152602260248201527f52656769737472793a2077726f6e67206964656e74697479207369676e617475604482015261726560f01b6064820152608401610282565b60006116038587613533565b6003549091506001600160a01b03166370a08231611621848a612405565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116989190613327565b8111156116b75760405162461bcd60e51b815260040161028290613340565b6116c3828886846127d6565b50851561172d576040516324f453d160e01b81526001600160a01b038381166004830152602482018890528816906324f453d190604401600060405180830381600087803b15801561171457600080fd5b505af1158015611728573d6000803e3d6000fd5b505050505b84156117b95760035460405163a9059cbb60e01b8152336004820152602481018790526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561177f57600080fd5b505af1158015611793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b79190613511565b505b50505050505050565b6001600160a01b03821661182c5760405162461bcd60e51b815260206004820152602b60248201527f52656769737472793a2062656e65666963696172792063616e2774206265207a60448201526a65726f206164647265737360a81b6064820152608401610282565b6007546001600160a01b03161561189f5760075460405163d0171d7960e01b81526001600160a01b039091169063d0171d79906118719086908690869060040161354b565b600060405180830381600087803b15801561188b57600080fd5b505af11580156117b9573d6000803e3d6000fd5b6004546118ad906001613533565b60045560006118c66007546001600160a01b0316151590565b6118d057306118dd565b6007546001600160a01b03165b9050600061192d83466004546040805160208101939093526001600160601b0319606088811b8216928501929092528a821b811660548501529089901b166068830152607c820152609c016107c8565b9050846001600160a01b0316816001600160a01b0316146119a65760405162461bcd60e51b815260206004820152602d60248201527f52656769737472793a206861766520746f206265207369676e6564206279206960448201526c3232b73a34ba3c9037bbb732b960991b6064820152608401610282565b6001600160a01b038581166000818152600a602090815260409182902080546001600160a01b0319169489169485179055905192835290917f768099735d1c322a05a5b9d7b76d99682a1833d3f7055e5ede25e0f2eeaa8c6d910160405180910390a25050505050565b6003546001600160a01b0316611a8e5760405162461bcd60e51b815260206004820152603960248201527f52656769737472793a206f6e6c7920696e697469616c697a656420726567697360448201527f7472792063616e207265676973746572206865726d65736573000000000000006064820152608401610282565b6001600160a01b038616611afc5760405162461bcd60e51b815260206004820152602f60248201527f52656769737472793a206865726d6573206f70657261746f722063616e27742060448201526e6265207a65726f206164647265737360881b6064820152608401610282565b600654851015611b745760405162461bcd60e51b815260206004820152603c60248201527f52656769737472793a206865726d6573206861766520746f207374616b65206160448201527f74206c65617374206d696e696d616c207374616b6520616d6f756e74000000006064820152608401610282565b6000611b7f87611029565b9050611b8a81611434565b15611be35760405162461bcd60e51b815260206004820152602360248201527f52656769737472793a206865726d657320616c726561647920726567697374656044820152621c995960ea1b6064820152608401610282565b6000611c02886001600160a01b0316611bfd6104e6610f4e565b612a01565b6003546040516323b872dd60e01b81523360048201526001600160a01b038084166024830152604482018b90529293509116906323b872dd90606401602060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613511565b5060035460055460405163699a088560e01b81526001600160a01b0392831660048201528a8316602482015261ffff89166044820152606481018890526084810187905290821660a48201529082169063699a08859060c401600060405180830381600087803b158015611d0357600080fd5b505af1158015611d17573d6000803e3d6000fd5b505050506040518060800160405280896001600160a01b03168152602001611d3d610c40565b815263fc0e3d90602084811b640100000000600160c01b0390811692909217604090811b828501529283018790526001600160a01b03868116600090815260098352849020855181546001600160a01b0319169216919091178155848201516001820155848401516002820180546001600160c01b03191663ffffffff9290961c91821691909416179390931790915560608301518051611de49260038501920190612d65565b505060035460405163095ea7b360e01b81526001600160a01b0385811660048301526000196024830152909116915063095ea7b390604401602060405180830381600087803b158015611e3657600080fd5b505af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e9190613511565b50816001600160a01b03167ff06d60cc2f463635fd237ad87f1d007af54840b82e7e4561707b1be63d91c2608985604051611eaa929190613577565b60405180910390a25050505050505050565b60026001541415611f0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610282565b60026001819055546001600160a01b0316611f2957600080fd5b6003546001600160a01b0382811691161415611f955760405162461bcd60e51b815260206004820152602560248201527f6e617469766520746f6b656e2066756e64732063616e2774206265207265636f6044820152641d995c995960da1b6064820152608401610282565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015611fd757600080fd5b505afa158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f9190613327565b60025460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561205f57600080fd5b505af1158015612073573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120979190613511565b50506001805550565b60408051608081018252600080825260208201819052918101919091526060808201526120cc82611434565b806120e057506007546001600160a01b0316155b61216a5760075460405163e0b6c32360e01b81526001600160a01b0384811660048301529091169063e0b6c3239060240160006040518083038186803b15801561212957600080fd5b505afa15801561213d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612165919081019061359b565b610c1b565b6001600160a01b038083166000908152600960209081526040918290208251608081018452815490941684526001810154918401919091526002810154640100000000600160c01b03811663ffffffff90911617821b918301919091526003810180546060840191906121dc906134d6565b80601f0160208091040260200160405190810160405280929190818152602001828054612208906134d6565b80156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b50505050508152505092915050565b6000546001600160a01b031633148061228657506000546001600160a01b0316155b6122a25760405162461bcd60e51b8152600401610282906133b1565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156122e657600080fd5b505afa1580156122fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231e9190613327565b90506000811161237f5760405162461bcd60e51b815260206004820152602660248201527f636f6c6c6563746564206665652063616e6e6f74206265206c657373207468616044820152656e207a65726f60d01b6064820152608401610282565b60035460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156123cd57600080fd5b505af11580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a9190613511565b6001600160a01b0381166000908152600960205260408120600101548190612430906104e690610a72565b8051906020012090506000848460405160200161246c929190606092831b6001600160601b031990811682529190921b16601482015260280190565b60405160208183030381529060405280519060200120905061151181836129b0565b6000546001600160a01b03163314806124b057506000546001600160a01b0316155b6124cc5760405162461bcd60e51b8152600401610282906133b1565b6001600160a01b0381166125315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610282565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806125ae57506000546001600160a01b0316155b6125ca5760405162461bcd60e51b8152600401610282906133b1565b6003546001600160a01b0316156126235760405162461bcd60e51b815260206004820181905260248201527f52656769737472793a20697320616c726561647920696e697469616c697a65646044820152606401610282565b60068490556001600160a01b03861661263b57600080fd5b600380546001600160a01b0319166001600160a01b0388811691909117909155851661266657600080fd5b600580546001600160a01b0319166001600160a01b03871617905561268b8383610d3f565b6126943361248e565b600780546001600160a01b0319166001600160a01b03929092169190911790555050505050565b60006126c682611434565b6127215760405162461bcd60e51b815260206004820152602660248201527f52656769737472793a206865726d6573206861766520746f20626520726567696044820152651cdd195c995960d21b6064820152608401610282565b6000826001600160a01b0316634e69d5606040518163ffffffff1660e01b815260040160206040518083038186803b15801561275c57600080fd5b505afa158015612770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127949190613681565b905060008160038111156127aa576127aa6136a2565b149392505050565b60008060006127c18585612a1b565b915091506127ce81612a8b565b509392505050565b6040516001600160601b0319606086811b8216602084015285901b1660348201526000908190604801604051602081830303815290604052805190602001209050600061284d6104e660096000896001600160a01b03166001600160a01b0316815260200190815260200160002060010154610a72565b9050600061285b8383612a01565b600354600554604051637b809f7b60e11b81526001600160a01b03928316600482015290821660248201528a8216604482015289821660648201526084810188905291925082169063f7013ef69060a401600060405180830381600087803b1580156128c657600080fd5b505af11580156128da573d6000803e3d6000fd5b50506040516001600160a01b038481168252808b1693508b1691507f2ed7bcf2ff03098102c7003d7ce2a633e4b49b8198b07de5383cdf4c0ab9228b9060200160405180910390a36001600160a01b038616612934578095505b61293d88611276565b6129a5576001600160a01b038881166000818152600a602090815260409182902080546001600160a01b031916948b169485179055905192835290917fefaf768237c22e140a862d5d375ad5c153479fac3f8bcf8b580a1651fd62c3ef910160405180910390a25b979650505050505050565b604080516001600160f81b03196020808301919091523060601b6001600160601b03191660218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b600080838351602085016000f59050803b6109be57600080fd5b600080825160411415612a525760208301516040840151606085015160001a612a4687828585612c49565b94509450505050612a84565b825160401415612a7c5760208301516040840151612a71868383612d36565b935093505050612a84565b506000905060025b9250929050565b6000816004811115612a9f57612a9f6136a2565b1415612aa85750565b6001816004811115612abc57612abc6136a2565b1415612b0a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610282565b6002816004811115612b1e57612b1e6136a2565b1415612b6c5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610282565b6003816004811115612b8057612b806136a2565b1415612bd95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610282565b6004816004811115612bed57612bed6136a2565b1415612c465760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610282565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c805750600090506003612d2d565b8460ff16601b14158015612c9857508460ff16601c14155b15612ca95750600090506004612d2d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cfd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d2657600060019250925050612d2d565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612d5787828885612c49565b935093505050935093915050565b828054612d71906134d6565b90600052602060002090601f016020900481019282612d935760008555612dd9565b82601f10612dac57805160ff1916838001178555612dd9565b82800160010185558215612dd9579182015b82811115612dd9578251825591602001919060010190612dbe565b50612de5929150612de9565b5090565b5b80821115612de55760008155600101612dea565b6001600160a01b0381168114612c4657600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715612e4c57612e4c612e13565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e7b57612e7b612e13565b604052919050565b600067ffffffffffffffff821115612e9d57612e9d612e13565b50601f01601f191660200190565b600082601f830112612ebc57600080fd5b8135612ecf612eca82612e83565b612e52565b818152846020838601011115612ee457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215612f1657600080fd5b8335612f2181612dfe565b925060208401359150604084013567ffffffffffffffff811115612f4457600080fd5b612f5086828701612eab565b9150509250925092565b60008060408385031215612f6d57600080fd5b8235612f7881612dfe565b91506020830135612f8881612dfe565b809150509250929050565b600060208284031215612fa557600080fd5b81356109be81612dfe565b600060208284031215612fc257600080fd5b5035919050565b60008060408385031215612fdc57600080fd5b8235612fe781612dfe565b946020939093013593505050565b60005b83811015613010578181015183820152602001612ff8565b8381111561301f576000848401525b50505050565b6000815180845261303d816020860160208601612ff5565b601f01601f19169290920160200192915050565b6020815260006109be6020830184613025565b60008060006060848603121561307957600080fd5b833561308481612dfe565b9250602084013567ffffffffffffffff808211156130a157600080fd5b6130ad87838801612eab565b935060408601359150808211156130c357600080fd5b50612f5086828701612eab565b600080600080600060a086880312156130e857600080fd5b85356130f381612dfe565b94506020860135935060408601359250606086013561311181612dfe565b9150608086013567ffffffffffffffff81111561312d57600080fd5b61313988828901612eab565b9150509295509295909350565b60008060006060848603121561315b57600080fd5b833561316681612dfe565b9250602084013561317681612dfe565b9150604084013567ffffffffffffffff811115612f4457600080fd5b60008060008060008060c087890312156131ab57600080fd5b86356131b681612dfe565b955060208701359450604087013561ffff811681146131d457600080fd5b9350606087013592506080870135915060a087013567ffffffffffffffff8111156131fe57600080fd5b61320a89828a01612eab565b9150509295509295509295565b6020815260018060a01b0382511660208201526020820151604082015267ffffffffffffffff19604083015116606082015260006060830151608080840152610b7b60a0840182613025565b60008060008060008060c0878903121561327c57600080fd5b863561328781612dfe565b9550602087013561329781612dfe565b94506040870135935060608701356132ae81612dfe565b925060808701356132be81612dfe565b915060a08701356132ce81612dfe565b809150509295509295509295565b6020808252602b908201527f52656769737472793a2070726f7669646564206865726d65732068617665207460408201526a6f2062652061637469766560a81b606082015260800190565b60006020828403121561333957600080fd5b5051919050565b60208082526034908201527f52656769737472793a206e6f7420656e6f756768742066756e647320696e206360408201527368616e6e656c20746f20636f766572206665657360601b606082015260800190565b6000602082840312156133a657600080fd5b81516109be81612dfe565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015613424576134246133fc565b500390565b600060ff821660ff84168060ff03821115613446576134466133fc565b019392505050565b600060ff821660ff811415613465576134656133fc565b60010192915050565b6000600019821415613482576134826133fc565b5060010190565b60006bffffffffffffffffffffffff19808760601b168352808660601b1660148401525083516134c0816028850160208801612ff5565b6028920191820192909252604801949350505050565b600181811c908216806134ea57607f821691505b6020821081141561350b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561352357600080fd5b815180151581146109be57600080fd5b60008219821115613546576135466133fc565b500190565b6001600160a01b0384811682528316602082015260606040820181905260009061151190830184613025565b6001600160a01b0383168152604060208201819052600090610b7b90830184613025565b600060208083850312156135ae57600080fd5b825167ffffffffffffffff808211156135c657600080fd5b90840190608082870312156135da57600080fd5b6135e2612e29565b82516135ed81612dfe565b81528284015184820152604083015167ffffffffffffffff198116811461361357600080fd5b604082015260608301518281111561362a57600080fd5b80840193505086601f84011261363f57600080fd5b8251915061364f612eca83612e83565b828152878584860101111561366357600080fd5b61367283868301878701612ff5565b60608201529695505050505050565b60006020828403121561369357600080fd5b8151600481106109be57600080fd5b634e487b7160e01b600052602160045260246000fdfe3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3a264697066735822122036219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c7664736f6c63430008090033

Deployed Bytecode Sourcemap

17846:16827:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19365:49;;-1:-1:-1;;;19365:49:0;;216:2:1;19365:49:0;;;198:21:1;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:1;;;338:37;392:19;;19365:49:0;;;;;;;;17846:16827;;;;22413:702;;;;;;;;;;-1:-1:-1;22413:702:0;;;;;:::i;:::-;;:::i;:::-;;34139:247;;;;;;;;;;-1:-1:-1;34139:247:0;;;;;:::i;:::-;;:::i;:::-;;;2972:14:1;;2965:22;2947:41;;2935:2;2920:18;34139:247:0;;;;;;;;16012:258;;;;;;;;;;-1:-1:-1;16012:258:0;;;;;:::i;:::-;;:::i;20586:106::-;;;;;;;;;;-1:-1:-1;20664:5:0;;-1:-1:-1;;;;;20664:5:0;20656:28;;20586:106;;31107:152;;;;;;;;;;-1:-1:-1;31107:152:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3608:32:1;;;3590:51;;3578:2;3563:18;31107:152:0;3444:203:1;23209:347:0;;;;;;;;;;-1:-1:-1;23209:347:0;;;;;:::i;:::-;;:::i;27075:278::-;;;;;;;;;;-1:-1:-1;27075:278:0;;;;;:::i;:::-;;:::i;29324:218::-;;;;;;;;;;-1:-1:-1;29324:218:0;;;;;:::i;:::-;;:::i;17927:24::-;;;;;;;;;;;;;;;;;;;4370:25:1;;;4358:2;4343:18;17927:24:0;4224:177:1;32113:106:0;;;;;;;;;;;;;:::i;18043:33::-;;;;;;;;;;;;;;;;17958:26;;;;;;;;;;-1:-1:-1;17958:26:0;;;;-1:-1:-1;;;;;17958:26:0;;;16577:160;;;;;;;;;;;;;:::i;30955:144::-;;;;;;;;;;;;;:::i;31575:469::-;;;;;;;;;;-1:-1:-1;31575:469:0;;;;;:::i;:::-;;:::i;31417:150::-;;;;;;;;;;-1:-1:-1;31417:150:0;;;;;:::i;:::-;;:::i;12613:79::-;;;;;;;;;;-1:-1:-1;12651:7:0;12678:6;-1:-1:-1;;;;;12678:6:0;12613:79;;31267:142;;;;;;;;;;;;;:::i;28405:548::-;;;;;;;;;;-1:-1:-1;28405:548:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26815:252::-;;;;;;;;;;-1:-1:-1;26815:252:0;;;;;:::i;:::-;;:::i;27494:562::-;;;;;;;;;;-1:-1:-1;27494:562:0;;;;;:::i;:::-;;:::i;27361:125::-;;;;;;;;;;-1:-1:-1;27361:125:0;;;;;:::i;:::-;;:::i;32751:298::-;;;;;;;;;;-1:-1:-1;32751:298:0;;;;;:::i;:::-;;:::i;30568:296::-;;;;;;;;;;-1:-1:-1;30568:296:0;;;;;:::i;:::-;;:::i;18083:30::-;;;;;;;;;;-1:-1:-1;18083:30:0;;;;-1:-1:-1;;;;;18083:30:0;;;33057:658;;;;;;;;;;-1:-1:-1;33057:658:0;;;;;:::i;:::-;;:::i;21009:1309::-;;;;;;;;;;-1:-1:-1;21009:1309:0;;;;;:::i;:::-;;:::i;29550:1010::-;;;;;;;;;;-1:-1:-1;29550:1010:0;;;;;:::i;:::-;;:::i;32624:119::-;;;;;;;;;;-1:-1:-1;32706:14:0;;-1:-1:-1;;;;;32706:14:0;32698:37;;32624:119;;24739:1516;;;;;;;;;;-1:-1:-1;24739:1516:0;;;;;:::i;:::-;;:::i;16816:339::-;;;;;;;;;;-1:-1:-1;16816:339:0;;;;;:::i;:::-;;:::i;26604:203::-;;;;;;;;;;-1:-1:-1;26604:203:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34394:276::-;;;;;;;;;;-1:-1:-1;34394:276:0;;;;;:::i;:::-;;:::i;26263:333::-;;;;;;;;;;-1:-1:-1;26263:333:0;;;;;:::i;:::-;;:::i;12851:244::-;;;;;;;;;;-1:-1:-1;12851:244:0;;;;;:::i;:::-;;:::i;16339:103::-;;;;;;;;;;-1:-1:-1;16418:16:0;;-1:-1:-1;;;;;16418:16:0;16339:103;;15808:24;;;;;;;;;;-1:-1:-1;15808:24:0;;;;-1:-1:-1;;;;;15808:24:0;;;19726:852;;;;;;;;;;-1:-1:-1;19726:852:0;;;;;:::i;:::-;;:::i;22413:702::-;22536:25;22551:9;22536:14;:25::i;:::-;22528:81;;;;-1:-1:-1;;;22528:81:0;;;;;;;:::i;:::-;22668:17;22688:103;22780:10;17310:9;22698:72;;;;;;10794:19:1;;;;-1:-1:-1;;;;;;22737:4:0;10901:2:1;10897:15;;;10893:24;;10879:12;;;10872:46;;;;10952:15;;;;10948:24;10934:12;;;10927:46;10989:12;;;10982:28;;;11026:13;;22698:72:0;;;;;;;;;;;;;22688:83;;;;;;:91;;:103;;;;:::i;:::-;22668:123;-1:-1:-1;;;;;;22810:23:0;;22802:78;;;;-1:-1:-1;;;22802:78:0;;11252:2:1;22802:78:0;;;11234:21:1;11291:2;11271:18;;;11264:30;11330:34;11310:18;;;11303:62;-1:-1:-1;;;11381:18:1;;;11374:40;11431:19;;22802:78:0;11050:406:1;22802:78:0;22919:5;;-1:-1:-1;;;;;22919:5:0;:15;22935:39;22953:9;22964;22935:17;:39::i;:::-;22919:56;;-1:-1:-1;;;;;;22919:56:0;;;;;;;-1:-1:-1;;;;;3608:32:1;;;22919:56:0;;;3590:51:1;3563:18;;22919:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22901:14;:74;;22893:139;;;;-1:-1:-1;;;22893:139:0;;;;;;;:::i;:::-;23045:62;23058:9;23069;23088:1;23092:14;23045:12;:62::i;:::-;;22517:598;22413:702;;;:::o;34139:247::-;34223:4;34247:56;34263:39;34281:9;34292;34263:17;:39::i;:::-;32458:18;32506:16;;;32310:220;34247:56;:131;;;-1:-1:-1;34323:14:0;;:54;;-1:-1:-1;;;34323:54:0;;-1:-1:-1;;;;;12301:15:1;;;34323:54:0;;;12283:34:1;12353:15;;;12333:18;;;12326:43;34307:71:0;;34323:14;;:32;;12218:18:1;;34323:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34307:71::-;34240:138;34139:247;-1:-1:-1;;;34139:247:0:o;16012:258::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16118:29:0;::::1;16110:38;;;::::0;::::1;;16183:16;::::0;16164:53:::1;::::0;-1:-1:-1;;;;;16164:53:0;;::::1;::::0;16183:16:::1;::::0;16164:53:::1;::::0;16183:16:::1;::::0;16164:53:::1;16228:16;:34:::0;;-1:-1:-1;;;;;;16228:34:0::1;-1:-1:-1::0;;;;;16228:34:0;;;::::1;::::0;;;::::1;::::0;;16012:258::o;31107:152::-;31180:7;31207:15;31223:8;31207:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;31207:44:0;;31107:152;-1:-1:-1;;31107:152:0:o;23209:347::-;23302:25;23317:9;23302:14;:25::i;:::-;23294:81;;;;-1:-1:-1;;;23294:81:0;;;;;;;:::i;:::-;23395:37;23411:9;23422;23395:15;:37::i;:::-;23394:38;23386:100;;;;-1:-1:-1;;;23386:100:0;;13331:2:1;23386:100:0;;;13313:21:1;13370:2;13350:18;;;13343:30;13409:34;13389:18;;;13382:62;-1:-1:-1;;;13460:18:1;;;13453:47;13517:19;;23386:100:0;13129:413:1;23386:100:0;23499:49;23512:9;23523;23542:1;23546;23499:12;:49::i;:::-;;23209:347;;:::o;27075:278::-;27165:7;27185:13;27211:47;27224:33;27248:8;27224:23;:33::i;27211:47::-;27201:58;;;;;;;;-1:-1:-1;27277:68:0;-1:-1:-1;;;;;27303:33:0;;27201:58;27277:17;:68::i;:::-;27270:75;27075:278;-1:-1:-1;;;;27075:278:0:o;29324:218::-;29388:7;29412:19;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;;;32624:119;29412:19;29408:85;;;29453:14;;:40;;-1:-1:-1;;;29453:40:0;;-1:-1:-1;;;;;3608:32:1;;;29453:40:0;;;3590:51:1;29453:14:0;;;;:29;;3563:18:1;;29453:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29446:47;29324:218;-1:-1:-1;;29324:218:0:o;29408:85::-;-1:-1:-1;;;;;;29513:21:0;;;;;;;:10;:21;;;;;;;;29324:218::o;32113:106::-;32187:15;:22;32160:7;;32187:24;;32210:1;;32187:24;:::i;:::-;32180:31;;32113:106;:::o;16577:160::-;14755:1;15351:7;;:19;;15343:63;;;;-1:-1:-1;;;15343:63:0;;14011:2:1;15343:63:0;;;13993:21:1;14050:2;14030:18;;;14023:30;14089:33;14069:18;;;14062:61;14140:18;;15343:63:0;13809:355:1;15343:63:0;14755:1;15484:7;:18;;;16639:16;-1:-1:-1;;;;;16639:16:0::1;16631:39;;;::::0;::::1;;16681:16;::::0;:48:::1;::::0;-1:-1:-1;;;;;16681:16:0;;::::1;::::0;16707:21:::1;16681:48:::0;::::1;;;::::0;:16:::1;:48:::0;:16;:48;16707:21;16681:16;:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;14711:1:0;15663:22;;16577:160::o;30955:144::-;31012:7;31039:15;31055:16;:14;:16::i;:::-;31039:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:52;-1:-1:-1;;;;;31039:52:0;;30955:144;-1:-1:-1;30955:144:0:o;31575:469::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;20664:5;;-1:-1:-1;;;;;20664:5:0;31694:91:::1;;;::::0;-1:-1:-1;;;31694:91:0;;14371:2:1;31694:91:0::1;::::0;::::1;14353:21:1::0;14410:2;14390:18;;;14383:30;14449:34;14429:18;;;14422:62;14520:33;14500:18;;;14493:61;14571:19;;31694:91:0::1;14169:427:1::0;31694:91:0::1;32458:18:::0;;32506:16;;31804:81:::1;;;;-1:-1:-1::0;32458:18:0;;32506:16;;31847:38:::1;31796:146;;;::::0;-1:-1:-1;;;31796:146:0;;14803:2:1;31796:146:0::1;::::0;::::1;14785:21:1::0;14842:2;14822:18;;;14815:30;14881:34;14861:18;;;14854:62;-1:-1:-1;;;14932:18:1;;;14925:50;14992:19;;31796:146:0::1;14601:416:1::0;31796:146:0::1;31974:61;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;31974:61:0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;31953:15:::1;:83:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;31953:83:0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;31953:83:0;;::::1;;::::0;;;;;;;;;;;;;::::1;::::0;::::1;;::::0;;31575:469::o;31417:150::-;31489:7;31516:15;31532:8;31516:25;;;;;;;;:::i;:::-;;;;;;;;;:43;:25;;;;;:43;;-1:-1:-1;;;;;31516:43:0;;31417:150;-1:-1:-1;;31417:150:0:o;31267:142::-;31323:7;31350:15;31366:16;:14;:16::i;:::-;31350:33;;;;;;;;:::i;:::-;;;;;;;;;:51;:33;;;;;:51;;-1:-1:-1;;;;;31350:51:0;;31267:142;-1:-1:-1;31267:142:0:o;28405:548::-;28473:12;28625:18;:136;;;;;;;;;;;;;;;;;;-1:-1:-1;28797:24:0;;;;28774:20;28832:89;28854:2;28850:1;:6;;;28832:89;;;28894:12;28907:1;28894:15;;;;;;;;;:::i;:::-;;;;28878:5;28884:6;28889:1;28884:2;:6;:::i;:::-;28878:13;;;;;;;;;;:::i;:::-;;;;:31;-1:-1:-1;;;;;28878:31:0;;;;;;;;-1:-1:-1;28858:3:0;;;;:::i;:::-;;;;28832:89;;;-1:-1:-1;28940:5:0;;28405:548;-1:-1:-1;;;28405:548:0:o;26815:252::-;26887:7;26907:13;26933:39;26946:25;:23;:25::i;26933:39::-;26923:50;;;;;;;;-1:-1:-1;26991:68:0;-1:-1:-1;;;;;27017:33:0;;26923:50;26991:17;:68::i;27494:562::-;27608:25;27623:9;27608:14;:25::i;:::-;27600:80;;;;-1:-1:-1;;;27600:80:0;;15613:2:1;27600:80:0;;;15595:21:1;15652:2;15632:18;;;15625:30;15691:34;15671:18;;;15664:62;-1:-1:-1;;;15742:18:1;;;15735:40;15792:19;;27600:80:0;15411:406:1;27600:80:0;27739:17;27759:92;27840:10;27794:4;27801:9;27812:4;27818:9;;:11;;;;;;;;;:::i;:::-;;;;;27769:61;;;;;;;;;;;:::i;27759:92::-;-1:-1:-1;;;;;27883:19:0;;;;;;;:8;:19;;;;;:28;27739:112;;-1:-1:-1;27870:41:0;;;27883:28;;27870:41;27862:69;;;;-1:-1:-1;;;27862:69:0;;16753:2:1;27862:69:0;;;16735:21:1;16792:2;16772:18;;;16765:30;-1:-1:-1;;;16811:18:1;;;16804:45;16866:18;;27862:69:0;16551:339:1;27862:69:0;-1:-1:-1;;;;;27967:19:0;;;;;;:8;:19;;;;;;;;:30;;;;:23;;;;;:30;;;;:::i;:::-;;28032:9;-1:-1:-1;;;;;28015:33:0;;28043:4;28015:33;;;;;;:::i;:::-;;;;;;;;27589:467;27494:562;;;:::o;27361:125::-;-1:-1:-1;;;;;27455:19:0;;;;;;:8;:19;;;;;:23;;27448:30;;27423:12;;27455:23;27448:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27361:125;;;:::o;32751:298::-;32813:4;32834:19;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;;;32624:119;32834:19;32830:83;;;32875:14;;:38;;-1:-1:-1;;;32875:38:0;;-1:-1:-1;;;;;3608:32:1;;;32875:38:0;;;3590:51:1;32875:14:0;;;;:27;;3563:18:1;;32875:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32830:83::-;-1:-1:-1;;;;;;33006:21:0;;;33039:1;33006:21;;;:10;:21;;;;;;;:35;;;32751:298::o;30568:296::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;20664:5;;-1:-1:-1;;;;;20664:5:0;30653:96:::1;;;::::0;-1:-1:-1;;;30653:96:0;;17764:2:1;30653:96:0::1;::::0;::::1;17746:21:1::0;17803:2;17783:18;;;17776:30;;;17842:34;17822:18;;;17815:62;17913:34;17893:18;;;17886:62;-1:-1:-1;;;17964:19:1;;;17957:35;18009:19;;30653:96:0::1;17562:472:1::0;30653:96:0::1;30760:18;:37:::0;;;30813:43:::1;::::0;4370:25:1;;;30813:43:0::1;::::0;4358:2:1;4343:18;30813:43:0::1;;;;;;;30568:296:::0;:::o;33057:658::-;-1:-1:-1;;;;;33364:19:0;;;33115:4;33364:19;;;:8;:19;;;;;:28;;;33422:27;;;;33115:4;;33364:28;;33115:4;33476:43;33364:28;33422:27;33476:16;:43::i;:::-;33460:59;;33543:9;-1:-1:-1;;;;;33534:18:0;:5;-1:-1:-1;;;;;33534:18:0;;33530:49;;-1:-1:-1;33574:5:0;;33057:658;-1:-1:-1;;;;33057:658:0:o;33530:49::-;32458:18;;32506:16;;33647:60;;;-1:-1:-1;33673:14:0;;:34;;-1:-1:-1;;;33673:34:0;;-1:-1:-1;;;;;3608:32:1;;;33673:34:0;;;3590:51:1;33673:14:0;;;;:23;;3563:18:1;;33673:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33640:67;33057:658;-1:-1:-1;;;;;33057:658:0:o;21009:1309::-;21173:25;21188:9;21173:14;:25::i;:::-;21165:81;;;;-1:-1:-1;;;21165:81:0;;;;;;;:::i;:::-;21305:17;21325:131;21445:10;17310:9;21335:100;;;;;;18308:19:1;;;;-1:-1:-1;;;;;;21374:4:0;18415:2:1;18411:15;;;18407:24;;18393:12;;;18386:46;;;;18466:15;;;18462:24;;18448:12;;;18441:46;18503:12;;;18496:28;;;18540:13;;;18533:29;;;18597:15;;;;18593:24;18578:13;;;18571:47;18634:13;;21335:100:0;18039:614:1;21325:131:0;21305:151;-1:-1:-1;;;;;;21475:23:0;;21467:70;;;;-1:-1:-1;;;21467:70:0;;18860:2:1;21467:70:0;;;18842:21:1;18899:2;18879:18;;;18872:30;18938:34;18918:18;;;18911:62;-1:-1:-1;;;18989:18:1;;;18982:32;19031:19;;21467:70:0;18658:398:1;21467:70:0;21633:17;21653:29;21668:14;21653:12;:29;:::i;:::-;21714:5;;21633:49;;-1:-1:-1;;;;;;21714:5:0;:15;21730:39;21748:9;21759;21730:17;:39::i;:::-;21714:56;;-1:-1:-1;;;;;;21714:56:0;;;;;;;-1:-1:-1;;;;;3608:32:1;;;21714:56:0;;;3590:51:1;3563:18;;21714:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21701:9;:69;;21693:134;;;;-1:-1:-1;;;21693:134:0;;;;;;;:::i;:::-;21874:59;21887:9;21898;21909:12;21923:9;21874:12;:59::i;:::-;-1:-1:-1;22056:16:0;;22052:112;;22089:63;;-1:-1:-1;;;22089:63:0;;-1:-1:-1;;;;;19386:32:1;;;22089:63:0;;;19368:51:1;19435:18;;;19428:34;;;22089:38:0;;;;;19341:18:1;;22089:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22052:112;22222:18;;22218:93;;22257:5;;:42;;-1:-1:-1;;;22257:42:0;;22272:10;22257:42;;;19368:51:1;19435:18;;;19428:34;;;-1:-1:-1;;;;;22257:5:0;;;;:14;;19341:18:1;;22257:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22218:93;21154:1164;;21009:1309;;;;;:::o;29550:1010::-;-1:-1:-1;;;;;29669:29:0;;29661:85;;;;-1:-1:-1;;;29661:85:0;;19675:2:1;29661:85:0;;;19657:21:1;19714:2;19694:18;;;19687:30;19753:34;19733:18;;;19726:62;-1:-1:-1;;;19804:18:1;;;19797:41;19855:19;;29661:85:0;19473:407:1;29661:85:0;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;29813:740;;29853:14;;:69;;-1:-1:-1;;;29853:69:0;;-1:-1:-1;;;;;29853:14:0;;;;:29;;:69;;29883:9;;29894:15;;29911:10;;29853:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29813:740;29967:9;;:13;;29979:1;29967:13;:::i;:::-;29955:9;:25;30091:21;30115:19;32706:14;;-1:-1:-1;;;;;32706:14:0;32698:37;;;32624:119;30115:19;:61;;30171:4;30115:61;;;30145:14;;-1:-1:-1;;;;;30145:14:0;30115:61;30091:85;-1:-1:-1;30191:15:0;30209:115;30313:10;17310:9;30293;;30219:84;;;;;;20546:19:1;;;;-1:-1:-1;;;;;;20653:2:1;20649:15;;;20645:24;;20631:12;;;20624:46;;;;20704:15;;;20700:24;;20686:12;;;20679:46;20759:15;;;;20755:24;20741:12;;;20734:46;20796:12;;;20789:28;20833:13;;30219:84:0;20305:547:1;30209:115:0;30191:133;;30358:9;-1:-1:-1;;;;;30347:20:0;:7;-1:-1:-1;;;;;30347:20:0;;30339:78;;;;-1:-1:-1;;;30339:78:0;;21059:2:1;30339:78:0;;;21041:21:1;21098:2;21078:18;;;21071:30;21137:34;21117:18;;;21110:62;-1:-1:-1;;;21188:18:1;;;21181:43;21241:19;;30339:78:0;20857:409:1;30339:78:0;-1:-1:-1;;;;;30434:21:0;;;;;;;:10;:21;;;;;;;;;:39;;-1:-1:-1;;;;;;30434:39:0;;;;;;;;;30495:46;;3590:51:1;;;30434:21:0;;30495:46;;3563:18:1;30495:46:0;;;;;;;29940:613;;29550:1010;;;:::o;24739:1516::-;20664:5;;-1:-1:-1;;;;;20664:5:0;24918:85;;;;-1:-1:-1;;;24918:85:0;;21473:2:1;24918:85:0;;;21455:21:1;21512:2;21492:18;;;21485:30;21551:34;21531:18;;;21524:62;21622:27;21602:18;;;21595:55;21667:19;;24918:85:0;21271:421:1;24918:85:0;-1:-1:-1;;;;;25022:29:0;;25014:89;;;;-1:-1:-1;;;25014:89:0;;21899:2:1;25014:89:0;;;21881:21:1;21938:2;21918:18;;;21911:30;21977:34;21957:18;;;21950:62;-1:-1:-1;;;22028:18:1;;;22021:45;22083:19;;25014:89:0;21697:411:1;25014:89:0;25138:18;;25122:12;:34;;25114:107;;;;-1:-1:-1;;;25114:107:0;;22315:2:1;25114:107:0;;;22297:21:1;22354:2;22334:18;;;22327:30;22393:34;22373:18;;;22366:62;22464:30;22444:18;;;22437:58;22512:19;;25114:107:0;22113:424:1;25114:107:0;25234:17;25254:33;25271:15;25254:16;:33::i;:::-;25234:53;;25307:19;25316:9;25307:8;:19::i;:::-;25306:20;25298:68;;;;-1:-1:-1;;;25298:68:0;;22744:2:1;25298:68:0;;;22726:21:1;22783:2;22763:18;;;22756:30;22822:34;22802:18;;;22795:62;-1:-1:-1;;;22873:18:1;;;22866:33;22916:19;;25298:68:0;22542:399:1;25298:68:0;25463:23;25505:91;25537:15;-1:-1:-1;;;;;25521:33:0;25556:39;25569:25;:23;:25::i;25556:39::-;25505:15;:91::i;:::-;25664:5;;:62;;-1:-1:-1;;;25664:62:0;;25683:10;25664:62;;;23186:34:1;-1:-1:-1;;;;;23256:15:1;;;23236:18;;;23229:43;23288:18;;;23281:34;;;25463:134:0;;-1:-1:-1;25664:5:0;;;:18;;23121::1;;25664:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25796:5:0;;25869:3;;25769:104;;-1:-1:-1;;;25769:104:0;;-1:-1:-1;;;;;25796:5:0;;;25769:104;;;23665:34:1;23735:15;;;23715:18;;;23708:43;23799:6;23787:19;;23767:18;;;23760:47;23823:18;;;23816:34;;;23866:19;;;23859:35;;;25869:3:0;;;23910:19:1;;;23903:44;25769:18:0;;;;;;23599:19:1;;25769:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25957:65;;;;;;;;25964:15;-1:-1:-1;;;;;25957:65:0;;;;;25981:16;:14;:16::i;:::-;25957:65;;25999:16;25957:65;;;;-1:-1:-1;;;;;25957:65:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25935:19:0;;;-1:-1:-1;25935:19:0;;;:8;:19;;;;;:87;;;;-1:-1:-1;;;;;;25935:87:0;;;;;;;;;;;;;-1:-1:-1;25935:87:0;;;;;;;;;;;;-1:-1:-1;;;;;;25935:87:0;25957:65;25935:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;26136:5:0;;:43;;-1:-1:-1;;;26136:43:0;;-1:-1:-1;;;;;19386:32:1;;;26136:43:0;;;19368:51:1;-1:-1:-1;;19435:18:1;;;19428:34;26136:5:0;;;;-1:-1:-1;26136:13:0;;19341:18:1;;26136:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26214:9;-1:-1:-1;;;;;26197:50:0;;26225:15;26242:4;26197:50;;;;;;;:::i;:::-;;;;;;;;24907:1348;;24739:1516;;;;;;:::o;16816:339::-;14755:1;15351:7;;:19;;15343:63;;;;-1:-1:-1;;;15343:63:0;;14011:2:1;15343:63:0;;;13993:21:1;14050:2;14030:18;;;14023:30;14089:33;14069:18;;;14062:61;14140:18;;15343:63:0;13809:355:1;15343:63:0;14755:1;15484:7;:18;;;16892:16;-1:-1:-1;;;;;16892:16:0::1;16884:39;;;::::0;::::1;;16960:5;::::0;-1:-1:-1;;;;;16942:24:0;;::::1;16960:5:::0;::::1;16942:24;;16934:74;;;::::0;-1:-1:-1;;;16934:74:0;;24479:2:1;16934:74:0::1;::::0;::::1;24461:21:1::0;24518:2;24498:18;;;24491:30;24557:34;24537:18;;;24530:62;-1:-1:-1;;;24608:18:1;;;24601:35;24653:19;;16934:74:0::1;24277:401:1::0;16934:74:0::1;17037:44;::::0;-1:-1:-1;;;17037:44:0;;17075:4:::1;17037:44;::::0;::::1;3590:51:1::0;17019:15:0::1;::::0;-1:-1:-1;;;;;17037:29:0;::::1;::::0;::::1;::::0;3563:18:1;;17037:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17121:16;::::0;17092:55:::1;::::0;-1:-1:-1;;;17092:55:0;;-1:-1:-1;;;;;17121:16:0;;::::1;17092:55;::::0;::::1;19368:51:1::0;19435:18;;;19428:34;;;17019:62:0;;-1:-1:-1;17092:28:0;::::1;::::0;::::1;::::0;19341:18:1;;17092:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;14711:1:0;15663:22;;-1:-1:-1;16816:339:0:o;26604:203::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26696:19:0;26705:9;26696:8;:19::i;:::-;:43;;;-1:-1:-1;32706:14:0;;-1:-1:-1;;;;;32706:14:0;32698:37;26696:43;:103;;26764:14;;:35;;-1:-1:-1;;;26764:35:0;;-1:-1:-1;;;;;3608:32:1;;;26764:35:0;;;3590:51:1;26764:14:0;;;;:24;;3563:18:1;;26764:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26764:35:0;;;;;;;;;;;;:::i;:::-;26696:103;;;-1:-1:-1;;;;;26742:19:0;;;;;;;:8;:19;;;;;;;;;26696:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26696:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26689:110;26604:203;-1:-1:-1;;26604:203:0:o;34394:276::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;34499:5:::1;::::0;:30:::1;::::0;-1:-1:-1;;;34499:30:0;;34523:4:::1;34499:30;::::0;::::1;3590:51:1::0;34475:21:0::1;::::0;-1:-1:-1;;;;;34499:5:0::1;::::0;:15:::1;::::0;3563:18:1;;34499:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34475:54;;34564:1;34548:13;:17;34540:68;;;::::0;-1:-1:-1;;;34540:68:0;;26439:2:1;34540:68:0::1;::::0;::::1;26421:21:1::0;26478:2;26458:18;;;26451:30;26517:34;26497:18;;;26490:62;-1:-1:-1;;;26568:18:1;;;26561:36;26614:19;;34540:68:0::1;26237:402:1::0;34540:68:0::1;34619:5;::::0;:43:::1;::::0;-1:-1:-1;;;34619:43:0;;-1:-1:-1;;;;;19386:32:1;;;34619:43:0::1;::::0;::::1;19368:51:1::0;19435:18;;;19428:34;;;34619:5:0;;::::1;::::0;:14:::1;::::0;19341:18:1;;34619:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26263:333::-:0;-1:-1:-1;;;;;26433:19:0;;26349:7;26433:19;;;:8;:19;;;;;:27;;;26349:7;;26395:67;;26408:53;;:24;:53::i;26395:67::-;26385:78;;;;;;26369:94;;26474:13;26517:9;26528;26500:38;;;;;;;;26871:2:1;26867:15;;;-1:-1:-1;;;;;;26863:24:1;;;26851:37;;26922:15;;;;26918:24;26913:2;26904:12;;26897:46;26968:2;26959:12;;26644:333;26500:38:0;;;;;;;;;;;;;26490:49;;;;;;26474:65;;26557:31;26575:5;26582;26557:17;:31::i;12851:244::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12940:22:0;::::1;12932:73;;;::::0;-1:-1:-1;;;12932:73:0;;27184:2:1;12932:73:0::1;::::0;::::1;27166:21:1::0;27223:2;27203:18;;;27196:30;27262:34;27242:18;;;27235:62;-1:-1:-1;;;27313:18:1;;;27306:36;27359:19;;12932:73:0::1;26982:402:1::0;12932:73:0::1;13042:6;::::0;;13021:38:::1;::::0;-1:-1:-1;;;;;13021:38:0;;::::1;::::0;13042:6;::::1;::::0;13021:38:::1;::::0;::::1;13070:6;:17:::0;;-1:-1:-1;;;;;;13070:17:0::1;-1:-1:-1::0;;;;;13070:17:0;;;::::1;::::0;;;::::1;::::0;;12851:244::o;19726:852::-;12740:6;;-1:-1:-1;;;;;12740:6:0;12750:10;12740:20;;:46;;-1:-1:-1;12782:3:0;12764:6;-1:-1:-1;;;;;12764:6:0;:22;12740:46;12732:91;;;;-1:-1:-1;;;12732:91:0;;;;;;;:::i;:::-;20664:5;;-1:-1:-1;;;;;20664:5:0;20656:28;19951:61:::1;;;::::0;-1:-1:-1;;;19951:61:0;;27591:2:1;19951:61:0::1;::::0;::::1;27573:21:1::0;;;27610:18;;;27603:30;27669:34;27649:18;;;27642:62;27721:18;;19951:61:0::1;27389:356:1::0;19951:61:0::1;20025:18;:40:::0;;;-1:-1:-1;;;;;20086:27:0;::::1;20078:36;;;::::0;::::1;;20125:5;:34:::0;;-1:-1:-1;;;;;;20125:34:0::1;-1:-1:-1::0;;;;;20125:34:0;;::::1;::::0;;;::::1;::::0;;;20180:25;::::1;20172:34;;;::::0;::::1;;20217:3;:17:::0;;-1:-1:-1;;;;;;20217:17:0::1;-1:-1:-1::0;;;;;20217:17:0;::::1;;::::0;;20295:65:::1;20314:22:::0;20338:21;20295:18:::1;:65::i;:::-;20417:29;20435:10;20417:17;:29::i;:::-;20528:14;:42:::0;;-1:-1:-1;;;;;;20528:42:0::1;-1:-1:-1::0;;;;;20528:42:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;19726:852:0:o;33723:408::-;33789:4;33921:19;33930:9;33921:8;:19::i;:::-;33913:70;;;;-1:-1:-1;;;33913:70:0;;27952:2:1;33913:70:0;;;27934:21:1;27991:2;27971:18;;;27964:30;28030:34;28010:18;;;28003:62;-1:-1:-1;;;28081:18:1;;;28074:36;28127:19;;33913:70:0;27750:402:1;33913:70:0;33996:29;34044:9;-1:-1:-1;;;;;34028:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33996:70;-1:-1:-1;34094:29:0;34084:6;:39;;;;;;;;:::i;:::-;;;33723:408;-1:-1:-1;;;33723:408:0:o;4440:231::-;4518:7;4539:17;4558:18;4580:27;4591:4;4597:9;4580:10;:27::i;:::-;4538:69;;;;4618:18;4630:5;4618:11;:18::i;:::-;-1:-1:-1;4654:9:0;4440:231;-1:-1:-1;;;4440:231:0:o;23709:1022::-;23869:38;;-1:-1:-1;;;;;;26871:2:1;26867:15;;;26863:24;;23869:38:0;;;26851:37:1;26922:15;;;26918:24;26904:12;;;26897:46;23823:7:0;;;;26959:12:1;;23869:38:0;;;;;;;;;;;;23859:49;;;;;;23843:65;;23919:18;23940:67;23953:53;23978:8;:19;23987:9;-1:-1:-1;;;;;23978:19:0;-1:-1:-1;;;;;23978:19:0;;;;;;;;;;;;:27;;;23953:24;:53::i;23940:67::-;23919:88;-1:-1:-1;24018:16:0;24045:38;24069:5;23919:88;24045:15;:38::i;:::-;24123:5;;24131:3;;24095:68;;-1:-1:-1;;;24095:68:0;;-1:-1:-1;;;;;24123:5:0;;;24095:68;;;28869:34:1;24131:3:0;;;28919:18:1;;;28912:43;28991:15;;;28971:18;;;28964:43;29043:15;;;29023:18;;;29016:43;29075:19;;;29068:35;;;24018:66:0;;-1:-1:-1;24095:19:0;;;;;28803::1;;24095:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24181:63:0;;-1:-1:-1;;;;;3608:32:1;;;3590:51;;24181:63:0;;;;-1:-1:-1;24181:63:0;;;-1:-1:-1;24181:63:0;;3578:2:1;3563:18;24181:63:0;;;;;;;-1:-1:-1;;;;;24356:26:0;;24352:91;;24422:8;24399:32;;24352:91;24536:23;24549:9;24536:12;:23::i;:::-;24531:156;;-1:-1:-1;;;;;24576:21:0;;;;;;;:10;:21;;;;;;;;;:36;;-1:-1:-1;;;;;;24576:36:0;;;;;;;;;24632:43;;3590:51:1;;;24576:21:0;;24632:43;;3563:18:1;24632:43:0;;;;;;;24531:156;24714:8;23709:1022;-1:-1:-1;;;;;;;23709:1022:0:o;28104:293::-;28245:140;;;-1:-1:-1;;;;;;28245:140:0;;;;29325:39:1;;;;28311:4:0;29401:2:1;29397:15;-1:-1:-1;;;;;;29393:53:1;29380:11;;;29373:74;29463:12;;;29456:28;;;;29500:12;;;;29493:28;;;;28245:140:0;;;;;;;;;;29537:12:1;;28245:140:0;;28235:151;;;;;;28104:293::o;28961:355::-;29039:15;29067:21;29177:5;29169;29163:12;29156:4;29149:5;29145:16;29142:1;29134:49;29125:58;;29219:5;29207:18;29197:76;;29256:1;29253;29246:12;2330:1308;2411:7;2420:12;2645:9;:16;2665:2;2645:22;2641:990;;;2941:4;2926:20;;2920:27;2991:4;2976:20;;2970:27;3049:4;3034:20;;3028:27;2684:9;3020:36;3092:25;3103:4;3020:36;2920:27;2970;3092:10;:25::i;:::-;3085:32;;;;;;;;;2641:990;3139:9;:16;3159:2;3139:22;3135:496;;;3414:4;3399:20;;3393:27;3465:4;3450:20;;3444:27;3507:23;3518:4;3393:27;3444;3507:10;:23::i;:::-;3500:30;;;;;;;;3135:496;-1:-1:-1;3579:1:0;;-1:-1:-1;3583:35:0;3135:496;2330:1308;;;;;:::o;601:643::-;679:20;670:5;:29;;;;;;;;:::i;:::-;;666:571;;;601:643;:::o;666:571::-;777:29;768:5;:38;;;;;;;;:::i;:::-;;764:473;;;823:34;;-1:-1:-1;;;823:34:0;;29762:2:1;823:34:0;;;29744:21:1;29801:2;29781:18;;;29774:30;29840:26;29820:18;;;29813:54;29884:18;;823:34:0;29560:348:1;764:473:0;888:35;879:5;:44;;;;;;;;:::i;:::-;;875:362;;;940:41;;-1:-1:-1;;;940:41:0;;30115:2:1;940:41:0;;;30097:21:1;30154:2;30134:18;;;30127:30;30193:33;30173:18;;;30166:61;30244:18;;940:41:0;29913:355:1;875:362:0;1012:30;1003:5;:39;;;;;;;;:::i;:::-;;999:238;;;1059:44;;-1:-1:-1;;;1059:44:0;;30475:2:1;1059:44:0;;;30457:21:1;30514:2;30494:18;;;30487:30;30553:34;30533:18;;;30526:62;-1:-1:-1;;;30604:18:1;;;30597:32;30646:19;;1059:44:0;30273:398:1;999:238:0;1134:30;1125:5;:39;;;;;;;;:::i;:::-;;1121:116;;;1181:44;;-1:-1:-1;;;1181:44:0;;30878:2:1;1181:44:0;;;30860:21:1;30917:2;30897:18;;;30890:30;30956:34;30936:18;;;30929:62;-1:-1:-1;;;31007:18:1;;;31000:32;31049:19;;1181:44:0;30676:398:1;1121:116:0;601:643;:::o;5939:1632::-;6070:7;;7004:66;6991:79;;6987:163;;;-1:-1:-1;7103:1:0;;-1:-1:-1;7107:30:0;7087:51;;6987:163;7164:1;:7;;7169:2;7164:7;;:18;;;;;7175:1;:7;;7180:2;7175:7;;7164:18;7160:102;;;-1:-1:-1;7215:1:0;;-1:-1:-1;7219:30:0;7199:51;;7160:102;7376:24;;;7359:14;7376:24;;;;;;;;;31306:25:1;;;31379:4;31367:17;;31347:18;;;31340:45;;;;31401:18;;;31394:34;;;31444:18;;;31437:34;;;7376:24:0;;31278:19:1;;7376:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7376:24:0;;-1:-1:-1;;7376:24:0;;;-1:-1:-1;;;;;;;7415:20:0;;7411:103;;7468:1;7472:29;7452:50;;;;;;;7411:103;7534:6;-1:-1:-1;7542:20:0;;-1:-1:-1;5939:1632:0;;;;;;;;:::o;4934:391::-;5048:7;;-1:-1:-1;;;;;5149:75:0;;5251:3;5247:12;;;5261:2;5243:21;5292:25;5303:4;5243:21;5312:1;5149:75;5292:10;:25::i;:::-;5285:32;;;;;;4934:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;422:131:1;-1:-1:-1;;;;;497:31:1;;487:42;;477:70;;543:1;540;533:12;558:127;619:10;614:3;610:20;607:1;600:31;650:4;647:1;640:15;674:4;671:1;664:15;690:253;762:2;756:9;804:4;792:17;;839:18;824:34;;860:22;;;821:62;818:88;;;886:18;;:::i;:::-;922:2;915:22;690:253;:::o;948:275::-;1019:2;1013:9;1084:2;1065:13;;-1:-1:-1;;1061:27:1;1049:40;;1119:18;1104:34;;1140:22;;;1101:62;1098:88;;;1166:18;;:::i;:::-;1202:2;1195:22;948:275;;-1:-1:-1;948:275:1:o;1228:186::-;1276:4;1309:18;1301:6;1298:30;1295:56;;;1331:18;;:::i;:::-;-1:-1:-1;1397:2:1;1376:15;-1:-1:-1;;1372:29:1;1403:4;1368:40;;1228:186::o;1419:462::-;1461:5;1514:3;1507:4;1499:6;1495:17;1491:27;1481:55;;1532:1;1529;1522:12;1481:55;1568:6;1555:20;1599:48;1615:31;1643:2;1615:31;:::i;:::-;1599:48;:::i;:::-;1672:2;1663:7;1656:19;1718:3;1711:4;1706:2;1698:6;1694:15;1690:26;1687:35;1684:55;;;1735:1;1732;1725:12;1684:55;1800:2;1793:4;1785:6;1781:17;1774:4;1765:7;1761:18;1748:55;1848:1;1823:16;;;1841:4;1819:27;1812:38;;;;1827:7;1419:462;-1:-1:-1;;;1419:462:1:o;1886:523::-;1972:6;1980;1988;2041:2;2029:9;2020:7;2016:23;2012:32;2009:52;;;2057:1;2054;2047:12;2009:52;2096:9;2083:23;2115:31;2140:5;2115:31;:::i;:::-;2165:5;-1:-1:-1;2217:2:1;2202:18;;2189:32;;-1:-1:-1;2272:2:1;2257:18;;2244:32;2299:18;2288:30;;2285:50;;;2331:1;2328;2321:12;2285:50;2354:49;2395:7;2386:6;2375:9;2371:22;2354:49;:::i;:::-;2344:59;;;1886:523;;;;;:::o;2414:388::-;2482:6;2490;2543:2;2531:9;2522:7;2518:23;2514:32;2511:52;;;2559:1;2556;2549:12;2511:52;2598:9;2585:23;2617:31;2642:5;2617:31;:::i;:::-;2667:5;-1:-1:-1;2724:2:1;2709:18;;2696:32;2737:33;2696:32;2737:33;:::i;:::-;2789:7;2779:17;;;2414:388;;;;;:::o;2999:255::-;3066:6;3119:2;3107:9;3098:7;3094:23;3090:32;3087:52;;;3135:1;3132;3125:12;3087:52;3174:9;3161:23;3193:31;3218:5;3193:31;:::i;3259:180::-;3318:6;3371:2;3359:9;3350:7;3346:23;3342:32;3339:52;;;3387:1;3384;3377:12;3339:52;-1:-1:-1;3410:23:1;;3259:180;-1:-1:-1;3259:180:1:o;3652:315::-;3720:6;3728;3781:2;3769:9;3760:7;3756:23;3752:32;3749:52;;;3797:1;3794;3787:12;3749:52;3836:9;3823:23;3855:31;3880:5;3855:31;:::i;:::-;3905:5;3957:2;3942:18;;;;3929:32;;-1:-1:-1;;;3652:315:1:o;4630:258::-;4702:1;4712:113;4726:6;4723:1;4720:13;4712:113;;;4802:11;;;4796:18;4783:11;;;4776:39;4748:2;4741:10;4712:113;;;4843:6;4840:1;4837:13;4834:48;;;4878:1;4869:6;4864:3;4860:16;4853:27;4834:48;;4630:258;;;:::o;4893:257::-;4934:3;4972:5;4966:12;4999:6;4994:3;4987:19;5015:63;5071:6;5064:4;5059:3;5055:14;5048:4;5041:5;5037:16;5015:63;:::i;:::-;5132:2;5111:15;-1:-1:-1;;5107:29:1;5098:39;;;;5139:4;5094:50;;4893:257;-1:-1:-1;;4893:257:1:o;5155:217::-;5302:2;5291:9;5284:21;5265:4;5322:44;5362:2;5351:9;5347:18;5339:6;5322:44;:::i;5377:674::-;5472:6;5480;5488;5541:2;5529:9;5520:7;5516:23;5512:32;5509:52;;;5557:1;5554;5547:12;5509:52;5596:9;5583:23;5615:31;5640:5;5615:31;:::i;:::-;5665:5;-1:-1:-1;5721:2:1;5706:18;;5693:32;5744:18;5774:14;;;5771:34;;;5801:1;5798;5791:12;5771:34;5824:49;5865:7;5856:6;5845:9;5841:22;5824:49;:::i;:::-;5814:59;;5926:2;5915:9;5911:18;5898:32;5882:48;;5955:2;5945:8;5942:16;5939:36;;;5971:1;5968;5961:12;5939:36;;5994:51;6037:7;6026:8;6015:9;6011:24;5994:51;:::i;6289:734::-;6393:6;6401;6409;6417;6425;6478:3;6466:9;6457:7;6453:23;6449:33;6446:53;;;6495:1;6492;6485:12;6446:53;6534:9;6521:23;6553:31;6578:5;6553:31;:::i;:::-;6603:5;-1:-1:-1;6655:2:1;6640:18;;6627:32;;-1:-1:-1;6706:2:1;6691:18;;6678:32;;-1:-1:-1;6762:2:1;6747:18;;6734:32;6775:33;6734:32;6775:33;:::i;:::-;6827:7;-1:-1:-1;6885:3:1;6870:19;;6857:33;6913:18;6902:30;;6899:50;;;6945:1;6942;6935:12;6899:50;6968:49;7009:7;7000:6;6989:9;6985:22;6968:49;:::i;:::-;6958:59;;;6289:734;;;;;;;;:::o;7028:596::-;7114:6;7122;7130;7183:2;7171:9;7162:7;7158:23;7154:32;7151:52;;;7199:1;7196;7189:12;7151:52;7238:9;7225:23;7257:31;7282:5;7257:31;:::i;:::-;7307:5;-1:-1:-1;7364:2:1;7349:18;;7336:32;7377:33;7336:32;7377:33;:::i;:::-;7429:7;-1:-1:-1;7487:2:1;7472:18;;7459:32;7514:18;7503:30;;7500:50;;;7546:1;7543;7536:12;7629:830;7741:6;7749;7757;7765;7773;7781;7834:3;7822:9;7813:7;7809:23;7805:33;7802:53;;;7851:1;7848;7841:12;7802:53;7890:9;7877:23;7909:31;7934:5;7909:31;:::i;:::-;7959:5;-1:-1:-1;8011:2:1;7996:18;;7983:32;;-1:-1:-1;8067:2:1;8052:18;;8039:32;8115:6;8102:20;;8090:33;;8080:61;;8137:1;8134;8127:12;8080:61;8160:7;-1:-1:-1;8214:2:1;8199:18;;8186:32;;-1:-1:-1;8265:3:1;8250:19;;8237:33;;-1:-1:-1;8321:3:1;8306:19;;8293:33;8349:18;8338:30;;8335:50;;;8381:1;8378;8371:12;8335:50;8404:49;8445:7;8436:6;8425:9;8421:22;8404:49;:::i;:::-;8394:59;;;7629:830;;;;;;;;:::o;8464:570::-;8639:2;8628:9;8621:21;8714:1;8710;8705:3;8701:11;8697:19;8688:6;8682:13;8678:39;8673:2;8662:9;8658:18;8651:67;8772:2;8764:6;8760:15;8754:22;8749:2;8738:9;8734:18;8727:50;8845:18;8841:23;8835:2;8827:6;8823:15;8817:22;8813:52;8808:2;8797:9;8793:18;8786:80;8602:4;8913:2;8905:6;8901:15;8895:22;8955:4;8948;8937:9;8933:20;8926:34;8977:51;9023:3;9012:9;9008:19;8994:12;8977:51;:::i;9266:898::-;9386:6;9394;9402;9410;9418;9426;9479:3;9467:9;9458:7;9454:23;9450:33;9447:53;;;9496:1;9493;9486:12;9447:53;9535:9;9522:23;9554:31;9579:5;9554:31;:::i;:::-;9604:5;-1:-1:-1;9661:2:1;9646:18;;9633:32;9674:33;9633:32;9674:33;:::i;:::-;9726:7;-1:-1:-1;9780:2:1;9765:18;;9752:32;;-1:-1:-1;9836:2:1;9821:18;;9808:32;9849:33;9808:32;9849:33;:::i;:::-;9901:7;-1:-1:-1;9960:3:1;9945:19;;9932:33;9974;9932;9974;:::i;:::-;10026:7;-1:-1:-1;10085:3:1;10070:19;;10057:33;10099;10057;10099;:::i;:::-;10151:7;10141:17;;;9266:898;;;;;;;;:::o;10169:407::-;10371:2;10353:21;;;10410:2;10390:18;;;10383:30;10449:34;10444:2;10429:18;;10422:62;-1:-1:-1;;;10515:2:1;10500:18;;10493:41;10566:3;10551:19;;10169:407::o;11461:184::-;11531:6;11584:2;11572:9;11563:7;11559:23;11555:32;11552:52;;;11600:1;11597;11590:12;11552:52;-1:-1:-1;11623:16:1;;11461:184;-1:-1:-1;11461:184:1:o;11650:416::-;11852:2;11834:21;;;11891:2;11871:18;;;11864:30;11930:34;11925:2;11910:18;;11903:62;-1:-1:-1;;;11996:2:1;11981:18;;11974:50;12056:3;12041:19;;11650:416::o;12380:251::-;12450:6;12503:2;12491:9;12482:7;12478:23;12474:32;12471:52;;;12519:1;12516;12509:12;12471:52;12551:9;12545:16;12570:31;12595:5;12570:31;:::i;12636:356::-;12838:2;12820:21;;;12857:18;;;12850:30;12916:34;12911:2;12896:18;;12889:62;12983:2;12968:18;;12636:356::o;12997:127::-;13058:10;13053:3;13049:20;13046:1;13039:31;13089:4;13086:1;13079:15;13113:4;13110:1;13103:15;13547:127;13608:10;13603:3;13599:20;13596:1;13589:31;13639:4;13636:1;13629:15;13663:4;13660:1;13653:15;13679:125;13719:4;13747:1;13744;13741:8;13738:34;;;13752:18;;:::i;:::-;-1:-1:-1;13789:9:1;;13679:125::o;15022:204::-;15060:3;15096:4;15093:1;15089:12;15128:4;15125:1;15121:12;15163:3;15157:4;15153:14;15148:3;15145:23;15142:49;;;15171:18;;:::i;:::-;15207:13;;15022:204;-1:-1:-1;;;15022:204:1:o;15231:175::-;15268:3;15312:4;15305:5;15301:16;15341:4;15332:7;15329:17;15326:43;;;15349:18;;:::i;:::-;15398:1;15385:15;;15231:175;-1:-1:-1;;15231:175:1:o;15822:135::-;15861:3;-1:-1:-1;;15882:17:1;;15879:43;;;15902:18;;:::i;:::-;-1:-1:-1;15949:1:1;15938:13;;15822:135::o;15962:584::-;16175:3;16207:26;16203:31;16276:2;16267:6;16263:2;16259:15;16255:24;16250:3;16243:37;16331:2;16322:6;16318:2;16314:15;16310:24;16305:2;16300:3;16296:12;16289:46;;16364:6;16358:13;16380:62;16435:6;16430:2;16425:3;16421:12;16414:4;16406:6;16402:17;16380:62;:::i;:::-;16501:2;16461:16;;16493:11;;;16486:27;;;;16537:2;16529:11;;15962:584;-1:-1:-1;;;;15962:584:1:o;16895:380::-;16974:1;16970:12;;;;17017;;;17038:61;;17092:4;17084:6;17080:17;17070:27;;17038:61;17145:2;17137:6;17134:14;17114:18;17111:38;17108:161;;;17191:10;17186:3;17182:20;17179:1;17172:31;17226:4;17223:1;17216:15;17254:4;17251:1;17244:15;17108:161;;16895:380;;;:::o;17280:277::-;17347:6;17400:2;17388:9;17379:7;17375:23;17371:32;17368:52;;;17416:1;17413;17406:12;17368:52;17448:9;17442:16;17501:5;17494:13;17487:21;17480:5;17477:32;17467:60;;17523:1;17520;17513:12;19061:128;19101:3;19132:1;19128:6;19125:1;19122:13;19119:39;;;19138:18;;:::i;:::-;-1:-1:-1;19174:9:1;;19061:128::o;19885:415::-;-1:-1:-1;;;;;20126:15:1;;;20108:34;;20178:15;;20173:2;20158:18;;20151:43;20230:2;20225;20210:18;;20203:30;;;20051:4;;20250:44;;20275:18;;20267:6;20250:44;:::i;23958:314::-;-1:-1:-1;;;;;24133:32:1;;24115:51;;24202:2;24197;24182:18;;24175:30;;;-1:-1:-1;;24222:44:1;;24247:18;;24239:6;24222:44;:::i;24970:1262::-;25063:6;25094:2;25137;25125:9;25116:7;25112:23;25108:32;25105:52;;;25153:1;25150;25143:12;25105:52;25186:9;25180:16;25215:18;25256:2;25248:6;25245:14;25242:34;;;25272:1;25269;25262:12;25242:34;25295:22;;;;25351:4;25333:16;;;25329:27;25326:47;;;25369:1;25366;25359:12;25326:47;25395:22;;:::i;:::-;25447:2;25441:9;25459:33;25484:7;25459:33;:::i;:::-;25501:22;;25561:11;;;25555:18;25539:14;;;25532:42;25608:2;25600:11;;25594:18;-1:-1:-1;;25639:33:1;;25631:42;;25621:70;;25687:1;25684;25677:12;25621:70;25718:2;25707:14;;25700:27;25766:2;25758:11;;25752:18;25782:16;;;25779:36;;;25811:1;25808;25801:12;25779:36;25842:8;25838:2;25834:17;25824:27;;;25889:7;25882:4;25878:2;25874:13;25870:27;25860:55;;25911:1;25908;25901:12;25860:55;25940:2;25934:9;25924:19;;25965:48;25981:31;26009:2;25981:31;:::i;25965:48::-;26036:2;26029:5;26022:17;26076:7;26071:2;26066;26062;26058:11;26054:20;26051:33;26048:53;;;26097:1;26094;26087:12;26048:53;26110:54;26161:2;26156;26149:5;26145:14;26140:2;26136;26132:11;26110:54;:::i;:::-;26191:2;26180:14;;26173:29;26184:5;24970:1262;-1:-1:-1;;;;;;24970:1262:1:o;28157:270::-;28237:6;28290:2;28278:9;28269:7;28265:23;28261:32;28258:52;;;28306:1;28303;28296:12;28258:52;28338:9;28332:16;28377:1;28370:5;28367:12;28357:40;;28393:1;28390;28383:12;28432:127;28493:10;28488:3;28484:20;28481:1;28474:31;28524:4;28521:1;28514:15;28548:4;28545:1;28538:15

Swarm Source

ipfs://36219ab918a429fdce341f2929073e190befbb7c069166e8b963bcc654c35c76

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ 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.