Amoy Testnet

Contract

0x935305eBD48264E72067c242231b9c1638f8722c

Overview

POL Balance

Polygon PoS Chain Amoy LogoPolygon PoS Chain Amoy LogoPolygon PoS Chain Amoy Logo0 POL

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Register Identit...119265732024-09-13 15:37:039 mins ago1726241823IN
0x935305eB...638f8722c
0 POL0.0097321431.00000001
Register Identit...119265672024-09-13 15:36:5110 mins ago1726241811IN
0x935305eB...638f8722c
0 POL0.0091903531.00000001
Register Identit...119265662024-09-13 15:36:4910 mins ago1726241809IN
0x935305eB...638f8722c
0 POL0.0097321431.00000001
Register Identit...119265632024-09-13 15:36:4310 mins ago1726241803IN
0x935305eB...638f8722c
0 POL0.0091897331.00000001
Register Identit...119262682024-09-13 15:26:1520 mins ago1726241175IN
0x935305eB...638f8722c
0 POL0.0097321431.00000001
Register Identit...119262682024-09-13 15:26:1520 mins ago1726241175IN
0x935305eB...638f8722c
0 POL0.0097321431.00000001
Register Identit...119259652024-09-13 15:15:3131 mins ago1726240531IN
0x935305eB...638f8722c
0 POL0.0097327631.00000001
Register Identit...119259652024-09-13 15:15:3131 mins ago1726240531IN
0x935305eB...638f8722c
0 POL0.0091893631.00000001
Register Identit...119259652024-09-13 15:15:3131 mins ago1726240531IN
0x935305eB...638f8722c
0 POL0.0097321431.00000001
Register Identit...119259602024-09-13 15:15:2131 mins ago1726240521IN
0x935305eB...638f8722c
0 POL0.0091893631.00000001
Register Identit...119256652024-09-13 15:04:5542 mins ago1726239895IN
0x935305eB...638f8722c
0 POL0.0097327631.00000001
Register Identit...119256602024-09-13 15:04:4342 mins ago1726239883IN
0x935305eB...638f8722c
0 POL0.0091903531.00000001
Register Identit...119256602024-09-13 15:04:4342 mins ago1726239883IN
0x935305eB...638f8722c
0 POL0.0097327631.00000001
Register Identit...119256552024-09-13 15:04:3342 mins ago1726239873IN
0x935305eB...638f8722c
0 POL0.0091903531.00000001
Register Identit...119253612024-09-13 14:54:0952 mins ago1726239249IN
0x935305eB...638f8722c
0 POL0.0091903531.00000001
Register Identit...119253612024-09-13 14:54:0952 mins ago1726239249IN
0x935305eB...638f8722c
0 POL0.0097327631.00000001
Register Identit...119253602024-09-13 14:54:0752 mins ago1726239247IN
0x935305eB...638f8722c
0 POL0.0097321431.00000001
Register Identit...119253522024-09-13 14:53:4953 mins ago1726239229IN
0x935305eB...638f8722c
0 POL0.0091897331.00000001
Register Identit...119250572024-09-13 14:43:231 hr ago1726238603IN
0x935305eB...638f8722c
0 POL0.0097327631.00000001
Register Identit...119250572024-09-13 14:43:231 hr ago1726238603IN
0x935305eB...638f8722c
0 POL0.0091899831.00000001
Register Identit...119250572024-09-13 14:43:231 hr ago1726238603IN
0x935305eB...638f8722c
0 POL0.0097327631.00000001
Register Identit...119250522024-09-13 14:43:111 hr ago1726238591IN
0x935305eB...638f8722c
0 POL0.0091897331.00000001
Register Identit...119247582024-09-13 14:32:471 hr ago1726237967IN
0x935305eB...638f8722c
0 POL0.0130443744.00000003
Register Identit...119247582024-09-13 14:32:471 hr ago1726237967IN
0x935305eB...638f8722c
0 POL0.0138137144.00000003
Register Identit...119247562024-09-13 14:32:431 hr ago1726237963IN
0x935305eB...638f8722c
0 POL0.0097327631.00000001
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
119265732024-09-13 15:37:039 mins ago1726241823
0x935305eB...638f8722c
 Contract Creation0 POL
119265672024-09-13 15:36:5110 mins ago1726241811
0x935305eB...638f8722c
 Contract Creation0 POL
119265662024-09-13 15:36:4910 mins ago1726241809
0x935305eB...638f8722c
 Contract Creation0 POL
119265632024-09-13 15:36:4310 mins ago1726241803
0x935305eB...638f8722c
 Contract Creation0 POL
119262682024-09-13 15:26:1520 mins ago1726241175
0x935305eB...638f8722c
 Contract Creation0 POL
119262682024-09-13 15:26:1520 mins ago1726241175
0x935305eB...638f8722c
 Contract Creation0 POL
119259652024-09-13 15:15:3131 mins ago1726240531
0x935305eB...638f8722c
 Contract Creation0 POL
119259652024-09-13 15:15:3131 mins ago1726240531
0x935305eB...638f8722c
 Contract Creation0 POL
119259652024-09-13 15:15:3131 mins ago1726240531
0x935305eB...638f8722c
 Contract Creation0 POL
119259602024-09-13 15:15:2131 mins ago1726240521
0x935305eB...638f8722c
 Contract Creation0 POL
119256652024-09-13 15:04:5542 mins ago1726239895
0x935305eB...638f8722c
 Contract Creation0 POL
119256602024-09-13 15:04:4342 mins ago1726239883
0x935305eB...638f8722c
 Contract Creation0 POL
119256602024-09-13 15:04:4342 mins ago1726239883
0x935305eB...638f8722c
 Contract Creation0 POL
119256552024-09-13 15:04:3342 mins ago1726239873
0x935305eB...638f8722c
 Contract Creation0 POL
119253612024-09-13 14:54:0952 mins ago1726239249
0x935305eB...638f8722c
 Contract Creation0 POL
119253612024-09-13 14:54:0952 mins ago1726239249
0x935305eB...638f8722c
 Contract Creation0 POL
119253602024-09-13 14:54:0752 mins ago1726239247
0x935305eB...638f8722c
 Contract Creation0 POL
119253522024-09-13 14:53:4953 mins ago1726239229
0x935305eB...638f8722c
 Contract Creation0 POL
119250572024-09-13 14:43:231 hr ago1726238603
0x935305eB...638f8722c
 Contract Creation0 POL
119250572024-09-13 14:43:231 hr ago1726238603
0x935305eB...638f8722c
 Contract Creation0 POL
119250572024-09-13 14:43:231 hr ago1726238603
0x935305eB...638f8722c
 Contract Creation0 POL
119250522024-09-13 14:43:111 hr ago1726238591
0x935305eB...638f8722c
 Contract Creation0 POL
119247582024-09-13 14:32:471 hr ago1726237967
0x935305eB...638f8722c
 Contract Creation0 POL
119247582024-09-13 14:32:471 hr ago1726237967
0x935305eB...638f8722c
 Contract Creation0 POL
119247562024-09-13 14:32:431 hr ago1726237963
0x935305eB...638f8722c
 Contract Creation0 POL
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:
london EvmVersion, GNU GPLv3 license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : Registry.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.9;

import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import { IERC20Token } from "./interfaces/IERC20Token.sol";
import { IHermesContract } from "./interfaces/IHermesContract.sol";
import { FundsRecovery } from "./FundsRecovery.sol";
import { Utils } from "./Utils.sol";

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);
    }
}

File 2 of 9 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and 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;
    }
}

File 3 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 9 : 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));
    }
}

File 5 of 9 : FundsRecovery.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.9;

import { IERC20Token } from "./interfaces/IERC20Token.sol";
import { Ownable } from "./Ownable.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol";

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);
    }
}

File 6 of 9 : Ownable.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.9;

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;
    }
}

File 7 of 9 : Utils.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.9;

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;
    }
}

File 8 of 9 : IERC20Token.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.4;

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

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

File 9 of 9 : IHermesContract.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.6;

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);
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "london",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

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

500:16475:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1986:49;;-1:-1:-1;;;1986:49:5;;216:2:9;1986:49:5;;;198:21:9;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:9;;;338:37;392:19;;1986:49:5;;;;;;;;500:16475;;;;4974:692;;;;;;;;;;-1:-1:-1;4974:692:5;;;;;:::i;:::-;;:::i;:::-;;16450:245;;;;;;;;;;-1:-1:-1;16450:245:5;;;;;:::i;:::-;;:::i;:::-;;;2972:14:9;;2965:22;2947:41;;2935:2;2920:18;16450:245:5;;;;;;;;551:254:3;;;;;;;;;;-1:-1:-1;551:254:3;;;;;:::i;:::-;;:::i;3180:104:5:-;;;;;;;;;;-1:-1:-1;3257:5:5;;-1:-1:-1;;;;;3257:5:5;3249:28;;3180:104;;13486:150;;;;;;;;;;-1:-1:-1;13486:150:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3608:32:9;;;3590:51;;3578:2;3563:18;13486:150:5;3444:203:9;5757:342:5;;;;;;;;;;-1:-1:-1;5757:342:5;;;;;:::i;:::-;;:::i;9551:275::-;;;;;;;;;;-1:-1:-1;9551:275:5;;;;;:::i;:::-;;:::i;11742:213::-;;;;;;;;;;-1:-1:-1;11742:213:5;;;;;:::i;:::-;;:::i;578:24::-;;;;;;;;;;;;;;;;;;;4370:25:9;;;4358:2;4343:18;578:24:5;4224:177:9;14473:104:5;;;;;;;;;;;;;:::i;692:33::-;;;;;;;;;;;;;;;;608:26;;;;;;;;;;-1:-1:-1;608:26:5;;;;-1:-1:-1;;;;;608:26:5;;;1100:157:3;;;;;;;;;;;;;:::i;13338:142:5:-;;;;;;;;;;;;;:::i;13942:465::-;;;;;;;;;;-1:-1:-1;13942:465:5;;;;;:::i;:::-;;:::i;13788:148::-;;;;;;;;;;-1:-1:-1;13788:148:5;;;;;:::i;:::-;;:::i;202:77:4:-;;;;;;;;;;-1:-1:-1;240:7:4;266:6;-1:-1:-1;;;;;266:6:4;202:77;;13642:140:5;;;;;;;;;;;;;:::i;10849:537::-;;;;;;;;;;-1:-1:-1;10849:537:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9296:249::-;;;;;;;;;;-1:-1:-1;9296:249:5;;;;;:::i;:::-;;:::i;9961:551::-;;;;;;;;;;-1:-1:-1;9961:551:5;;;;;:::i;:::-;;:::i;9832:123::-;;;;;;;;;;-1:-1:-1;9832:123:5;;;;;:::i;:::-;;:::i;15090:292::-;;;;;;;;;;-1:-1:-1;15090:292:5;;;;;:::i;:::-;;:::i;12959:::-;;;;;;;;;;-1:-1:-1;12959:292:5;;;;;:::i;:::-;;:::i;731:30::-;;;;;;;;;;-1:-1:-1;731:30:5;;;;-1:-1:-1;;;;;731:30:5;;;15388:648;;;;;;;;;;-1:-1:-1;15388:648:5;;;;;:::i;:::-;;:::i;3596:1286::-;;;;;;;;;;-1:-1:-1;3596:1286:5;;;;;:::i;:::-;;:::i;11961:992::-;;;;;;;;;;-1:-1:-1;11961:992:5;;;;;:::i;:::-;;:::i;14967:117::-;;;;;;;;;;-1:-1:-1;15048:14:5;;-1:-1:-1;;;;;15048:14:5;15040:37;;14967:117;;7256:1492;;;;;;;;;;-1:-1:-1;7256:1492:5;;;;;:::i;:::-;;:::i;1331:334:3:-;;;;;;;;;;-1:-1:-1;1331:334:3;;;;;:::i;:::-;;:::i;9089:201:5:-;;;;;;;;;;-1:-1:-1;9089:201:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16701:272::-;;;;;;;;;;-1:-1:-1;16701:272:5;;;;;:::i;:::-;;:::i;8754:329::-;;;;;;;;;;-1:-1:-1;8754:329:5;;;;;:::i;:::-;;:::i;431:240:4:-;;;;;;;;;;-1:-1:-1;431:240:4;;;;;:::i;:::-;;:::i;869:101:3:-;;;;;;;;;;-1:-1:-1;947:16:3;;-1:-1:-1;;;;;947:16:3;869:101;;354:24;;;;;;;;;;-1:-1:-1;354:24:3;;;;-1:-1:-1;;;;;354:24:3;;;2341:833:5;;;;;;;;;;-1:-1:-1;2341:833:5;;;;;:::i;:::-;;:::i;4974:692::-;5096:25;5111:9;5096:14;:25::i;:::-;5088:81;;;;-1:-1:-1;;;5088:81:5;;;;;;;:::i;:::-;5225:17;5245:103;5337:10;204:9:6;5255:72:5;;;;;;10795:19:9;;;;-1:-1:-1;;;;;;5294:4:5;10902:2:9;10898:15;;;10894:24;;10880:12;;;10873:46;;;;10953:15;;;;10949:24;10935:12;;;10928:46;10990:12;;;10983:28;;;11027:13;;5255:72:5;;;;;;;;;;;;;5245:83;;;;;;:91;;:103;;;;:::i;:::-;5225:123;-1:-1:-1;;;;;;5366:23:5;;5358:78;;;;-1:-1:-1;;;5358:78:5;;11253:2:9;5358:78:5;;;11235:21:9;11292:2;11272:18;;;11265:30;11331:34;11311:18;;;11304:62;-1:-1:-1;;;11382:18:9;;;11375:40;11432:19;;5358:78:5;11051:406:9;5358:78:5;5473:5;;-1:-1:-1;;;;;5473:5:5;:15;5489:39;5507:9;5518;5489:17;:39::i;:::-;5473:56;;-1:-1:-1;;;;;;5473:56:5;;;;;;;-1:-1:-1;;;;;3608:32:9;;;5473:56:5;;;3590:51:9;3563:18;;5473:56:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5455:14;:74;;5447:139;;;;-1:-1:-1;;;5447:139:5;;;;;;;:::i;:::-;5597:62;5610:9;5621;5640:1;5644:14;5597:12;:62::i;:::-;;5078:588;4974:692;;;:::o;16450:245::-;16534:4;16557:56;16573:39;16591:9;16602;16573:17;:39::i;:::-;14808:18;14853:16;;;14664:212;16557:56;:131;;;-1:-1:-1;16633:14:5;;:54;;-1:-1:-1;;;16633:54:5;;-1:-1:-1;;;;;12302:15:9;;;16633:54:5;;;12284:34:9;12354:15;;;12334:18;;;12327:43;16617:71:5;;16633:14;;:32;;12219:18:9;;16633:54:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16617:71::-;16550:138;16450:245;-1:-1:-1;;;16450:245:5:o;551:254:3:-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;656:29:3;::::1;648:38;;;::::0;::::1;;720:16;::::0;701:53:::1;::::0;-1:-1:-1;;;;;701:53:3;;::::1;::::0;720:16:::1;::::0;701:53:::1;::::0;720:16:::1;::::0;701:53:::1;764:16;:34:::0;;-1:-1:-1;;;;;;764:34:3::1;-1:-1:-1::0;;;;;764:34:3;;;::::1;::::0;;;::::1;::::0;;551:254::o;13486:150:5:-;13559:7;13585:15;13601:8;13585:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;-1:-1:-1;;;;;13585:44:5;;13486:150;-1:-1:-1;;13486:150:5:o;5757:342::-;5849:25;5864:9;5849:14;:25::i;:::-;5841:81;;;;-1:-1:-1;;;5841:81:5;;;;;;;:::i;:::-;5941:37;5957:9;5968;5941:15;:37::i;:::-;5940:38;5932:100;;;;-1:-1:-1;;;5932:100:5;;13332:2:9;5932:100:5;;;13314:21:9;13371:2;13351:18;;;13344:30;13410:34;13390:18;;;13383:62;-1:-1:-1;;;13461:18:9;;;13454:47;13518:19;;5932:100:5;13130:413:9;5932:100:5;6043:49;6056:9;6067;6086:1;6090;6043:12;:49::i;:::-;;5757:342;;:::o;9551:275::-;9641:7;9660:13;9686:47;9699:33;9723:8;9699:23;:33::i;9686:47::-;9676:58;;;;;;;;-1:-1:-1;9751:68:5;-1:-1:-1;;;;;9777:33:5;;9676:58;9751:17;:68::i;:::-;9744:75;9551:275;-1:-1:-1;;;;9551:275:5:o;11742:213::-;11806:7;11829:19;15048:14;;-1:-1:-1;;;;;15048:14:5;15040:37;;;14967:117;11829:19;11825:84;;;11869:14;;:40;;-1:-1:-1;;;11869:40:5;;-1:-1:-1;;;;;3608:32:9;;;11869:40:5;;;3590:51:9;11869:14:5;;;;:29;;3563:18:9;;11869:40:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11862:47;11742:213;-1:-1:-1;;11742:213:5:o;11825:84::-;-1:-1:-1;;;;;;11927:21:5;;;;;;;:10;:21;;;;;;;;11742:213::o;14473:104::-;14546:15;:22;14520:7;;14546:24;;14569:1;;14546:24;:::i;:::-;14539:31;;14473:104;:::o;1100:157:3:-;1680:1:0;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:0;;14012:2:9;2251:63:0;;;13994:21:9;14051:2;14031:18;;;14024:30;14090:33;14070:18;;;14063:61;14141:18;;2251:63:0;13810:355:9;2251:63:0;1680:1;2389:7;:18;;;1161:16:3;-1:-1:-1;;;;;1161:16:3::1;1153:39;;;::::0;::::1;;1202:16;::::0;:48:::1;::::0;-1:-1:-1;;;;;1202:16:3;;::::1;::::0;1228:21:::1;1202:48:::0;::::1;;;::::0;:16:::1;:48:::0;:16;:48;1228:21;1202:16;:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;1637:1:0;2562:22;;1100:157:3:o;13338:142:5:-;13395:7;13421:15;13437:16;:14;:16::i;:::-;13421:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:52;-1:-1:-1;;;;;13421:52:5;;13338:142;-1:-1:-1;13338:142:5:o;13942:465::-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;3257:5:5;;-1:-1:-1;;;;;3257:5:5;14060:91:::1;;;::::0;-1:-1:-1;;;14060:91:5;;14372:2:9;14060:91:5::1;::::0;::::1;14354:21:9::0;14411:2;14391:18;;;14384:30;14450:34;14430:18;;;14423:62;14521:33;14501:18;;;14494:61;14572:19;;14060:91:5::1;14170:427:9::0;14060:91:5::1;14808:18:::0;;14853:16;;14169:81:::1;;;;-1:-1:-1::0;14808:18:5;;14853:16;;14212:38:::1;14161:146;;;::::0;-1:-1:-1;;;14161:146:5;;14804:2:9;14161:146:5::1;::::0;::::1;14786:21:9::0;14843:2;14823:18;;;14816:30;14882:34;14862:18;;;14855:62;-1:-1:-1;;;14933:18:9;;;14926:50;14993:19;;14161:146:5::1;14602:416:9::0;14161:146:5::1;14338:61;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;14338:61:5;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;14317:15:::1;:83:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;14317:83:5;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;14317:83:5;;::::1;;::::0;;;;;;;;;;;;;::::1;::::0;::::1;;::::0;;13942:465::o;13788:148::-;13860:7;13886:15;13902:8;13886:25;;;;;;;;:::i;:::-;;;;;;;;;:43;:25;;;;;:43;;-1:-1:-1;;;;;13886:43:5;;13788:148;-1:-1:-1;;13788:148:5:o;13642:140::-;13698:7;13724:15;13740:16;:14;:16::i;:::-;13724:33;;;;;;;;:::i;:::-;;;;;;;;;:51;:33;;;;;:51;;-1:-1:-1;;;;;13724:51:5;;13642:140;-1:-1:-1;13642:140:5:o;10849:537::-;10917:12;11066:18;:136;;;;;;;;;;;;;;;;;;-1:-1:-1;11236:24:5;;;;11213:20;11270:87;11292:2;11288:1;:6;;;11270:87;;;11331:12;11344:1;11331:15;;;;;;;;;:::i;:::-;;;;11315:5;11321:6;11326:1;11321:2;:6;:::i;:::-;11315:13;;;;;;;;;;:::i;:::-;;;;:31;-1:-1:-1;;;;;11315:31:5;;;;;;;;-1:-1:-1;11296:3:5;;;;:::i;:::-;;;;11270:87;;;-1:-1:-1;11374:5:5;;10849:537;-1:-1:-1;;;10849:537:5:o;9296:249::-;9368:7;9387:13;9413:39;9426:25;:23;:25::i;9413:39::-;9403:50;;;;;;;;-1:-1:-1;9470:68:5;-1:-1:-1;;;;;9496:33:5;;9403:50;9470:17;:68::i;9961:551::-;10074:25;10089:9;10074:14;:25::i;:::-;10066:80;;;;-1:-1:-1;;;10066:80:5;;15614:2:9;10066:80:5;;;15596:21:9;15653:2;15633:18;;;15626:30;15692:34;15672:18;;;15665:62;-1:-1:-1;;;15743:18:9;;;15736:40;15793:19;;10066:80:5;15412:406:9;10066:80:5;10202:17;10222:92;10303:10;10257:4;10264:9;10275:4;10281:9;;:11;;;;;;;;;:::i;:::-;;;;;10232:61;;;;;;;;;;;:::i;10222:92::-;-1:-1:-1;;;;;10345:19:5;;;;;;;:8;:19;;;;;:28;10202:112;;-1:-1:-1;10332:41:5;;;10345:28;;10332:41;10324:69;;;;-1:-1:-1;;;10324:69:5;;16754:2:9;10324:69:5;;;16736:21:9;16793:2;16773:18;;;16766:30;-1:-1:-1;;;16812:18:9;;;16805:45;16867:18;;10324:69:5;16552:339:9;10324:69:5;-1:-1:-1;;;;;10426:19:5;;;;;;:8;:19;;;;;;;;:30;;;;:23;;;;;:30;;;;:::i;:::-;;10489:9;-1:-1:-1;;;;;10472:33:5;;10500:4;10472:33;;;;;;:::i;:::-;;;;;;;;10056:456;9961:551;;;:::o;9832:123::-;-1:-1:-1;;;;;9925:19:5;;;;;;:8;:19;;;;;:23;;9918:30;;9894:12;;9925:23;9918:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9832:123;;;:::o;15090:292::-;15152:4;15172:19;15048:14;;-1:-1:-1;;;;;15048:14:5;15040:37;;;14967:117;15172:19;15168:82;;;15212:14;;:38;;-1:-1:-1;;;15212:38:5;;-1:-1:-1;;;;;3608:32:9;;;15212:38:5;;;3590:51:9;15212:14:5;;;;:27;;3563:18:9;;15212:38:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15168:82::-;-1:-1:-1;;;;;;15340:21:5;;;15373:1;15340:21;;;:10;:21;;;;;;;:35;;;15090:292::o;12959:::-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;3257:5:5;;-1:-1:-1;;;;;3257:5:5;13043:96:::1;;;::::0;-1:-1:-1;;;13043:96:5;;17765:2:9;13043:96:5::1;::::0;::::1;17747:21:9::0;17804:2;17784:18;;;17777:30;;;17843:34;17823:18;;;17816:62;17914:34;17894:18;;;17887:62;-1:-1:-1;;;17965:19:9;;;17958:35;18010:19;;13043:96:5::1;17563:472:9::0;13043:96:5::1;13149:18;:37:::0;;;13201:43:::1;::::0;4370:25:9;;;13201:43:5::1;::::0;4358:2:9;4343:18;13201:43:5::1;;;;;;;12959:292:::0;:::o;15388:648::-;-1:-1:-1;;;;;15692:19:5;;;15446:4;15692:19;;;:8;:19;;;;;:28;;;15749:27;;;;15446:4;;15692:28;;15446:4;15802:43;15692:28;15749:27;15802:16;:43::i;:::-;15786:59;;15868:9;-1:-1:-1;;;;;15859:18:5;:5;-1:-1:-1;;;;;15859:18:5;;15855:48;;-1:-1:-1;15898:5:5;;15388:648;-1:-1:-1;;;;15388:648:5:o;15855:48::-;14808:18;;14853:16;;15969:60;;;-1:-1:-1;15995:14:5;;:34;;-1:-1:-1;;;15995:34:5;;-1:-1:-1;;;;;3608:32:9;;;15995:34:5;;;3590:51:9;15995:14:5;;;;:23;;3563:18:9;;15995:34:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15962:67;15388:648;-1:-1:-1;;;;;15388:648:5:o;3596:1286::-;3759:25;3774:9;3759:14;:25::i;:::-;3751:81;;;;-1:-1:-1;;;3751:81:5;;;;;;;:::i;:::-;3888:17;3908:131;4028:10;204:9:6;3918:100:5;;;;;;18309:19:9;;;;-1:-1:-1;;;;;;3957:4:5;18416:2:9;18412:15;;;18408:24;;18394:12;;;18387:46;;;;18467:15;;;18463:24;;18449:12;;;18442:46;18504:12;;;18497:28;;;18541:13;;;18534:29;;;18598:15;;;;18594:24;18579:13;;;18572:47;18635:13;;3918:100:5;18040:614:9;3908:131:5;3888:151;-1:-1:-1;;;;;;4057:23:5;;4049:70;;;;-1:-1:-1;;;4049:70:5;;18861:2:9;4049:70:5;;;18843:21:9;18900:2;18880:18;;;18873:30;18939:34;18919:18;;;18912:62;-1:-1:-1;;;18990:18:9;;;18983:32;19032:19;;4049:70:5;18659:398:9;4049:70:5;4212:17;4232:29;4247:14;4232:12;:29;:::i;:::-;4292:5;;4212:49;;-1:-1:-1;;;;;;4292:5:5;:15;4308:39;4326:9;4337;4308:17;:39::i;:::-;4292:56;;-1:-1:-1;;;;;;4292:56:5;;;;;;;-1:-1:-1;;;;;3608:32:9;;;4292:56:5;;;3590:51:9;3563:18;;4292:56:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4279:9;:69;;4271:134;;;;-1:-1:-1;;;4271:134:5;;;;;;;:::i;:::-;4449:59;4462:9;4473;4484:12;4498:9;4449:12;:59::i;:::-;-1:-1:-1;4628:16:5;;4624:110;;4660:63;;-1:-1:-1;;;4660:63:5;;-1:-1:-1;;;;;19387:32:9;;;4660:63:5;;;19369:51:9;19436:18;;;19429:34;;;4660:38:5;;;;;19342:18:9;;4660:63:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4624:110;4789:18;;4785:91;;4823:5;;:42;;-1:-1:-1;;;4823:42:5;;4838:10;4823:42;;;19369:51:9;19436:18;;;19429:34;;;-1:-1:-1;;;;;4823:5:5;;;;:14;;19342:18:9;;4823:42:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4785:91;3741:1141;;3596:1286;;;;;:::o;11961:992::-;-1:-1:-1;;;;;12079:29:5;;12071:85;;;;-1:-1:-1;;;12071:85:5;;19676:2:9;12071:85:5;;;19658:21:9;19715:2;19695:18;;;19688:30;19754:34;19734:18;;;19727:62;-1:-1:-1;;;19805:18:9;;;19798:41;19856:19;;12071:85:5;19474:407:9;12071:85:5;15048:14;;-1:-1:-1;;;;;15048:14:5;15040:37;12220:727;;12259:14;;:69;;-1:-1:-1;;;12259:69:5;;-1:-1:-1;;;;;12259:14:5;;;;:29;;:69;;12289:9;;12300:15;;12317:10;;12259:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12220:727;12371:9;;:13;;12383:1;12371:13;:::i;:::-;12359:9;:25;12492:21;12516:19;15048:14;;-1:-1:-1;;;;;15048:14:5;15040:37;;;14967:117;12516:19;:61;;12572:4;12516:61;;;12546:14;;-1:-1:-1;;;;;12546:14:5;12516:61;12492:85;-1:-1:-1;12591:15:5;12609:115;12713:10;204:9:6;12693::5;;12619:84;;;;;;20547:19:9;;;;-1:-1:-1;;;;;;20654:2:9;20650:15;;;20646:24;;20632:12;;;20625:46;;;;20705:15;;;20701:24;;20687:12;;;20680:46;20760:15;;;;20756:24;20742:12;;;20735:46;20797:12;;;20790:28;20834:13;;12619:84:5;20306:547:9;12609:115:5;12591:133;;12757:9;-1:-1:-1;;;;;12746:20:5;:7;-1:-1:-1;;;;;12746:20:5;;12738:78;;;;-1:-1:-1;;;12738:78:5;;21060:2:9;12738:78:5;;;21042:21:9;21099:2;21079:18;;;21072:30;21138:34;21118:18;;;21111:62;-1:-1:-1;;;21189:18:9;;;21182:43;21242:19;;12738:78:5;20858:409:9;12738:78:5;-1:-1:-1;;;;;12831:21:5;;;;;;;:10;:21;;;;;;;;;:39;;-1:-1:-1;;;;;;12831:39:5;;;;;;;;;12890:46;;3590:51:9;;;12831:21:5;;12890:46;;3563:18:9;12890:46:5;;;;;;;12345:602;;11961:992;;;:::o;7256:1492::-;3257:5;;-1:-1:-1;;;;;3257:5:5;7434:85;;;;-1:-1:-1;;;7434:85:5;;21474:2:9;7434:85:5;;;21456:21:9;21513:2;21493:18;;;21486:30;21552:34;21532:18;;;21525:62;21623:27;21603:18;;;21596:55;21668:19;;7434:85:5;21272:421:9;7434:85:5;-1:-1:-1;;;;;7537:29:5;;7529:89;;;;-1:-1:-1;;;7529:89:5;;21900:2:9;7529:89:5;;;21882:21:9;21939:2;21919:18;;;21912:30;21978:34;21958:18;;;21951:62;-1:-1:-1;;;22029:18:9;;;22022:45;22084:19;;7529:89:5;21698:411:9;7529:89:5;7652:18;;7636:12;:34;;7628:107;;;;-1:-1:-1;;;7628:107:5;;22316:2:9;7628:107:5;;;22298:21:9;22355:2;22335:18;;;22328:30;22394:34;22374:18;;;22367:62;22465:30;22445:18;;;22438:58;22513:19;;7628:107:5;22114:424:9;7628:107:5;7746:17;7766:33;7783:15;7766:16;:33::i;:::-;7746:53;;7818:19;7827:9;7818:8;:19::i;:::-;7817:20;7809:68;;;;-1:-1:-1;;;7809:68:5;;22745:2:9;7809:68:5;;;22727:21:9;22784:2;22764:18;;;22757:30;22823:34;22803:18;;;22796:62;-1:-1:-1;;;22874:18:9;;;22867:33;22917:19;;7809:68:5;22543:399:9;7809:68:5;7971:23;8013:91;8045:15;-1:-1:-1;;;;;8029:33:5;8064:39;8077:25;:23;:25::i;8064:39::-;8013:15;:91::i;:::-;8169:5;;:62;;-1:-1:-1;;;8169:62:5;;8188:10;8169:62;;;23187:34:9;-1:-1:-1;;;;;23257:15:9;;;23237:18;;;23230:43;23289:18;;;23282:34;;;7971:134:5;;-1:-1:-1;8169:5:5;;;:18;;23122::9;;8169:62:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8298:5:5;;8371:3;;8271:104;;-1:-1:-1;;;8271:104:5;;-1:-1:-1;;;;;8298:5:5;;;8271:104;;;23666:34:9;23736:15;;;23716:18;;;23709:43;23800:6;23788:19;;23768:18;;;23761:47;23824:18;;;23817:34;;;23867:19;;;23860:35;;;8371:3:5;;;23911:19:9;;;23904:44;8271:18:5;;;;;;23600:19:9;;8271:104:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8456:65;;;;;;;;8463:15;-1:-1:-1;;;;;8456:65:5;;;;;8480:16;:14;:16::i;:::-;8456:65;;8498:16;8456:65;;;;-1:-1:-1;;;;;8456:65:5;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8434:19:5;;;-1:-1:-1;8434:19:5;;;:8;:19;;;;;:87;;;;-1:-1:-1;;;;;;8434:87:5;;;;;;;;;;;;;-1:-1:-1;8434:87:5;;;;;;;;;;;;-1:-1:-1;;;;;;8434:87:5;8456:65;8434:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;8632:5:5;;:43;;-1:-1:-1;;;8632:43:5;;-1:-1:-1;;;;;19387:32:9;;;8632:43:5;;;19369:51:9;-1:-1:-1;;19436:18:9;;;19429:34;8632:5:5;;;;-1:-1:-1;8632:13:5;;19342:18:9;;8632:43:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8708:9;-1:-1:-1;;;;;8691:50:5;;8719:15;8736:4;8691:50;;;;;;;:::i;:::-;;;;;;;;7424:1324;;7256:1492;;;;;;:::o;1331:334:3:-;1680:1:0;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:0;;14012:2:9;2251:63:0;;;13994:21:9;14051:2;14031:18;;;14024:30;14090:33;14070:18;;;14063:61;14141:18;;2251:63:0;13810:355:9;2251:63:0;1680:1;2389:7;:18;;;1406:16:3;-1:-1:-1;;;;;1406:16:3::1;1398:39;;;::::0;::::1;;1473:5;::::0;-1:-1:-1;;;;;1455:24:3;;::::1;1473:5:::0;::::1;1455:24;;1447:74;;;::::0;-1:-1:-1;;;1447:74:3;;24480:2:9;1447:74:3::1;::::0;::::1;24462:21:9::0;24519:2;24499:18;;;24492:30;24558:34;24538:18;;;24531:62;-1:-1:-1;;;24609:18:9;;;24602:35;24654:19;;1447:74:3::1;24278:401:9::0;1447:74:3::1;1549:44;::::0;-1:-1:-1;;;1549:44:3;;1587:4:::1;1549:44;::::0;::::1;3590:51:9::0;1531:15:3::1;::::0;-1:-1:-1;;;;;1549:29:3;::::1;::::0;::::1;::::0;3563:18:9;;1549:44:3::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1632:16;::::0;1603:55:::1;::::0;-1:-1:-1;;;1603:55:3;;-1:-1:-1;;;;;1632:16:3;;::::1;1603:55;::::0;::::1;19369:51:9::0;19436:18;;;19429:34;;;1531:62:3;;-1:-1:-1;1603:28:3;::::1;::::0;::::1;::::0;19342:18:9;;1603:55:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;1637:1:0;2562:22;;-1:-1:-1;1331:334:3:o;9089:201:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9180:19:5;9189:9;9180:8;:19::i;:::-;:43;;;-1:-1:-1;15048:14:5;;-1:-1:-1;;;;;15048:14:5;15040:37;9180:43;:103;;9248:14;;:35;;-1:-1:-1;;;9248:35:5;;-1:-1:-1;;;;;3608:32:9;;;9248:35:5;;;3590:51:9;9248:14:5;;;;:24;;3563:18:9;;9248:35:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9248:35:5;;;;;;;;;;;;:::i;:::-;9180:103;;;-1:-1:-1;;;;;9226:19:5;;;;;;;:8;:19;;;;;;;;;9180:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9180:103:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9173:110;9089:201;-1:-1:-1;;9089:201:5:o;16701:272::-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;16805:5:5::1;::::0;:30:::1;::::0;-1:-1:-1;;;16805:30:5;;16829:4:::1;16805:30;::::0;::::1;3590:51:9::0;16781:21:5::1;::::0;-1:-1:-1;;;;;16805:5:5::1;::::0;:15:::1;::::0;3563:18:9;;16805:30:5::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16781:54;;16869:1;16853:13;:17;16845:68;;;::::0;-1:-1:-1;;;16845:68:5;;26440:2:9;16845:68:5::1;::::0;::::1;26422:21:9::0;26479:2;26459:18;;;26452:30;26518:34;26498:18;;;26491:62;-1:-1:-1;;;26569:18:9;;;26562:36;26615:19;;16845:68:5::1;26238:402:9::0;16845:68:5::1;16923:5;::::0;:43:::1;::::0;-1:-1:-1;;;16923:43:5;;-1:-1:-1;;;;;19387:32:9;;;16923:43:5::1;::::0;::::1;19369:51:9::0;19436:18;;;19429:34;;;16923:5:5;;::::1;::::0;:14:::1;::::0;19342:18:9;;16923:43:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8754:329::-:0;-1:-1:-1;;;;;8923:19:5;;8840:7;8923:19;;;:8;:19;;;;;:27;;;8840:7;;8885:67;;8898:53;;:24;:53::i;8885:67::-;8875:78;;;;;;8859:94;;8963:13;9006:9;9017;8989:38;;;;;;;;26872:2:9;26868:15;;;-1:-1:-1;;;;;;26864:24:9;;;26852:37;;26923:15;;;;26919:24;26914:2;26905:12;;26898:46;26969:2;26960:12;;26645:333;8989:38:5;;;;;;;;;;;;;8979:49;;;;;;8963:65;;9045:31;9063:5;9070;9045:17;:31::i;431:240:4:-;324:6;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;519:22:4;::::1;511:73;;;::::0;-1:-1:-1;;;511:73:4;;27185:2:9;511:73:4::1;::::0;::::1;27167:21:9::0;27224:2;27204:18;;;27197:30;27263:34;27243:18;;;27236:62;-1:-1:-1;;;27314:18:9;;;27307:36;27360:19;;511:73:4::1;26983:402:9::0;511:73:4::1;620:6;::::0;;599:38:::1;::::0;-1:-1:-1;;;;;599:38:4;;::::1;::::0;620:6;::::1;::::0;599:38:::1;::::0;::::1;647:6;:17:::0;;-1:-1:-1;;;;;;647:17:4::1;-1:-1:-1::0;;;;;647:17:4;;;::::1;::::0;;;::::1;::::0;;431:240::o;2341:833:5:-;324:6:4;;-1:-1:-1;;;;;324:6:4;334:10;324:20;;:46;;-1:-1:-1;366:3:4;348:6;-1:-1:-1;;;;;348:6:4;:22;324:46;316:91;;;;-1:-1:-1;;;316:91:4;;;;;;;:::i;:::-;3257:5:5;;-1:-1:-1;;;;;3257:5:5;3249:28;2565:61:::1;;;::::0;-1:-1:-1;;;2565:61:5;;27592:2:9;2565:61:5::1;::::0;::::1;27574:21:9::0;;;27611:18;;;27604:30;27670:34;27650:18;;;27643:62;27722:18;;2565:61:5::1;27390:356:9::0;2565:61:5::1;2637:18;:40:::0;;;-1:-1:-1;;;;;2696:27:5;::::1;2688:36;;;::::0;::::1;;2734:5;:34:::0;;-1:-1:-1;;;;;;2734:34:5::1;-1:-1:-1::0;;;;;2734:34:5;;::::1;::::0;;;::::1;::::0;;;2787:25;::::1;2779:34;;;::::0;::::1;;2823:3;:17:::0;;-1:-1:-1;;;;;;2823:17:5::1;-1:-1:-1::0;;;;;2823:17:5;::::1;;::::0;;2898:65:::1;2917:22:::0;2941:21;2898:18:::1;:65::i;:::-;3017:29;3035:10;3017:17;:29::i;:::-;3125:14;:42:::0;;-1:-1:-1;;;;;;3125:42:5::1;-1:-1:-1::0;;;;;3125:42:5;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;2341:833:5:o;16042:402::-;16108:4;16238:19;16247:9;16238:8;:19::i;:::-;16230:70;;;;-1:-1:-1;;;16230:70:5;;27953:2:9;16230:70:5;;;27935:21:9;27992:2;27972:18;;;27965:30;28031:34;28011:18;;;28004:62;-1:-1:-1;;;28082:18:9;;;28075:36;28128:19;;16230:70:5;27751:402:9;16230:70:5;16311:29;16359:9;-1:-1:-1;;;;;16343:36:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16311:70;-1:-1:-1;16408:29:5;16398:6;:39;;;;;;;;:::i;:::-;;;16042:402;-1:-1:-1;;;16042:402:5:o;4203:227:2:-;4281:7;4301:17;4320:18;4342:27;4353:4;4359:9;4342:10;:27::i;:::-;4300:69;;;;4379:18;4391:5;4379:11;:18::i;:::-;-1:-1:-1;4414:9:2;4203:227;-1:-1:-1;;;4203:227:2:o;6248:1002:5:-;6407:38;;-1:-1:-1;;;;;;26872:2:9;26868:15;;;26864:24;;6407:38:5;;;26852:37:9;26923:15;;;26919:24;26905:12;;;26898:46;6362:7:5;;;;26960:12:9;;6407:38:5;;;;;;;;;;;;6397:49;;;;;;6381:65;;6456:18;6477:67;6490:53;6515:8;:19;6524:9;-1:-1:-1;;;;;6515:19:5;-1:-1:-1;;;;;6515:19:5;;;;;;;;;;;;:27;;;6490:24;:53::i;6477:67::-;6456:88;-1:-1:-1;6554:16:5;6581:38;6605:5;6456:88;6581:15;:38::i;:::-;6658:5;;6666:3;;6630:68;;-1:-1:-1;;;6630:68:5;;-1:-1:-1;;;;;6658:5:5;;;6630:68;;;28871:34:9;6666:3:5;;;28921:18:9;;;28914:43;28993:15;;;28973:18;;;28966:43;29045:15;;;29025:18;;;29018:43;29077:19;;;29070:35;;;6554:66:5;;-1:-1:-1;6630:19:5;;;;;28805::9;;6630:68:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6714:63:5;;-1:-1:-1;;;;;3608:32:9;;;3590:51;;6714:63:5;;;;-1:-1:-1;6714:63:5;;;-1:-1:-1;6714:63:5;;3578:2:9;3563:18;6714:63:5;;;;;;;-1:-1:-1;;;;;6886:26:5;;6882:89;;6951:8;6928:32;;6882:89;7061:23;7074:9;7061:12;:23::i;:::-;7056:153;;-1:-1:-1;;;;;7100:21:5;;;;;;;:10;:21;;;;;;;;;:36;;-1:-1:-1;;;;;;7100:36:5;;;;;;;;;7155:43;;3590:51:9;;;7100:21:5;;7155:43;;3563:18:9;7155:43:5;;;;;;;7056:153;7234:8;6248:1002;-1:-1:-1;;;;;;;6248:1002:5:o;10557:286::-;10697:135;;;-1:-1:-1;;;;;;10697:135:5;;;;29327:39:9;;;;10761:4:5;29403:2:9;29399:15;-1:-1:-1;;;;;;29395:53:9;29382:11;;;29375:74;29465:12;;;29458:28;;;;29502:12;;;;29495:28;;;;10697:135:5;;;;;;;;;;29539:12:9;;10697:135:5;;10687:146;;;;;;10557:286::o;11392:344::-;11470:15;11497:21;11604:5;11596;11590:12;11583:4;11576:5;11572:16;11569:1;11561:49;11552:58;;11645:5;11633:18;11623:74;;11681:1;11678;11671:12;2138:1279:2;2219:7;2228:12;2449:9;:16;2469:2;2449:22;2445:966;;;2738:4;2723:20;;2717:27;2787:4;2772:20;;2766:27;2844:4;2829:20;;2823:27;2487:9;2815:36;2885:25;2896:4;2815:36;2717:27;2766;2885:10;:25::i;:::-;2878:32;;;;;;;;;2445:966;2931:9;:16;2951:2;2931:22;2927:484;;;3200:4;3185:20;;3179:27;3250:4;3235:20;;3229:27;3290:23;3301:4;3179:27;3229;3290:10;:23::i;:::-;3283:30;;;;;;;;2927:484;-1:-1:-1;3360:1:2;;-1:-1:-1;3364:35:2;2927:484;2138:1279;;;;;:::o;443:631::-;520:20;511:5;:29;;;;;;;;:::i;:::-;;507:561;;;443:631;:::o;507:561::-;616:29;607:5;:38;;;;;;;;:::i;:::-;;603:465;;;661:34;;-1:-1:-1;;;661:34:2;;29764:2:9;661:34:2;;;29746:21:9;29803:2;29783:18;;;29776:30;29842:26;29822:18;;;29815:54;29886:18;;661:34:2;29562:348:9;603:465:2;725:35;716:5;:44;;;;;;;;:::i;:::-;;712:356;;;776:41;;-1:-1:-1;;;776:41:2;;30117:2:9;776:41:2;;;30099:21:9;30156:2;30136:18;;;30129:30;30195:33;30175:18;;;30168:61;30246:18;;776:41:2;29915:355:9;712:356:2;847:30;838:5;:39;;;;;;;;:::i;:::-;;834:234;;;893:44;;-1:-1:-1;;;893:44:2;;30477:2:9;893:44:2;;;30459:21:9;30516:2;30496:18;;;30489:30;30555:34;30535:18;;;30528:62;-1:-1:-1;;;30606:18:9;;;30599:32;30648:19;;893:44:2;30275:398:9;834:234:2;967:30;958:5;:39;;;;;;;;:::i;:::-;;954:114;;;1013:44;;-1:-1:-1;;;1013:44:2;;30880:2:9;1013:44:2;;;30862:21:9;30919:2;30899:18;;;30892:30;30958:34;30938:18;;;30931:62;-1:-1:-1;;;31009:18:9;;;31002:32;31051:19;;1013:44:2;30678:398:9;954:114:2;443:631;:::o;5654:1603::-;5780:7;;6704:66;6691:79;;6687:161;;;-1:-1:-1;6802:1:2;;-1:-1:-1;6806:30:2;6786:51;;6687:161;6861:1;:7;;6866:2;6861:7;;:18;;;;;6872:1;:7;;6877:2;6872:7;;6861:18;6857:100;;;-1:-1:-1;6911:1:2;;-1:-1:-1;6915:30:2;6895:51;;6857:100;7068:24;;;7051:14;7068:24;;;;;;;;;31308:25:9;;;31381:4;31369:17;;31349:18;;;31342:45;;;;31403:18;;;31396:34;;;31446:18;;;31439:34;;;7068:24:2;;31280:19:9;;7068:24:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7068:24:2;;-1:-1:-1;;7068:24:2;;;-1:-1:-1;;;;;;;7106:20:2;;7102:101;;7158:1;7162:29;7142:50;;;;;;;7102:101;7221:6;-1:-1:-1;7229:20:2;;-1:-1:-1;5654:1603:2;;;;;;;;:::o;4684:379::-;4794:7;;-1:-1:-1;;;;;4891:75:2;;4992:3;4988:12;;;5002:2;4984:21;5031:25;5042:4;4984:21;5051:1;4891:75;5031:10;:25::i;:::-;5024:32;;;;;;4684:379;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;422:131:9;-1:-1:-1;;;;;497:31:9;;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:9;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:9:o;1228:186::-;1276:4;1309:18;1301:6;1298:30;1295:56;;;1331:18;;:::i;:::-;-1:-1:-1;1397:2:9;1376:15;-1:-1:-1;;1372:29:9;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:9: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:9;2202:18;;2189:32;;-1:-1:-1;2272:2:9;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:9;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:9;;3259:180;-1:-1:-1;3259:180:9: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:9: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:9;5098:39;;;;5139:4;5094:50;;4893:257;-1:-1:-1;;4893:257:9: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:9;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:9;6640:18;;6627:32;;-1:-1:-1;6706:2:9;6691:18;;6678:32;;-1:-1:-1;6762:2:9;6747:18;;6734:32;6775:33;6734:32;6775:33;:::i;:::-;6827:7;-1:-1:-1;6885:3:9;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:9;7349:18;;7336:32;7377:33;7336:32;7377:33;:::i;:::-;7429:7;-1:-1:-1;7487:2:9;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:9;7996:18;;7983:32;;-1:-1:-1;8067:2:9;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:9;8199:18;;8186:32;;-1:-1:-1;8265:3:9;8250:19;;8237:33;;-1:-1:-1;8321:3:9;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;9267:898::-;9387:6;9395;9403;9411;9419;9427;9480:3;9468:9;9459:7;9455:23;9451:33;9448:53;;;9497:1;9494;9487:12;9448:53;9536:9;9523:23;9555:31;9580:5;9555:31;:::i;:::-;9605:5;-1:-1:-1;9662:2:9;9647:18;;9634:32;9675:33;9634:32;9675:33;:::i;:::-;9727:7;-1:-1:-1;9781:2:9;9766:18;;9753:32;;-1:-1:-1;9837:2:9;9822:18;;9809:32;9850:33;9809:32;9850:33;:::i;:::-;9902:7;-1:-1:-1;9961:3:9;9946:19;;9933:33;9975;9933;9975;:::i;:::-;10027:7;-1:-1:-1;10086:3:9;10071:19;;10058:33;10100;10058;10100;:::i;:::-;10152:7;10142:17;;;9267:898;;;;;;;;:::o;10170:407::-;10372:2;10354:21;;;10411:2;10391:18;;;10384:30;10450:34;10445:2;10430:18;;10423:62;-1:-1:-1;;;10516:2:9;10501:18;;10494:41;10567:3;10552:19;;10170:407::o;11462:184::-;11532:6;11585:2;11573:9;11564:7;11560:23;11556:32;11553:52;;;11601:1;11598;11591:12;11553:52;-1:-1:-1;11624:16:9;;11462:184;-1:-1:-1;11462:184:9:o;11651:416::-;11853:2;11835:21;;;11892:2;11872:18;;;11865:30;11931:34;11926:2;11911:18;;11904:62;-1:-1:-1;;;11997:2:9;11982:18;;11975:50;12057:3;12042:19;;11651:416::o;12381:251::-;12451:6;12504:2;12492:9;12483:7;12479:23;12475:32;12472:52;;;12520:1;12517;12510:12;12472:52;12552:9;12546:16;12571:31;12596:5;12571:31;:::i;12637:356::-;12839:2;12821:21;;;12858:18;;;12851:30;12917:34;12912:2;12897:18;;12890:62;12984:2;12969:18;;12637:356::o;12998:127::-;13059:10;13054:3;13050:20;13047:1;13040:31;13090:4;13087:1;13080:15;13114:4;13111:1;13104:15;13548:127;13609:10;13604:3;13600:20;13597:1;13590:31;13640:4;13637:1;13630:15;13664:4;13661:1;13654:15;13680:125;13720:4;13748:1;13745;13742:8;13739:34;;;13753:18;;:::i;:::-;-1:-1:-1;13790:9:9;;13680:125::o;15023:204::-;15061:3;15097:4;15094:1;15090:12;15129:4;15126:1;15122:12;15164:3;15158:4;15154:14;15149:3;15146:23;15143:49;;;15172:18;;:::i;:::-;15208:13;;15023:204;-1:-1:-1;;;15023:204:9:o;15232:175::-;15269:3;15313:4;15306:5;15302:16;15342:4;15333:7;15330:17;15327:43;;;15350:18;;:::i;:::-;15399:1;15386:15;;15232:175;-1:-1:-1;;15232:175:9:o;15823:135::-;15862:3;-1:-1:-1;;15883:17:9;;15880:43;;;15903:18;;:::i;:::-;-1:-1:-1;15950:1:9;15939:13;;15823:135::o;15963:584::-;16176:3;16208:26;16204:31;16277:2;16268:6;16264:2;16260:15;16256:24;16251:3;16244:37;16332:2;16323:6;16319:2;16315:15;16311:24;16306:2;16301:3;16297:12;16290:46;;16365:6;16359:13;16381:62;16436:6;16431:2;16426:3;16422:12;16415:4;16407:6;16403:17;16381:62;:::i;:::-;16502:2;16462:16;;16494:11;;;16487:27;;;;16538:2;16530:11;;15963:584;-1:-1:-1;;;;15963:584:9:o;16896:380::-;16975:1;16971:12;;;;17018;;;17039:61;;17093:4;17085:6;17081:17;17071:27;;17039:61;17146:2;17138:6;17135:14;17115:18;17112:38;17109:161;;;17192:10;17187:3;17183:20;17180:1;17173:31;17227:4;17224:1;17217:15;17255:4;17252:1;17245:15;17109:161;;16896:380;;;:::o;17281:277::-;17348:6;17401:2;17389:9;17380:7;17376:23;17372:32;17369:52;;;17417:1;17414;17407:12;17369:52;17449:9;17443:16;17502:5;17495:13;17488:21;17481:5;17478:32;17468:60;;17524:1;17521;17514:12;19062:128;19102:3;19133:1;19129:6;19126:1;19123:13;19120:39;;;19139:18;;:::i;:::-;-1:-1:-1;19175:9:9;;19062:128::o;19886:415::-;-1:-1:-1;;;;;20127:15:9;;;20109:34;;20179:15;;20174:2;20159:18;;20152:43;20231:2;20226;20211:18;;20204:30;;;20052:4;;20251:44;;20276:18;;20268:6;20251:44;:::i;23959:314::-;-1:-1:-1;;;;;24134:32:9;;24116:51;;24203:2;24198;24183:18;;24176:30;;;-1:-1:-1;;24223:44:9;;24248:18;;24240:6;24223:44;:::i;24971:1262::-;25064:6;25095:2;25138;25126:9;25117:7;25113:23;25109:32;25106:52;;;25154:1;25151;25144:12;25106:52;25187:9;25181:16;25216:18;25257:2;25249:6;25246:14;25243:34;;;25273:1;25270;25263:12;25243:34;25296:22;;;;25352:4;25334:16;;;25330:27;25327:47;;;25370:1;25367;25360:12;25327:47;25396:22;;:::i;:::-;25448:2;25442:9;25460:33;25485:7;25460:33;:::i;:::-;25502:22;;25562:11;;;25556:18;25540:14;;;25533:42;25609:2;25601:11;;25595:18;-1:-1:-1;;25640:33:9;;25632:42;;25622:70;;25688:1;25685;25678:12;25622:70;25719:2;25708:14;;25701:27;25767:2;25759:11;;25753:18;25783:16;;;25780:36;;;25812:1;25809;25802:12;25780:36;25843:8;25839:2;25835:17;25825:27;;;25890:7;25883:4;25879:2;25875:13;25871:27;25861:55;;25912:1;25909;25902:12;25861:55;25941:2;25935:9;25925:19;;25966:48;25982:31;26010:2;25982:31;:::i;25966:48::-;26037:2;26030:5;26023:17;26077:7;26072:2;26067;26063;26059:11;26055:20;26052:33;26049:53;;;26098:1;26095;26088:12;26049:53;26111:54;26162:2;26157;26150:5;26146:14;26141:2;26137;26133:11;26111:54;:::i;:::-;26192:2;26181:14;;26174:29;26185:5;24971:1262;-1:-1:-1;;;;;;24971:1262:9:o;28158:271::-;28239:6;28292:2;28280:9;28271:7;28267:23;28263:32;28260:52;;;28308:1;28305;28298:12;28260:52;28340:9;28334:16;28379:1;28372:5;28369:12;28359:40;;28395:1;28392;28385:12;28434:127;28495:10;28490:3;28486:20;28483:1;28476:31;28526:4;28523:1;28516:15;28550:4;28547:1;28540: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.