FTM Testnet

Contract

0xd8178947cFB9bF5Da5edd360a34B98fcB98eD0b5

Overview

FTM Balance

Fantom LogoFantom LogoFantom Logo0 FTM

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Value
0x60c06040101576032022-08-23 8:15:54584 days ago1661242554IN
 Contract Creation
0 FTM0.009937372.5

Latest 1 internal transaction

Parent Txn Hash Block From To Value
101576032022-08-23 8:15:54584 days ago1661242554  Contract Creation0 FTM
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x089f7F18...534e7E3e2
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
AxelarGateway

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.ftmscan.com on 2022-08-11
*/

// Sources flattened with hardhat v2.9.9 https://hardhat.org

// File contracts/interfaces/IAxelarGateway.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

interface IAxelarGateway {
    /**********\
    |* Errors *|
    \**********/

    error NotSelf();
    error NotProxy();
    error InvalidCodeHash();
    error SetupFailed();
    error InvalidAuthModule();
    error InvalidTokenDeployer();
    error InvalidAmount();
    error InvalidChainId();
    error InvalidCommands();
    error TokenDoesNotExist(string symbol);
    error TokenAlreadyExists(string symbol);
    error TokenDeployFailed(string symbol);
    error TokenContractDoesNotExist(address token);
    error BurnFailed(string symbol);
    error MintFailed(string symbol);
    error InvalidSetMintLimitsParams();
    error ExceedMintLimit(string symbol);

    /**********\
    |* Events *|
    \**********/

    event TokenSent(address indexed sender, string destinationChain, string destinationAddress, string symbol, uint256 amount);

    event ContractCall(
        address indexed sender,
        string destinationChain,
        string destinationContractAddress,
        bytes32 indexed payloadHash,
        bytes payload
    );

    event ContractCallWithToken(
        address indexed sender,
        string destinationChain,
        string destinationContractAddress,
        bytes32 indexed payloadHash,
        bytes payload,
        string symbol,
        uint256 amount
    );

    event Executed(bytes32 indexed commandId);

    event TokenDeployed(string symbol, address tokenAddresses);

    event ContractCallApproved(
        bytes32 indexed commandId,
        string sourceChain,
        string sourceAddress,
        address indexed contractAddress,
        bytes32 indexed payloadHash,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    );

    event ContractCallApprovedWithMint(
        bytes32 indexed commandId,
        string sourceChain,
        string sourceAddress,
        address indexed contractAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    );

    event TokenMintLimitUpdated(string symbol, uint256 limit);

    event OperatorshipTransferred(bytes newOperatorsData);

    event Upgraded(address indexed implementation);

    /********************\
    |* Public Functions *|
    \********************/

    function sendToken(
        string calldata destinationChain,
        string calldata destinationAddress,
        string calldata symbol,
        uint256 amount
    ) external;

    function callContract(
        string calldata destinationChain,
        string calldata contractAddress,
        bytes calldata payload
    ) external;

    function callContractWithToken(
        string calldata destinationChain,
        string calldata contractAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount
    ) external;

    function isContractCallApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) external view returns (bool);

    function isContractCallAndMintApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external view returns (bool);

    function validateContractCall(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash
    ) external returns (bool);

    function validateContractCallAndMint(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external returns (bool);

    /***********\
    |* Getters *|
    \***********/

    function authModule() external view returns (address);

    function tokenDeployer() external view returns (address);

    function tokenMintLimit(string memory symbol) external view returns (uint256);

    function tokenMintAmount(string memory symbol) external view returns (uint256);

    function allTokensFrozen() external view returns (bool);

    function implementation() external view returns (address);

    function tokenAddresses(string memory symbol) external view returns (address);

    function tokenFrozen(string memory symbol) external view returns (bool);

    function isCommandExecuted(bytes32 commandId) external view returns (bool);

    function adminEpoch() external view returns (uint256);

    function adminThreshold(uint256 epoch) external view returns (uint256);

    function admins(uint256 epoch) external view returns (address[] memory);

    /*******************\
    |* Admin Functions *|
    \*******************/

    function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external;

    function upgrade(
        address newImplementation,
        bytes32 newImplementationCodeHash,
        bytes calldata setupParams
    ) external;

    /**********************\
    |* External Functions *|
    \**********************/

    function setup(bytes calldata params) external;

    function execute(bytes calldata input) external;
}


// File contracts/interfaces/IOwnable.sol

interface IOwnable {
    error NotOwner();
    error InvalidOwner();

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

    function owner() external view returns (address);

    function transferOwnership(address newOwner) external;
}


// File contracts/interfaces/IAxelarAuth.sol

interface IAxelarAuth is IOwnable {
    function validateProof(bytes32 messageHash, bytes calldata proof) external returns (bool currentOperators);

    function transferOperatorship(bytes calldata params) external;
}


// File contracts/interfaces/IERC20.sol

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    error InvalidAccount();

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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


// File contracts/interfaces/IERC20Burn.sol

interface IERC20Burn {
    function burn(bytes32 salt) external;
}


// File contracts/interfaces/IERC20BurnFrom.sol

interface IERC20BurnFrom {
    function burnFrom(address account, uint256 amount) external;
}


// File contracts/interfaces/IERC20Permit.sol

interface IERC20Permit {
    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function nonces(address account) external view returns (uint256);

    function permit(
        address issuer,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}


// File contracts/interfaces/IMintableCappedERC20.sol

interface IMintableCappedERC20 is IERC20, IERC20Permit, IOwnable {
    error CapExceeded();

    function cap() external view returns (uint256);

    function mint(address account, uint256 amount) external;
}


// File contracts/interfaces/IBurnableMintableCappedERC20.sol

interface IBurnableMintableCappedERC20 is IERC20Burn, IERC20BurnFrom, IMintableCappedERC20 {
    function depositAddress(bytes32 salt) external view returns (address);

    function burn(bytes32 salt) external;

    function burnFrom(address account, uint256 amount) external;
}


// File contracts/interfaces/ITokenDeployer.sol

interface ITokenDeployer {
    function deployToken(
        string calldata name,
        string calldata symbol,
        uint8 decimals,
        uint256 cap,
        bytes32 salt
    ) external returns (address tokenAddress);
}


// File contracts/ECDSA.sol

/**
 * @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 {
    error InvalidSignatureLength();
    error InvalidS();
    error InvalidV();
    error InvalidSignature();

    /**
     * @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 signer) {
        // Check the signature length
        if (signature.length != 65) revert InvalidSignatureLength();

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) revert InvalidS();

        if (v != 27 && v != 28) revert InvalidV();

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

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * 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));
    }
}


// File contracts/DepositHandler.sol

contract DepositHandler {
    error IsLocked();
    error NotContract();

    uint256 internal constant IS_NOT_LOCKED = uint256(1);
    uint256 internal constant IS_LOCKED = uint256(2);

    uint256 internal _lockedStatus = IS_NOT_LOCKED;

    modifier noReenter() {
        if (_lockedStatus == IS_LOCKED) revert IsLocked();

        _lockedStatus = IS_LOCKED;
        _;
        _lockedStatus = IS_NOT_LOCKED;
    }

    function execute(address callee, bytes calldata data) external noReenter returns (bool success, bytes memory returnData) {
        if (callee.code.length == 0) revert NotContract();
        (success, returnData) = callee.call(data);
    }

    // NOTE: The gateway should always destroy the `DepositHandler` in the same runtime context that deploys it.
    function destroy(address etherDestination) external noReenter {
        selfdestruct(payable(etherDestination));
    }
}


// File contracts/EternalStorage.sol

/**
 * @title EternalStorage
 * @dev This contract holds all the necessary state variables to carry out the storage of any contract.
 */
contract EternalStorage {
    mapping(bytes32 => uint256) private _uintStorage;
    mapping(bytes32 => string) private _stringStorage;
    mapping(bytes32 => address) private _addressStorage;
    mapping(bytes32 => bytes) private _bytesStorage;
    mapping(bytes32 => bool) private _boolStorage;
    mapping(bytes32 => int256) private _intStorage;

    // *** Getter Methods ***
    function getUint(bytes32 key) public view returns (uint256) {
        return _uintStorage[key];
    }

    function getString(bytes32 key) public view returns (string memory) {
        return _stringStorage[key];
    }

    function getAddress(bytes32 key) public view returns (address) {
        return _addressStorage[key];
    }

    function getBytes(bytes32 key) public view returns (bytes memory) {
        return _bytesStorage[key];
    }

    function getBool(bytes32 key) public view returns (bool) {
        return _boolStorage[key];
    }

    function getInt(bytes32 key) public view returns (int256) {
        return _intStorage[key];
    }

    // *** Setter Methods ***
    function _setUint(bytes32 key, uint256 value) internal {
        _uintStorage[key] = value;
    }

    function _setString(bytes32 key, string memory value) internal {
        _stringStorage[key] = value;
    }

    function _setAddress(bytes32 key, address value) internal {
        _addressStorage[key] = value;
    }

    function _setBytes(bytes32 key, bytes memory value) internal {
        _bytesStorage[key] = value;
    }

    function _setBool(bytes32 key, bool value) internal {
        _boolStorage[key] = value;
    }

    function _setInt(bytes32 key, int256 value) internal {
        _intStorage[key] = value;
    }

    // *** Delete Methods ***
    function _deleteUint(bytes32 key) internal {
        delete _uintStorage[key];
    }

    function _deleteString(bytes32 key) internal {
        delete _stringStorage[key];
    }

    function _deleteAddress(bytes32 key) internal {
        delete _addressStorage[key];
    }

    function _deleteBytes(bytes32 key) internal {
        delete _bytesStorage[key];
    }

    function _deleteBool(bytes32 key) internal {
        delete _boolStorage[key];
    }

    function _deleteInt(bytes32 key) internal {
        delete _intStorage[key];
    }
}


// File contracts/AdminMultisigBase.sol

contract AdminMultisigBase is EternalStorage {
    error NotAdmin();
    error AlreadyVoted();
    error InvalidAdmins();
    error InvalidAdminThreshold();
    error DuplicateAdmin(address admin);

    // AUDIT: slot names should be prefixed with some standard string
    bytes32 internal constant KEY_ADMIN_EPOCH = keccak256('admin-epoch');

    bytes32 internal constant PREFIX_ADMIN = keccak256('admin');
    bytes32 internal constant PREFIX_ADMIN_COUNT = keccak256('admin-count');
    bytes32 internal constant PREFIX_ADMIN_THRESHOLD = keccak256('admin-threshold');
    bytes32 internal constant PREFIX_ADMIN_VOTE_COUNTS = keccak256('admin-vote-counts');
    bytes32 internal constant PREFIX_ADMIN_VOTED = keccak256('admin-voted');
    bytes32 internal constant PREFIX_IS_ADMIN = keccak256('is-admin');

    // NOTE: Given the early void return, this modifier should be used with care on functions that return data.
    modifier onlyAdmin() {
        uint256 adminEpoch = _adminEpoch();

        if (!_isAdmin(adminEpoch, msg.sender)) revert NotAdmin();

        bytes32 topic = keccak256(msg.data);

        // Check that admin has not voted, then record that they have voted.
        if (_hasVoted(adminEpoch, topic, msg.sender)) revert AlreadyVoted();

        _setHasVoted(adminEpoch, topic, msg.sender, true);

        // Determine the new vote count and update it.
        uint256 adminVoteCount = _getVoteCount(adminEpoch, topic) + uint256(1);
        _setVoteCount(adminEpoch, topic, adminVoteCount);

        // Do not proceed with operation execution if insufficient votes.
        if (adminVoteCount < _getAdminThreshold(adminEpoch)) return;

        _;

        // Clear vote count and voted booleans.
        _setVoteCount(adminEpoch, topic, uint256(0));

        uint256 adminCount = _getAdminCount(adminEpoch);

        for (uint256 i; i < adminCount; ++i) {
            _setHasVoted(adminEpoch, topic, _getAdmin(adminEpoch, i), false);
        }
    }

    /********************\
    |* Pure Key Getters *|
    \********************/

    function _getAdminKey(uint256 adminEpoch, uint256 index) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN, adminEpoch, index));
    }

    function _getAdminCountKey(uint256 adminEpoch) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN_COUNT, adminEpoch));
    }

    function _getAdminThresholdKey(uint256 adminEpoch) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN_THRESHOLD, adminEpoch));
    }

    function _getAdminVoteCountsKey(uint256 adminEpoch, bytes32 topic) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN_VOTE_COUNTS, adminEpoch, topic));
    }

    function _getAdminVotedKey(
        uint256 adminEpoch,
        bytes32 topic,
        address account
    ) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN_VOTED, adminEpoch, topic, account));
    }

    function _getIsAdminKey(uint256 adminEpoch, address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_IS_ADMIN, adminEpoch, account));
    }

    /***********\
    |* Getters *|
    \***********/

    function _adminEpoch() internal view returns (uint256) {
        return getUint(KEY_ADMIN_EPOCH);
    }

    function _getAdmin(uint256 adminEpoch, uint256 index) internal view returns (address) {
        return getAddress(_getAdminKey(adminEpoch, index));
    }

    function _getAdminCount(uint256 adminEpoch) internal view returns (uint256) {
        return getUint(_getAdminCountKey(adminEpoch));
    }

    function _getAdminThreshold(uint256 adminEpoch) internal view returns (uint256) {
        return getUint(_getAdminThresholdKey(adminEpoch));
    }

    function _getVoteCount(uint256 adminEpoch, bytes32 topic) internal view returns (uint256) {
        return getUint(_getAdminVoteCountsKey(adminEpoch, topic));
    }

    function _hasVoted(
        uint256 adminEpoch,
        bytes32 topic,
        address account
    ) internal view returns (bool) {
        return getBool(_getAdminVotedKey(adminEpoch, topic, account));
    }

    function _isAdmin(uint256 adminEpoch, address account) internal view returns (bool) {
        return getBool(_getIsAdminKey(adminEpoch, account));
    }

    /***********\
    |* Setters *|
    \***********/

    function _setAdminEpoch(uint256 adminEpoch) internal {
        _setUint(KEY_ADMIN_EPOCH, adminEpoch);
    }

    function _setAdmin(
        uint256 adminEpoch,
        uint256 index,
        address account
    ) internal {
        _setAddress(_getAdminKey(adminEpoch, index), account);
    }

    function _setAdminCount(uint256 adminEpoch, uint256 adminCount) internal {
        _setUint(_getAdminCountKey(adminEpoch), adminCount);
    }

    function _setAdmins(
        uint256 adminEpoch,
        address[] memory accounts,
        uint256 threshold
    ) internal {
        uint256 adminLength = accounts.length;

        if (adminLength < threshold) revert InvalidAdmins();

        if (threshold == uint256(0)) revert InvalidAdminThreshold();

        _setAdminThreshold(adminEpoch, threshold);
        _setAdminCount(adminEpoch, adminLength);

        for (uint256 i; i < adminLength; ++i) {
            address account = accounts[i];

            // Check that the account wasn't already set as an admin for this epoch.
            if (_isAdmin(adminEpoch, account)) revert DuplicateAdmin(account);

            if (account == address(0)) revert InvalidAdmins();

            // Set this account as the i-th admin in this epoch (needed to we can clear topic votes in `onlyAdmin`).
            _setAdmin(adminEpoch, i, account);
            _setIsAdmin(adminEpoch, account, true);
        }
    }

    function _setAdminThreshold(uint256 adminEpoch, uint256 adminThreshold) internal {
        _setUint(_getAdminThresholdKey(adminEpoch), adminThreshold);
    }

    function _setVoteCount(
        uint256 adminEpoch,
        bytes32 topic,
        uint256 voteCount
    ) internal {
        _setUint(_getAdminVoteCountsKey(adminEpoch, topic), voteCount);
    }

    function _setHasVoted(
        uint256 adminEpoch,
        bytes32 topic,
        address account,
        bool voted
    ) internal {
        _setBool(_getAdminVotedKey(adminEpoch, topic, account), voted);
    }

    function _setIsAdmin(
        uint256 adminEpoch,
        address account,
        bool isAdmin
    ) internal {
        _setBool(_getIsAdminKey(adminEpoch, account), isAdmin);
    }
}


// File contracts/AxelarGateway.sol


contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
    enum TokenType {
        InternalBurnable,
        InternalBurnableFrom,
        External
    }

    /// @dev Removed slots; Should avoid re-using
    // bytes32 internal constant KEY_ALL_TOKENS_FROZEN = keccak256('all-tokens-frozen');
    // bytes32 internal constant PREFIX_TOKEN_FROZEN = keccak256('token-frozen');

    /// @dev Storage slot with the address of the current implementation. `keccak256('eip1967.proxy.implementation') - 1`.
    bytes32 internal constant KEY_IMPLEMENTATION = bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc);

    // AUDIT: slot names should be prefixed with some standard string
    bytes32 internal constant PREFIX_COMMAND_EXECUTED = keccak256('command-executed');
    bytes32 internal constant PREFIX_TOKEN_ADDRESS = keccak256('token-address');
    bytes32 internal constant PREFIX_TOKEN_TYPE = keccak256('token-type');
    bytes32 internal constant PREFIX_CONTRACT_CALL_APPROVED = keccak256('contract-call-approved');
    bytes32 internal constant PREFIX_CONTRACT_CALL_APPROVED_WITH_MINT = keccak256('contract-call-approved-with-mint');
    bytes32 internal constant PREFIX_TOKEN_MINT_LIMIT = keccak256('token-mint-limit');
    bytes32 internal constant PREFIX_TOKEN_MINT_AMOUNT = keccak256('token-mint-amount');

    bytes32 internal constant SELECTOR_BURN_TOKEN = keccak256('burnToken');
    bytes32 internal constant SELECTOR_DEPLOY_TOKEN = keccak256('deployToken');
    bytes32 internal constant SELECTOR_MINT_TOKEN = keccak256('mintToken');
    bytes32 internal constant SELECTOR_APPROVE_CONTRACT_CALL = keccak256('approveContractCall');
    bytes32 internal constant SELECTOR_APPROVE_CONTRACT_CALL_WITH_MINT = keccak256('approveContractCallWithMint');
    bytes32 internal constant SELECTOR_TRANSFER_OPERATORSHIP = keccak256('transferOperatorship');

    // solhint-disable-next-line var-name-mixedcase
    address internal immutable AUTH_MODULE;
    // solhint-disable-next-line var-name-mixedcase
    address internal immutable TOKEN_DEPLOYER_IMPLEMENTATION;

    constructor(address authModule_, address tokenDeployerImplementation_) {
        if (authModule_.code.length == 0) revert InvalidAuthModule();
        if (tokenDeployerImplementation_.code.length == 0) revert InvalidTokenDeployer();

        AUTH_MODULE = authModule_;
        TOKEN_DEPLOYER_IMPLEMENTATION = tokenDeployerImplementation_;
    }

    modifier onlySelf() {
        if (msg.sender != address(this)) revert NotSelf();

        _;
    }

    /******************\
    |* Public Methods *|
    \******************/

    function sendToken(
        string calldata destinationChain,
        string calldata destinationAddress,
        string calldata symbol,
        uint256 amount
    ) external {
        _burnTokenFrom(msg.sender, symbol, amount);
        emit TokenSent(msg.sender, destinationChain, destinationAddress, symbol, amount);
    }

    function callContract(
        string calldata destinationChain,
        string calldata destinationContractAddress,
        bytes calldata payload
    ) external {
        emit ContractCall(msg.sender, destinationChain, destinationContractAddress, keccak256(payload), payload);
    }

    function callContractWithToken(
        string calldata destinationChain,
        string calldata destinationContractAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount
    ) external {
        _burnTokenFrom(msg.sender, symbol, amount);
        emit ContractCallWithToken(msg.sender, destinationChain, destinationContractAddress, keccak256(payload), payload, symbol, amount);
    }

    function isContractCallApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) external view override returns (bool) {
        return getBool(_getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash));
    }

    function isContractCallAndMintApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external view override returns (bool) {
        return
            getBool(
                _getIsContractCallApprovedWithMintKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, symbol, amount)
            );
    }

    function validateContractCall(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash
    ) external override returns (bool valid) {
        bytes32 key = _getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, msg.sender, payloadHash);
        valid = getBool(key);
        if (valid) _setBool(key, false);
    }

    function validateContractCallAndMint(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external override returns (bool valid) {
        bytes32 key = _getIsContractCallApprovedWithMintKey(commandId, sourceChain, sourceAddress, msg.sender, payloadHash, symbol, amount);
        valid = getBool(key);
        if (valid) {
            // Prevent re-entrance
            _setBool(key, false);
            _mintToken(symbol, msg.sender, amount);
        }
    }

    /***********\
    |* Getters *|
    \***********/

    function authModule() public view returns (address) {
        return AUTH_MODULE;
    }

    function tokenDeployer() public view returns (address) {
        return TOKEN_DEPLOYER_IMPLEMENTATION;
    }

    function tokenMintLimit(string memory symbol) public view override returns (uint256) {
        return getUint(_getTokenMintLimitKey(symbol));
    }

    function tokenMintAmount(string memory symbol) public view override returns (uint256) {
        // solhint-disable-next-line not-rely-on-time
        return getUint(_getTokenMintAmountKey(symbol, block.timestamp / 6 hours));
    }

    /// @dev This function is kept around to keep things working for internal
    /// tokens that were deployed before the token freeze functionality was removed
    function allTokensFrozen() external pure override returns (bool) {
        return false;
    }

    function implementation() public view override returns (address) {
        return getAddress(KEY_IMPLEMENTATION);
    }

    function tokenAddresses(string memory symbol) public view override returns (address) {
        return getAddress(_getTokenAddressKey(symbol));
    }

    /// @dev This function is kept around to keep things working for internal
    /// tokens that were deployed before the token freeze functionality was removed
    function tokenFrozen(string memory) external pure override returns (bool) {
        return false;
    }

    function isCommandExecuted(bytes32 commandId) public view override returns (bool) {
        return getBool(_getIsCommandExecutedKey(commandId));
    }

    /// @dev Returns the current `adminEpoch`.
    function adminEpoch() external view override returns (uint256) {
        return _adminEpoch();
    }

    /// @dev Returns the admin threshold for a given `adminEpoch`.
    function adminThreshold(uint256 epoch) external view override returns (uint256) {
        return _getAdminThreshold(epoch);
    }

    /// @dev Returns the array of admins within a given `adminEpoch`.
    function admins(uint256 epoch) external view override returns (address[] memory results) {
        uint256 adminCount = _getAdminCount(epoch);
        results = new address[](adminCount);

        for (uint256 i; i < adminCount; ++i) {
            results[i] = _getAdmin(epoch, i);
        }
    }

    /*******************\
    |* Admin Functions *|
    \*******************/

    function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external override onlyAdmin {
        if (symbols.length != limits.length) revert InvalidSetMintLimitsParams();

        for (uint256 i = 0; i < symbols.length; i++) {
            string memory symbol = symbols[i];
            uint256 limit = limits[i];

            if (tokenAddresses(symbol) == address(0)) revert TokenDoesNotExist(symbol);

            _setTokenMintLimit(symbol, limit);
        }
    }

    function upgrade(
        address newImplementation,
        bytes32 newImplementationCodeHash,
        bytes calldata setupParams
    ) external override onlyAdmin {
        if (newImplementationCodeHash != newImplementation.codehash) revert InvalidCodeHash();

        emit Upgraded(newImplementation);

        // AUDIT: If `newImplementation.setup` performs `selfdestruct`, it will result in the loss of _this_ implementation (thereby losing the gateway)
        //        if `upgrade` is entered within the context of _this_ implementation itself.
        if (setupParams.length != 0) {
            // solhint-disable-next-line avoid-low-level-calls
            (bool success, ) = newImplementation.delegatecall(abi.encodeWithSelector(IAxelarGateway.setup.selector, setupParams));

            if (!success) revert SetupFailed();
        }

        _setImplementation(newImplementation);
    }

    /**********************\
    |* External Functions *|
    \**********************/

    /// @dev Not publicly accessible as overshadowed in the proxy
    function setup(bytes calldata params) external override {
        // Prevent setup from being called on a non-proxy (the implementation).
        if (implementation() == address(0)) revert NotProxy();

        (address[] memory adminAddresses, uint256 newAdminThreshold, bytes memory newOperatorsData) = abi.decode(
            params,
            (address[], uint256, bytes)
        );

        // NOTE: Admin epoch is incremented to easily invalidate current admin-related state.
        uint256 newAdminEpoch = _adminEpoch() + uint256(1);
        _setAdminEpoch(newAdminEpoch);
        _setAdmins(newAdminEpoch, adminAddresses, newAdminThreshold);

        if (newOperatorsData.length != 0) {
            IAxelarAuth(AUTH_MODULE).transferOperatorship(newOperatorsData);

            emit OperatorshipTransferred(newOperatorsData);
        }
    }

    function execute(bytes calldata input) external override {
        (bytes memory data, bytes memory proof) = abi.decode(input, (bytes, bytes));

        bytes32 messageHash = ECDSA.toEthSignedMessageHash(keccak256(data));

        // returns true for current operators
        bool allowOperatorshipTransfer = IAxelarAuth(AUTH_MODULE).validateProof(messageHash, proof);

        uint256 chainId;
        bytes32[] memory commandIds;
        string[] memory commands;
        bytes[] memory params;

        (chainId, commandIds, commands, params) = abi.decode(data, (uint256, bytes32[], string[], bytes[]));

        if (chainId != block.chainid) revert InvalidChainId();

        uint256 commandsLength = commandIds.length;

        if (commandsLength != commands.length || commandsLength != params.length) revert InvalidCommands();

        for (uint256 i; i < commandsLength; ++i) {
            bytes32 commandId = commandIds[i];

            if (isCommandExecuted(commandId)) continue; /* Ignore if duplicate commandId received */

            bytes4 commandSelector;
            bytes32 commandHash = keccak256(abi.encodePacked(commands[i]));

            if (commandHash == SELECTOR_DEPLOY_TOKEN) {
                commandSelector = AxelarGateway.deployToken.selector;
            } else if (commandHash == SELECTOR_MINT_TOKEN) {
                commandSelector = AxelarGateway.mintToken.selector;
            } else if (commandHash == SELECTOR_APPROVE_CONTRACT_CALL) {
                commandSelector = AxelarGateway.approveContractCall.selector;
            } else if (commandHash == SELECTOR_APPROVE_CONTRACT_CALL_WITH_MINT) {
                commandSelector = AxelarGateway.approveContractCallWithMint.selector;
            } else if (commandHash == SELECTOR_BURN_TOKEN) {
                commandSelector = AxelarGateway.burnToken.selector;
            } else if (commandHash == SELECTOR_TRANSFER_OPERATORSHIP) {
                if (!allowOperatorshipTransfer) continue;

                allowOperatorshipTransfer = false;
                commandSelector = AxelarGateway.transferOperatorship.selector;
            } else {
                continue; /* Ignore if unknown command received */
            }

            // Prevent a re-entrancy from executing this command before it can be marked as successful.
            _setCommandExecuted(commandId, true);
            // solhint-disable-next-line avoid-low-level-calls
            (bool success, ) = address(this).call(abi.encodeWithSelector(commandSelector, params[i], commandId));

            if (success) emit Executed(commandId);
            else _setCommandExecuted(commandId, false);
        }
    }

    /******************\
    |* Self Functions *|
    \******************/

    function deployToken(bytes calldata params, bytes32) external onlySelf {
        (string memory name, string memory symbol, uint8 decimals, uint256 cap, address tokenAddress, uint256 mintLimit) = abi.decode(
            params,
            (string, string, uint8, uint256, address, uint256)
        );

        // Ensure that this symbol has not been taken.
        if (tokenAddresses(symbol) != address(0)) revert TokenAlreadyExists(symbol);

        if (tokenAddress == address(0)) {
            // If token address is no specified, it indicates a request to deploy one.
            bytes32 salt = keccak256(abi.encodePacked(symbol));

            // solhint-disable-next-line avoid-low-level-calls
            (bool success, bytes memory data) = TOKEN_DEPLOYER_IMPLEMENTATION.delegatecall(
                abi.encodeWithSelector(ITokenDeployer.deployToken.selector, name, symbol, decimals, cap, salt)
            );

            if (!success) revert TokenDeployFailed(symbol);

            tokenAddress = abi.decode(data, (address));

            _setTokenType(symbol, TokenType.InternalBurnableFrom);
        } else {
            // If token address is specified, ensure that there is a contact at the specified address.
            if (tokenAddress.code.length == uint256(0)) revert TokenContractDoesNotExist(tokenAddress);

            // Mark that this symbol is an external token, which is needed to differentiate between operations on mint and burn.
            _setTokenType(symbol, TokenType.External);
        }

        _setTokenAddress(symbol, tokenAddress);
        _setTokenMintLimit(symbol, mintLimit);

        emit TokenDeployed(symbol, tokenAddress);
    }

    function mintToken(bytes calldata params, bytes32) external onlySelf {
        (string memory symbol, address account, uint256 amount) = abi.decode(params, (string, address, uint256));

        _mintToken(symbol, account, amount);
    }

    function burnToken(bytes calldata params, bytes32) external onlySelf {
        (string memory symbol, bytes32 salt) = abi.decode(params, (string, bytes32));

        address tokenAddress = tokenAddresses(symbol);

        if (tokenAddress == address(0)) revert TokenDoesNotExist(symbol);

        if (_getTokenType(symbol) == TokenType.External) {
            DepositHandler depositHandler = new DepositHandler{ salt: salt }();

            (bool success, bytes memory returnData) = depositHandler.execute(
                tokenAddress,
                abi.encodeWithSelector(IERC20.transfer.selector, address(this), IERC20(tokenAddress).balanceOf(address(depositHandler)))
            );

            if (!success || (returnData.length != uint256(0) && !abi.decode(returnData, (bool)))) revert BurnFailed(symbol);

            // NOTE: `depositHandler` must always be destroyed in the same runtime context that it is deployed.
            depositHandler.destroy(address(this));
        } else {
            IBurnableMintableCappedERC20(tokenAddress).burn(salt);
        }
    }

    function approveContractCall(bytes calldata params, bytes32 commandId) external onlySelf {
        (
            string memory sourceChain,
            string memory sourceAddress,
            address contractAddress,
            bytes32 payloadHash,
            bytes32 sourceTxHash,
            uint256 sourceEventIndex
        ) = abi.decode(params, (string, string, address, bytes32, bytes32, uint256));

        _setContractCallApproved(commandId, sourceChain, sourceAddress, contractAddress, payloadHash);
        emit ContractCallApproved(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, sourceTxHash, sourceEventIndex);
    }

    function approveContractCallWithMint(bytes calldata params, bytes32 commandId) external onlySelf {
        (
            string memory sourceChain,
            string memory sourceAddress,
            address contractAddress,
            bytes32 payloadHash,
            string memory symbol,
            uint256 amount,
            bytes32 sourceTxHash,
            uint256 sourceEventIndex
        ) = abi.decode(params, (string, string, address, bytes32, string, uint256, bytes32, uint256));

        _setContractCallApprovedWithMint(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, symbol, amount);
        emit ContractCallApprovedWithMint(
            commandId,
            sourceChain,
            sourceAddress,
            contractAddress,
            payloadHash,
            symbol,
            amount,
            sourceTxHash,
            sourceEventIndex
        );
    }

    function transferOperatorship(bytes calldata newOperatorsData, bytes32) external onlySelf {
        IAxelarAuth(AUTH_MODULE).transferOperatorship(newOperatorsData);

        emit OperatorshipTransferred(newOperatorsData);
    }

    /********************\
    |* Internal Methods *|
    \********************/

    function _callERC20Token(address tokenAddress, bytes memory callData) internal returns (bool) {
        if (tokenAddress.code.length == 0) return false;

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returnData) = tokenAddress.call(callData);
        return success && (returnData.length == 0 || abi.decode(returnData, (bool)));
    }

    function _mintToken(
        string memory symbol,
        address account,
        uint256 amount
    ) internal {
        address tokenAddress = tokenAddresses(symbol);

        if (tokenAddress == address(0)) revert TokenDoesNotExist(symbol);

        _setTokenMintAmount(symbol, tokenMintAmount(symbol) + amount);

        if (_getTokenType(symbol) == TokenType.External) {
            bool success = _callERC20Token(tokenAddress, abi.encodeWithSelector(IERC20.transfer.selector, account, amount));

            if (!success) revert MintFailed(symbol);
        } else {
            IBurnableMintableCappedERC20(tokenAddress).mint(account, amount);
        }
    }

    function _burnTokenFrom(
        address sender,
        string memory symbol,
        uint256 amount
    ) internal {
        address tokenAddress = tokenAddresses(symbol);

        if (tokenAddress == address(0)) revert TokenDoesNotExist(symbol);
        if (amount == 0) revert InvalidAmount();

        TokenType tokenType = _getTokenType(symbol);
        bool burnSuccess;

        if (tokenType == TokenType.External) {
            burnSuccess = _callERC20Token(
                tokenAddress,
                abi.encodeWithSelector(IERC20.transferFrom.selector, sender, address(this), amount)
            );

            if (!burnSuccess) revert BurnFailed(symbol);

            return;
        }

        if (tokenType == TokenType.InternalBurnableFrom) {
            burnSuccess = _callERC20Token(
                tokenAddress,
                abi.encodeWithSelector(IBurnableMintableCappedERC20.burnFrom.selector, sender, amount)
            );

            if (!burnSuccess) revert BurnFailed(symbol);

            return;
        }

        burnSuccess = _callERC20Token(
            tokenAddress,
            abi.encodeWithSelector(
                IERC20.transferFrom.selector,
                sender,
                IBurnableMintableCappedERC20(tokenAddress).depositAddress(bytes32(0)),
                amount
            )
        );

        if (!burnSuccess) revert BurnFailed(symbol);

        IBurnableMintableCappedERC20(tokenAddress).burn(bytes32(0));
    }

    /********************\
    |* Pure Key Getters *|
    \********************/

    function _getTokenMintLimitKey(string memory symbol) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_TOKEN_MINT_LIMIT, symbol));
    }

    function _getTokenMintAmountKey(string memory symbol, uint256 day) internal pure returns (bytes32) {
        // abi.encode to securely hash dynamic-length symbol data followed by day
        return keccak256(abi.encode(PREFIX_TOKEN_MINT_AMOUNT, symbol, day));
    }

    function _getTokenTypeKey(string memory symbol) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_TOKEN_TYPE, symbol));
    }

    function _getTokenAddressKey(string memory symbol) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_TOKEN_ADDRESS, symbol));
    }

    function _getIsCommandExecutedKey(bytes32 commandId) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_COMMAND_EXECUTED, commandId));
    }

    function _getIsContractCallApprovedKey(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) internal pure returns (bytes32) {
        return keccak256(abi.encode(PREFIX_CONTRACT_CALL_APPROVED, commandId, sourceChain, sourceAddress, contractAddress, payloadHash));
    }

    function _getIsContractCallApprovedWithMintKey(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string memory symbol,
        uint256 amount
    ) internal pure returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    PREFIX_CONTRACT_CALL_APPROVED_WITH_MINT,
                    commandId,
                    sourceChain,
                    sourceAddress,
                    contractAddress,
                    payloadHash,
                    symbol,
                    amount
                )
            );
    }

    /********************\
    |* Internal Getters *|
    \********************/

    function _getTokenType(string memory symbol) internal view returns (TokenType) {
        return TokenType(getUint(_getTokenTypeKey(symbol)));
    }

    /********************\
    |* Internal Setters *|
    \********************/

    function _setTokenMintLimit(string memory symbol, uint256 limit) internal {
        _setUint(_getTokenMintLimitKey(symbol), limit);

        emit TokenMintLimitUpdated(symbol, limit);
    }

    function _setTokenMintAmount(string memory symbol, uint256 amount) internal {
        uint256 limit = tokenMintLimit(symbol);
        if (limit > 0 && amount > limit) revert ExceedMintLimit(symbol);

        // solhint-disable-next-line not-rely-on-time
        _setUint(_getTokenMintAmountKey(symbol, block.timestamp / 6 hours), amount);
    }

    function _setTokenType(string memory symbol, TokenType tokenType) internal {
        _setUint(_getTokenTypeKey(symbol), uint256(tokenType));
    }

    function _setTokenAddress(string memory symbol, address tokenAddress) internal {
        _setAddress(_getTokenAddressKey(symbol), tokenAddress);
    }

    function _setCommandExecuted(bytes32 commandId, bool executed) internal {
        _setBool(_getIsCommandExecutedKey(commandId), executed);
    }

    function _setContractCallApproved(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) internal {
        _setBool(_getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash), true);
    }

    function _setContractCallApprovedWithMint(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string memory symbol,
        uint256 amount
    ) internal {
        _setBool(
            _getIsContractCallApprovedWithMintKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, symbol, amount),
            true
        );
    }

    function _setImplementation(address newImplementation) internal {
        _setAddress(KEY_IMPLEMENTATION, newImplementation);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"authModule_","type":"address"},{"internalType":"address","name":"tokenDeployerImplementation_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyVoted","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"BurnFailed","type":"error"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"DuplicateAdmin","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"ExceedMintLimit","type":"error"},{"inputs":[],"name":"InvalidAdminThreshold","type":"error"},{"inputs":[],"name":"InvalidAdmins","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidAuthModule","type":"error"},{"inputs":[],"name":"InvalidChainId","type":"error"},{"inputs":[],"name":"InvalidCodeHash","type":"error"},{"inputs":[],"name":"InvalidCommands","type":"error"},{"inputs":[],"name":"InvalidSetMintLimitsParams","type":"error"},{"inputs":[],"name":"InvalidTokenDeployer","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"MintFailed","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotProxy","type":"error"},{"inputs":[],"name":"NotSelf","type":"error"},{"inputs":[],"name":"SetupFailed","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"TokenAlreadyExists","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"TokenContractDoesNotExist","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"TokenDeployFailed","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"TokenDoesNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationContractAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"}],"name":"ContractCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"commandId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"sourceChain","type":"string"},{"indexed":false,"internalType":"string","name":"sourceAddress","type":"string"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"sourceTxHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"sourceEventIndex","type":"uint256"}],"name":"ContractCallApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"commandId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"sourceChain","type":"string"},{"indexed":false,"internalType":"string","name":"sourceAddress","type":"string"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"sourceTxHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"sourceEventIndex","type":"uint256"}],"name":"ContractCallApprovedWithMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationContractAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ContractCallWithToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"commandId","type":"bytes32"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"newOperatorsData","type":"bytes"}],"name":"OperatorshipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"address","name":"tokenAddresses","type":"address"}],"name":"TokenDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"TokenMintLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"adminEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"adminThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"admins","outputs":[{"internalType":"address[]","name":"results","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allTokensFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"commandId","type":"bytes32"}],"name":"approveContractCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"commandId","type":"bytes32"}],"name":"approveContractCallWithMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"authModule","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationContractAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"callContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationContractAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"callContractWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"deployToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getBool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getBytes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getInt","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getUint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"}],"name":"isCommandExecuted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"isContractCallAndMintApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"isContractCallApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"limits","type":"uint256[]"}],"name":"setTokenMintLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"}],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"tokenAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"tokenFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"tokenMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"tokenMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"newOperatorsData","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"transferOperatorship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes32","name":"newImplementationCodeHash","type":"bytes32"},{"internalType":"bytes","name":"setupParams","type":"bytes"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"validateContractCall","outputs":[{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"validateContractCallAndMint","outputs":[{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102415760003560e01c80637b1b769e11610145578063b5417084116100bd578063cec7b3591161008c578063dc97d96211610071578063dc97d9621461058a578063f6a5f9f5146105aa578063fbe0a31b146105bd57600080fd5b8063cec7b35914610564578063d26ff2101461057757600080fd5b8063b54170841461050b578063bc00c2161461051e578063bd02d0f514610531578063c031a1801461055157600080fd5b806397b87ba6116101145780639ded06df116100f95780639ded06df146104de578063a3499c73146104f1578063aa1e1f0a1461050457600080fd5b806397b87ba6146104ab578063986e791a146104be57600080fd5b80637b1b769e1461045e578063886a625d1461047257806388b3058714610485578063935b13f61461049857600080fd5b80632a2dae0a116101d85780635c60da1b116101a757806364940c561161018c57806364940c561461040257806367ace8eb146104285780637ae1cfca1461043b57600080fd5b80635c60da1b146103965780635f6970c3146103ef57600080fd5b80632a2dae0a14610342578063364940d8146103685780634656ae2e14610370578063585a9fd41461038357600080fd5b80631c92115f116102145780631c92115f146102ba57806321f8a721146102cd578063269eb65e1461030e57806326ef699d1461032f57600080fd5b806309c5eabe14610246578063146e2d781461025b57806314bfd6d01461026e5780631876eed914610297575b600080fd5b610259610254366004612f84565b6105d0565b005b610259610269366004612fc6565b610aea565b61028161027c366004613012565b610b33565b60405161028e919061302b565b60405180910390f35b6102aa6102a5366004613078565b610bdd565b604051901515815260200161028e565b6102596102c836600461312d565b610d11565b6102f66102db366004613012565b6000908152600260205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161028e565b61032161031c36600461328c565b610d7c565b60405190815260200161028e565b61025961033d3660046132c1565b610d90565b7f0000000000000000000000000300898296e17a8f393b6bde3b391a1d6c10cc9b6102f6565b610321610e28565b61025961037e366004612fc6565b610e80565b610259610391366004612fc6565b6111d4565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3546001600160a01b03166102f6565b6102aa6103fd366004613364565b611282565b7f000000000000000000000000ff99b33b97544fb781b95605af0545b9d75c928e6102f6565b61025961043636600461342b565b61133b565b6102aa610449366004613012565b60009081526004602052604090205460ff1690565b6102aa61046c36600461328c565b50600090565b610259610480366004612fc6565b6115b8565b610321610493366004613012565b611868565b6102f66104a636600461328c565b611873565b6102596104b9366004612fc6565b611881565b6104d16104cc366004613012565b61195f565b60405161028e91906134ef565b6102596104ec366004612f84565b611a01565b6102596104ff366004613517565b611c35565b60006102aa565b610259610519366004613567565b611f59565b6102aa61052c366004613633565b61200f565b61032161053f366004613012565b60009081526020819052604090205490565b6104d161055f366004613012565b6120e2565b61032161057236600461328c565b6120ff565b6102aa610585366004613012565b612119565b610321610598366004613012565b60009081526005602052604090205490565b6102aa6105b8366004613701565b612127565b6102596105cb366004612fc6565b6121b0565b6000806105df83850185613798565b9150915060006105f58380519060200120612250565b905060007f000000000000000000000000ff99b33b97544fb781b95605af0545b9d75c928e6001600160a01b03166373e3d66a83856040518363ffffffff1660e01b81526004016106479291906137fc565b602060405180830381600087803b15801561066157600080fd5b505af1158015610675573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610699919061382a565b905060006060806060878060200190518101906106b691906139ce565b929650909450925090504684146106f9576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825182518114158061070c575081518114155b15610743576040517fca9a28f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610adc57600085828151811061076257610762613ab8565b6020026020010151905061077581612119565b156107805750610acc565b60008086848151811061079557610795613ab8565b60200260200101516040516020016107ad9190613ace565b6040516020818303038152906040528051906020012090507f5763814b98a3aa86f212797af3273868b5dd6e2a532d764a79b98ca859e7bbad811415610815577f886a625d0000000000000000000000000000000000000000000000000000000091506109be565b7fec78d9c22c08bb9f0ecd5d95571ae83e3f22219c5a9278c3270691d50abfd91b811415610865577f146e2d780000000000000000000000000000000000000000000000000000000091506109be565b7f37ac16aabc4d87540e53151b2b716265cfd6b195db96a9daf8e893c829bbd2338114156108b5577ffbe0a31b0000000000000000000000000000000000000000000000000000000091506109be565b7ff41504255b911b3042ee4f8786fdf7cf4bcf24ace033fa16af3c8574e025e436811415610905577f585a9fd40000000000000000000000000000000000000000000000000000000091506109be565b7fda199c0e76f665e0450020791c7f8eacc75f3cdbace313272c28f93e5390b62c811415610955577f4656ae2e0000000000000000000000000000000000000000000000000000000091506109be565b7fb460dcb6fd5797fc0e7ea0f13406c80d30702ba7f73a42bd91394775dcbca7188114156109b6578961098a57505050610acc565b600099507f97b87ba60000000000000000000000000000000000000000000000000000000091506109be565b505050610acc565b6109c98360016122a4565b6000306001600160a01b0316838887815181106109e8576109e8613ab8565b602002602001015186604051602401610a02929190613aea565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610a409190613ace565b6000604051808303816000865af19150503d8060008114610a7d576040519150601f19603f3d011682016040523d82523d6000602084013e610a82565b606091505b505090508015610abc5760405184907fa74c8847d513feba22a0f0cb38d53081abf97562cdb293926ba243689e7c41ca90600090a2610ac7565b610ac78460006122a4565b505050505b610ad581613b22565b9050610746565b505050505050505050505050565b333014610b0a576040516314e1dbf760e11b815260040160405180910390fd5b60008080610b1a85870187613b48565b925092509250610b2b8383836122d0565b505050505050565b60606000610b408361246d565b90508067ffffffffffffffff811115610b5b57610b5b6131c7565b604051908082528060200260200182016040528015610b84578160200160208202803683370190505b50915060005b81811015610bd657610b9c848261247b565b838281518110610bae57610bae613ab8565b6001600160a01b0390921660209283029190910190910152610bcf81613b22565b9050610b8a565b5050919050565b600080610c8e8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525050604080516020601f8d018190048102820181019092528b81523393508d9250908c908c90819084018382808284376000920191909152508c9250612491915050565b60008181526004602052604090205460ff16925090508115610d03576000818152600460205260409020805460ff19169055610d0385858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503392508791506122d09050565b509998505050505050505050565b8181604051610d21929190613ba2565b6040518091039020336001600160a01b03167f30ae6cc78c27e651745bf2ad08a11de83910ac1e347a52f7ac898c0fbef94dae888888888888604051610d6c96959493929190613bdb565b60405180910390a3505050505050565b6000610d8a61053f836124f5565b92915050565b610dd23384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086925061252a915050565b336001600160a01b03167f651d93f66c4329630e8d0f62488eff599e3be484da587335e8dc0fcf4606272688888888888888604051610e179796959493929190613c24565b60405180910390a250505050505050565b6000610e7b7fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b905090565b333014610ea0576040516314e1dbf760e11b815260040160405180910390fd5b600080610eaf84860186613c75565b915091506000610ebe83611873565b90506001600160a01b038116610ef2578260405163395d09bf60e11b8152600401610ee991906134ef565b60405180910390fd5b6002610efd84612795565b6002811115610f0e57610f0e613cba565b141561117157600082604051610f2390612f2e565b8190604051809103906000f5905080158015610f43573d6000803e3d6000fd5b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830181905292935060009283929091631cff79cd91879163a9059cbb60e01b9130918416906370a082319060240160206040518083038186803b158015610fbd57600080fd5b505afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff59190613cd0565b6040516001600160a01b039092166024830152604482015260640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526110569291600401613ce9565b600060405180830381600087803b15801561107057600080fd5b505af1158015611084573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110ac9190810190613d0b565b915091508115806110d957508051158015906110d95750808060200190518101906110d7919061382a565b155b156110f9578560405163e217b0ad60e01b8152600401610ee991906134ef565b6040517ef55d9d0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0384169062f55d9d90602401600060405180830381600087803b15801561115157600080fd5b505af1158015611165573d6000803e3d6000fd5b50505050505050610b2b565b6040516308a1eee160e01b8152600481018390526001600160a01b038216906308a1eee1906024015b600060405180830381600087803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b50505050505050505050565b3330146111f4576040516314e1dbf760e11b815260040160405180910390fd5b6000808080808080806112098a8c018c613d4f565b97509750975097509750975097509750611228898989898989896127b4565b84866001600160a01b03168a7f9991faa1f435675159ffae64b66d7ecfdb55c29755869a18db8497b4392347e08b8b8989898960405161126d96959493929190613e0d565b60405180910390a45050505050505050505050565b6000806112fd8888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a91508990819084018382808284376000920191909152503392508991506127ea9050565b60008181526004602052604090205460ff16925090508115611330576000818152600460205260409020805460ff191690555b509695505050505050565b600061138e7fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b905061139a8133612848565b6113b757604051637bfa4b9f60e01b815260040160405180910390fd5b600080366040516113c9929190613ba2565b604051809103902090506113de828233612857565b156113fc57604051637c9a1cf960e01b815260040160405180910390fd5b61140982823360016128d5565b600060016114178484612948565b6114219190613e65565b905061142e838383612957565b6114378361297c565b811015611446575050506115b2565b85841461147f576040517f14a2275f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8681101561156157600088888381811061149e5761149e613ab8565b90506020028101906114b09190613e7d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509394508a92508991508590508181106114fb576114fb613ab8565b90506020020135905060006001600160a01b031661151883611873565b6001600160a01b03161415611542578160405163395d09bf60e11b8152600401610ee991906134ef565b61154c828261298a565b5050808061155990613b22565b915050611482565b5061156e83836000612957565b60006115798461246d565b905060005b818110156115ac5761159c8585611595888561247b565b60006128d5565b6115a581613b22565b905061157e565b50505050505b50505050565b3330146115d8576040516314e1dbf760e11b815260040160405180910390fd5b600080808080806115eb888a018a613ec4565b95509550955095509550955060006001600160a01b031661160b86611873565b6001600160a01b03161461164d57846040517faa7e8b32000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b6001600160a01b0382166117b95760008560405160200161166e9190613ace565b6040516020818303038152906040528051906020012090506000807f0000000000000000000000000300898296e17a8f393b6bde3b391a1d6c10cc9b6001600160a01b0316636fc95b3460e01b8a8a8a8a886040516024016116d4959493929190613f67565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516117129190613ace565b600060405180830381855af49150503d806000811461174d576040519150601f19603f3d011682016040523d82523d6000602084013e611752565b606091505b50915091508161179057876040517f86d52743000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b808060200190518101906117a49190613fad565b94506117b18860016129d3565b505050611810565b6001600160a01b0382163b611805576040517fc5ccddde0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610ee9565b6118108560026129d3565b61181a8583612a03565b611824858261298a565b7fbf90b5a1ec9763e8bf4b9245cef0c28db92bab309fc2c5177f17814f382469388583604051611855929190613fca565b60405180910390a1505050505050505050565b6000610d8a8261297c565b6000610d8a6102db83612a45565b3330146118a1576040516314e1dbf760e11b815260040160405180910390fd5b60405163d289d1cb60e01b81526001600160a01b037f000000000000000000000000ff99b33b97544fb781b95605af0545b9d75c928e169063d289d1cb906118ef9086908690600401613ff5565b600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b505050507f192e759e55f359cd9832b5c0c6e38e4b6df5c5ca33f3bd5c90738e865a5218728383604051611952929190613ff5565b60405180910390a1505050565b600081815260016020526040902080546060919061197c90614009565b80601f01602080910402602001604051908101604052809291908181526020018280546119a890614009565b80156119f55780601f106119ca576101008083540402835291602001916119f5565b820191906000526020600020905b8154815290600101906020018083116119d857829003601f168201915b50505050509050919050565b6000611a5d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3546001600160a01b031690565b6001600160a01b03161415611a9e576040517fbf10dd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080611aae84860186614044565b92509250925060006001611b097fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b611b139190613e65565b9050611b66817fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc255565b611b71818585612a7d565b815115610b2b5760405163d289d1cb60e01b81526001600160a01b037f000000000000000000000000ff99b33b97544fb781b95605af0545b9d75c928e169063d289d1cb90611bc49085906004016134ef565b600060405180830381600087803b158015611bde57600080fd5b505af1158015611bf2573d6000803e3d6000fd5b505050507f192e759e55f359cd9832b5c0c6e38e4b6df5c5ca33f3bd5c90738e865a52187282604051611c2591906134ef565b60405180910390a1505050505050565b6000611c887fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b9050611c948133612848565b611cb157604051637bfa4b9f60e01b815260040160405180910390fd5b60008036604051611cc3929190613ba2565b60405180910390209050611cd8828233612857565b15611cf657604051637c9a1cf960e01b815260040160405180910390fd5b611d0382823360016128d5565b60006001611d118484612948565b611d1b9190613e65565b9050611d28838383612957565b611d318361297c565b811015611d40575050506115b2565b866001600160a01b03163f8614611d83576040517f8f84fb2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038816907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28315611e9f576000876001600160a01b0316639ded06df60e01b8787604051602401611de4929190613ff5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611e229190613ace565b600060405180830381855af49150503d8060008114611e5d576040519150601f19603f3d011682016040523d82523d6000602084013e611e62565b606091505b5050905080611e9d576040517f97905dfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b611f16877f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03831617905550565b611f2283836000612957565b6000611f2d8461246d565b905060005b818110156115ac57611f498585611595888561247b565b611f5281613b22565b9050611f32565b611f9b3384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086925061252a915050565b8484604051611fab929190613ba2565b6040518091039020336001600160a01b03167f7e50569d26be643bda7757722291ec66b1be66d8283474ae3fab5a98f878a7a28b8b8b8b8b8b8b8b8b604051611ffc9998979695949392919061410f565b60405180910390a3505050505050505050565b60006120d36104498c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284376000920191909152508c9250612491915050565b9b9a5050505050505050505050565b600081815260036020526040902080546060919061197c90614009565b6000610d8a61053f8361211461546042614177565b612bb6565b6000610d8a61044983612c0b565b60006121a46104498989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a90819084018382808284376000920191909152508a92508991506127ea9050565b98975050505050505050565b3330146121d0576040516314e1dbf760e11b815260040160405180910390fd5b600080808080806121e3888a018a614199565b9550955095509550955095506121fc8787878787612c46565b82846001600160a01b0316887f44e4f8f6bd682c5a3aeba93601ab07cb4d1f21b2aab1ae4880d9577919309aa48989878760405161223d949392919061422b565b60405180910390a4505050505050505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c015b604051602081830303815290604052805190602001209050919050565b6122cc6122b083612c0b565b6000908152600460205260409020805460ff1916831515179055565b5050565b60006122db84611873565b90506001600160a01b038116612306578360405163395d09bf60e11b8152600401610ee991906134ef565b6123238483612314876120ff565b61231e9190613e65565b612c56565b600261232e85612795565b600281111561233f5761233f613cba565b14156123ec576040516001600160a01b0384166024820152604481018390526000906123ab90839063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612cd1565b9050806123e657846040517f90c52ed7000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b506115b2565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490528216906340c10f1990604401600060405180830381600087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b5050505050505050565b6000610d8a61053f83612d7a565b600061248a6102db8484612db5565b9392505050565b60007fb7ad972b71475860613db3ba1fe699b886c878f9002a09250dc25e769eb19a10888888888888886040516020016124d2989796959493929190614264565b604051602081830303815290604052805190602001209050979650505050505050565b60007feee9348b4aaba3647b1612b2724f18e93b9299da26fb321c7b3fda135d7dea87826040516020016122879291906142d7565b600061253583611873565b90506001600160a01b038116612560578260405163395d09bf60e11b8152600401610ee991906134ef565b81612597576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006125a284612795565b9050600060028260028111156125ba576125ba613cba565b1415612618576040516001600160a01b0387166024820152306044820152606481018590526125f69084906323b872dd60e01b90608401612374565b905080610b2b578460405163e217b0ad60e01b8152600401610ee991906134ef565b600182600281111561262c5761262c613cba565b141561267b576040516001600160a01b0387166024820152604481018590526125f69084907f79cc67900000000000000000000000000000000000000000000000000000000090606401612374565b6040517f31eecaf4000000000000000000000000000000000000000000000000000000008152600060048201526127469084906323b872dd60e01b9089906001600160a01b038416906331eecaf49060240160206040518083038186803b1580156126e557600080fd5b505afa1580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271d9190613fad565b6040516001600160a01b0392831660248201529116604482015260648101889052608401612374565b905080612768578460405163e217b0ad60e01b8152600401610ee991906134ef565b6040516308a1eee160e01b8152600060048201526001600160a01b038416906308a1eee19060240161119a565b60006127a361053f83612df7565b6002811115610d8a57610d8a613cba565b6127e16127c688888888888888612491565b6000908152600460205260409020805460ff19166001179055565b50505050505050565b60007f07b0d4304f82012bd3b70b1d531c160e326067c90829e2a3d386722ad10b89c38686868686604051602001612827969594939291906142fd565b60405160208183030381529060405280519060200120905095945050505050565b600061248a6104498484612e2c565b604080517f3ced7a8caf1111e0fbf4b784c5b41aebd0f2389d9f2f64d5c3424aeed3adbd3c602080830191909152818301869052606080830186905284901b6bffffffffffffffffffffffff1916608083015282518083036074018152609490920190925280519101206000906128cd90610449565b949350505050565b604080517f3ced7a8caf1111e0fbf4b784c5b41aebd0f2389d9f2f64d5c3424aeed3adbd3c602080830191909152818301879052606080830187905285901b6bffffffffffffffffffffffff1916608083015282518083036074018152609490920190925280519101206115b2906122b0565b600061248a61053f8484612e7f565b6129776129648484612e7f565b8260009182526020829052604090912055565b505050565b6000610d8a61053f83612ec1565b612996612964836124f5565b7fd99446c1d76385bb5519ccfb5274abcfd5896dfc22405e40010fde217f018a1882826040516129c7929190613aea565b60405180910390a15050565b6122cc6129df83612df7565b8260028111156129f1576129f1613cba565b60009182526020829052604090912055565b6122cc612a0f83612a45565b6000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416179055565b60007fc4e632779a6a7838736dd7e5e6a0eadf171dd37dfb6230720e265576dfcf42bb826040516020016122879291906142d7565b50565b815181811015612aa05760405163f1965a0760e01b815260040160405180910390fd5b81612ad7576040517f1845300d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ae18483612efc565b612aeb8482612f08565b60005b81811015612baf576000848281518110612b0a57612b0a613ab8565b60200260200101519050612b1e8682612848565b15612b60576040517f424926de0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610ee9565b6001600160a01b038116612b875760405163f1965a0760e01b815260040160405180910390fd5b612b92868383612f14565b612b9e86826001612f21565b50612ba881613b22565b9050612aee565b5050505050565b60007f2f8851fe0d6d537e552a4f25b7a3167d48eb1292622c71d84630a2a44757bced8383604051602001612bed9392919061434d565b60405160208183030381529060405280519060200120905092915050565b604080517f957705a374326b30f4a1069c936d736cc9993ed6c820b4e0e2fd94a8beca0d1d6020820152908101829052600090606001612287565b612baf6127c686868686866127ea565b6000612c6183610d7c565b9050600081118015612c7257508082115b15612cab57826040517f037f60e5000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b612977612cbe8461211461546042614177565b8360009182526020829052604090912055565b60006001600160a01b0383163b612cea57506000610d8a565b600080846001600160a01b031684604051612d059190613ace565b6000604051808303816000865af19150503d8060008114612d42576040519150601f19603f3d011682016040523d82523d6000602084013e612d47565b606091505b5091509150818015612d71575080511580612d71575080806020019051810190612d71919061382a565b95945050505050565b604080517f05112ef894367de1270cfae12afcd2285c225830eb8f74e7e938f721bb510cba6020820152908101829052600090606001612287565b604080517ff23ec0bb4210edd5cba85afd05127efcd2fc6a781bfed49188da1081670b22d8602082015290810183905260608101829052600090608001612bed565b60007fa80d2259af55890618ec2eeb3ac72de4bdba22529bb14845d8a3d712d1c3f621826040516020016122879291906142d7565b604080517f63fa879cb478fddf1de08d49e29115fb768866711bc799ff9ab419a7f16c9afb6020820152908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401612bed565b604080517fbaea1c6c0f16a0a340b10a9e980806696a68ddbb5e8361fd64630dd21abf515f602082015290810183905260608101829052600090608001612bed565b604080517f79bd914addd90bd67ad800bf0230bb85ffdef5aeba5fd8249f116d3f17f4fb4b6020820152908101829052600090606001612287565b6122cc61296483612ec1565b6122cc61296483612d7a565b612977612a0f8484612db5565b6129776122b08484612e2c565b6103498061437783390190565b60008083601f840112612f4d57600080fd5b50813567ffffffffffffffff811115612f6557600080fd5b602083019150836020828501011115612f7d57600080fd5b9250929050565b60008060208385031215612f9757600080fd5b823567ffffffffffffffff811115612fae57600080fd5b612fba85828601612f3b565b90969095509350505050565b600080600060408486031215612fdb57600080fd5b833567ffffffffffffffff811115612ff257600080fd5b612ffe86828701612f3b565b909790965060209590950135949350505050565b60006020828403121561302457600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561306c5783516001600160a01b031683529284019291840191600101613047565b50909695505050505050565b600080600080600080600080600060c08a8c03121561309657600080fd5b8935985060208a013567ffffffffffffffff808211156130b557600080fd5b6130c18d838e01612f3b565b909a50985060408c01359150808211156130da57600080fd5b6130e68d838e01612f3b565b909850965060608c0135955060808c013591508082111561310657600080fd5b506131138c828d01612f3b565b9a9d999c50979a9699959894979660a00135949350505050565b6000806000806000806060878903121561314657600080fd5b863567ffffffffffffffff8082111561315e57600080fd5b61316a8a838b01612f3b565b9098509650602089013591508082111561318357600080fd5b61318f8a838b01612f3b565b909650945060408901359150808211156131a857600080fd5b506131b589828a01612f3b565b979a9699509497509295939492505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613206576132066131c7565b604052919050565b600067ffffffffffffffff821115613228576132286131c7565b50601f01601f191660200190565b600082601f83011261324757600080fd5b813561325a6132558261320e565b6131dd565b81815284602083860101111561326f57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561329e57600080fd5b813567ffffffffffffffff8111156132b557600080fd5b6128cd84828501613236565b60008060008060008060006080888a0312156132dc57600080fd5b873567ffffffffffffffff808211156132f457600080fd5b6133008b838c01612f3b565b909950975060208a013591508082111561331957600080fd5b6133258b838c01612f3b565b909750955060408a013591508082111561333e57600080fd5b5061334b8a828b01612f3b565b989b979a50959894979596606090950135949350505050565b6000806000806000806080878903121561337d57600080fd5b86359550602087013567ffffffffffffffff8082111561339c57600080fd5b6133a88a838b01612f3b565b909750955060408901359150808211156133c157600080fd5b506133ce89828a01612f3b565b979a9699509497949695606090950135949350505050565b60008083601f8401126133f857600080fd5b50813567ffffffffffffffff81111561341057600080fd5b6020830191508360208260051b8501011115612f7d57600080fd5b6000806000806040858703121561344157600080fd5b843567ffffffffffffffff8082111561345957600080fd5b613465888389016133e6565b9096509450602087013591508082111561347e57600080fd5b5061348b878288016133e6565b95989497509550505050565b60005b838110156134b257818101518382015260200161349a565b838111156115b25750506000910152565b600081518084526134db816020860160208601613497565b601f01601f19169290920160200192915050565b60208152600061248a60208301846134c3565b6001600160a01b0381168114612a7a57600080fd5b6000806000806060858703121561352d57600080fd5b843561353881613502565b935060208501359250604085013567ffffffffffffffff81111561355b57600080fd5b61348b87828801612f3b565b600080600080600080600080600060a08a8c03121561358557600080fd5b893567ffffffffffffffff8082111561359d57600080fd5b6135a98d838e01612f3b565b909b50995060208c01359150808211156135c257600080fd5b6135ce8d838e01612f3b565b909950975060408c01359150808211156135e757600080fd5b6135f38d838e01612f3b565b909750955060608c013591508082111561360c57600080fd5b506136198c828d01612f3b565b9a9d999c50979a9699959894979660800135949350505050565b60008060008060008060008060008060e08b8d03121561365257600080fd5b8a35995060208b013567ffffffffffffffff8082111561367157600080fd5b61367d8e838f01612f3b565b909b50995060408d013591508082111561369657600080fd5b6136a28e838f01612f3b565b909950975060608d013591506136b782613502565b90955060808c0135945060a08c013590808211156136d457600080fd5b506136e18d828e01612f3b565b9150809450508092505060c08b013590509295989b9194979a5092959850565b600080600080600080600060a0888a03121561371c57600080fd5b87359650602088013567ffffffffffffffff8082111561373b57600080fd5b6137478b838c01612f3b565b909850965060408a013591508082111561376057600080fd5b5061376d8a828b01612f3b565b909550935050606088013561378181613502565b809250506080880135905092959891949750929550565b600080604083850312156137ab57600080fd5b823567ffffffffffffffff808211156137c357600080fd5b6137cf86838701613236565b935060208501359150808211156137e557600080fd5b506137f285828601613236565b9150509250929050565b8281526040602082015260006128cd60408301846134c3565b8051801515811461382557600080fd5b919050565b60006020828403121561383c57600080fd5b61248a82613815565b600067ffffffffffffffff82111561385f5761385f6131c7565b5060051b60200190565b60006138776132558461320e565b905082815283838301111561388b57600080fd5b61248a836020830184613497565b600082601f8301126138aa57600080fd5b815160206138ba61325583613845565b82815260059290921b840181019181810190868411156138d957600080fd5b8286015b8481101561133057805167ffffffffffffffff8111156138fd5760008081fd5b8701603f8101891361390f5760008081fd5b613920898683015160408401613869565b8452509183019183016138dd565b600082601f83011261393f57600080fd5b61248a83835160208501613869565b600082601f83011261395f57600080fd5b8151602061396f61325583613845565b82815260059290921b8401810191818101908684111561398e57600080fd5b8286015b8481101561133057805167ffffffffffffffff8111156139b25760008081fd5b6139c08986838b010161392e565b845250918301918301613992565b600080600080608085870312156139e457600080fd5b8451935060208086015167ffffffffffffffff80821115613a0457600080fd5b818801915088601f830112613a1857600080fd5b8151613a2661325582613845565b81815260059190911b8301840190848101908b831115613a4557600080fd5b938501935b82851015613a6357845182529385019390850190613a4a565b60408b01519098509450505080831115613a7c57600080fd5b613a8889848a01613899565b94506060880151925080831115613a9e57600080fd5b5050613aac8782880161394e565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b60008251613ae0818460208701613497565b9190910192915050565b604081526000613afd60408301856134c3565b90508260208301529392505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613b3657613b36613b0c565b5060010190565b803561382581613502565b600080600060608486031215613b5d57600080fd5b833567ffffffffffffffff811115613b7457600080fd5b613b8086828701613236565b9350506020840135613b9181613502565b929592945050506040919091013590565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b606081526000613bef60608301888a613bb2565b8281036020840152613c02818789613bb2565b90508281036040840152613c17818587613bb2565b9998505050505050505050565b608081526000613c3860808301898b613bb2565b8281036020840152613c4b81888a613bb2565b90508281036040840152613c60818688613bb2565b91505082606083015298975050505050505050565b60008060408385031215613c8857600080fd5b823567ffffffffffffffff811115613c9f57600080fd5b613cab85828601613236565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b600060208284031215613ce257600080fd5b5051919050565b6001600160a01b03831681526040602082015260006128cd60408301846134c3565b60008060408385031215613d1e57600080fd5b613d2783613815565b9150602083015167ffffffffffffffff811115613d4357600080fd5b6137f28582860161392e565b600080600080600080600080610100898b031215613d6c57600080fd5b883567ffffffffffffffff80821115613d8457600080fd5b613d908c838d01613236565b995060208b0135915080821115613da657600080fd5b613db28c838d01613236565b9850613dc060408c01613b3d565b975060608b0135965060808b0135915080821115613ddd57600080fd5b50613dea8b828c01613236565b989b979a50959894979660a0860135965060c08601359560e00135945092505050565b60c081526000613e2060c08301896134c3565b8281036020840152613e3281896134c3565b90508281036040840152613e4681886134c3565b60608401969096525050608081019290925260a0909101529392505050565b60008219821115613e7857613e78613b0c565b500190565b6000808335601e19843603018112613e9457600080fd5b83018035915067ffffffffffffffff821115613eaf57600080fd5b602001915036819003821315612f7d57600080fd5b60008060008060008060c08789031215613edd57600080fd5b863567ffffffffffffffff80821115613ef557600080fd5b613f018a838b01613236565b97506020890135915080821115613f1757600080fd5b50613f2489828a01613236565b955050604087013560ff81168114613f3b57600080fd5b9350606087013592506080870135613f5281613502565b8092505060a087013590509295509295509295565b60a081526000613f7a60a08301886134c3565b8281036020840152613f8c81886134c3565b60ff9690961660408401525050606081019290925260809091015292915050565b600060208284031215613fbf57600080fd5b815161248a81613502565b604081526000613fdd60408301856134c3565b90506001600160a01b03831660208301529392505050565b6020815260006128cd602083018486613bb2565b600181811c9082168061401d57607f821691505b6020821081141561403e57634e487b7160e01b600052602260045260246000fd5b50919050565b60008060006060848603121561405957600080fd5b833567ffffffffffffffff8082111561407157600080fd5b818601915086601f83011261408557600080fd5b8135602061409561325583613845565b82815260059290921b8401810191818101908a8411156140b457600080fd5b948201945b838610156140db5785356140cc81613502565b825294820194908201906140b9565b97505087013594505060408601359150808211156140f857600080fd5b5061410586828701613236565b9150509250925092565b60a08152600061412360a083018b8d613bb2565b8281036020840152614136818a8c613bb2565b9050828103604084015261414b81888a613bb2565b90508281036060840152614160818688613bb2565b9150508260808301529a9950505050505050505050565b60008261419457634e487b7160e01b600052601260045260246000fd5b500490565b60008060008060008060c087890312156141b257600080fd5b863567ffffffffffffffff808211156141ca57600080fd5b6141d68a838b01613236565b975060208901359150808211156141ec57600080fd5b506141f989828a01613236565b955050604087013561420a81613502565b959894975094956060810135955060808101359460a0909101359350915050565b60808152600061423e60808301876134c3565b828103602084015261425081876134c3565b604084019590955250506060015292915050565b60006101008a83528960208401528060408401526142848184018a6134c3565b9050828103606084015261429881896134c3565b90506001600160a01b03871660808401528560a084015282810360c08401526142c181866134c3565b9150508260e08301529998505050505050505050565b828152600082516142ef816020850160208701613497565b919091016020019392505050565b86815285602082015260c06040820152600061431c60c08301876134c3565b828103606084015261432e81876134c3565b6001600160a01b03959095166080840152505060a00152949350505050565b83815260606020820152600061436660608301856134c3565b905082604083015294935050505056fe6080604052600160005534801561001557600080fd5b50610324806100256000396000f3fe608060405234801561001057600080fd5b50600436106100355760003560e01c8062f55d9d1461003a5780631cff79cd1461004f575b600080fd5b61004d6100483660046101da565b610079565b005b61006261005d3660046101fc565b6100bb565b60405161007092919061027f565b60405180910390f35b6002600054141561009d5760405163caa30f5560e01b815260040160405180910390fd5b600260005573ffffffffffffffffffffffffffffffffffffffff8116ff5b60006060600260005414156100e35760405163caa30f5560e01b815260040160405180910390fd5b600260005573ffffffffffffffffffffffffffffffffffffffff85163b610136576040517f6f7c43f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16848460405161015d9291906102de565b6000604051808303816000865af19150503d806000811461019a576040519150601f19603f3d011682016040523d82523d6000602084013e61019f565b606091505b50600160005590969095509350505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101d557600080fd5b919050565b6000602082840312156101ec57600080fd5b6101f5826101b1565b9392505050565b60008060006040848603121561021157600080fd5b61021a846101b1565b9250602084013567ffffffffffffffff8082111561023757600080fd5b818601915086601f83011261024b57600080fd5b81358181111561025a57600080fd5b87602082850101111561026c57600080fd5b6020830194508093505050509250925092565b821515815260006020604081840152835180604085015260005b818110156102b557858101830151858201606001528201610299565b818111156102c7576000606083870101525b50601f01601f191692909201606001949350505050565b818382376000910190815291905056fea264697066735822122032cb5e746816b7fac95205c068b30da37bd40119a57265be331c162cae74712464736f6c63430008090033a26469706673582212204998f838cdcafb3bed81b83a80af25a5eb3725a58bc3781fb9f68ff16718975664736f6c63430008090033

Deployed Bytecode Sourcemap

24777:25649:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35459:2725;;;;;;:::i;:::-;;:::i;:::-;;39991:240;;;;;;:::i;:::-;;:::i;32597:304::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29874:615;;;;;;:::i;:::-;;:::i;:::-;;;3517:14:1;;3510:22;3492:41;;3480:2;3465:18;29874:615:0;3352:187:1;27804:290:0;;;;;;:::i;:::-;;:::i;16135:109::-;;;;;;:::i;:::-;16189:7;16216:20;;;:15;:20;;;;;;-1:-1:-1;;;;;16216:20:0;;16135:109;;;;-1:-1:-1;;;;;4904:55:1;;;4886:74;;4874:2;4859:18;16135:109:0;4740:226:1;30771:149:0;;;;;;:::i;:::-;;:::i;:::-;;;6574:25:1;;;6562:2;6547:18;30771:149:0;6428:177:1;27463:333:0;;;;;;:::i;:::-;;:::i;30653:110::-;30726:29;30653:110;;32209:102;;;:::i;40239:1100::-;;;;;;:::i;:::-;;:::i;42020:930::-;;;;;;:::i;:::-;;:::i;31437:121::-;25356:66;31493:7;16216:20;:15;:20;;;;-1:-1:-1;;;;;16216:20:0;31437:121;32209:102;29455:411;;;;;;:::i;:::-;;:::i;30556:89::-;30626:11;30556:89;;32992:499;;;;;;:::i;:::-;;:::i;16370:100::-;;;;;;:::i;:::-;16421:4;16445:17;;;:12;:17;;;;;;;;;16370:100;31888:105;;;;;;:::i;:::-;-1:-1:-1;31956:4:0;;31888:105;38272:1711;;;;;;:::i;:::-;;:::i;32387:131::-;;;;;;:::i;:::-;;:::i;31566:150::-;;;;;;:::i;:::-;;:::i;42958:231::-;;;;;;:::i;:::-;;:::i;16014:113::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34583:868::-;;;;;;:::i;:::-;;:::i;33499:917::-;;;;;;:::i;:::-;;:::i;31333:96::-;31392:4;31333:96;;28102:435;;;;;;:::i;:::-;;:::i;28933:514::-;;;;;;:::i;:::-;;:::i;15903:103::-;;;;;;:::i;:::-;15954:7;15981:17;;;;;;;;;;;;15903:103;16252:110;;;;;;:::i;:::-;;:::i;30928:233::-;;;;;;:::i;:::-;;:::i;32001:152::-;;;;;;:::i;:::-;;:::i;16478:100::-;;;;;;:::i;:::-;16528:6;16554:16;;;:11;:16;;;;;;;16478:100;28545:380;;;;;;:::i;:::-;;:::i;41347:665::-;;;;;;:::i;:::-;;:::i;35459:2725::-;35528:17;;35569:33;;;;35580:5;35569:33;:::i;:::-;35527:75;;;;35615:19;35637:45;35676:4;35666:15;;;;;;35637:28;:45::i;:::-;35615:67;;35742:30;35787:11;-1:-1:-1;;;;;35775:38:0;;35814:11;35827:5;35775:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35742:91;;35846:15;35872:27;35910:24;35945:21;36032:4;36021:57;;;;;;;;;;;;:::i;:::-;35979:99;;-1:-1:-1;35979:99:0;;-1:-1:-1;35979:99:0;-1:-1:-1;35979:99:0;-1:-1:-1;36106:13:0;36095:24;;36091:53;;36128:16;;;;;;;;;;;;;;36091:53;36182:17;;36234:15;;36216:33;;;;:68;;;36271:6;:13;36253:14;:31;;36216:68;36212:98;;;36293:17;;;;;;;;;;;;;;36212:98;36328:9;36323:1854;36343:14;36339:1;:18;36323:1854;;;36379:17;36399:10;36410:1;36399:13;;;;;;;;:::i;:::-;;;;;;;36379:33;;36433:28;36451:9;36433:17;:28::i;:::-;36429:42;;;36463:8;;;36429:42;36533:22;36570:19;36619:8;36628:1;36619:11;;;;;;;;:::i;:::-;;;;;;;36602:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;36592:40;;;;;;36570:62;;26276:24;36653:11;:36;36649:1069;;;36728:34;;-1:-1:-1;36649:1069:0;;;26355:22;36788:11;:34;36784:934;;;36861:32;;-1:-1:-1;36784:934:0;;;26443:32;36919:11;:45;36915:803;;;37003:42;;-1:-1:-1;36915:803:0;;;26551:40;37071:11;:55;37067:651;;;37165:50;;-1:-1:-1;37067:651:0;;;26197:22;37241:11;:34;37237:481;;;37314:32;;-1:-1:-1;37237:481:0;;;26657:33;37372:11;:45;37368:350;;;37443:25;37438:40;;37470:8;;;;;37438:40;37527:5;;-1:-1:-1;37569:43:0;;-1:-1:-1;37368:350:0;;;37653:8;;;;;37368:350;37839:36;37859:9;37870:4;37839:19;:36::i;:::-;37955:12;37981:4;-1:-1:-1;;;;;37973:18:0;38015:15;38032:6;38039:1;38032:9;;;;;;;;:::i;:::-;;;;;;;38043;37992:61;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;37992:61:0;;;;;;;;;;;;;;-1:-1:-1;;;;;37992:61:0;-1:-1:-1;;;;;;37992:61:0;;;;;;;;;;37973:81;;;;37992:61;37973:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37954:100;;;38075:7;38071:94;;;38089:19;;38098:9;;38089:19;;;;;38071:94;;;38128:37;38148:9;38159:5;38128:19;:37::i;:::-;36364:1813;;;;36323:1854;36359:3;;;:::i;:::-;;;36323:1854;;;;35516:2668;;;;;;;;;35459:2725;;:::o;39991:240::-;27308:10;27330:4;27308:27;27304:49;;27344:9;;-1:-1:-1;;;27344:9:0;;;;;;;;;;;27304:49;40072:20:::1;::::0;;40129:46:::1;::::0;;::::1;40140:6:::0;40129:46:::1;:::i;:::-;40071:104;;;;;;40188:35;40199:6;40207:7;40216:6;40188:10;:35::i;:::-;40060:171;;;39991:240:::0;;;:::o;32597:304::-;32660:24;32697:18;32718:21;32733:5;32718:14;:21::i;:::-;32697:42;;32774:10;32760:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32760:25:0;;32750:35;;32803:9;32798:96;32818:10;32814:1;:14;32798:96;;;32863:19;32873:5;32880:1;32863:9;:19::i;:::-;32850:7;32858:1;32850:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32850:32:0;;;:10;;;;;;;;;;;:32;32830:3;;;:::i;:::-;;;32798:96;;;;32686:215;32597:304;;;:::o;29874:615::-;30139:10;30162:11;30176:117;30214:9;30225:11;;30176:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30176:117:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30238:13:0;;-1:-1:-1;30238:13:0;;;;30176:117;;30238:13;;;;30176:117;;;;;;;;;-1:-1:-1;;30176:117:0;;;;;;;;;;;;;;;;;;;;;;30253:10;;-1:-1:-1;30265:11:0;;-1:-1:-1;30176:117:0;30278:6;;;;;;30176:117;;30278:6;;;;30176:117;;;;;;;;;-1:-1:-1;30286:6:0;;-1:-1:-1;30176:37:0;;-1:-1:-1;;30176:117:0:i;:::-;16421:4;16445:17;;;:12;:17;;;;;;;;;-1:-1:-1;16445:17:0;-1:-1:-1;30335:147:0;;;;30411:5;17131:17;;;:12;:17;;;;;:25;;-1:-1:-1;;17131:25:0;;;30432:38;30443:6;;30432:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30451:10:0;;-1:-1:-1;30463:6:0;;-1:-1:-1;30432:10:0;;-1:-1:-1;30432:38:0:i;:::-;30151:338;29874:615;;;;;;;;;;;:::o;27804:290::-;28068:7;;28058:18;;;;;;;:::i;:::-;;;;;;;;28000:10;-1:-1:-1;;;;;27987:99:0;;28012:16;;28030:26;;28078:7;;27987:99;;;;;;;;;;;:::i;:::-;;;;;;;;27804:290;;;;;;:::o;30771:149::-;30847:7;30874:38;30882:29;30904:6;30882:21;:29::i;30874:38::-;30867:45;30771:149;-1:-1:-1;;30771:149:0:o;27463:333::-;27655:42;27670:10;27682:6;;27655:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27690:6:0;;-1:-1:-1;27655:14:0;;-1:-1:-1;;27655:42:0:i;:::-;27723:10;-1:-1:-1;;;;;27713:75:0;;27735:16;;27753:18;;27773:6;;27781;27713:75;;;;;;;;;;;;:::i;:::-;;;;;;;;27463:333;;;;;;;:::o;32209:102::-;32263:7;32290:13;18250:24;21329:7;15981:17;;;;;;;;32209:102;32290:13;32283:20;;32209:102;:::o;40239:1100::-;27308:10;27330:4;27308:27;27304:49;;27344:9;;-1:-1:-1;;;27344:9:0;;;;;;;;;;;27304:49;40320:20:::1;::::0;40358:37:::1;::::0;;::::1;40369:6:::0;40358:37:::1;:::i;:::-;40319:76;;;;40408:20;40431:22;40446:6;40431:14;:22::i;:::-;40408:45:::0;-1:-1:-1;;;;;;40470:26:0;::::1;40466:64;;40523:6;40505:25;;-1:-1:-1::0;;;40505:25:0::1;;;;;;;;:::i;:::-;;;;;;;;40466:64;40572:18;40547:21;40561:6;40547:13;:21::i;:::-;:43;;;;;;;;:::i;:::-;;40543:789;;;40607:29;40665:4;40639:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;40868:55:0::1;::::0;;;;-1:-1:-1;;;;;40732:22:0;;::::1;40868:55;::::0;::::1;4886:74:1::0;;;40607:66:0;;-1:-1:-1;40691:12:0::1;::::0;;;40732:22;;::::1;::::0;40773:12;;-1:-1:-1;;;40827:24:0;40861:4:::1;::::0;40868:30;::::1;::::0;::::1;::::0;4859:18:1;;40868:55:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40804:120;::::0;-1:-1:-1;;;;;25692:55:1;;;40804:120:0::1;::::0;::::1;25674:74:1::0;25764:18;;;25757:34;25647:18;;40804:120:0::1;::::0;;-1:-1:-1;;40804:120:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;40804:120:0::1;-1:-1:-1::0;;;;;;40804:120:0;;::::1;;::::0;;40732:207;::::1;::::0;;;;;;;;::::1;::::0;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;40732:207:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;40690:249;;;;40961:7;40960:8;:80;;;-1:-1:-1::0;40973:17:0;;:31;;::::1;::::0;:66:::1;;;41020:10;41009:30;;;;;;;;;;;;:::i;:::-;41008:31;40973:66;40956:111;;;41060:6;41049:18;;-1:-1:-1::0;;;41049:18:0::1;;;;;;;;:::i;40956:111::-;41197:37;::::0;;;;41228:4:::1;41197:37;::::0;::::1;4886:74:1::0;-1:-1:-1;;;;;41197:22:0;::::1;::::0;::::1;::::0;4859:18:1;;41197:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40592:654;;;40543:789;;;41267:53;::::0;-1:-1:-1;;;41267:53:0;;::::1;::::0;::::1;6574:25:1::0;;;-1:-1:-1;;;;;41267:47:0;::::1;::::0;::::1;::::0;6547:18:1;;41267:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40308:1031;;;40239:1100:::0;;;:::o;42020:930::-;27308:10;27330:4;27308:27;27304:49;;27344:9;;-1:-1:-1;;;27344:9:0;;;;;;;;;;;27304:49;42143:25:::1;::::0;;;;;;;42434:89:::1;::::0;;::::1;42445:6:::0;42434:89:::1;:::i;:::-;42128:395;;;;;;;;;;;;;;;;42536:117;42569:9;42580:11;42593:13;42608:15;42625:11;42638:6;42646;42536:32;:117::i;:::-;42820:11;42790:15;-1:-1:-1::0;;;;;42669:273:0::1;42712:9;42669:273;42736:11;42762:13;42846:6;42867;42888:12;42915:16;42669:273;;;;;;;;;;;:::i;:::-;;;;;;;;42117:833;;;;;;;;42020:930:::0;;;:::o;29455:411::-;29655:10;29678:11;29692:93;29722:9;29733:11;;29692:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29692:93:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29746:13:0;;-1:-1:-1;29746:13:0;;;;29692:93;;29746:13;;;;29692:93;;;;;;;;;-1:-1:-1;29761:10:0;;-1:-1:-1;29773:11:0;;-1:-1:-1;29692:29:0;;-1:-1:-1;29692:93:0:i;:::-;16421:4;16445:17;;;:12;:17;;;;;;;;;-1:-1:-1;16445:17:0;-1:-1:-1;29827:31:0;;;;29852:5;17131:17;;;:12;:17;;;;;:25;;-1:-1:-1;;17131:25:0;;;29838:20;29667:199;29455:411;;;;;;;;:::o;32992:499::-;18900:18;18921:13;18250:24;21329:7;15981:17;;;;;;;;32209:102;18921:13;18900:34;;18952:32;18961:10;18973;18952:8;:32::i;:::-;18947:56;;18993:10;;-1:-1:-1;;;18993:10:0;;;;;;;;;;;18947:56;19016:13;19042:8;;19032:19;;;;;;;:::i;:::-;;;;;;;;19016:35;;19146:40;19156:10;19168:5;19175:10;19146:9;:40::i;:::-;19142:67;;;19195:14;;-1:-1:-1;;;19195:14:0;;;;;;;;;;;19142:67;19222:49;19235:10;19247:5;19254:10;19266:4;19222:12;:49::i;:::-;19340:22;19408:1;19365:32;19379:10;19391:5;19365:13;:32::i;:::-;:45;;;;:::i;:::-;19340:70;;19421:48;19435:10;19447:5;19454:14;19421:13;:48::i;:::-;19578:30;19597:10;19578:18;:30::i;:::-;19561:14;:47;19557:60;;;19610:7;;;;;19557:60;33117:31;;::::1;33113:72;;33157:28;;;;;;;;;;;;;;33113:72;33203:9;33198:286;33218:18:::0;;::::1;33198:286;;;33258:20;33281:7;;33289:1;33281:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;33258:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;33258:33:0;;-1:-1:-1;33322:6:0;;-1:-1:-1;33322:6:0;;-1:-1:-1;33329:1:0;;-1:-1:-1;33322:9:0;;::::1;;;;;:::i;:::-;;;;;;;33306:25;;33386:1;-1:-1:-1::0;;;;;33352:36:0::1;:22;33367:6;33352:14;:22::i;:::-;-1:-1:-1::0;;;;;33352:36:0::1;;33348:74;;;33415:6;33397:25;;-1:-1:-1::0;;;33397:25:0::1;;;;;;;;:::i;33348:74::-;33439:33;33458:6;33466:5;33439:18;:33::i;:::-;33243:241;;33238:3;;;;;:::i;:::-;;;;33198:286;;;;19692:44:::0;19706:10;19718:5;19733:1;19692:13;:44::i;:::-;19749:18;19770:26;19785:10;19770:14;:26::i;:::-;19749:47;;19814:9;19809:128;19829:10;19825:1;:14;19809:128;;;19861:64;19874:10;19886:5;19893:24;19903:10;19915:1;19893:9;:24::i;:::-;19919:5;19861:12;:64::i;:::-;19841:3;;;:::i;:::-;;;19809:128;;;;18889:1055;;;;32992:499;;;;;:::o;38272:1711::-;27308:10;27330:4;27308:27;27304:49;;27344:9;;-1:-1:-1;;;27344:9:0;;;;;;;;;;;27304:49;38355:18:::1;::::0;;;;;38469:107:::1;::::0;;::::1;38494:6:::0;38469:107:::1;:::i;:::-;38354:222;;;;;;;;;;;;38683:1;-1:-1:-1::0;;;;;38649:36:0::1;:22;38664:6;38649:14;:22::i;:::-;-1:-1:-1::0;;;;;38649:36:0::1;;38645:75;;38713:6;38694:26;;;;;;;;;;;:::i;38645:75::-;-1:-1:-1::0;;;;;38737:26:0;::::1;38733:1091;;38868:12;38910:6;38893:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;38883:35;;;;;;38868:50;;39000:12;39014:17:::0;39035:29:::1;-1:-1:-1::0;;;;;39035:42:0::1;39119:35;;;39156:4;39162:6;39170:8;39180:3;39185:4;39096:94;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;39096:94:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;39096:94:0::1;-1:-1:-1::0;;;;;;39096:94:0;;::::1;::::0;;;::::1;::::0;;;39035:170;;::::1;::::0;39096:94;39035:170:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38999:206;;;;39227:7;39222:46;;39261:6;39243:25;;;;;;;;;;;:::i;39222:46::-;39311:4;39300:27;;;;;;;;;;;;:::i;:::-;39285:42;;39344:53;39358:6;39366:30;39344:13;:53::i;:::-;38765:644;;;38733:1091;;;-1:-1:-1::0;;;;;39538:24:0;::::1;;39534:90;;39585:39;::::0;::::1;::::0;;-1:-1:-1;;;;;4904:55:1;;39585:39:0::1;::::0;::::1;4886:74:1::0;4859:18;;39585:39:0::1;4740:226:1::0;39534:90:0::1;39771:41;39785:6;39793:18;39771:13;:41::i;:::-;39836:38;39853:6;39861:12;39836:16;:38::i;:::-;39885:37;39904:6;39912:9;39885:18;:37::i;:::-;39940:35;39954:6;39962:12;39940:35;;;;;;;:::i;:::-;;;;;;;;38343:1640;;;;;;38272:1711:::0;;;:::o;32387:131::-;32458:7;32485:25;32504:5;32485:18;:25::i;31566:150::-;31642:7;31669:39;31680:27;31700:6;31680:19;:27::i;42958:231::-;27308:10;27330:4;27308:27;27304:49;;27344:9;;-1:-1:-1;;;27344:9:0;;;;;;;;;;;27304:49;43059:63:::1;::::0;-1:-1:-1;;;43059:63:0;;-1:-1:-1;;;;;43071:11:0::1;43059:45;::::0;::::1;::::0;:63:::1;::::0;43105:16;;;;43059:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43140:41;43164:16;;43140:41;;;;;;;:::i;:::-;;;;;;;;42958:231:::0;;;:::o;16014:113::-;16100:19;;;;:14;:19;;;;;16093:26;;16067:13;;16100:19;16093:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16014:113;;;:::o;34583:868::-;34763:1;34735:16;25356:66;31493:7;16216:20;:15;:20;;;;-1:-1:-1;;;;;16216:20:0;;32209:102;34735:16;-1:-1:-1;;;;;34735:30:0;;34731:53;;;34774:10;;;;;;;;;;;;;;34731:53;34798:31;;;34891:84;;;;34916:6;34891:84;:::i;:::-;34797:178;;;;;;35083:21;35131:1;35107:13;18250:24;21329:7;15981:17;;;;;;;;32209:102;35107:13;:26;;;;:::i;:::-;35083:50;;35144:29;35159:13;18250:24;16683:12;:17;;;;;;:25;22480:109;35144:29;35184:60;35195:13;35210:14;35226:17;35184:10;:60::i;:::-;35261:23;;:28;35257:187;;35306:63;;-1:-1:-1;;;35306:63:0;;-1:-1:-1;;;;;35318:11:0;35306:45;;;;:63;;35352:16;;35306:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35391:41;35415:16;35391:41;;;;;;:::i;:::-;;;;;;;;34639:812;;;;34583:868;;:::o;33499:917::-;18900:18;18921:13;18250:24;21329:7;15981:17;;;;;;;;32209:102;18921:13;18900:34;;18952:32;18961:10;18973;18952:8;:32::i;:::-;18947:56;;18993:10;;-1:-1:-1;;;18993:10:0;;;;;;;;;;;18947:56;19016:13;19042:8;;19032:19;;;;;;;:::i;:::-;;;;;;;;19016:35;;19146:40;19156:10;19168:5;19175:10;19146:9;:40::i;:::-;19142:67;;;19195:14;;-1:-1:-1;;;19195:14:0;;;;;;;;;;;19142:67;19222:49;19235:10;19247:5;19254:10;19266:4;19222:12;:49::i;:::-;19340:22;19408:1;19365:32;19379:10;19391:5;19365:13;:32::i;:::-;:45;;;;:::i;:::-;19340:70;;19421:48;19435:10;19447:5;19454:14;19421:13;:48::i;:::-;19578:30;19597:10;19578:18;:30::i;:::-;19561:14;:47;19557:60;;;19610:7;;;;;19557:60;33712:17:::1;-1:-1:-1::0;;;;;33712:26:0::1;;33683:25;:55;33679:85;;33747:17;;;;;;;;;;;;;;33679:85;33782:27;::::0;-1:-1:-1;;;;;33782:27:0;::::1;::::0;::::1;::::0;;;::::1;34075:23:::0;;34071:288:::1;;34180:12;34198:17;-1:-1:-1::0;;;;;34198:30:0::1;34252:29;;;34283:11;;34229:66;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;34229:66:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;34229:66:0::1;-1:-1:-1::0;;;;;;34229:66:0;;::::1;::::0;;;::::1;::::0;;;34198:98;;::::1;::::0;34229:66;34198:98:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34179:117;;;34318:7;34313:34;;34334:13;;;;;;;;;;;;;;34313:34;34100:259;34071:288;34371:37;34390:17;25356:66:::0;16910:20;;:15;:20;;;:28;;-1:-1:-1;;16910:28:0;-1:-1:-1;;;;;16910:28:0;;;;;22480:109;;34371:37:::1;19692:44:::0;19706:10;19718:5;19733:1;19692:13;:44::i;:::-;19749:18;19770:26;19785:10;19770:14;:26::i;:::-;19749:47;;19814:9;19809:128;19829:10;19825:1;:14;19809:128;;;19861:64;19874:10;19886:5;19893:24;19903:10;19915:1;19893:9;:24::i;19861:64::-;19841:3;;;:::i;:::-;;;19809:128;;28102:435;28347:42;28362:10;28374:6;;28347:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28382:6:0;;-1:-1:-1;28347:14:0;;-1:-1:-1;;28347:42:0:i;:::-;28495:7;;28485:18;;;;;;;:::i;:::-;;;;;;;;28427:10;-1:-1:-1;;;;;28405:124:0;;28439:16;;28457:26;;28505:7;;28514:6;;28522;28405:124;;;;;;;;;;;;;;:::i;:::-;;;;;;;;28102:435;;;;;;;;;:::o;28933:514::-;29239:4;29276:163;29302:122;29340:9;29351:11;;29302:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29364:13;;29302:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29302:122:0;;;;;;;;;;;;;;;;;;;;;;29379:15;;-1:-1:-1;29396:11:0;;-1:-1:-1;29302:122:0;29409:6;;;;;;29302:122;;29409:6;;;;29302:122;;;;;;;;;-1:-1:-1;29417:6:0;;-1:-1:-1;29302:37:0;;-1:-1:-1;;29302:122:0:i;29276:163::-;29256:183;28933:514;-1:-1:-1;;;;;;;;;;;28933:514:0:o;16252:110::-;16336:18;;;;:13;:18;;;;;16329:25;;16304:12;;16336:18;16329:25;;;:::i;30928:233::-;31005:7;31087:66;31095:57;31118:6;31126:25;31144:7;31126:15;:25;:::i;:::-;31095:22;:57::i;32001:152::-;32077:4;32101:44;32109:35;32134:9;32109:24;:35::i;28545:380::-;28786:4;28810:107;28818:98;28848:9;28859:11;;28818:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28818:98:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28872:13:0;;-1:-1:-1;28872:13:0;;;;28818:98;;28872:13;;;;28818:98;;;;;;;;;-1:-1:-1;28887:15:0;;-1:-1:-1;28904:11:0;;-1:-1:-1;28818:29:0;;-1:-1:-1;28818:98:0:i;28810:107::-;28803:114;28545:380;-1:-1:-1;;;;;;;;28545:380:0:o;41347:665::-;27308:10;27330:4;27308:27;27304:49;;27344:9;;-1:-1:-1;;;27344:9:0;;;;;;;;;;;27304:49;41462:25:::1;::::0;;;;;41689:72:::1;::::0;;::::1;41700:6:::0;41689:72:::1;:::i;:::-;41447:314;;;;;;;;;;;;41774:93;41799:9;41810:11;41823:13;41838:15;41855:11;41774:24;:93::i;:::-;41960:11;41943:15;-1:-1:-1::0;;;;;41883:121:0::1;41904:9;41883:121;41915:11;41928:13;41973:12;41987:16;41883:121;;;;;;;;;:::i;:::-;;;;;;;;41436:576;;;;;;41347:665:::0;;;:::o;14080:269::-;14282:58;;36300:66:1;14282:58:0;;;36288:79:1;36383:12;;;36376:28;;;14149:7:0;;36420:12:1;;14282:58:0;;;;;;;;;;;;;14272:69;;;;;;14265:76;;14080:269;;;:::o;49297:146::-;49380:55;49389:35;49414:9;49389:24;:35::i;:::-;17131:17;;;;:12;:17;;;;;:25;;-1:-1:-1;;17131:25:0;;;;;;;17068:96;49380:55;49297:146;;:::o;43680:685::-;43809:20;43832:22;43847:6;43832:14;:22::i;:::-;43809:45;-1:-1:-1;;;;;;43871:26:0;;43867:64;;43924:6;43906:25;;-1:-1:-1;;;43906:25:0;;;;;;;;:::i;43867:64::-;43944:61;43964:6;43998;43972:23;43988:6;43972:15;:23::i;:::-;:32;;;;:::i;:::-;43944:19;:61::i;:::-;44047:18;44022:21;44036:6;44022:13;:21::i;:::-;:43;;;;;;;;:::i;:::-;;44018:340;;;44127:65;;-1:-1:-1;;;;;25692:55:1;;44127:65:0;;;25674:74:1;25764:18;;;25757:34;;;44082:12:0;;44097:96;;44113:12;;-1:-1:-1;;;44150:24:0;25647:18:1;;44127:65:0;;;;-1:-1:-1;;44127:65:0;;;;;;;;;;;;;;-1:-1:-1;;;;;44127:65:0;-1:-1:-1;;;;;;44127:65:0;;;;;;;;;;44097:15;:96::i;:::-;44082:111;;44215:7;44210:39;;44242:6;44231:18;;;;;;;;;;;:::i;44210:39::-;44067:194;44018:340;;;44282:64;;;;;-1:-1:-1;;;;;25692:55:1;;;44282:64:0;;;25674:74:1;25764:18;;;25757:34;;;44282:47:0;;;;;25647:18:1;;44282:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43798:567;43680:685;;;:::o;21559:140::-;21626:7;21653:38;21661:29;21679:10;21661:17;:29::i;21396:155::-;21473:7;21500:43;21511:31;21524:10;21536:5;21511:12;:31::i;21500:43::-;21493:50;21396:155;-1:-1:-1;;;21396:155:0:o;47372:713::-;47671:7;25917:45;47834:9;47866:11;47900:13;47936:15;47974:11;48008:6;48037;47739:323;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47711:366;;;;;;47691:386;;47372:713;;;;;;;;;:::o;45994:171::-;46070:7;26021:29;46149:6;46107:49;;;;;;;;;:::i;44373:1527::-;44505:20;44528:22;44543:6;44528:14;:22::i;:::-;44505:45;-1:-1:-1;;;;;;44567:26:0;;44563:64;;44620:6;44602:25;;-1:-1:-1;;;44602:25:0;;;;;;;;:::i;44563:64::-;44642:11;44638:39;;44662:15;;;;;;;;;;;;;;44638:39;44690:19;44712:21;44726:6;44712:13;:21::i;:::-;44690:43;-1:-1:-1;44744:16:0;44790:18;44777:9;:31;;;;;;;;:::i;:::-;;44773:324;;;44904:83;;-1:-1:-1;;;;;38058:15:1;;44904:83:0;;;38040:34:1;44973:4:0;38090:18:1;;;38083:43;38142:18;;;38135:34;;;44839:163:0;;44873:12;;-1:-1:-1;;;44927:28:0;37952:18:1;;44904:83:0;37777:398:1;44839:163:0;44825:177;;45024:11;45019:43;;45055:6;45044:18;;-1:-1:-1;;;45044:18:0;;;;;;;;:::i;44773:324::-;45126:30;45113:9;:43;;;;;;;;:::i;:::-;;45109:339;;;45252:86;;-1:-1:-1;;;;;25692:55:1;;45252:86:0;;;25674:74:1;25764:18;;;25757:34;;;45187:166:0;;45221:12;;45275:46;;25647:18:1;;45252:86:0;25500:297:1;45109:339:0;45644:69;;;;;45710:1;45644:69;;;6574:25:1;45474:290:0;;45504:12;;-1:-1:-1;;;45572:28:0;45619:6;;-1:-1:-1;;;;;45644:57:0;;;;;6547:18:1;;45644:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45531:222;;-1:-1:-1;;;;;38058:15:1;;;45531:222:0;;;38040:34:1;38110:15;;38090:18;;;38083:43;38142:18;;;38135:34;;;37952:18;;45531:222:0;37777:398:1;45474:290:0;45460:304;;45782:11;45777:43;;45813:6;45802:18;;-1:-1:-1;;;45802:18:0;;;;;;;;:::i;45777:43::-;45833:59;;-1:-1:-1;;;45833:59:0;;45889:1;45833:59;;;6574:25:1;-1:-1:-1;;;;;45833:47:0;;;;;6547:18:1;;45833:59:0;6428:177:1;48179:149:0;48247:9;48286:33;48294:24;48311:6;48294:16;:24::i;48286:33::-;48276:44;;;;;;;;:::i;49808:474::-;50099:175;50122:122;50160:9;50171:11;50184:13;50199:15;50216:11;50229:6;50237;50122:37;:122::i;:::-;17131:17;;;;:12;:17;;;;;:25;;-1:-1:-1;;17131:25:0;50259:4;17131:25;;;17068:96;50099:175;49808:474;;;;;;;:::o;46973:391::-;47208:7;25807:35;47287:9;47298:11;47311:13;47326:15;47343:11;47245:110;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47235:121;;;;;;47228:128;;46973:391;;;;;;;:::o;22259:154::-;22337:4;22361:44;22369:35;22384:10;22396:7;22369:14;:35::i;22037:214::-;20951:64;;;18650:24;20951:64;;;;41222:19:1;;;;41257:12;;;41250:28;;;41294:12;;;;41287:28;;;41349:15;;;-1:-1:-1;;41345:53:1;41331:12;;;41324:75;20951:64:0;;;;;;;;;41415:13:1;;;;20951:64:0;;;20941:75;;;;;-1:-1:-1;;22189:54:0;;22197:45;20778:246;22189:54;22182:61;22037:214;-1:-1:-1;;;;22037:214:0:o;24312:219::-;20951:64;;;18650:24;20951:64;;;;41222:19:1;;;;41257:12;;;41250:28;;;41294:12;;;;41287:28;;;41349:15;;;-1:-1:-1;;41345:53:1;41331:12;;;41324:75;20951:64:0;;;;;;;;;41415:13:1;;;;20951:64:0;;;20941:75;;;;;24461:62;;24470:45;20778:246;21863:166;21944:7;21971:50;21979:41;22002:10;22014:5;21979:22;:41::i;24103:201::-;24234:62;24243:41;24266:10;24278:5;24243:22;:41::i;:::-;24286:9;16683:12;:17;;;;;;;;;;;:25;16617:99;24234:62;24103:201;;;:::o;21707:148::-;21778:7;21805:42;21813:33;21835:10;21813:21;:33::i;48422:193::-;48507:46;48516:29;48538:6;48516:21;:29::i;48507:46::-;48571:36;48593:6;48601:5;48571:36;;;;;;;:::i;:::-;;;;;;;;48422:193;;:::o;48981:148::-;49067:54;49076:24;49093:6;49076:16;:24::i;:::-;49110:9;49102:18;;;;;;;;:::i;:::-;16683:12;:17;;;;;;;;;;;:25;16617:99;49137:152;49227:54;49239:27;49259:6;49239:19;:27::i;:::-;16910:20;;;;:15;:20;;;;;:28;;-1:-1:-1;;16910:28:0;-1:-1:-1;;;;;16910:28:0;;;;;16841:105;46617:166;46691:7;25640:26;46767:6;46728:46;;;;;;;;;:::i;22544:37::-;22480:109;:::o;22942:986::-;23104:15;;23136:23;;;23132:51;;;23168:15;;-1:-1:-1;;;23168:15:0;;;;;;;;;;;23132:51;23200:23;23196:59;;23232:23;;;;;;;;;;;;;;23196:59;23268:41;23287:10;23299:9;23268:18;:41::i;:::-;23320:39;23335:10;23347:11;23320:14;:39::i;:::-;23377:9;23372:549;23392:11;23388:1;:15;23372:549;;;23425:15;23443:8;23452:1;23443:11;;;;;;;;:::i;:::-;;;;;;;23425:29;;23561;23570:10;23582:7;23561:8;:29::i;:::-;23557:65;;;23599:23;;;;;-1:-1:-1;;;;;4904:55:1;;23599:23:0;;;4886:74:1;4859:18;;23599:23:0;4740:226:1;23557:65:0;-1:-1:-1;;;;;23643:21:0;;23639:49;;23673:15;;-1:-1:-1;;;23673:15:0;;;;;;;;;;;23639:49;23823:33;23833:10;23845:1;23848:7;23823:9;:33::i;:::-;23871:38;23883:10;23895:7;23904:4;23871:11;:38::i;:::-;-1:-1:-1;23405:3:0;;;:::i;:::-;;;23372:549;;;;23071:857;22942:986;;;:::o;46173:268::-;46263:7;26110:30;46420:6;46428:3;46383:49;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46373:60;;;;;;46366:67;;46173:268;;;;:::o;46791:174::-;46904:52;;;25555:29;46904:52;;;39981:19:1;40016:12;;;40009:28;;;46867:7:0;;40053:12:1;;46904:52:0;39824:247:1;49451:349:0;49678:114;49687:98;49717:9;49728:11;49741:13;49756:15;49773:11;49687:29;:98::i;48623:350::-;48710:13;48726:22;48741:6;48726:14;:22::i;:::-;48710:38;;48771:1;48763:5;:9;:27;;;;;48785:5;48776:6;:14;48763:27;48759:63;;;48815:6;48799:23;;;;;;;;;;;:::i;48759:63::-;48890:75;48899:57;48922:6;48930:25;48948:7;48930:15;:25;:::i;48899:57::-;48958:6;16683:12;:17;;;;;;;;;;;:25;16617:99;43283:389;43371:4;-1:-1:-1;;;;;43392:24:0;;;43388:47;;-1:-1:-1;43430:5:0;43423:12;;43388:47;43509:12;43523:23;43550:12;-1:-1:-1;;;;;43550:17:0;43568:8;43550:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43508:69;;;;43595:7;:69;;;;-1:-1:-1;43607:17:0;;:22;;:56;;;43644:10;43633:30;;;;;;;;;;;;:::i;:::-;43588:76;43283:389;-1:-1:-1;;;;;43283:389:0:o;20221:164::-;20328:48;;;18396:24;20328:48;;;39981:19:1;40016:12;;;40009:28;;;20291:7:0;;40053:12:1;;20328:48:0;39824:247:1;20038:175:0;20155:49;;;18324:18;20155:49;;;40513:19:1;40548:12;;;40541:28;;;40585:12;;;40578:28;;;20118:7:0;;40622:12:1;;20155:49:0;40328:312:1;46449:160:0;46520:7;25719:23;46593:6;46557:43;;;;;;;;;:::i;21032:184::-;21153:54;;;18725:21;21153:54;;;40830:19:1;40865:12;;;40858:28;;;40924:2;40920:15;;;-1:-1:-1;;40916:53:1;40902:12;;;40895:75;-1:-1:-1;;40986:12:1;;21153:54:0;40645:359:1;20573:197:0;20700:61;;;18566:30;20700:61;;;40513:19:1;40548:12;;;40541:28;;;40585:12;;;40578:28;;;20663:7:0;;40622:12:1;;20700:61:0;40328:312:1;20393:172:0;20504:52;;;18478:28;20504:52;;;39981:19:1;40016:12;;;40009:28;;;20467:7:0;;40053:12:1;;20504:52:0;39824:247:1;23936:159:0;24028:59;24037:33;24059:10;24037:21;:33::i;22791:143::-;22875:51;22884:29;22902:10;22884:17;:29::i;22597:186::-;22722:53;22734:31;22747:10;22759:5;22734:12;:31::i;24539:188::-;24665:54;24674:35;24689:10;24701:7;24674:14;:35::i;-1:-1:-1:-;;;;;;;;:::o;14:347:1:-;65:8;75:6;129:3;122:4;114:6;110:17;106:27;96:55;;147:1;144;137:12;96:55;-1:-1:-1;170:20:1;;213:18;202:30;;199:50;;;245:1;242;235:12;199:50;282:4;274:6;270:17;258:29;;334:3;327:4;318:6;310;306:19;302:30;299:39;296:59;;;351:1;348;341:12;296:59;14:347;;;;;:::o;366:409::-;436:6;444;497:2;485:9;476:7;472:23;468:32;465:52;;;513:1;510;503:12;465:52;553:9;540:23;586:18;578:6;575:30;572:50;;;618:1;615;608:12;572:50;657:58;707:7;698:6;687:9;683:22;657:58;:::i;:::-;734:8;;631:84;;-1:-1:-1;366:409:1;-1:-1:-1;;;;366:409:1:o;780:477::-;859:6;867;875;928:2;916:9;907:7;903:23;899:32;896:52;;;944:1;941;934:12;896:52;984:9;971:23;1017:18;1009:6;1006:30;1003:50;;;1049:1;1046;1039:12;1003:50;1088:58;1138:7;1129:6;1118:9;1114:22;1088:58;:::i;:::-;1165:8;;1062:84;;-1:-1:-1;1247:2:1;1232:18;;;;1219:32;;780:477;-1:-1:-1;;;;780:477:1:o;1262:180::-;1321:6;1374:2;1362:9;1353:7;1349:23;1345:32;1342:52;;;1390:1;1387;1380:12;1342:52;-1:-1:-1;1413:23:1;;1262:180;-1:-1:-1;1262:180:1:o;1447:681::-;1618:2;1670:21;;;1740:13;;1643:18;;;1762:22;;;1589:4;;1618:2;1841:15;;;;1815:2;1800:18;;;1589:4;1884:218;1898:6;1895:1;1892:13;1884:218;;;1963:13;;-1:-1:-1;;;;;1959:62:1;1947:75;;2077:15;;;;2042:12;;;;1920:1;1913:9;1884:218;;;-1:-1:-1;2119:3:1;;1447:681;-1:-1:-1;;;;;;1447:681:1:o;2133:1214::-;2273:6;2281;2289;2297;2305;2313;2321;2329;2337;2390:3;2378:9;2369:7;2365:23;2361:33;2358:53;;;2407:1;2404;2397:12;2358:53;2443:9;2430:23;2420:33;;2504:2;2493:9;2489:18;2476:32;2527:18;2568:2;2560:6;2557:14;2554:34;;;2584:1;2581;2574:12;2554:34;2623:58;2673:7;2664:6;2653:9;2649:22;2623:58;:::i;:::-;2700:8;;-1:-1:-1;2597:84:1;-1:-1:-1;2788:2:1;2773:18;;2760:32;;-1:-1:-1;2804:16:1;;;2801:36;;;2833:1;2830;2823:12;2801:36;2872:60;2924:7;2913:8;2902:9;2898:24;2872:60;:::i;:::-;2951:8;;-1:-1:-1;2846:86:1;-1:-1:-1;3033:2:1;3018:18;;3005:32;;-1:-1:-1;3090:3:1;3075:19;;3062:33;;-1:-1:-1;3107:16:1;;;3104:36;;;3136:1;3133;3126:12;3104:36;;3175:60;3227:7;3216:8;3205:9;3201:24;3175:60;:::i;:::-;2133:1214;;;;-1:-1:-1;2133:1214:1;;;;;;;;3254:8;3336:3;3321:19;3308:33;;2133:1214;-1:-1:-1;;;;2133:1214:1:o;3544:1006::-;3656:6;3664;3672;3680;3688;3696;3749:2;3737:9;3728:7;3724:23;3720:32;3717:52;;;3765:1;3762;3755:12;3717:52;3805:9;3792:23;3834:18;3875:2;3867:6;3864:14;3861:34;;;3891:1;3888;3881:12;3861:34;3930:58;3980:7;3971:6;3960:9;3956:22;3930:58;:::i;:::-;4007:8;;-1:-1:-1;3904:84:1;-1:-1:-1;4095:2:1;4080:18;;4067:32;;-1:-1:-1;4111:16:1;;;4108:36;;;4140:1;4137;4130:12;4108:36;4179:60;4231:7;4220:8;4209:9;4205:24;4179:60;:::i;:::-;4258:8;;-1:-1:-1;4153:86:1;-1:-1:-1;4346:2:1;4331:18;;4318:32;;-1:-1:-1;4362:16:1;;;4359:36;;;4391:1;4388;4381:12;4359:36;;4430:60;4482:7;4471:8;4460:9;4456:24;4430:60;:::i;:::-;3544:1006;;;;-1:-1:-1;3544:1006:1;;-1:-1:-1;3544:1006:1;;4509:8;;3544:1006;-1:-1:-1;;;3544:1006:1:o;4971:184::-;-1:-1:-1;;;5020:1:1;5013:88;5120:4;5117:1;5110:15;5144:4;5141:1;5134:15;5160:275;5231:2;5225:9;5296:2;5277:13;;-1:-1:-1;;5273:27:1;5261:40;;5331:18;5316:34;;5352:22;;;5313:62;5310:88;;;5378:18;;:::i;:::-;5414:2;5407:22;5160:275;;-1:-1:-1;5160:275:1:o;5440:187::-;5489:4;5522:18;5514:6;5511:30;5508:56;;;5544:18;;:::i;:::-;-1:-1:-1;5610:2:1;5589:15;-1:-1:-1;;5585:29:1;5616:4;5581:40;;5440:187::o;5632:464::-;5675:5;5728:3;5721:4;5713:6;5709:17;5705:27;5695:55;;5746:1;5743;5736:12;5695:55;5782:6;5769:20;5813:49;5829:32;5858:2;5829:32;:::i;:::-;5813:49;:::i;:::-;5887:2;5878:7;5871:19;5933:3;5926:4;5921:2;5913:6;5909:15;5905:26;5902:35;5899:55;;;5950:1;5947;5940:12;5899:55;6015:2;6008:4;6000:6;5996:17;5989:4;5980:7;5976:18;5963:55;6063:1;6038:16;;;6056:4;6034:27;6027:38;;;;6042:7;5632:464;-1:-1:-1;;;5632:464:1:o;6101:322::-;6170:6;6223:2;6211:9;6202:7;6198:23;6194:32;6191:52;;;6239:1;6236;6229:12;6191:52;6279:9;6266:23;6312:18;6304:6;6301:30;6298:50;;;6344:1;6341;6334:12;6298:50;6367;6409:7;6400:6;6389:9;6385:22;6367:50;:::i;6610:1076::-;6732:6;6740;6748;6756;6764;6772;6780;6833:3;6821:9;6812:7;6808:23;6804:33;6801:53;;;6850:1;6847;6840:12;6801:53;6890:9;6877:23;6919:18;6960:2;6952:6;6949:14;6946:34;;;6976:1;6973;6966:12;6946:34;7015:58;7065:7;7056:6;7045:9;7041:22;7015:58;:::i;:::-;7092:8;;-1:-1:-1;6989:84:1;-1:-1:-1;7180:2:1;7165:18;;7152:32;;-1:-1:-1;7196:16:1;;;7193:36;;;7225:1;7222;7215:12;7193:36;7264:60;7316:7;7305:8;7294:9;7290:24;7264:60;:::i;:::-;7343:8;;-1:-1:-1;7238:86:1;-1:-1:-1;7431:2:1;7416:18;;7403:32;;-1:-1:-1;7447:16:1;;;7444:36;;;7476:1;7473;7466:12;7444:36;;7515:60;7567:7;7556:8;7545:9;7541:24;7515:60;:::i;:::-;6610:1076;;;;-1:-1:-1;6610:1076:1;;;;;;7676:2;7661:18;;;7648:32;;6610:1076;-1:-1:-1;;;;6610:1076:1:o;7691:856::-;7801:6;7809;7817;7825;7833;7841;7894:3;7882:9;7873:7;7869:23;7865:33;7862:53;;;7911:1;7908;7901:12;7862:53;7947:9;7934:23;7924:33;;8008:2;7997:9;7993:18;7980:32;8031:18;8072:2;8064:6;8061:14;8058:34;;;8088:1;8085;8078:12;8058:34;8127:58;8177:7;8168:6;8157:9;8153:22;8127:58;:::i;:::-;8204:8;;-1:-1:-1;8101:84:1;-1:-1:-1;8292:2:1;8277:18;;8264:32;;-1:-1:-1;8308:16:1;;;8305:36;;;8337:1;8334;8327:12;8305:36;;8376:60;8428:7;8417:8;8406:9;8402:24;8376:60;:::i;:::-;7691:856;;;;-1:-1:-1;7691:856:1;;;;;8537:2;8522:18;;;8509:32;;7691:856;-1:-1:-1;;;;7691:856:1:o;8552:375::-;8623:8;8633:6;8687:3;8680:4;8672:6;8668:17;8664:27;8654:55;;8705:1;8702;8695:12;8654:55;-1:-1:-1;8728:20:1;;8771:18;8760:30;;8757:50;;;8803:1;8800;8793:12;8757:50;8840:4;8832:6;8828:17;8816:29;;8900:3;8893:4;8883:6;8880:1;8876:14;8868:6;8864:27;8860:38;8857:47;8854:67;;;8917:1;8914;8907:12;8932:801;9066:6;9074;9082;9090;9143:2;9131:9;9122:7;9118:23;9114:32;9111:52;;;9159:1;9156;9149:12;9111:52;9199:9;9186:23;9228:18;9269:2;9261:6;9258:14;9255:34;;;9285:1;9282;9275:12;9255:34;9324:78;9394:7;9385:6;9374:9;9370:22;9324:78;:::i;:::-;9421:8;;-1:-1:-1;9298:104:1;-1:-1:-1;9509:2:1;9494:18;;9481:32;;-1:-1:-1;9525:16:1;;;9522:36;;;9554:1;9551;9544:12;9522:36;;9593:80;9665:7;9654:8;9643:9;9639:24;9593:80;:::i;:::-;8932:801;;;;-1:-1:-1;9692:8:1;-1:-1:-1;;;;8932:801:1:o;9738:258::-;9810:1;9820:113;9834:6;9831:1;9828:13;9820:113;;;9910:11;;;9904:18;9891:11;;;9884:39;9856:2;9849:10;9820:113;;;9951:6;9948:1;9945:13;9942:48;;;-1:-1:-1;;9986:1:1;9968:16;;9961:27;9738:258::o;10001:::-;10043:3;10081:5;10075:12;10108:6;10103:3;10096:19;10124:63;10180:6;10173:4;10168:3;10164:14;10157:4;10150:5;10146:16;10124:63;:::i;:::-;10241:2;10220:15;-1:-1:-1;;10216:29:1;10207:39;;;;10248:4;10203:50;;10001:258;-1:-1:-1;;10001:258:1:o;10264:220::-;10413:2;10402:9;10395:21;10376:4;10433:45;10474:2;10463:9;10459:18;10451:6;10433:45;:::i;10489:154::-;-1:-1:-1;;;;;10568:5:1;10564:54;10557:5;10554:65;10544:93;;10633:1;10630;10623:12;10648:612;10736:6;10744;10752;10760;10813:2;10801:9;10792:7;10788:23;10784:32;10781:52;;;10829:1;10826;10819:12;10781:52;10868:9;10855:23;10887:31;10912:5;10887:31;:::i;:::-;10937:5;-1:-1:-1;10989:2:1;10974:18;;10961:32;;-1:-1:-1;11044:2:1;11029:18;;11016:32;11071:18;11060:30;;11057:50;;;11103:1;11100;11093:12;11057:50;11142:58;11192:7;11183:6;11172:9;11168:22;11142:58;:::i;11265:1364::-;11407:6;11415;11423;11431;11439;11447;11455;11463;11471;11524:3;11512:9;11503:7;11499:23;11495:33;11492:53;;;11541:1;11538;11531:12;11492:53;11581:9;11568:23;11610:18;11651:2;11643:6;11640:14;11637:34;;;11667:1;11664;11657:12;11637:34;11706:58;11756:7;11747:6;11736:9;11732:22;11706:58;:::i;:::-;11783:8;;-1:-1:-1;11680:84:1;-1:-1:-1;11871:2:1;11856:18;;11843:32;;-1:-1:-1;11887:16:1;;;11884:36;;;11916:1;11913;11906:12;11884:36;11955:60;12007:7;11996:8;11985:9;11981:24;11955:60;:::i;:::-;12034:8;;-1:-1:-1;11929:86:1;-1:-1:-1;12122:2:1;12107:18;;12094:32;;-1:-1:-1;12138:16:1;;;12135:36;;;12167:1;12164;12157:12;12135:36;12206:60;12258:7;12247:8;12236:9;12232:24;12206:60;:::i;:::-;12285:8;;-1:-1:-1;12180:86:1;-1:-1:-1;12373:2:1;12358:18;;12345:32;;-1:-1:-1;12389:16:1;;;12386:36;;;12418:1;12415;12408:12;12386:36;;12457:60;12509:7;12498:8;12487:9;12483:24;12457:60;:::i;:::-;11265:1364;;;;-1:-1:-1;11265:1364:1;;;;;;;;12536:8;12618:3;12603:19;12590:33;;11265:1364;-1:-1:-1;;;;11265:1364:1:o;12634:1350::-;12783:6;12791;12799;12807;12815;12823;12831;12839;12847;12855;12908:3;12896:9;12887:7;12883:23;12879:33;12876:53;;;12925:1;12922;12915:12;12876:53;12961:9;12948:23;12938:33;;13022:2;13011:9;13007:18;12994:32;13045:18;13086:2;13078:6;13075:14;13072:34;;;13102:1;13099;13092:12;13072:34;13141:58;13191:7;13182:6;13171:9;13167:22;13141:58;:::i;:::-;13218:8;;-1:-1:-1;13115:84:1;-1:-1:-1;13306:2:1;13291:18;;13278:32;;-1:-1:-1;13322:16:1;;;13319:36;;;13351:1;13348;13341:12;13319:36;13390:60;13442:7;13431:8;13420:9;13416:24;13390:60;:::i;:::-;13469:8;;-1:-1:-1;13364:86:1;-1:-1:-1;13554:2:1;13539:18;;13526:32;;-1:-1:-1;13567:31:1;13526:32;13567:31;:::i;:::-;13617:5;;-1:-1:-1;13669:3:1;13654:19;;13641:33;;-1:-1:-1;13727:3:1;13712:19;;13699:33;;13744:16;;;13741:36;;;13773:1;13770;13763:12;13741:36;;13812:60;13864:7;13853:8;13842:9;13838:24;13812:60;:::i;:::-;13786:86;;13891:8;13881:18;;;13918:8;13908:18;;;13973:3;13962:9;13958:19;13945:33;13935:43;;12634:1350;;;;;;;;;;;;;:::o;14392:992::-;14511:6;14519;14527;14535;14543;14551;14559;14612:3;14600:9;14591:7;14587:23;14583:33;14580:53;;;14629:1;14626;14619:12;14580:53;14665:9;14652:23;14642:33;;14726:2;14715:9;14711:18;14698:32;14749:18;14790:2;14782:6;14779:14;14776:34;;;14806:1;14803;14796:12;14776:34;14845:58;14895:7;14886:6;14875:9;14871:22;14845:58;:::i;:::-;14922:8;;-1:-1:-1;14819:84:1;-1:-1:-1;15010:2:1;14995:18;;14982:32;;-1:-1:-1;15026:16:1;;;15023:36;;;15055:1;15052;15045:12;15023:36;;15094:60;15146:7;15135:8;15124:9;15120:24;15094:60;:::i;:::-;15173:8;;-1:-1:-1;15068:86:1;-1:-1:-1;;15258:2:1;15243:18;;15230:32;15271:31;15230:32;15271:31;:::i;:::-;15321:5;15311:15;;;15373:3;15362:9;15358:19;15345:33;15335:43;;14392:992;;;;;;;;;;:::o;15389:541::-;15475:6;15483;15536:2;15524:9;15515:7;15511:23;15507:32;15504:52;;;15552:1;15549;15542:12;15504:52;15592:9;15579:23;15621:18;15662:2;15654:6;15651:14;15648:34;;;15678:1;15675;15668:12;15648:34;15701:50;15743:7;15734:6;15723:9;15719:22;15701:50;:::i;:::-;15691:60;;15804:2;15793:9;15789:18;15776:32;15760:48;;15833:2;15823:8;15820:16;15817:36;;;15849:1;15846;15839:12;15817:36;;15872:52;15916:7;15905:8;15894:9;15890:24;15872:52;:::i;:::-;15862:62;;;15389:541;;;;;:::o;15935:289::-;16110:6;16099:9;16092:25;16153:2;16148;16137:9;16133:18;16126:30;16073:4;16173:45;16214:2;16203:9;16199:18;16191:6;16173:45;:::i;16229:164::-;16305:13;;16354;;16347:21;16337:32;;16327:60;;16383:1;16380;16373:12;16327:60;16229:164;;;:::o;16398:202::-;16465:6;16518:2;16506:9;16497:7;16493:23;16489:32;16486:52;;;16534:1;16531;16524:12;16486:52;16557:37;16584:9;16557:37;:::i;16605:183::-;16665:4;16698:18;16690:6;16687:30;16684:56;;;16720:18;;:::i;:::-;-1:-1:-1;16765:1:1;16761:14;16777:4;16757:25;;16605:183::o;16793:309::-;16869:5;16898:53;16914:36;16943:6;16914:36;:::i;16898:53::-;16889:62;;16974:6;16967:5;16960:21;17014:3;17005:6;17000:3;16996:16;16993:25;16990:45;;;17031:1;17028;17021:12;16990:45;17044:52;17089:6;17082:4;17075:5;17071:16;17066:3;17044:52;:::i;17107:1090::-;17171:5;17224:3;17217:4;17209:6;17205:17;17201:27;17191:55;;17242:1;17239;17232:12;17191:55;17271:6;17265:13;17297:4;17321:60;17337:43;17377:2;17337:43;:::i;17321:60::-;17415:15;;;17501:1;17497:10;;;;17485:23;;17481:32;;;17446:12;;;;17525:15;;;17522:35;;;17553:1;17550;17543:12;17522:35;17589:2;17581:6;17577:15;17601:567;17617:6;17612:3;17609:15;17601:567;;;17696:3;17690:10;17732:18;17719:11;17716:35;17713:125;;;17792:1;17821:2;17817;17810:14;17713:125;17861:24;;17920:2;17912:11;;17908:21;-1:-1:-1;17898:119:1;;17971:1;18000:2;17996;17989:14;17898:119;18042:83;18121:3;18115:2;18111;18107:11;18101:18;18096:2;18092;18088:11;18042:83;:::i;:::-;18030:96;;-1:-1:-1;18146:12:1;;;;17634;;17601:567;;18202:236;18255:5;18308:3;18301:4;18293:6;18289:17;18285:27;18275:55;;18326:1;18323;18316:12;18275:55;18348:84;18428:3;18419:6;18413:13;18406:4;18398:6;18394:17;18348:84;:::i;18443:894::-;18506:5;18559:3;18552:4;18544:6;18540:17;18536:27;18526:55;;18577:1;18574;18567:12;18526:55;18606:6;18600:13;18632:4;18656:60;18672:43;18712:2;18672:43;:::i;18656:60::-;18750:15;;;18836:1;18832:10;;;;18820:23;;18816:32;;;18781:12;;;;18860:15;;;18857:35;;;18888:1;18885;18878:12;18857:35;18924:2;18916:6;18912:15;18936:372;18952:6;18947:3;18944:15;18936:372;;;19031:3;19025:10;19067:18;19054:11;19051:35;19048:125;;;19127:1;19156:2;19152;19145:14;19048:125;19198:67;19261:3;19256:2;19242:11;19234:6;19230:24;19226:33;19198:67;:::i;:::-;19186:80;;-1:-1:-1;19286:12:1;;;;18969;;18936:372;;19342:1440;19533:6;19541;19549;19557;19610:3;19598:9;19589:7;19585:23;19581:33;19578:53;;;19627:1;19624;19617:12;19578:53;19656:9;19650:16;19640:26;;19685:2;19731;19720:9;19716:18;19710:25;19754:18;19795:2;19787:6;19784:14;19781:34;;;19811:1;19808;19801:12;19781:34;19849:6;19838:9;19834:22;19824:32;;19894:7;19887:4;19883:2;19879:13;19875:27;19865:55;;19916:1;19913;19906:12;19865:55;19945:2;19939:9;19968:60;19984:43;20024:2;19984:43;:::i;19968:60::-;20062:15;;;20144:1;20140:10;;;;20132:19;;20128:28;;;20093:12;;;;20168:19;;;20165:39;;;20200:1;20197;20190:12;20165:39;20224:11;;;;20244:135;20260:6;20255:3;20252:15;20244:135;;;20326:10;;20314:23;;20277:12;;;;20357;;;;20244:135;;;20449:2;20434:18;;20428:25;20398:5;;-1:-1:-1;20428:25:1;-1:-1:-1;;;20465:16:1;;;20462:36;;;20494:1;20491;20484:12;20462:36;20517:73;20582:7;20571:8;20560:9;20556:24;20517:73;:::i;:::-;20507:83;;20636:2;20625:9;20621:18;20615:25;20599:41;;20665:2;20655:8;20652:16;20649:36;;;20681:1;20678;20671:12;20649:36;;;20704:72;20768:7;20757:8;20746:9;20742:24;20704:72;:::i;:::-;20694:82;;;19342:1440;;;;;;;:::o;20787:184::-;-1:-1:-1;;;20836:1:1;20829:88;20936:4;20933:1;20926:15;20960:4;20957:1;20950:15;20976:276;21107:3;21145:6;21139:13;21161:53;21207:6;21202:3;21195:4;21187:6;21183:17;21161:53;:::i;:::-;21230:16;;;;;20976:276;-1:-1:-1;;20976:276:1:o;21257:289::-;21432:2;21421:9;21414:21;21395:4;21452:45;21493:2;21482:9;21478:18;21470:6;21452:45;:::i;:::-;21444:53;;21533:6;21528:2;21517:9;21513:18;21506:34;21257:289;;;;;:::o;21830:184::-;-1:-1:-1;;;21879:1:1;21872:88;21979:4;21976:1;21969:15;22003:4;22000:1;21993:15;22019:135;22058:3;-1:-1:-1;;22079:17:1;;22076:43;;;22099:18;;:::i;:::-;-1:-1:-1;22146:1:1;22135:13;;22019:135::o;22159:142::-;22235:20;;22264:31;22235:20;22264:31;:::i;22306:533::-;22401:6;22409;22417;22470:2;22458:9;22449:7;22445:23;22441:32;22438:52;;;22486:1;22483;22476:12;22438:52;22526:9;22513:23;22559:18;22551:6;22548:30;22545:50;;;22591:1;22588;22581:12;22545:50;22614;22656:7;22647:6;22636:9;22632:22;22614:50;:::i;:::-;22604:60;;;22714:2;22703:9;22699:18;22686:32;22727:31;22752:5;22727:31;:::i;:::-;22306:533;;22777:5;;-1:-1:-1;;;22829:2:1;22814:18;;;;22801:32;;22306:533::o;22844:271::-;23027:6;23019;23014:3;23001:33;22983:3;23053:16;;23078:13;;;23053:16;22844:271;-1:-1:-1;22844:271:1:o;23120:267::-;23209:6;23204:3;23197:19;23261:6;23254:5;23247:4;23242:3;23238:14;23225:43;-1:-1:-1;23313:1:1;23288:16;;;23306:4;23284:27;;;23277:38;;;;23369:2;23348:15;;;-1:-1:-1;;23344:29:1;23335:39;;;23331:50;;23120:267::o;23392:625::-;23665:2;23654:9;23647:21;23628:4;23691:62;23749:2;23738:9;23734:18;23726:6;23718;23691:62;:::i;:::-;23801:9;23793:6;23789:22;23784:2;23773:9;23769:18;23762:50;23835;23878:6;23870;23862;23835:50;:::i;:::-;23821:64;;23933:9;23925:6;23921:22;23916:2;23905:9;23901:18;23894:50;23961;24004:6;23996;23988;23961:50;:::i;:::-;23953:58;23392:625;-1:-1:-1;;;;;;;;;23392:625:1:o;24022:700::-;24325:3;24314:9;24307:22;24288:4;24352:63;24410:3;24399:9;24395:19;24387:6;24379;24352:63;:::i;:::-;24463:9;24455:6;24451:22;24446:2;24435:9;24431:18;24424:50;24497;24540:6;24532;24524;24497:50;:::i;:::-;24483:64;;24595:9;24587:6;24583:22;24578:2;24567:9;24563:18;24556:50;24623;24666:6;24658;24650;24623:50;:::i;:::-;24615:58;;;24709:6;24704:2;24693:9;24689:18;24682:34;24022:700;;;;;;;;;;:::o;24727:390::-;24805:6;24813;24866:2;24854:9;24845:7;24841:23;24837:32;24834:52;;;24882:1;24879;24872:12;24834:52;24922:9;24909:23;24955:18;24947:6;24944:30;24941:50;;;24987:1;24984;24977:12;24941:50;25010;25052:7;25043:6;25032:9;25028:22;25010:50;:::i;:::-;25000:60;25107:2;25092:18;;;;25079:32;;-1:-1:-1;;;;24727:390:1:o;25122:184::-;-1:-1:-1;;;25171:1:1;25164:88;25271:4;25268:1;25261:15;25295:4;25292:1;25285:15;25311:184;25381:6;25434:2;25422:9;25413:7;25409:23;25405:32;25402:52;;;25450:1;25447;25440:12;25402:52;-1:-1:-1;25473:16:1;;25311:184;-1:-1:-1;25311:184:1:o;25802:338::-;-1:-1:-1;;;;;25981:6:1;25977:55;25966:9;25959:74;26069:2;26064;26053:9;26049:18;26042:30;25940:4;26089:45;26130:2;26119:9;26115:18;26107:6;26089:45;:::i;26145:414::-;26230:6;26238;26291:2;26279:9;26270:7;26266:23;26262:32;26259:52;;;26307:1;26304;26297:12;26259:52;26330:37;26357:9;26330:37;:::i;:::-;26320:47;;26411:2;26400:9;26396:18;26390:25;26438:18;26430:6;26427:30;26424:50;;;26470:1;26467;26460:12;26424:50;26493:60;26545:7;26536:6;26525:9;26521:22;26493:60;:::i;26746:1110::-;26906:6;26914;26922;26930;26938;26946;26954;26962;27015:3;27003:9;26994:7;26990:23;26986:33;26983:53;;;27032:1;27029;27022:12;26983:53;27072:9;27059:23;27101:18;27142:2;27134:6;27131:14;27128:34;;;27158:1;27155;27148:12;27128:34;27181:50;27223:7;27214:6;27203:9;27199:22;27181:50;:::i;:::-;27171:60;;27284:2;27273:9;27269:18;27256:32;27240:48;;27313:2;27303:8;27300:16;27297:36;;;27329:1;27326;27319:12;27297:36;27352:52;27396:7;27385:8;27374:9;27370:24;27352:52;:::i;:::-;27342:62;;27423:46;27465:2;27454:9;27450:18;27423:46;:::i;:::-;27413:56;;27516:2;27505:9;27501:18;27488:32;27478:42;;27573:3;27562:9;27558:19;27545:33;27529:49;;27603:2;27593:8;27590:16;27587:36;;;27619:1;27616;27609:12;27587:36;;27642:52;27686:7;27675:8;27664:9;27660:24;27642:52;:::i;:::-;26746:1110;;;;-1:-1:-1;26746:1110:1;;;;27632:62;27741:3;27726:19;;27713:33;;-1:-1:-1;27793:3:1;27778:19;;27765:33;;27845:3;27830:19;27817:33;;-1:-1:-1;26746:1110:1;-1:-1:-1;;;26746:1110:1:o;27861:763::-;28190:3;28179:9;28172:22;28153:4;28217:46;28258:3;28247:9;28243:19;28235:6;28217:46;:::i;:::-;28311:9;28303:6;28299:22;28294:2;28283:9;28279:18;28272:50;28345:33;28371:6;28363;28345:33;:::i;:::-;28331:47;;28426:9;28418:6;28414:22;28409:2;28398:9;28394:18;28387:50;28454:33;28480:6;28472;28454:33;:::i;:::-;28518:2;28503:18;;28496:34;;;;-1:-1:-1;;28561:3:1;28546:19;;28539:35;;;;28605:3;28590:19;;;28583:35;28446:41;27861:763;-1:-1:-1;;;27861:763:1:o;28629:128::-;28669:3;28700:1;28696:6;28693:1;28690:13;28687:39;;;28706:18;;:::i;:::-;-1:-1:-1;28742:9:1;;28629:128::o;28762:522::-;28840:4;28846:6;28906:11;28893:25;29000:2;28996:7;28985:8;28969:14;28965:29;28961:43;28941:18;28937:68;28927:96;;29019:1;29016;29009:12;28927:96;29046:33;;29098:20;;;-1:-1:-1;29141:18:1;29130:30;;29127:50;;;29173:1;29170;29163:12;29127:50;29206:4;29194:17;;-1:-1:-1;29237:14:1;29233:27;;;29223:38;;29220:58;;;29274:1;29271;29264:12;29289:988;29419:6;29427;29435;29443;29451;29459;29512:3;29500:9;29491:7;29487:23;29483:33;29480:53;;;29529:1;29526;29519:12;29480:53;29569:9;29556:23;29598:18;29639:2;29631:6;29628:14;29625:34;;;29655:1;29652;29645:12;29625:34;29678:50;29720:7;29711:6;29700:9;29696:22;29678:50;:::i;:::-;29668:60;;29781:2;29770:9;29766:18;29753:32;29737:48;;29810:2;29800:8;29797:16;29794:36;;;29826:1;29823;29816:12;29794:36;;29849:52;29893:7;29882:8;29871:9;29867:24;29849:52;:::i;:::-;29839:62;;;29951:2;29940:9;29936:18;29923:32;29995:4;29988:5;29984:16;29977:5;29974:27;29964:55;;30015:1;30012;30005:12;29964:55;30038:5;-1:-1:-1;30090:2:1;30075:18;;30062:32;;-1:-1:-1;30146:3:1;30131:19;;30118:33;30160;30118;30160;:::i;:::-;30212:7;30202:17;;;30266:3;30255:9;30251:19;30238:33;30228:43;;29289:988;;;;;;;;:::o;30282:606::-;30559:3;30548:9;30541:22;30522:4;30586:46;30627:3;30616:9;30612:19;30604:6;30586:46;:::i;:::-;30680:9;30672:6;30668:22;30663:2;30652:9;30648:18;30641:50;30708:33;30734:6;30726;30708:33;:::i;:::-;30789:4;30777:17;;;;30772:2;30757:18;;30750:45;-1:-1:-1;;30826:2:1;30811:18;;30804:34;;;;30869:3;30854:19;;;30847:35;30700:41;30282:606;-1:-1:-1;;30282:606:1:o;30893:259::-;30971:6;31024:2;31012:9;31003:7;30999:23;30995:32;30992:52;;;31040:1;31037;31030:12;30992:52;31072:9;31066:16;31091:31;31116:5;31091:31;:::i;31157:340::-;31334:2;31323:9;31316:21;31297:4;31354:45;31395:2;31384:9;31380:18;31372:6;31354:45;:::i;:::-;31346:53;;-1:-1:-1;;;;;31439:6:1;31435:55;31430:2;31419:9;31415:18;31408:83;31157:340;;;;;:::o;31502:245::-;31659:2;31648:9;31641:21;31622:4;31679:62;31737:2;31726:9;31722:18;31714:6;31706;31679:62;:::i;31752:437::-;31831:1;31827:12;;;;31874;;;31895:61;;31949:4;31941:6;31937:17;31927:27;;31895:61;32002:2;31994:6;31991:14;31971:18;31968:38;31965:218;;;-1:-1:-1;;;32036:1:1;32029:88;32140:4;32137:1;32130:15;32168:4;32165:1;32158:15;31965:218;;31752:437;;;:::o;32194:1256::-;32305:6;32313;32321;32374:2;32362:9;32353:7;32349:23;32345:32;32342:52;;;32390:1;32387;32380:12;32342:52;32430:9;32417:23;32459:18;32500:2;32492:6;32489:14;32486:34;;;32516:1;32513;32506:12;32486:34;32554:6;32543:9;32539:22;32529:32;;32599:7;32592:4;32588:2;32584:13;32580:27;32570:55;;32621:1;32618;32611:12;32570:55;32657:2;32644:16;32679:4;32703:60;32719:43;32759:2;32719:43;:::i;32703:60::-;32797:15;;;32879:1;32875:10;;;;32867:19;;32863:28;;;32828:12;;;;32903:19;;;32900:39;;;32935:1;32932;32925:12;32900:39;32959:11;;;;32979:217;32995:6;32990:3;32987:15;32979:217;;;33075:3;33062:17;33092:31;33117:5;33092:31;:::i;:::-;33136:18;;33012:12;;;;33174;;;;32979:217;;;33215:5;-1:-1:-1;;33252:18:1;;33239:32;;-1:-1:-1;;33324:2:1;33309:18;;33296:32;;-1:-1:-1;33340:16:1;;;33337:36;;;33369:1;33366;33359:12;33337:36;;33392:52;33436:7;33425:8;33414:9;33410:24;33392:52;:::i;:::-;33382:62;;;32194:1256;;;;;:::o;33455:889::-;33814:3;33803:9;33796:22;33777:4;33841:63;33899:3;33888:9;33884:19;33876:6;33868;33841:63;:::i;:::-;33952:9;33944:6;33940:22;33935:2;33924:9;33920:18;33913:50;33986;34029:6;34021;34013;33986:50;:::i;:::-;33972:64;;34084:9;34076:6;34072:22;34067:2;34056:9;34052:18;34045:50;34118;34161:6;34153;34145;34118:50;:::i;:::-;34104:64;;34216:9;34208:6;34204:22;34199:2;34188:9;34184:18;34177:50;34244;34287:6;34279;34271;34244:50;:::i;:::-;34236:58;;;34331:6;34325:3;34314:9;34310:19;34303:35;33455:889;;;;;;;;;;;;:::o;34349:274::-;34389:1;34415;34405:189;;-1:-1:-1;;;34447:1:1;34440:88;34551:4;34548:1;34541:15;34579:4;34576:1;34569:15;34405:189;-1:-1:-1;34608:9:1;;34349:274::o;34628:893::-;34760:6;34768;34776;34784;34792;34800;34853:3;34841:9;34832:7;34828:23;34824:33;34821:53;;;34870:1;34867;34860:12;34821:53;34910:9;34897:23;34939:18;34980:2;34972:6;34969:14;34966:34;;;34996:1;34993;34986:12;34966:34;35019:50;35061:7;35052:6;35041:9;35037:22;35019:50;:::i;:::-;35009:60;;35122:2;35111:9;35107:18;35094:32;35078:48;;35151:2;35141:8;35138:16;35135:36;;;35167:1;35164;35157:12;35135:36;;35190:52;35234:7;35223:8;35212:9;35208:24;35190:52;:::i;:::-;35180:62;;;35292:2;35281:9;35277:18;35264:32;35305:31;35330:5;35305:31;:::i;:::-;34628:893;;;;-1:-1:-1;35355:5:1;;35407:2;35392:18;;35379:32;;-1:-1:-1;35458:3:1;35443:19;;35430:33;;35510:3;35495:19;;;35482:33;;-1:-1:-1;34628:893:1;-1:-1:-1;;34628:893:1:o;35526:527::-;35779:3;35768:9;35761:22;35742:4;35806:46;35847:3;35836:9;35832:19;35824:6;35806:46;:::i;:::-;35900:9;35892:6;35888:22;35883:2;35872:9;35868:18;35861:50;35928:33;35954:6;35946;35928:33;:::i;:::-;35992:2;35977:18;;35970:34;;;;-1:-1:-1;;36035:2:1;36020:18;36013:34;35920:41;35526:527;-1:-1:-1;;35526:527:1:o;36443:976::-;36791:4;36820:3;36850:6;36839:9;36832:25;36893:6;36888:2;36877:9;36873:18;36866:34;36936:2;36931;36920:9;36916:18;36909:30;36962:45;37003:2;36992:9;36988:18;36980:6;36962:45;:::i;:::-;36948:59;;37055:9;37047:6;37043:22;37038:2;37027:9;37023:18;37016:50;37089:33;37115:6;37107;37089:33;:::i;:::-;37075:47;;-1:-1:-1;;;;;37163:6:1;37159:55;37153:3;37142:9;37138:19;37131:84;37252:6;37246:3;37235:9;37231:19;37224:35;37308:9;37300:6;37296:22;37290:3;37279:9;37275:19;37268:51;37336:33;37362:6;37354;37336:33;:::i;:::-;37328:41;;;37406:6;37400:3;37389:9;37385:19;37378:35;36443:976;;;;;;;;;;;:::o;37424:348::-;37613:6;37608:3;37601:19;37583:3;37649:6;37643:13;37665:60;37718:6;37713:2;37708:3;37704:12;37699:2;37691:6;37687:15;37665:60;:::i;:::-;37745:16;;;;37763:2;37741:25;;37424:348;-1:-1:-1;;;37424:348:1:o;38436:720::-;38745:6;38734:9;38727:25;38788:6;38783:2;38772:9;38768:18;38761:34;38831:3;38826:2;38815:9;38811:18;38804:31;38708:4;38858:46;38899:3;38888:9;38884:19;38876:6;38858:46;:::i;:::-;38952:9;38944:6;38940:22;38935:2;38924:9;38920:18;38913:50;38980:33;39006:6;38998;38980:33;:::i;:::-;-1:-1:-1;;;;;39050:55:1;;;;39044:3;39029:19;;39022:84;-1:-1:-1;;39137:3:1;39122:19;39115:35;38972:41;38436:720;-1:-1:-1;;;;38436:720:1:o;39457:362::-;39662:6;39651:9;39644:25;39705:2;39700;39689:9;39685:18;39678:30;39625:4;39725:45;39766:2;39755:9;39751:18;39743:6;39725:45;:::i;:::-;39717:53;;39806:6;39801:2;39790:9;39786:18;39779:34;39457:362;;;;;;:::o

Swarm Source

ipfs://4998f838cdcafb3bed81b83a80af25a5eb3725a58bc3781fb9f68ff167189756

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Txn 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.