Goerli Testnet

Contract

0x3D4e1981f822e87A1A4C05F2e4b3bcAdE5406AE3
Transaction Hash
Method
Block
From
To
Value
Any Exec91256762023-06-05 8:46:36114 days 6 hrs ago1685954796IN
0x3D4e19...E5406AE3
0 ETH0.0016147711.49703483
Any Call88995232023-04-27 8:18:12153 days 7 hrs ago1682583492IN
0x3D4e19...E5406AE3
0 ETH0.00514172106.79006051
Any Exec85014212023-02-16 11:12:12223 days 4 hrs ago1676545932IN
0x3D4e19...E5406AE3
0 ETH0.0024914916.4307467
Any Exec85013972023-02-16 11:06:48223 days 4 hrs ago1676545608IN
0x3D4e19...E5406AE3
0 ETH0.0040386218.25638523
Any Exec83557212023-01-22 10:43:12248 days 5 hrs ago1674384192IN
0x3D4e19...E5406AE3
0 ETH0.000125320.82201004
Any Exec83553802023-01-22 9:21:12248 days 6 hrs ago1674379272IN
0x3D4e19...E5406AE3
0 ETH0.000154741.01482722
Any Exec82544042023-01-04 9:02:12266 days 6 hrs ago1672822932IN
0x3D4e19...E5406AE3
0 ETH0.001458179.9
Any Exec81346002022-12-14 17:03:48286 days 22 hrs ago1671037428IN
0x3D4e19...E5406AE3
0 ETH0.001060657.2171
Any Exec81345242022-12-14 16:46:24286 days 22 hrs ago1671036384IN
0x3D4e19...E5406AE3
0 ETH0.000614854.18373388
Any Exec81281182022-12-13 14:35:24288 days 1 hr ago1670942124IN
0x3D4e19...E5406AE3
0 ETH0.0019840322.04480372
Any Exec80901142022-12-07 6:26:00294 days 9 hrs ago1670394360IN
0x3D4e19...E5406AE3
0 ETH0.001049337.2171
Deposit80900562022-12-07 6:13:12294 days 9 hrs ago1670393592IN
0x3D4e19...E5406AE3
0.05 ETH0.000045521.00000001
Any Exec80899672022-12-07 5:54:12294 days 9 hrs ago1670392452IN
0x3D4e19...E5406AE3
0 ETH0.000789485.2612659
Deposit80899552022-12-07 5:51:36294 days 9 hrs ago1670392296IN
0x3D4e19...E5406AE3
0.03 ETH0.000045521.00000002
Any Exec80892802022-12-07 3:12:48294 days 12 hrs ago1670382768IN
0x3D4e19...E5406AE3
0 ETH0.000836585.845851
Any Exec80892142022-12-07 2:56:36294 days 12 hrs ago1670381796IN
0x3D4e19...E5406AE3
0 ETH0.000732784.73513931
Any Exec80892072022-12-07 2:55:12294 days 12 hrs ago1670381712IN
0x3D4e19...E5406AE3
0 ETH0.001240888.019
Deposit80891972022-12-07 2:52:36294 days 12 hrs ago1670381556IN
0x3D4e19...E5406AE3
0.05 ETH0.000045521.00000002
Deposit80831582022-12-06 3:52:24295 days 11 hrs ago1670298744IN
0x3D4e19...E5406AE3
0.015 ETH0.000045521.00000001
Deposit80829642022-12-06 3:09:12295 days 12 hrs ago1670296152IN
0x3D4e19...E5406AE3
0.02 ETH0.000045521.00000001
Any Exec80767142022-12-05 3:14:36296 days 12 hrs ago1670210076IN
0x3D4e19...E5406AE3
0 ETH00.0000167
Any Exec80767122022-12-05 3:14:12296 days 12 hrs ago1670210052IN
0x3D4e19...E5406AE3
0 ETH00.0000167
Deposit80644052022-12-03 3:47:00298 days 11 hrs ago1670039220IN
0x3D4e19...E5406AE3
0.02 ETH0.000028411
Deposit80641072022-12-03 2:38:12298 days 13 hrs ago1670035092IN
0x3D4e19...E5406AE3
0.05 ETH0.000045511.00000001
Any Exec79918852022-11-21 7:31:12310 days 8 hrs ago1669015872IN
0x3D4e19...E5406AE3
0 ETH0.0056055637.30874058
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
97176882023-09-18 16:43:128 days 23 hrs ago1695055392
0x3D4e19...E5406AE3
0 ETH
97176132023-09-18 16:24:248 days 23 hrs ago1695054264
0x3D4e19...E5406AE3
0 ETH
91256762023-06-05 8:46:36114 days 6 hrs ago1685954796
0x3D4e19...E5406AE3
0 ETH
91073472023-06-02 6:22:36117 days 9 hrs ago1685686956
0x3D4e19...E5406AE3
0 ETH
91069152023-06-02 4:39:12117 days 11 hrs ago1685680752
0x3D4e19...E5406AE3
0 ETH
89344902023-05-03 11:42:00147 days 4 hrs ago1683114120
0x3D4e19...E5406AE3
0 ETH
89344892023-05-03 11:41:48147 days 4 hrs ago1683114108
0x3D4e19...E5406AE3
0 ETH
89344872023-05-03 11:41:24147 days 4 hrs ago1683114084
0x3D4e19...E5406AE3
0 ETH
89344862023-05-03 11:41:12147 days 4 hrs ago1683114072
0x3D4e19...E5406AE3
0 ETH
89344082023-05-03 11:22:36147 days 4 hrs ago1683112956
0x3D4e19...E5406AE3
0 ETH
89344052023-05-03 11:22:00147 days 4 hrs ago1683112920
0x3D4e19...E5406AE3
0 ETH
89343082023-05-03 10:56:36147 days 4 hrs ago1683111396
0x3D4e19...E5406AE3
0 ETH
89341912023-05-03 10:25:12147 days 5 hrs ago1683109512
0x3D4e19...E5406AE3
0 ETH
89341522023-05-03 10:16:36147 days 5 hrs ago1683108996
0x3D4e19...E5406AE3
0 ETH
89340702023-05-03 9:57:48147 days 5 hrs ago1683107868
0x3D4e19...E5406AE3
0 ETH
85701222023-02-28 4:47:00211 days 10 hrs ago1677559620
0x3D4e19...E5406AE3
0.08999808 ETH
85701222023-02-28 4:47:00211 days 10 hrs ago1677559620
0x3D4e19...E5406AE3
0.01000192 ETH
85701222023-02-28 4:47:00211 days 10 hrs ago1677559620
0x3D4e19...E5406AE3
0.1 ETH
85650442023-02-27 8:23:00212 days 7 hrs ago1677486180
0x3D4e19...E5406AE3
0 ETH
85014212023-02-16 11:12:12223 days 4 hrs ago1676545932
0x3D4e19...E5406AE3
0 ETH
85013972023-02-16 11:06:48223 days 4 hrs ago1676545608
0x3D4e19...E5406AE3
0 ETH
85010952023-02-16 9:51:12223 days 5 hrs ago1676541072
0x3D4e19...E5406AE3
0 ETH
84154762023-02-01 13:39:36238 days 2 hrs ago1675258776
0x3D4e19...E5406AE3
0 ETH
84153942023-02-01 13:20:00238 days 2 hrs ago1675257600
0x3D4e19...E5406AE3
0 ETH
83918992023-01-28 14:25:36242 days 1 hr ago1674915936
0x3D4e19...E5406AE3
0 ETH
View All Internal Transactions
Loading...
Loading

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

Contract Name:
AnyCallV6Proxy

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-10
*/

/**
 *Submitted for verification at FtmScan.com on 2022-05-26
*/

/**
 *Submitted for verification at Etherscan.io on 2022-05-10
*/

/**
 *Submitted for verification at BscScan.com on 2022-05-10
*/

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.6;

/// IApp interface of the application
interface IApp {
    /// (required) call on the destination chain to exec the interaction
    function anyExecute(bytes calldata _data) external returns (bool success, bytes memory result);

    /// (optional,advised) call back on the originating chain if the cross chain interaction fails
    function anyFallback(address _to, bytes calldata _data) external;
}

/// anycall executor is the delegator to execute contract calling (like a sandbox)
contract AnyCallExecutor {
    struct Context {
        address from;
        uint256 fromChainID;
        uint256 nonce;
    }

    Context public context;
    address public creator;

    constructor() {
        creator = msg.sender;
    }

    function execute(
        address _to,
        bytes calldata _data,
        address _from,
        uint256 _fromChainID,
        uint256 _nonce
    ) external returns (bool success, bytes memory result) {
        if (msg.sender != creator) {
            return (false, "AnyCallExecutor: caller is not the creator");
        }
        context = Context({from: _from, fromChainID: _fromChainID, nonce: _nonce});
        (success, result) = IApp(_to).anyExecute(_data);
        context = Context({from: address(0), fromChainID: 0, nonce: 0});
    }
}

/// anycall proxy is a universal protocal to complete cross-chain interaction.
/// 1. the client call `anyCall` on the originating chain
///         to submit a request for a cross chain interaction
/// 2. the mpc network verify the request and call `anyExec` on the destination chain
///         to execute a cross chain interaction
/// 3. if step 2 failed and step 1 has set non-zero fallback,
///         then call `anyFallback` on the originating chain
contract AnyCallV6Proxy {
    // Packed fee information (only 1 storage slot)
    struct FeeData {
        uint128 accruedFees;
        uint128 premium;
    }

    // App config
    struct AppConfig {
        address app; // the application contract address
        address appAdmin; // account who admin the application's config
        uint256 appFlags; // flags of the application
    }

    // Src fee is (baseFees + msg.data.length*feesPerByte)
    struct SrcFeeConfig {
        uint256 baseFees;
        uint256 feesPerByte;
    }

    // Exec record
    struct ExecRecord {
        address to;
        bytes data;
    }

    // Context of the request on originating chain
    struct RequestContext {
        bytes32 txhash;
        address from;
        uint256 fromChainID;
        uint256 nonce;
        uint256 flags;
    }

    // anycall version
    string constant ANYCALL_VERSION = "v6.0";

    // Flags constant
    uint256 public constant FLAG_MERGE_CONFIG_FLAGS = 0x1;
    uint256 public constant FLAG_PAY_FEE_ON_SRC = 0x1 << 1;

    // App Modes constant
    uint256 public constant APPMODE_USE_CUSTOM_SRC_FEES = 0x1;

    // Modes constant
    uint256 public constant PERMISSIONLESS_MODE = 0x1;
    uint256 public constant FREE_MODE = 0x1 << 1;

    // Extra cost of execution (SSTOREs.SLOADs,ADDs,etc..)
    // TODO: analysis to verify the correct overhead gas usage
    uint256 constant EXECUTION_OVERHEAD = 100000;

    // key is app address
    mapping(address => string) public appIdentifier;

    // key is appID, a unique identifier for each project
    mapping(string => AppConfig) public appConfig;
    mapping(string => mapping(address => bool)) public appExecWhitelist;
    mapping(string => address[]) public appHistoryWhitelist;
    mapping(string => bool) public appBlacklist;
    mapping(uint256 => SrcFeeConfig) public srcDefaultFees; // key is chainID
    mapping(string => mapping(uint256 => SrcFeeConfig)) public srcCustomFees;
    mapping(string => uint256) public appDefaultModes;
    mapping(string => mapping(uint256 => uint256)) public appCustomModes;

    mapping(address => bool) public isAdmin;
    address[] public admins;

    address public mpc;
    address public pendingMPC;

    uint256 public mode;
    bool public paused;

    uint256 public minReserveBudget;
    mapping(address => uint256) public executionBudget;
    FeeData private _feeData;

    // applications should give permission to this executor
    AnyCallExecutor public executor;

    mapping(bytes32 => ExecRecord) public retryExecRecords;

    mapping(bytes32 => bool) public execCompleted;
    uint256 nonce;

    uint private unlocked = 1;
    modifier lock() {
        require(unlocked == 1);
        unlocked = 0;
        _;
        unlocked = 1;
    }

    event LogAnyCall(
        address indexed from,
        address indexed to,
        bytes data,
        address _fallback,
        uint256 indexed toChainID,
        uint256 flags,
        string appID,
        uint256 nonce
    );

    event LogAnyExec(
        bytes32 indexed txhash,
        address indexed from,
        address indexed to,
        uint256 fromChainID,
        uint256 nonce,
        bool success,
        bytes result
    );

    event Deposit(address indexed account, uint256 amount);
    event Withdraw(address indexed account, uint256 amount);
    event SetBlacklist(string appID, bool flag);
    event SetWhitelist(string appID, address indexed whitelist, bool flag);
    event UpdatePremium(uint256 oldPremium, uint256 newPremium);
    event AddAdmin(address admin);
    event RemoveAdmin(address admin);
    event ChangeMPC(address indexed oldMPC, address indexed newMPC, uint256 timestamp);
    event ApplyMPC(address indexed oldMPC, address indexed newMPC, uint256 timestamp);
    event SetAppConfig(string appID, address indexed app, address indexed appAdmin, uint256 appFlags);
    event UpgradeApp(string appID, address indexed oldApp, address indexed newApp);
    event StoreRetryExecRecord(bytes32 indexed txhash, address indexed from, address indexed to, uint256 fromChainID, uint256 nonce, bytes data);
    event DoneRetryExecRecord(bytes32 indexed txhash, address indexed from, uint256 fromChainID, uint256 nonce);

    constructor(
        address _admin,
        address _mpc,
        uint128 _premium,
        uint256 _mode
    ) {
        require(_mpc != address(0), "zero mpc address");
        if (_admin != address(0)) {
            isAdmin[_admin] = true;
            admins.push(_admin);
        }
        if (_mpc != _admin) {
            isAdmin[_mpc] = true;
            admins.push(_mpc);
        }

        mpc = _mpc;
        _feeData.premium = _premium;
        mode = _mode;

        executor = new AnyCallExecutor();

        emit ApplyMPC(address(0), _mpc, block.timestamp);
        emit UpdatePremium(0, _premium);
    }

    /// @dev Access control function
    modifier onlyMPC() {
        require(msg.sender == mpc, "only MPC");
        _;
    }

    /// @dev Access control function
    modifier onlyAdmin() {
        require(isAdmin[msg.sender], "only admin");
        _;
    }

    /// @dev pausable control function
    modifier whenNotPaused() {
        require(!paused, "paused");
        _;
    }

    /// @dev Charge an account for execution costs on this chain
    /// @param _from The account to charge for execution costs
    modifier charge(address _from, uint256 _flags) {
        uint256 gasUsed;

        // Prepare charge fee on the destination chain
        if (!_isSet(mode, FREE_MODE)) {
            if (!_isSet(_flags, FLAG_PAY_FEE_ON_SRC)) {
                require(executionBudget[_from] >= minReserveBudget, "less than min budget");
                gasUsed = gasleft() + EXECUTION_OVERHEAD;
            }
        }

        _;

        // Charge fee on the dest chain
        if (gasUsed > 0) {
            uint256 totalCost = (gasUsed - gasleft()) * (tx.gasprice + _feeData.premium);
            uint256 budget = executionBudget[_from];
            require(budget > totalCost, "no enough budget");
            executionBudget[_from] = budget - totalCost;
            _feeData.accruedFees += uint128(totalCost);
        }
    }

    /// @dev set paused flag to pause/unpause functions
    function setPaused(bool _paused) external onlyAdmin {
        paused = _paused;
    }

    function _paySrcFees(uint256 fees) internal {
        require(msg.value >= fees, "no enough src fee");
        if (fees > 0) { // pay fees
            (bool success,) = mpc.call{value: fees}("");
            require(success);
        }
        if (msg.value > fees) { // return remaining amount
            (bool success,) = msg.sender.call{value: msg.value - fees}("");
            require(success);
        }
    }

    /**
        @notice Submit a request for a cross chain interaction
        @param _to The target to interact with on `_toChainID`
        @param _data The calldata supplied for the interaction with `_to`
        @param _fallback The address to call back on the originating chain
            if the cross chain interaction fails
            for security reason, it must be zero or `msg.sender` address
        @param _toChainID The target chain id to interact with
        @param _flags The flags of app on the originating chain
    */
    function anyCall(
        address _to,
        bytes calldata _data,
        address _fallback,
        uint256 _toChainID,
        uint256 _flags
    ) external lock payable whenNotPaused {
        require(_fallback == address(0) || _fallback == msg.sender, "wrong fallback");
        string memory _appID = appIdentifier[msg.sender];

        require(!appBlacklist[_appID], "blacklist");

        bool _permissionlessMode = _isSet(mode, PERMISSIONLESS_MODE);
        if (!_permissionlessMode) {
            require(appExecWhitelist[_appID][msg.sender], "no permission");
        }

        if (!_isSet(mode, FREE_MODE)) {
            AppConfig storage config = appConfig[_appID];
            require(
                (_permissionlessMode && config.app == address(0)) ||
                msg.sender == config.app,
                "app not exist"
            );

            if (_isSet(_flags, FLAG_MERGE_CONFIG_FLAGS) && config.app == msg.sender) {
                _flags |= config.appFlags;
            }

            if (_isSet(_flags, FLAG_PAY_FEE_ON_SRC)) {
                uint256 fees = _calcSrcFees(_appID, _toChainID, _data.length);
                _paySrcFees(fees);
            } else if (msg.value > 0) {
                _paySrcFees(0);
            }
        }

        nonce++;
        emit LogAnyCall(msg.sender, _to, _data, _fallback, _toChainID, _flags, _appID, nonce);
    }

    /**
        @notice Execute a cross chain interaction
        @dev Only callable by the MPC
        @param _to The cross chain interaction target
        @param _data The calldata supplied for interacting with target
        @param _fallback The address to call on originating chain if the interaction fails
        @param _appID The app identifier to check whitelist
        @param _ctx The context of the request on originating chain
    */
    function anyExec(
        address _to,
        bytes memory _data,
        address _fallback,
        string memory _appID,
        RequestContext memory _ctx
    ) external lock whenNotPaused charge(_ctx.from, _ctx.flags) onlyMPC {
        address _from = _ctx.from;

        require(_fallback == address(0) || _fallback == _from, "wrong fallback");

        require(!appBlacklist[_appID], "blacklist");

        if (!_isSet(mode, PERMISSIONLESS_MODE)) {
            require(appExecWhitelist[_appID][_to], "no permission");
        }

        bytes32 uniqID = calcUniqID(_ctx.txhash, _from, _ctx.fromChainID, _ctx.nonce);
        require(!execCompleted[uniqID], "exec completed");

        bool success;
        {
            bytes memory result;
            try executor.execute(_to, _data, _from, _ctx.fromChainID, _ctx.nonce) returns (bool succ, bytes memory res) {
                (success, result) = (succ, res);
            } catch Error(string memory reason) {
                result = bytes(reason);
            } catch (bytes memory reason) {
                result = reason;
            }
            emit LogAnyExec(_ctx.txhash, _from, _to, _ctx.fromChainID, _ctx.nonce, success, result);
        }

        if (success) {
            execCompleted[uniqID] = true;
        } else if (_fallback == address(0)) {
            retryExecRecords[uniqID] = ExecRecord(_to, _data);
            emit StoreRetryExecRecord(_ctx.txhash, _from, _to, _ctx.fromChainID, _ctx.nonce, _data);
        } else {
            // Call the fallback on the originating chain with the call information (to, data)
            nonce++;
            emit LogAnyCall(
                _from,
                _fallback,
                abi.encodeWithSelector(IApp.anyFallback.selector, _to, _data),
                address(0),
                _ctx.fromChainID,
                0, // pay fee on dest chain
                _appID,
                nonce);
        }
    }

    function _isSet(uint256 _value, uint256 _testBits) internal pure returns (bool) {
        return (_value & _testBits) == _testBits;
    }

    // @notice Calc unique ID
    function calcUniqID(bytes32 _txhash, address _from, uint256 _fromChainID, uint256 _nonce) public pure returns (bytes32) {
        return keccak256(abi.encode(_txhash, _from, _fromChainID, _nonce));
    }

    /// @notice Retry stored exec record
    function retryExec(bytes32 _txhash, address _from, uint256 _fromChainID, uint256 _nonce) external {
        bytes32 uniqID = calcUniqID(_txhash, _from, _fromChainID, _nonce);
        require(!execCompleted[uniqID], "exec completed");

        ExecRecord storage record = retryExecRecords[uniqID];
        require(record.to != address(0), "no retry record");

        address _to = record.to;
        bytes memory _data = record.data;

        // Clear record
        record.to = address(0);
        record.data = "";

        (bool success,) = executor.execute(_to, _data, _from, _fromChainID, _nonce);
        require(success);

        execCompleted[uniqID] = true;
        emit DoneRetryExecRecord(_txhash, _from, _fromChainID, _nonce);
    }

    /// @notice Deposit native currency crediting `_account` for execution costs on this chain
    /// @param _account The account to deposit and credit for
    function deposit(address _account) external payable {
        executionBudget[_account] += msg.value;
        emit Deposit(_account, msg.value);
    }

    /// @notice Withdraw a previous deposit from your account
    /// @param _amount The amount to withdraw from your account
    function withdraw(uint256 _amount) external {
        executionBudget[msg.sender] -= _amount;
        emit Withdraw(msg.sender, _amount);
        (bool success,) = msg.sender.call{value: _amount}("");
        require(success);
    }

    /// @notice Withdraw all accrued execution fees
    /// @dev The MPC is credited in the native currency
    function withdrawAccruedFees() external {
        uint256 fees = _feeData.accruedFees;
        _feeData.accruedFees = 0;
        (bool success,) = mpc.call{value: fees}("");
        require(success);
    }

    /// @notice Set app blacklist
    function setBlacklist(string calldata _appID, bool _flag) external onlyAdmin {
        appBlacklist[_appID] = _flag;
        emit SetBlacklist(_appID, _flag);
    }

    /// @notice Set app blacklist in batch
    function setBlacklists(string[] calldata _appIDs, bool _flag) external onlyAdmin {
        for (uint256 i = 0; i < _appIDs.length; i++) {
            this.setBlacklist(_appIDs[i], _flag);
        }
    }

    /// @notice Set the premimum for cross chain executions
    /// @param _premium The premium per gas
    function setPremium(uint128 _premium) external onlyAdmin {
        emit UpdatePremium(_feeData.premium, _premium);
        _feeData.premium = _premium;
    }

    /// @notice Set minimum exection budget for cross chain executions
    /// @param _minBudget The minimum exection budget
    function setMinReserveBudget(uint128 _minBudget) external onlyAdmin {
        minReserveBudget = _minBudget;
    }

    /// @notice Set mode
    function setMode(uint256 _mode) external onlyAdmin {
        mode = _mode;
    }

    /// @notice Change mpc
    function changeMPC(address _mpc) external onlyMPC {
        pendingMPC = _mpc;
        emit ChangeMPC(mpc, _mpc, block.timestamp);
    }

    /// @notice Apply mpc
    function applyMPC() external {
        require(msg.sender == pendingMPC);
        emit ApplyMPC(mpc, pendingMPC, block.timestamp);
        mpc = pendingMPC;
        pendingMPC = address(0);
    }

    /// @notice Get the total accrued fees in native currency
    /// @dev Fees increase when executing cross chain requests
    function accruedFees() external view returns(uint128) {
        return _feeData.accruedFees;
    }

    /// @notice Get the gas premium cost
    /// @dev This is similar to priority fee in eip-1559, except instead of going
    ///     to the miner it is given to the MPC executing cross chain requests
    function premium() external view returns(uint128) {
        return _feeData.premium;
    }

    /// @notice Add admin
    function addAdmin(address _admin) external onlyMPC {
        require(!isAdmin[_admin]);
        isAdmin[_admin] = true;
        admins.push(_admin);
        emit AddAdmin(_admin);
    }

    /// @notice Remove admin
    function removeAdmin(address _admin) external onlyMPC {
        require(isAdmin[_admin]);
        isAdmin[_admin] = false;
        uint256 length = admins.length;
        for (uint256 i = 0; i < length - 1; i++) {
            if (admins[i] == _admin) {
                admins[i] = admins[length - 1];
                break;
            }
        }
        admins.pop();
        emit RemoveAdmin(_admin);
    }

    /// @notice Get all admins
    function getAllAdmins() external view returns (address[] memory) {
        return admins;
    }

    /// @notice Init app config
    function initAppConfig(
        string calldata _appID,
        address _app,
        address _admin,
        uint256 _flags,
        address[] calldata _whitelist
    ) external onlyAdmin {
        require(bytes(_appID).length > 0, "empty appID");
        require(_app != address(0), "zero app address");

        AppConfig storage config = appConfig[_appID];
        require(config.app == address(0), "app exist");

        appIdentifier[_app] = _appID;

        config.app = _app;
        config.appAdmin = _admin;
        config.appFlags = _flags;

        address[] memory whitelist = new address[](1+_whitelist.length);
        whitelist[0] = _app;
        for (uint256 i = 0; i < _whitelist.length; i++) {
            whitelist[i+1] = _whitelist[i];
        }
        _setAppWhitelist(_appID, whitelist, true);

        emit SetAppConfig(_appID, _app, _admin, _flags);
    }

    /// @notice Update app config
    /// can be operated only by mpc or app admin
    /// the config.app will always keep unchanged here
    function updateAppConfig(
        address _app,
        address _admin,
        uint256 _flags,
        address[] calldata _whitelist
    ) external {
        string memory _appID = appIdentifier[_app];
        AppConfig storage config = appConfig[_appID];

        require(config.app == _app && _app != address(0), "app not exist");
        require(msg.sender == mpc || msg.sender == config.appAdmin, "forbid");

        if (_admin != address(0)) {
            config.appAdmin = _admin;
        }
        config.appFlags = _flags;
        if (_whitelist.length > 0) {
            _setAppWhitelist(_appID, _whitelist, true);
        }

        emit SetAppConfig(_appID, _app, _admin, _flags);
    }

    /// @notice Upgrade app
    /// can be operated only by mpc or app admin
    /// change config.app to a new address
    /// require the `_newApp` is not inited
    function upgradeApp(address _oldApp, address _newApp) external {
        string memory _appID = appIdentifier[_oldApp];
        AppConfig storage config = appConfig[_appID];

        require(config.app == _oldApp && _oldApp != address(0), "app not exist");
        require(msg.sender == mpc || msg.sender == config.appAdmin, "forbid");
        require(bytes(appIdentifier[_newApp]).length == 0, "new app is inited");

        config.app = _newApp;

        emit UpgradeApp(_appID, _oldApp, _newApp);
    }

    /// @notice Add whitelist
    function addWhitelist(address _app, address[] memory _whitelist) external {
        string memory _appID = appIdentifier[_app];
        AppConfig storage config = appConfig[_appID];

        require(config.app == _app && _app != address(0), "app not exist");
        require(msg.sender == mpc || msg.sender == config.appAdmin, "forbid");

        _setAppWhitelist(_appID, _whitelist, true);
    }

    /// @notice Remove whitelist
    function removeWhitelist(address _app, address[] memory _whitelist) external {
        string memory _appID = appIdentifier[_app];
        AppConfig storage config = appConfig[_appID];

        require(config.app == _app && _app != address(0), "app not exist");
        require(msg.sender == mpc || msg.sender == config.appAdmin, "forbid");

        _setAppWhitelist(_appID, _whitelist, false);
    }

    function _setAppWhitelist(string memory _appID, address[] memory _whitelist, bool _flag) internal {
        mapping(address => bool) storage whitelist = appExecWhitelist[_appID];
        address[] storage historyWhitelist = appHistoryWhitelist[_appID];
        address addr;
        for (uint256 i = 0; i < _whitelist.length; i++) {
            addr = _whitelist[i];
            if (whitelist[addr] == _flag) {
                continue;
            }
            if (_flag) {
                historyWhitelist.push(addr);
            }
            whitelist[addr] = _flag;
            emit SetWhitelist(_appID, addr, _flag);
        }
    }

    /// @notice Get history whitelist length
    function getHistoryWhitelistLength(string memory _appID) external view returns (uint256) {
        return appHistoryWhitelist[_appID].length;
    }

    /// @notice Get all history whitelist
    function getAllHistoryWhitelist(string memory _appID) external view returns (address[] memory) {
        return appHistoryWhitelist[_appID];
    }

    /// @notice Tidy history whitelist to be same with actual whitelist
    function tidyHistoryWhitelist(string memory _appID) external {
        mapping(address => bool) storage actualWhitelist = appExecWhitelist[_appID];
        address[] storage historyWhitelist = appHistoryWhitelist[_appID];
        uint256 histLength = historyWhitelist.length;
        uint256 popIndex = histLength;
        address addr;
        for (uint256 i = 0; i < popIndex; ) {
            addr = historyWhitelist[i];
            if (actualWhitelist[addr]) {
                i++;
            } else {
                popIndex--;
                historyWhitelist[i] = historyWhitelist[popIndex];
            }
        }
        for (uint256 i = popIndex; i < histLength; i++) {
            historyWhitelist.pop();
        }
    }

    /// @notice Set default src fees
    function setDefaultSrcFees(
        uint256[] calldata _toChainIDs,
        uint256[] calldata _baseFees,
        uint256[] calldata _feesPerByte
    ) external onlyAdmin {
        uint256 length = _toChainIDs.length;
        require(length == _baseFees.length && length == _feesPerByte.length);

        for (uint256 i = 0; i < length; i++) {
            srcDefaultFees[_toChainIDs[i]] = SrcFeeConfig(_baseFees[i], _feesPerByte[i]);
        }
    }

    /// @notice Set custom src fees
    function setCustomSrcFees(
        address _app,
        uint256[] calldata _toChainIDs,
        uint256[] calldata _baseFees,
        uint256[] calldata _feesPerByte
    ) external onlyAdmin {
        string memory _appID = appIdentifier[_app];
        AppConfig storage config = appConfig[_appID];

        require(config.app == _app && _app != address(0), "app not exist");
        require(_isSet(config.appFlags, FLAG_PAY_FEE_ON_SRC), "flag not set");

        uint256 length = _toChainIDs.length;
        require(length == _baseFees.length && length == _feesPerByte.length);

        mapping(uint256 => SrcFeeConfig) storage _srcFees = srcCustomFees[_appID];
        for (uint256 i = 0; i < length; i++) {
            _srcFees[_toChainIDs[i]] = SrcFeeConfig(_baseFees[i], _feesPerByte[i]);
        }
    }

    /// @notice Set app modes
    function setAppModes(
        address _app,
        uint256 _appDefaultMode,
        uint256[] calldata _toChainIDs,
        uint256[] calldata _appCustomModes
    ) external onlyAdmin {
        string memory _appID = appIdentifier[_app];
        AppConfig storage config = appConfig[_appID];
        require(config.app == _app && _app != address(0), "app not exist");

        uint256 length = _toChainIDs.length;
        require(length == _appCustomModes.length);

        appDefaultModes[_appID] = _appDefaultMode;

        for (uint256 i = 0; i < length; i++) {
            appCustomModes[_appID][_toChainIDs[i]] = _appCustomModes[i];
        }
    }

    /// @notice Calc fees
    function calcSrcFees(
        address _app,
        uint256 _toChainID,
        uint256 _dataLength
    ) external view returns (uint256) {
        string memory _appID = appIdentifier[_app];
        return _calcSrcFees(_appID, _toChainID, _dataLength);
    }

    /// @notice Calc fees
    function calcSrcFees(
        string calldata _appID,
        uint256 _toChainID,
        uint256 _dataLength
    ) external view returns (uint256) {
        return _calcSrcFees(_appID, _toChainID, _dataLength);
    }

    /// @notice Is use custom src fees
    function isUseCustomSrcFees(string memory _appID, uint256 _toChainID) public view returns (bool) {
        uint256 _appMode = appCustomModes[_appID][_toChainID];
        if (_isSet(_appMode, APPMODE_USE_CUSTOM_SRC_FEES)) {
            return true;
        }
        _appMode = appDefaultModes[_appID];
        return _isSet(_appMode, APPMODE_USE_CUSTOM_SRC_FEES);
    }

    function _calcSrcFees(
        string memory _appID,
        uint256 _toChainID,
        uint256 _dataLength
    ) internal view returns (uint256) {
        SrcFeeConfig memory customFees = srcCustomFees[_appID][_toChainID];
        uint256 customBaseFees = customFees.baseFees;
        uint256 customFeesPerBytes = customFees.feesPerByte;

        if (isUseCustomSrcFees(_appID, _toChainID)) {
            return customBaseFees + _dataLength * customFeesPerBytes;
        }

        SrcFeeConfig memory defaultFees = srcDefaultFees[_toChainID];
        uint256 defaultBaseFees = defaultFees.baseFees;
        uint256 defaultFeesPerBytes = defaultFees.feesPerByte;

        uint256 baseFees = (customBaseFees > defaultBaseFees) ? customBaseFees : defaultBaseFees;
        uint256 feesPerByte = (customFeesPerBytes > defaultFeesPerBytes) ? customFeesPerBytes : defaultFeesPerBytes;

        return baseFees + _dataLength * feesPerByte;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_mpc","type":"address"},{"internalType":"uint128","name":"_premium","type":"uint128"},{"internalType":"uint256","name":"_mode","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"AddAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMPC","type":"address"},{"indexed":true,"internalType":"address","name":"newMPC","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ApplyMPC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMPC","type":"address"},{"indexed":true,"internalType":"address","name":"newMPC","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ChangeMPC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txhash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"DoneRetryExecRecord","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"address","name":"_fallback","type":"address"},{"indexed":true,"internalType":"uint256","name":"toChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"flags","type":"uint256"},{"indexed":false,"internalType":"string","name":"appID","type":"string"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"LogAnyCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txhash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"bytes","name":"result","type":"bytes"}],"name":"LogAnyExec","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"RemoveAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"appID","type":"string"},{"indexed":true,"internalType":"address","name":"app","type":"address"},{"indexed":true,"internalType":"address","name":"appAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"appFlags","type":"uint256"}],"name":"SetAppConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"appID","type":"string"},{"indexed":false,"internalType":"bool","name":"flag","type":"bool"}],"name":"SetBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"appID","type":"string"},{"indexed":true,"internalType":"address","name":"whitelist","type":"address"},{"indexed":false,"internalType":"bool","name":"flag","type":"bool"}],"name":"SetWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txhash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"StoreRetryExecRecord","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPremium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPremium","type":"uint256"}],"name":"UpdatePremium","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"appID","type":"string"},{"indexed":true,"internalType":"address","name":"oldApp","type":"address"},{"indexed":true,"internalType":"address","name":"newApp","type":"address"}],"name":"UpgradeApp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"APPMODE_USE_CUSTOM_SRC_FEES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FLAG_MERGE_CONFIG_FLAGS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FLAG_PAY_FEE_ON_SRC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_MODE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMISSIONLESS_MODE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accruedFees","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_app","type":"address"},{"internalType":"address[]","name":"_whitelist","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"admins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"_fallback","type":"address"},{"internalType":"uint256","name":"_toChainID","type":"uint256"},{"internalType":"uint256","name":"_flags","type":"uint256"}],"name":"anyCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"_fallback","type":"address"},{"internalType":"string","name":"_appID","type":"string"},{"components":[{"internalType":"bytes32","name":"txhash","type":"bytes32"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"fromChainID","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"}],"internalType":"struct AnyCallV6Proxy.RequestContext","name":"_ctx","type":"tuple"}],"name":"anyExec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"appBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"appConfig","outputs":[{"internalType":"address","name":"app","type":"address"},{"internalType":"address","name":"appAdmin","type":"address"},{"internalType":"uint256","name":"appFlags","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"appCustomModes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"appDefaultModes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"appExecWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"appHistoryWhitelist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"appIdentifier","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"applyMPC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_appID","type":"string"},{"internalType":"uint256","name":"_toChainID","type":"uint256"},{"internalType":"uint256","name":"_dataLength","type":"uint256"}],"name":"calcSrcFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_app","type":"address"},{"internalType":"uint256","name":"_toChainID","type":"uint256"},{"internalType":"uint256","name":"_dataLength","type":"uint256"}],"name":"calcSrcFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_txhash","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_fromChainID","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"calcUniqID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_mpc","type":"address"}],"name":"changeMPC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"execCompleted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"executionBudget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"executor","outputs":[{"internalType":"contract AnyCallExecutor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllAdmins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_appID","type":"string"}],"name":"getAllHistoryWhitelist","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_appID","type":"string"}],"name":"getHistoryWhitelistLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_appID","type":"string"},{"internalType":"address","name":"_app","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_flags","type":"uint256"},{"internalType":"address[]","name":"_whitelist","type":"address[]"}],"name":"initAppConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_appID","type":"string"},{"internalType":"uint256","name":"_toChainID","type":"uint256"}],"name":"isUseCustomSrcFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minReserveBudget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mpc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMPC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premium","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_app","type":"address"},{"internalType":"address[]","name":"_whitelist","type":"address[]"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_txhash","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_fromChainID","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"retryExec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"retryExecRecords","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_app","type":"address"},{"internalType":"uint256","name":"_appDefaultMode","type":"uint256"},{"internalType":"uint256[]","name":"_toChainIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"_appCustomModes","type":"uint256[]"}],"name":"setAppModes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_appID","type":"string"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_appIDs","type":"string[]"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setBlacklists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_app","type":"address"},{"internalType":"uint256[]","name":"_toChainIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"_baseFees","type":"uint256[]"},{"internalType":"uint256[]","name":"_feesPerByte","type":"uint256[]"}],"name":"setCustomSrcFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_toChainIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"_baseFees","type":"uint256[]"},{"internalType":"uint256[]","name":"_feesPerByte","type":"uint256[]"}],"name":"setDefaultSrcFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_minBudget","type":"uint128"}],"name":"setMinReserveBudget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mode","type":"uint256"}],"name":"setMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_premium","type":"uint128"}],"name":"setPremium","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"srcCustomFees","outputs":[{"internalType":"uint256","name":"baseFees","type":"uint256"},{"internalType":"uint256","name":"feesPerByte","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"srcDefaultFees","outputs":[{"internalType":"uint256","name":"baseFees","type":"uint256"},{"internalType":"uint256","name":"feesPerByte","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_appID","type":"string"}],"name":"tidyHistoryWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_app","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_flags","type":"uint256"},{"internalType":"address[]","name":"_whitelist","type":"address[]"}],"name":"updateAppConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oldApp","type":"address"},{"internalType":"address","name":"_newApp","type":"address"}],"name":"upgradeApp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAccruedFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x60806040526004361061038b5760003560e01c806384271a6c116101dc578063bd45c4e711610102578063d8f1bd68116100a0578063f340fa011161006f578063f340fa0114610b98578063f75c266414610bab578063f830e7b414610bcb578063fadd10a214610beb57600080fd5b8063d8f1bd6814610b0e578063dfde3fdb14610b2e578063e0a73a9314610b5e578063e9523c9714610b8357600080fd5b8063c1e26e33116100dc578063c1e26e3314610aae578063c3294bb5146105bb578063c34c08e514610ace578063d72dd3b414610aee57600080fd5b8063bd45c4e714610a7b578063bf5d3f2414610a8e578063c0ab8899146109af57600080fd5b8063ab818db71161017a578063afdd2aed11610149578063afdd2aed146109f9578063b041758714610a19578063b63b38d014610a46578063b854bb5614610a5b57600080fd5b8063ab818db71461098f578063ac61b46f146109af578063ada82c7d146109c4578063aeb79211146109d957600080fd5b806395ec1be8116101b657806395ec1be8146105bb57806397f8a94f146109045780639a295d4914610924578063a86529d81461094457600080fd5b806384271a6c1461087557806389168e1814610895578063908c07c5146108b557600080fd5b806354b09ac5116102c1578063682c20581161025f578063732a8eda1161022e578063732a8eda146107c357806374bdda60146107fb578063796a9e43146108285780637a67bbf91461085557600080fd5b8063682c2058146107095780636c0cf7b71461073b5780636e6e8a021461078357806370480275146107a357600080fd5b80635c975abb1161029b5780635c975abb146106665780635ffdc9ca14610680578063667cb4b7146106c957806366c96b37146106e957600080fd5b806354b09ac5146106105780635689f039146106305780635b7b018c1461064657600080fd5b80632898bff81161032e578063304281cb11610308578063304281cb1461053c5780633083d598146105bb578063439b3e1c146105d05780634a578150146105f057600080fd5b80632898bff8146104d8578063295a5212146104f85780632e1a7d4d1461051c57600080fd5b80631785f53c1161036a5780631785f53c1461043a57806322b6a4e11461045a57806324d7806c146104885780632687b2b1146104b857600080fd5b80626a5fa11461039057806314bfd6d0146103e057806316c38b3c14610418575b600080fd5b34801561039c57600080fd5b506103cb6103ab3660046139ed565b805160208183018101805160048252928201919093012091525460ff1681565b60405190151581526020015b60405180910390f35b3480156103ec57600080fd5b506104006103fb366004613a21565b610c0b565b6040516001600160a01b0390911681526020016103d7565b34801561042457600080fd5b50610438610433366004613a48565b610c35565b005b34801561044657600080fd5b50610438610455366004613a81565b610c80565b34801561046657600080fd5b5061047a610475366004613a21565b610e42565b6040516103d7929190613aec565b34801561049457600080fd5b506103cb6104a3366004613a81565b60096020526000908152604090205460ff1681565b3480156104c457600080fd5b506104386104d3366004613ba4565b610ef1565b3480156104e457600080fd5b506104386104f3366004613c41565b611206565b34801561050457600080fd5b5061050e600d5481565b6040519081526020016103d7565b34801561052857600080fd5b50610438610537366004613a21565b611243565b34801561054857600080fd5b506105956105573660046139ed565b805180820160209081018051600180835293830192909401919091209290528154908201546002909201546001600160a01b03918216929091169083565b604080516001600160a01b039485168152939092166020840152908201526060016103d7565b3480156105c757600080fd5b5061050e600181565b3480156105dc57600080fd5b506104386105eb366004613c41565b611301565b3480156105fc57600080fd5b5061043861060b366004613c6a565b61139d565b34801561061c57600080fd5b5061050e61062b366004613d61565b611a89565b34801561063c57600080fd5b5061050e600f5481565b34801561065257600080fd5b50610438610661366004613a81565b611ad0565b34801561067257600080fd5b50600e546103cb9060ff1681565b34801561068c57600080fd5b506106b461069b366004613a21565b6005602052600090815260409020805460019091015482565b604080519283526020830191909152016103d7565b3480156106d557600080fd5b506104386106e4366004613d9c565b611b56565b3480156106f557600080fd5b5061050e610704366004613dcf565b611d63565b34801561071557600080fd5b506011546001600160801b03165b6040516001600160801b0390911681526020016103d7565b34801561074757600080fd5b5061050e610756366004613e1f565b81516020818401810180516008825292820194820194909420919093529091526000908152604090205481565b34801561078f57600080fd5b5061043861079e366004613e63565b611db1565b3480156107af57600080fd5b506104386107be366004613a81565b611f0c565b3480156107cf57600080fd5b5061050e6107de3660046139ed565b805160208183018101805160078252928201919093012091525481565b34801561080757600080fd5b5061050e610816366004613a81565b60106020526000908152604090205481565b34801561083457600080fd5b506108486108433660046139ed565b611ff8565b6040516103d79190613f23565b34801561086157600080fd5b50610438610870366004613f70565b612072565b34801561088157600080fd5b50610438610890366004613d61565b61213a565b3480156108a157600080fd5b506104386108b0366004613fc6565b6123af565b3480156108c157600080fd5b506106b46108d0366004613e1f565b8151602081840181018051600682529282019482019490942091909352909152600090815260409020805460019091015482565b34801561091057600080fd5b5061040061091f366004613e1f565b61249f565b34801561093057600080fd5b5061043861093f36600461405f565b6124e6565b34801561095057600080fd5b506103cb61095f3660046140c9565b81516020818401810180516002825292820194820194909420919093529091526000908152604090205460ff1681565b34801561099b57600080fd5b5061050e6109aa36600461410d565b6126d9565b3480156109bb57600080fd5b5061050e600281565b3480156109d057600080fd5b50610438612795565b3480156109e557600080fd5b506104386109f4366004614140565b6127d6565b348015610a0557600080fd5b50610438610a143660046141ae565b6129ef565b348015610a2557600080fd5b50610a39610a34366004613a81565b612c50565b6040516103d79190614238565b348015610a5257600080fd5b50610438612cea565b348015610a6757600080fd5b506103cb610a76366004613e1f565b612d71565b610438610a8936600461424b565b612de8565b348015610a9a57600080fd5b50610438610aa93660046142c1565b613160565b348015610aba57600080fd5b50610438610ac93660046139ed565b613201565b348015610ada57600080fd5b50601254610400906001600160a01b031681565b348015610afa57600080fd5b50610438610b09366004613a21565b613383565b348015610b1a57600080fd5b50610438610b29366004613e63565b6133b7565b348015610b3a57600080fd5b506103cb610b49366004613a21565b60146020526000908152604090205460ff1681565b348015610b6a57600080fd5b50601154600160801b90046001600160801b0316610723565b348015610b8f57600080fd5b5061084861350c565b610438610ba6366004613a81565b61356e565b348015610bb757600080fd5b50600b54610400906001600160a01b031681565b348015610bd757600080fd5b50600c54610400906001600160a01b031681565b348015610bf757600080fd5b5061050e610c063660046139ed565b6135dc565b600a8181548110610c1b57600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081526009602052604090205460ff16610c6d5760405162461bcd60e51b8152600401610c64906142f8565b60405180910390fd5b600e805460ff1916911515919091179055565b600b546001600160a01b03163314610caa5760405162461bcd60e51b8152600401610c649061431c565b6001600160a01b03811660009081526009602052604090205460ff16610ccf57600080fd5b6001600160a01b0381166000908152600960205260408120805460ff19169055600a54905b610cff600183614354565b811015610dcb57826001600160a01b0316600a8281548110610d2357610d23614367565b6000918252602090912001546001600160a01b031603610db957600a610d4a600184614354565b81548110610d5a57610d5a614367565b600091825260209091200154600a80546001600160a01b039092169183908110610d8657610d86614367565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610dcb565b80610dc38161437d565b915050610cf4565b50600a805480610ddd57610ddd614396565b6000828152602090819020600019908301810180546001600160a01b03191690559091019091556040516001600160a01b03841681527f753f40ca3312b2408759a67875b367955e7baa221daf08aa3d643d96202ac12b910160405180910390a15050565b601360205260009081526040902080546001820180546001600160a01b039092169291610e6e906143ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a906143ac565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b5050505050905082565b3360009081526009602052604090205460ff16610f205760405162461bcd60e51b8152600401610c64906142f8565b85610f5b5760405162461bcd60e51b815260206004820152600b60248201526a195b5c1d1e48185c1c125160aa1b6044820152606401610c64565b6001600160a01b038516610fa45760405162461bcd60e51b815260206004820152601060248201526f7a65726f20617070206164647265737360801b6044820152606401610c64565b600060018888604051610fb89291906143e6565b90815260405190819003602001902080549091506001600160a01b03161561100e5760405162461bcd60e51b8152602060048201526009602482015268185c1c08195e1a5cdd60ba1b6044820152606401610c64565b6001600160a01b0386166000908152602081905260409020611031888a83614445565b5080546001600160a01b038088166001600160a01b031992831617835560018084018054928916929093169190911790915560028201859055600090611078908490614505565b6001600160401b0381111561108f5761108f6138f9565b6040519080825280602002602001820160405280156110b8578160200160208202803683370190505b50905086816000815181106110cf576110cf614367565b60200260200101906001600160a01b031690816001600160a01b03168152505060005b838110156111675784848281811061110c5761110c614367565b90506020020160208101906111219190613a81565b8261112d836001614505565b8151811061113d5761113d614367565b6001600160a01b03909216602092830291909101909101528061115f8161437d565b9150506110f2565b506111ac89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250600191506136049050565b856001600160a01b0316876001600160a01b03167fe6814e9c971e79d8cfa0cb8a20ef274c921710f5df7a6e19ca62fb272dc45cf58b8b896040516111f393929190614541565b60405180910390a3505050505050505050565b3360009081526009602052604090205460ff166112355760405162461bcd60e51b8152600401610c64906142f8565b6001600160801b0316600f55565b3360009081526010602052604081208054839290611262908490614354565b909155505060405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a26000336001600160a01b0316826040515b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b50509050806112fd57600080fd5b5050565b3360009081526009602052604090205460ff166113305760405162461bcd60e51b8152600401610c64906142f8565b60115460408051600160801b9092046001600160801b039081168352831660208301527fec6b0785fd83ba51c66ca8c8bb1e4fbdd02a0cced0457a21583fdf399eb3e000910160405180910390a1601180546001600160801b03928316600160801b029216919091179055565b6016546001146113ac57600080fd5b6000601655600e5460ff16156113ed5760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610c64565b806020015181608001516000611408600d5460029081161490565b6114895760028083161461148957600f546001600160a01b03841660009081526010602052604090205410156114775760405162461bcd60e51b81526020600482015260146024820152731b195cdcc81d1a185b881b5a5b88189d5919d95d60621b6044820152606401610c64565b620186a05a6114869190614505565b90505b600b546001600160a01b031633146114b35760405162461bcd60e51b8152600401610c649061431c565b60208401516001600160a01b03871615806114df5750806001600160a01b0316876001600160a01b0316145b61151c5760405162461bcd60e51b815260206004820152600e60248201526d77726f6e672066616c6c6261636b60901b6044820152606401610c64565b60048660405161152c9190614565565b9081526040519081900360200190205460ff16156115785760405162461bcd60e51b8152602060048201526009602482015268189b1858dadb1a5cdd60ba1b6044820152606401610c64565b600d546001908116146115f9576002866040516115959190614565565b90815260408051602092819003830190206001600160a01b038c166000908152925290205460ff166115f95760405162461bcd60e51b815260206004820152600d60248201526c3737903832b936b4b9b9b4b7b760991b6044820152606401610c64565b600061161386600001518388604001518960600151611a89565b60008181526014602052604090205490915060ff16156116665760405162461bcd60e51b815260206004820152600e60248201526d195e1958c818dbdb5c1b195d195960921b6044820152606401610c64565b60006060601260009054906101000a90046001600160a01b03166001600160a01b031663978802398d8d878c604001518d606001516040518663ffffffff1660e01b81526004016116bb959493929190614581565b6000604051808303816000875af19250505080156116fb57506040513d6000823e601f3d908101601f191682016040526116f891908101906145bf565b60015b61176657611707614656565b806308c379a00361172d575061171b614672565b80611726575061172f565b905061176c565b505b3d808015611759576040519150601f19603f3d011682016040523d82523d6000602084013e61175e565b606091505b50905061176c565b90925090505b8b6001600160a01b0316846001600160a01b031689600001517f0a2dd9a3c77dd69c3b4a5c5ef91fe5f43dfa5365029792e918b9db16ad2c35aa8b604001518c6060015187876040516117c294939291906146fb565b60405180910390a45080156117ef576000828152601460205260409020805460ff19166001179055611975565b6001600160a01b0389166118b7576040805180820182526001600160a01b038d8116825260208083018e815260008781526013909252939020825181546001600160a01b031916921691909117815591519091906001820190611852908261472c565b509050508a6001600160a01b0316836001600160a01b031688600001517fdad73de9dcb4c7934ccf673a532ca1547846f401631886090cb5c83c2e9ccd498a604001518b606001518f6040516118aa939291906147eb565b60405180910390a4611975565b601580549060006118c78361437d565b91905055508660400151896001600160a01b0316846001600160a01b03167fa17aef042e1a5dd2b8e68f0d0d92f9a6a0b35dc25be1d12c0cb3135bfd8951c963a35fe8bf60e01b8f8f604051602401611921929190613aec565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506000808e60155460405161196c95949392919061480a565b60405180910390a45b505081159050611a7a5760115460009061199f90600160801b90046001600160801b03163a614505565b5a6119aa9084614354565b6119b49190614858565b6001600160a01b038516600090815260106020526040902054909150818111611a125760405162461bcd60e51b815260206004820152601060248201526f1b9bc8195b9bdd59da08189d5919d95d60821b6044820152606401610c64565b611a1c8282614354565b6001600160a01b03861660009081526010602052604081209190915560118054849290611a539084906001600160801b031661486f565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555050505b50506001601655505050505050565b604080516020808201969096526001600160a01b03949094168482015260608401929092526080808401919091528151808403909101815260a09092019052805191012090565b600b546001600160a01b03163314611afa5760405162461bcd60e51b8152600401610c649061431c565b600c80546001600160a01b0319166001600160a01b03838116918217909255600b54604051428152919216907f587ad0bc9a6955b6c850bc4f90ab8c66b32e2a6919d4244e459ac74ffa4a88849060200160405180910390a350565b6001600160a01b03821660009081526020819052604081208054611b79906143ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611ba5906143ac565b8015611bf25780601f10611bc757610100808354040283529160200191611bf2565b820191906000526020600020905b815481529060010190602001808311611bd557829003601f168201915b505050505090506000600182604051611c0b9190614565565b90815260405190819003602001902080549091506001600160a01b03908116908516148015611c4257506001600160a01b03841615155b611c5e5760405162461bcd60e51b8152600401610c6490614896565b600b546001600160a01b0316331480611c83575060018101546001600160a01b031633145b611c9f5760405162461bcd60e51b8152600401610c64906148bd565b6001600160a01b03831660009081526020819052604090208054611cc2906143ac565b159050611d055760405162461bcd60e51b81526020600482015260116024820152701b995dc8185c1c081a5cc81a5b9a5d1959607a1b6044820152606401610c64565b80546001600160a01b0319166001600160a01b038481169182178355604051908616907fd037ce9f8e96b2c7cdea421a50a484949e5f9e1e4914834059493cbfbf65862290611d55908690614238565b60405180910390a350505050565b6000611da885858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792508691506137409050565b95945050505050565b6001600160a01b03821660009081526020819052604081208054611dd4906143ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611e00906143ac565b8015611e4d5780601f10611e2257610100808354040283529160200191611e4d565b820191906000526020600020905b815481529060010190602001808311611e3057829003601f168201915b505050505090506000600182604051611e669190614565565b90815260405190819003602001902080549091506001600160a01b03908116908516148015611e9d57506001600160a01b03841615155b611eb95760405162461bcd60e51b8152600401610c6490614896565b600b546001600160a01b0316331480611ede575060018101546001600160a01b031633145b611efa5760405162461bcd60e51b8152600401610c64906148bd565b611f0682846001613604565b50505050565b600b546001600160a01b03163314611f365760405162461bcd60e51b8152600401610c649061431c565b6001600160a01b03811660009081526009602052604090205460ff1615611f5c57600080fd5b6001600160a01b0381166000818152600960209081526040808320805460ff19166001908117909155600a805491820181559093527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890920180546001600160a01b0319168417905590519182527fad6de4452a631e641cb59902236607946ce9272b9b981f2f80e8d129cb9084ba910160405180910390a150565b606060038260405161200a9190614565565b908152604080519182900360209081018320805480830285018301909352828452919083018282801561206657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612048575b50505050509050919050565b3360009081526009602052604090205460ff166120a15760405162461bcd60e51b8152600401610c64906142f8565b60005b82811015611f06573063bf5d3f248585848181106120c4576120c4614367565b90506020028101906120d691906148dd565b856040518463ffffffff1660e01b81526004016120f593929190614923565b600060405180830381600087803b15801561210f57600080fd5b505af1158015612123573d6000803e3d6000fd5b5050505080806121329061437d565b9150506120a4565b600061214885858585611a89565b60008181526014602052604090205490915060ff161561219b5760405162461bcd60e51b815260206004820152600e60248201526d195e1958c818dbdb5c1b195d195960921b6044820152606401610c64565b600081815260136020526040902080546001600160a01b03166121f25760405162461bcd60e51b815260206004820152600f60248201526e1b9bc81c995d1c9e481c9958dbdc99608a1b6044820152606401610c64565b80546001820180546001600160a01b039092169160009190612213906143ac565b80601f016020809104026020016040519081016040528092919081815260200182805461223f906143ac565b801561228c5780601f106122615761010080835404028352916020019161228c565b820191906000526020600020905b81548152906001019060200180831161226f57829003601f168201915b505086546001600160a01b031916875550506040805160208101909152600081529192505060018401906122c0908261472c565b50601254604051639788023960e01b81526000916001600160a01b0316906397880239906122fa90869086908d908d908d90600401614581565b6000604051808303816000875af1158015612319573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261234191908101906145bf565b5090508061234e57600080fd5b60008581526014602052604090819020805460ff19166001179055516001600160a01b038916908a907f819e22d91cf6246af3647f0722340d66b71cae69d9c6b1cbbf015ed0ec46c9c4906111f3908b908b90918252602082015260400190565b3360009081526009602052604090205460ff166123de5760405162461bcd60e51b8152600401610c64906142f8565b8483811480156123ed57508082145b6123f657600080fd5b60005b8181101561249557604051806040016040528087878481811061241e5761241e614367565b90506020020135815260200185858481811061243c5761243c614367565b90506020020135815250600560008a8a8581811061245c5761245c614367565b6020908102929092013583525081810192909252604001600020825181559101516001909101558061248d8161437d565b9150506123f9565b5050505050505050565b815160208184018101805160038252928201918501919091209190528054829081106124ca57600080fd5b6000918252602090912001546001600160a01b03169150829050565b3360009081526009602052604090205460ff166125155760405162461bcd60e51b8152600401610c64906142f8565b6001600160a01b03861660009081526020819052604081208054612538906143ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612564906143ac565b80156125b15780601f10612586576101008083540402835291602001916125b1565b820191906000526020600020905b81548152906001019060200180831161259457829003601f168201915b5050505050905060006001826040516125ca9190614565565b90815260405190819003602001902080549091506001600160a01b0390811690891614801561260157506001600160a01b03881615155b61261d5760405162461bcd60e51b8152600401610c6490614896565b8483811461262a57600080fd5b8760078460405161263b9190614565565b9081526040519081900360200190205560005b818110156126cd5785858281811061266857612668614367565b9050602002013560088560405161267f9190614565565b908152602001604051809103902060008a8a858181106126a1576126a1614367565b9050602002013581526020019081526020016000208190555080806126c59061437d565b91505061264e565b50505050505050505050565b6001600160a01b038316600090815260208190526040812080548291906126ff906143ac565b80601f016020809104026020016040519081016040528092919081815260200182805461272b906143ac565b80156127785780601f1061274d57610100808354040283529160200191612778565b820191906000526020600020905b81548152906001019060200180831161275b57829003601f168201915b5050505050905061278a818585613740565b9150505b9392505050565b601180546fffffffffffffffffffffffffffffffff198116909155600b546040516001600160801b03909216916000916001600160a01b03169083906112ad565b6001600160a01b038516600090815260208190526040812080546127f9906143ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612825906143ac565b80156128725780601f1061284757610100808354040283529160200191612872565b820191906000526020600020905b81548152906001019060200180831161285557829003601f168201915b50505050509050600060018260405161288b9190614565565b90815260405190819003602001902080549091506001600160a01b039081169088161480156128c257506001600160a01b03871615155b6128de5760405162461bcd60e51b8152600401610c6490614896565b600b546001600160a01b0316331480612903575060018101546001600160a01b031633145b61291f5760405162461bcd60e51b8152600401610c64906148bd565b6001600160a01b0386161561294c576001810180546001600160a01b0319166001600160a01b0388161790555b600281018590558215612999576129998285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525060019250613604915050565b856001600160a01b0316876001600160a01b03167fe6814e9c971e79d8cfa0cb8a20ef274c921710f5df7a6e19ca62fb272dc45cf584886040516129de929190614949565b60405180910390a350505050505050565b3360009081526009602052604090205460ff16612a1e5760405162461bcd60e51b8152600401610c64906142f8565b6001600160a01b03871660009081526020819052604081208054612a41906143ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612a6d906143ac565b8015612aba5780601f10612a8f57610100808354040283529160200191612aba565b820191906000526020600020905b815481529060010190602001808311612a9d57829003601f168201915b505050505090506000600182604051612ad39190614565565b90815260405190819003602001902080549091506001600160a01b03908116908a16148015612b0a57506001600160a01b03891615155b612b265760405162461bcd60e51b8152600401610c6490614896565b600280820154811614612b6a5760405162461bcd60e51b815260206004820152600c60248201526b199b1859c81b9bdd081cd95d60a21b6044820152606401610c64565b868581148015612b7957508084145b612b8257600080fd5b6000600684604051612b949190614565565b9081526020016040518091039020905060005b82811015612c425760405180604001604052808a8a84818110612bcc57612bcc614367565b905060200201358152602001888884818110612bea57612bea614367565b905060200201358152508260008d8d85818110612c0957612c09614367565b60209081029290920135835250818101929092526040016000208251815591015160019091015580612c3a8161437d565b915050612ba7565b505050505050505050505050565b60006020819052908152604090208054612c69906143ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612c95906143ac565b8015612ce25780601f10612cb757610100808354040283529160200191612ce2565b820191906000526020600020905b815481529060010190602001808311612cc557829003601f168201915b505050505081565b600c546001600160a01b03163314612d0157600080fd5b600c54600b546040514281526001600160a01b0392831692909116907fa2e29fe96457476993f3188189d22408c86df0c977ec90a31b979c899800d0659060200160405180910390a3600c8054600b80546001600160a01b03199081166001600160a01b03841617909155169055565b600080600884604051612d849190614565565b9081526040805160209281900383019020600086815292529020549050600180821603612db5576001915050612de2565b600784604051612dc59190614565565b9081526040519081900360200190205490506001808216145b9150505b92915050565b601654600114612df757600080fd5b6000601655600e5460ff1615612e385760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610c64565b6001600160a01b0383161580612e5657506001600160a01b03831633145b612e935760405162461bcd60e51b815260206004820152600e60248201526d77726f6e672066616c6c6261636b60901b6044820152606401610c64565b3360009081526020819052604081208054612ead906143ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612ed9906143ac565b8015612f265780601f10612efb57610100808354040283529160200191612f26565b820191906000526020600020905b815481529060010190602001808311612f0957829003601f168201915b50505050509050600481604051612f3d9190614565565b9081526040519081900360200190205460ff1615612f895760405162461bcd60e51b8152602060048201526009602482015268189b1858dadb1a5cdd60ba1b6044820152606401610c64565b6000612f9a600d5460019081161490565b90508061300c57600282604051612fb19190614565565b9081526040805160209281900383019020336000908152925290205460ff1661300c5760405162461bcd60e51b815260206004820152600d60248201526c3737903832b936b4b9b9b4b7b760991b6044820152606401610c64565b600d546002908116146130e457600060018360405161302b9190614565565b90815260200160405180910390209050818015613050575080546001600160a01b0316155b80613064575080546001600160a01b031633145b6130805760405162461bcd60e51b8152600401610c6490614896565b600180851614801561309b575080546001600160a01b031633145b156130aa578060020154841793505b6002808516036130d25760006130c184878a613740565b90506130cc8161382d565b506130e2565b34156130e2576130e2600061382d565b505b601580549060006130f48361437d565b919050555083886001600160a01b0316336001600160a01b03167fa17aef042e1a5dd2b8e68f0d0d92f9a6a0b35dc25be1d12c0cb3135bfd8951c98a8a8a89896015546040516131499695949392919061496b565b60405180910390a450506001601655505050505050565b3360009081526009602052604090205460ff1661318f5760405162461bcd60e51b8152600401610c64906142f8565b80600484846040516131a29291906143e6565b908152604051908190036020018120805492151560ff19909316929092179091557f8450ad9faca1edf7a8a033ed0adf98a354d14b22658565ca76f3e11e881947c1906131f490859085908590614923565b60405180910390a1505050565b60006002826040516132139190614565565b9081526020016040518091039020905060006003836040516132359190614565565b9081526040519081900360200190208054909150806000805b8281101561332b5784818154811061326857613268614367565b60009182526020808320909101546001600160a01b03168083529088905260409091205490925060ff16156132a957806132a18161437d565b91505061324e565b826132b3816149bb565b9350508483815481106132c8576132c8614367565b9060005260206000200160009054906101000a90046001600160a01b03168582815481106132f8576132f8614367565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061324e565b50815b8381101561337a578480548061334657613346614396565b600082815260209020810160001990810180546001600160a01b0319169055019055806133728161437d565b91505061332e565b50505050505050565b3360009081526009602052604090205460ff166133b25760405162461bcd60e51b8152600401610c64906142f8565b600d55565b6001600160a01b038216600090815260208190526040812080546133da906143ac565b80601f0160208091040260200160405190810160405280929190818152602001828054613406906143ac565b80156134535780601f1061342857610100808354040283529160200191613453565b820191906000526020600020905b81548152906001019060200180831161343657829003601f168201915b50505050509050600060018260405161346c9190614565565b90815260405190819003602001902080549091506001600160a01b039081169085161480156134a357506001600160a01b03841615155b6134bf5760405162461bcd60e51b8152600401610c6490614896565b600b546001600160a01b03163314806134e4575060018101546001600160a01b031633145b6135005760405162461bcd60e51b8152600401610c64906148bd565b611f0682846000613604565b6060600a80548060200260200160405190810160405280929190818152602001828054801561356457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613546575b5050505050905090565b6001600160a01b03811660009081526010602052604081208054349290613596908490614505565b90915550506040513481526001600160a01b038216907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a250565b60006003826040516135ee9190614565565b9081526040519081900360200190205492915050565b60006002846040516136169190614565565b9081526020016040518091039020905060006003856040516136389190614565565b90815260405190819003602001902090506000805b855181101561337a5785818151811061366857613668614367565b6020908102919091018101516001600160a01b03811660009081529186905260409091205490925060ff1615158515151461372e5784156136cf5782546001810184556000848152602090200180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b03821660008181526020869052604090819020805460ff1916881515179055517f5059f2158bd5a3ba277fdb58bf30871e09bae3987abede6055be2e87bbf7f79690613725908a9089906149d2565b60405180910390a25b806137388161437d565b91505061364d565b6000806006856040516137539190614565565b9081526040805160209281900383018120600088815290845282902081830190925281548082526001909201549281018390529250906137938787612d71565b156137b6576137a28186614858565b6137ac9083614505565b935050505061278e565b60008681526005602090815260408083208151808301909252805480835260019091015492820183905290929091908286116137f257826137f4565b855b905060008286116138055782613807565b855b9050613813818b614858565b61381d9083614505565b9c9b505050505050505050505050565b803410156138715760405162461bcd60e51b81526020600482015260116024820152706e6f20656e6f756768207372632066656560781b6044820152606401610c64565b80156138d957600b546040516000916001600160a01b03169083908381818185875af1925050503d80600081146138c4576040519150601f19603f3d011682016040523d82523d6000602084013e6138c9565b606091505b50509050806138d757600080fd5b505b803411156138f6576000336138ee8334614354565b6040516112ad565b50565b634e487b7160e01b600052604160045260246000fd5b60a081018181106001600160401b038211171561392e5761392e6138f9565b60405250565b601f8201601f191681016001600160401b0381118282101715613959576139596138f9565b6040525050565b60006001600160401b03821115613979576139796138f9565b50601f01601f191660200190565b600061399283613960565b60405161399f8282613934565b8092508481528585850111156139b457600080fd5b8484602083013760006020868301015250509392505050565b600082601f8301126139de57600080fd5b61278e83833560208501613987565b6000602082840312156139ff57600080fd5b81356001600160401b03811115613a1557600080fd5b612dde848285016139cd565b600060208284031215613a3357600080fd5b5035919050565b80151581146138f657600080fd5b600060208284031215613a5a57600080fd5b813561278e81613a3a565b80356001600160a01b0381168114613a7c57600080fd5b919050565b600060208284031215613a9357600080fd5b61278e82613a65565b60005b83811015613ab7578181015183820152602001613a9f565b50506000910152565b60008151808452613ad8816020860160208601613a9c565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090613b1090830184613ac0565b949350505050565b60008083601f840112613b2a57600080fd5b5081356001600160401b03811115613b4157600080fd5b602083019150836020828501011115613b5957600080fd5b9250929050565b60008083601f840112613b7257600080fd5b5081356001600160401b03811115613b8957600080fd5b6020830191508360208260051b8501011115613b5957600080fd5b600080600080600080600060a0888a031215613bbf57600080fd5b87356001600160401b0380821115613bd657600080fd5b613be28b838c01613b18565b9099509750879150613bf660208b01613a65565b9650613c0460408b01613a65565b955060608a0135945060808a0135915080821115613c2157600080fd5b50613c2e8a828b01613b60565b989b979a50959850939692959293505050565b600060208284031215613c5357600080fd5b81356001600160801b038116811461278e57600080fd5b6000806000806000858703610120811215613c8457600080fd5b613c8d87613a65565b955060208701356001600160401b0380821115613ca957600080fd5b818901915089601f830112613cbd57600080fd5b613ccc8a833560208501613987565b9650613cda60408a01613a65565b95506060890135915080821115613cf057600080fd5b50613cfd89828a016139cd565b93505060a0607f1982011215613d1257600080fd5b50604051613d1f8161390f565b60808701358152613d3260a08801613a65565b602082015260c0870135604082015260e087013560608201526101009096013560808701525092959194509290565b60008060008060808587031215613d7757600080fd5b84359350613d8760208601613a65565b93969395505050506040820135916060013590565b60008060408385031215613daf57600080fd5b613db883613a65565b9150613dc660208401613a65565b90509250929050565b60008060008060608587031215613de557600080fd5b84356001600160401b03811115613dfb57600080fd5b613e0787828801613b18565b90989097506020870135966040013595509350505050565b60008060408385031215613e3257600080fd5b82356001600160401b03811115613e4857600080fd5b613e54858286016139cd565b95602094909401359450505050565b60008060408385031215613e7657600080fd5b613e7f83613a65565b91506020808401356001600160401b0380821115613e9c57600080fd5b818601915086601f830112613eb057600080fd5b813581811115613ec257613ec26138f9565b8060051b9150604051613ed785840182613934565b81815291830184019184810189841115613ef057600080fd5b938501935b83851015613f1357613f0685613a65565b8152938501938501613ef5565b5080955050505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613f645783516001600160a01b031683529284019291840191600101613f3f565b50909695505050505050565b600080600060408486031215613f8557600080fd5b83356001600160401b03811115613f9b57600080fd5b613fa786828701613b60565b9094509250506020840135613fbb81613a3a565b809150509250925092565b60008060008060008060608789031215613fdf57600080fd5b86356001600160401b0380821115613ff657600080fd5b6140028a838b01613b60565b9098509650602089013591508082111561401b57600080fd5b6140278a838b01613b60565b9096509450604089013591508082111561404057600080fd5b5061404d89828a01613b60565b979a9699509497509295939492505050565b6000806000806000806080878903121561407857600080fd5b61408187613a65565b95506020870135945060408701356001600160401b03808211156140a457600080fd5b6140b08a838b01613b60565b9096509450606089013591508082111561404057600080fd5b600080604083850312156140dc57600080fd5b82356001600160401b038111156140f257600080fd5b6140fe858286016139cd565b925050613dc660208401613a65565b60008060006060848603121561412257600080fd5b61412b84613a65565b95602085013595506040909401359392505050565b60008060008060006080868803121561415857600080fd5b61416186613a65565b945061416f60208701613a65565b93506040860135925060608601356001600160401b0381111561419157600080fd5b61419d88828901613b60565b969995985093965092949392505050565b60008060008060008060006080888a0312156141c957600080fd5b6141d288613a65565b965060208801356001600160401b03808211156141ee57600080fd5b6141fa8b838c01613b60565b909850965060408a013591508082111561421357600080fd5b61421f8b838c01613b60565b909650945060608a0135915080821115613c2157600080fd5b60208152600061278e6020830184613ac0565b60008060008060008060a0878903121561426457600080fd5b61426d87613a65565b955060208701356001600160401b0381111561428857600080fd5b61429489828a01613b18565b90965094506142a7905060408801613a65565b925060608701359150608087013590509295509295509295565b6000806000604084860312156142d657600080fd5b83356001600160401b038111156142ec57600080fd5b613fa786828701613b18565b6020808252600a908201526937b7363c9030b236b4b760b11b604082015260600190565b6020808252600890820152676f6e6c79204d504360c01b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115612de257612de261433e565b634e487b7160e01b600052603260045260246000fd5b60006001820161438f5761438f61433e565b5060010190565b634e487b7160e01b600052603160045260246000fd5b600181811c908216806143c057607f821691505b6020821081036143e057634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b601f82111561444057600081815260208120601f850160051c8101602086101561441d5750805b601f850160051c820191505b8181101561443c57828155600101614429565b5050505b505050565b6001600160401b0383111561445c5761445c6138f9565b6144708361446a83546143ac565b836143f6565b6000601f8411600181146144a4576000851561448c5750838201355b600019600387901b1c1916600186901b1783556144fe565b600083815260209020601f19861690835b828110156144d557868501358255602094850194600190920191016144b5565b50868210156144f25760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b80820180821115612de257612de261433e565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000614555604083018587614518565b9050826020830152949350505050565b60008251614577818460208701613a9c565b9190910192915050565b600060018060a01b03808816835260a060208401526145a360a0840188613ac0565b9516604083015250606081019290925260809091015292915050565b600080604083850312156145d257600080fd5b82516145dd81613a3a565b60208401519092506001600160401b038111156145f957600080fd5b8301601f8101851361460a57600080fd5b805161461581613960565b6040516146228282613934565b82815287602084860101111561463757600080fd5b614648836020830160208701613a9c565b809450505050509250929050565b600060033d111561466f5760046000803e5060005160e01c5b90565b600060443d10156146805790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156146af57505050505090565b82850191508151818111156146c75750505050505090565b843d87010160208285010111156146e15750505050505090565b6146f060208286010187613934565b509095945050505050565b84815283602082015282151560408201526080606082015260006147226080830184613ac0565b9695505050505050565b81516001600160401b03811115614745576147456138f9565b6147598161475384546143ac565b846143f6565b602080601f83116001811461478e57600084156147765750858301515b600019600386901b1c1916600185901b17855561443c565b600085815260208120601f198616915b828110156147bd5788860151825594840194600190910190840161479e565b50858210156147db5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b838152826020820152606060408201526000611da86060830184613ac0565b60a08152600061481d60a0830188613ac0565b6001600160a01b03871660208401526040830186905282810360608401526148458186613ac0565b9150508260808301529695505050505050565b8082028115828204841417612de257612de261433e565b6001600160801b0381811683821601908082111561488f5761488f61433e565b5092915050565b6020808252600d908201526c185c1c081b9bdd08195e1a5cdd609a1b604082015260600190565b602080825260069082015265199bdc989a5960d21b604082015260600190565b6000808335601e198436030181126148f457600080fd5b8301803591506001600160401b0382111561490e57600080fd5b602001915036819003821315613b5957600080fd5b604081526000614937604083018587614518565b90508215156020830152949350505050565b60408152600061495c6040830185613ac0565b90508260208301529392505050565b60a08152600061497f60a08301888a614518565b6001600160a01b03871660208401526040830186905282810360608401526149a78186613ac0565b915050826080830152979650505050505050565b6000816149ca576149ca61433e565b506000190190565b6040815260006149e56040830185613ac0565b90508215156020830152939250505056fea264697066735822122076373aaa9697106cfd80942154e4a7e6cd19ec891857c36532a6b79ae506107064736f6c63430008110033

Deployed Bytecode Sourcemap

2069:25875:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3894:43;;;;;;;;;;-1:-1:-1;3894:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1967:14:1;;1960:22;1942:41;;1930:2;1915:18;3894:43:0;;;;;;;;4281:23;;;;;;;;;;-1:-1:-1;4281:23:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2343:32:1;;;2325:51;;2313:2;2298:18;4281:23:0;2179:203:1;8524:87:0;;;;;;;;;;-1:-1:-1;8524:87:0;;;;;:::i;:::-;;:::i;:::-;;18042:421;;;;;;;;;;-1:-1:-1;18042:421:0;;;;;:::i;:::-;;:::i;4654:54::-;;;;;;;;;;-1:-1:-1;4654:54:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;4235:39::-;;;;;;;;;;-1:-1:-1;4235:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18641:908;;;;;;;;;;-1:-1:-1;18641:908:0;;;;;:::i;:::-;;:::i;16597:116::-;;;;;;;;;;-1:-1:-1;16597:116:0;;;;;:::i;:::-;;:::i;4372:19::-;;;;;;;;;;;;;;;;;;;6306:25:1;;;6294:2;6279:18;4372:19:0;6160:177:1;15154:237:0;;;;;;;;;;-1:-1:-1;15154:237:0;;;;;:::i;:::-;;:::i;3706:45::-;;;;;;;;;;-1:-1:-1;3706:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3706:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;6600:15:1;;;6582:34;;6652:15;;;;6647:2;6632:18;;6625:43;6684:18;;;6677:34;6532:2;6517:18;3706:45:0;6342:375:1;3039:53:0;;;;;;;;;;;;3089:3;3039:53;;16302:160;;;;;;;;;;-1:-1:-1;16302:160:0;;;;;:::i;:::-;;:::i;11495:1998::-;;;;;;;;;;-1:-1:-1;11495:1998:0;;;;;:::i;:::-;;:::i;13679:205::-;;;;;;;;;;-1:-1:-1;13679:205:0;;;;;:::i;:::-;;:::i;4425:31::-;;;;;;;;;;;;;;;;16865:139;;;;;;;;;;-1:-1:-1;16865:139:0;;;;;:::i;:::-;;:::i;4398:18::-;;;;;;;;;;-1:-1:-1;4398:18:0;;;;;;;;3944:54;;;;;;;;;;-1:-1:-1;3944:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;8857:25:1;;;8913:2;8898:18;;8891:34;;;;8830:18;3944:54:0;8683:248:1;20593:516:0;;;;;;;;;;-1:-1:-1;20593:516:0;;;;;:::i;:::-;;:::i;26325:223::-;;;;;;;;;;-1:-1:-1;26325:223:0;;;;;:::i;:::-;;:::i;17374:100::-;;;;;;;;;;-1:-1:-1;17446:8:0;:20;-1:-1:-1;;;;;17446:20:0;17374:100;;;-1:-1:-1;;;;;9917:47:1;;;9899:66;;9887:2;9872:18;17374:100:0;9753:218:1;4158:68:0;;;;;;;;;;-1:-1:-1;4158:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4158:68:0;;;;;;;;;21148:404;;;;;;;;;;-1:-1:-1;21148:404:0;;;;;:::i;:::-;;:::i;17814:190::-;;;;;;;;;;-1:-1:-1;17814:190:0;;;;;:::i;:::-;;:::i;4102:49::-;;;;;;;;;;-1:-1:-1;4102:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4463:50;;;;;;;;;;-1:-1:-1;4463:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;22918:148;;;;;;;;;;-1:-1:-1;22918:148:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15981:207::-;;;;;;;;;;-1:-1:-1;15981:207:0;;;;;:::i;:::-;;:::i;13934:764::-;;;;;;;;;;-1:-1:-1;13934:764:0;;;;;:::i;:::-;;:::i;23944:460::-;;;;;;;;;;-1:-1:-1;23944:460:0;;;;;:::i;:::-;;:::i;4023:72::-;;;;;;;;;;-1:-1:-1;4023:72:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4023:72:0;;;;;;;;;;;;;;;3832:55;;;;;;;;;;-1:-1:-1;3832:55:0;;;;;:::i;:::-;;:::i;25317:672::-;;;;;;;;;;-1:-1:-1;25317:672:0;;;;;:::i;:::-;;:::i;3758:67::-;;;;;;;;;;-1:-1:-1;3758:67:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3758:67:0;;;;;;;;;;;26024:266;;;;;;;;;;-1:-1:-1;26024:266:0;;;;;:::i;:::-;;:::i;3099:54::-;;;;;;;;;;;;3145:8;3099:54;;15509:210;;;;;;;;;;;;;:::i;19698:719::-;;;;;;;;;;-1:-1:-1;19698:719:0;;;;;:::i;:::-;;:::i;24449:829::-;;;;;;;;;;-1:-1:-1;24449:829:0;;;;;:::i;:::-;;:::i;3591:47::-;;;;;;;;;;-1:-1:-1;3591:47:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17039:200::-;;;;;;;;;;;;;:::i;26596:376::-;;;;;;;;;;-1:-1:-1;26596:376:0;;;;;:::i;:::-;;:::i;9602:1429::-;;;;;;:::i;:::-;;:::i;15762:167::-;;;;;;;;;;-1:-1:-1;15762:167:0;;;;;:::i;:::-;;:::i;23147:751::-;;;;;;;;;;-1:-1:-1;23147:751:0;;;;;:::i;:::-;;:::i;4614:31::-;;;;;;;;;;-1:-1:-1;4614:31:0;;;;-1:-1:-1;;;;;4614:31:0;;;16747:82;;;;;;;;;;-1:-1:-1;16747:82:0;;;;;:::i;:::-;;:::i;21594:408::-;;;;;;;;;;-1:-1:-1;21594:408:0;;;;;:::i;:::-;;:::i;4717:45::-;;;;;;;;;;-1:-1:-1;4717:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17687:92;;;;;;;;;;-1:-1:-1;17755:8:0;:16;-1:-1:-1;;;17755:16:0;;-1:-1:-1;;;;;17755:16:0;17687:92;;18503:97;;;;;;;;;;;;;:::i;14865:153::-;;;;;;:::i;:::-;;:::i;4313:18::-;;;;;;;;;;-1:-1:-1;4313:18:0;;;;-1:-1:-1;;;;;4313:18:0;;;4338:25;;;;;;;;;;-1:-1:-1;4338:25:0;;;;-1:-1:-1;;;;;4338:25:0;;;22718:149;;;;;;;;;;-1:-1:-1;22718:149:0;;;;;:::i;:::-;;:::i;4281:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4281:23:0;;-1:-1:-1;4281:23:0;:::o;8524:87::-;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;;;;;;;;;8587:6:::1;:16:::0;;-1:-1:-1;;8587:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;8524:87::o;18042:421::-;7181:3;;-1:-1:-1;;;;;7181:3:0;7167:10;:17;7159:38;;;;-1:-1:-1;;;7159:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18115:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;::::1;;18107:24;;;::::0;::::1;;-1:-1:-1::0;;;;;18142:15:0;::::1;18160:5;18142:15:::0;;;:7:::1;:15;::::0;;;;:23;;-1:-1:-1;;18142:23:0::1;::::0;;18193:6:::1;:13:::0;;18217:181:::1;18241:10;18250:1;18241:6:::0;:10:::1;:::i;:::-;18237:1;:14;18217:181;;;18290:6;-1:-1:-1::0;;;;;18277:19:0::1;:6;18284:1;18277:9;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;18277:9:0::1;:19:::0;18273:114:::1;;18329:6;18336:10;18345:1;18336:6:::0;:10:::1;:::i;:::-;18329:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;18317:6:::1;:9:::0;;-1:-1:-1;;;;;18329:18:0;;::::1;::::0;18324:1;;18317:9;::::1;;;;;:::i;:::-;;;;;;;;;:30;;;;;-1:-1:-1::0;;;;;18317:30:0::1;;;;;-1:-1:-1::0;;;;;18317:30:0::1;;;;;;18366:5;;18273:114;18253:3:::0;::::1;::::0;::::1;:::i;:::-;;;;18217:181;;;;18408:6;:12;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;18408:12:0;;;;;;;-1:-1:-1;;;;;;18408:12:0::1;::::0;;;;;;;;18436:19:::1;::::0;-1:-1:-1;;;;;2343:32:1;;2325:51;;18436:19:0::1;::::0;2298:18:1;18436:19:0::1;;;;;;;18096:367;18042:421:::0;:::o;4654:54::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4654:54:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18641:908::-;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;18855:24;18847:48:::1;;;::::0;-1:-1:-1;;;18847:48:0;;20890:2:1;18847:48:0::1;::::0;::::1;20872:21:1::0;20929:2;20909:18;;;20902:30;-1:-1:-1;;;20948:18:1;;;20941:41;20999:18;;18847:48:0::1;20688:335:1::0;18847:48:0::1;-1:-1:-1::0;;;;;18914:18:0;::::1;18906:47;;;::::0;-1:-1:-1;;;18906:47:0;;21230:2:1;18906:47:0::1;::::0;::::1;21212:21:1::0;21269:2;21249:18;;;21242:30;-1:-1:-1;;;21288:18:1;;;21281:46;21344:18;;18906:47:0::1;21028:340:1::0;18906:47:0::1;18966:24;18993:9;19003:6;;18993:17;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;19029:10;;18993:17;;-1:-1:-1;;;;;;19029:10:0::1;:24:::0;19021:46:::1;;;::::0;-1:-1:-1;;;19021:46:0;;21853:2:1;19021:46:0::1;::::0;::::1;21835:21:1::0;21892:1;21872:18;;;21865:29;-1:-1:-1;;;21910:18:1;;;21903:39;21959:18;;19021:46:0::1;21651:332:1::0;19021:46:0::1;-1:-1:-1::0;;;;;19080:19:0;::::1;:13;:19:::0;;;::::1;::::0;;;;;;:28:::1;19102:6:::0;;19080:19;:28:::1;:::i;:::-;-1:-1:-1::0;19121:17:0;;-1:-1:-1;;;;;19121:17:0;;::::1;-1:-1:-1::0;;;;;;19121:17:0;;::::1;;::::0;;;19149:15;;::::1;:24:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;19184:15:::1;::::0;::::1;:24:::0;;;19121:10:::1;::::0;19264:19:::1;::::0;19266:10;;19264:19:::1;:::i;:::-;-1:-1:-1::0;;;;;19250:34:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;19250:34:0::1;;19221:63;;19310:4;19295:9;19305:1;19295:12;;;;;;;;:::i;:::-;;;;;;:19;-1:-1:-1::0;;;;;19295:19:0::1;;;-1:-1:-1::0;;;;;19295:19:0::1;;;::::0;::::1;19330:9;19325:105;19345:21:::0;;::::1;19325:105;;;19405:10;;19416:1;19405:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;19388:9:::0;19398:3:::1;:1:::0;19400::::1;19398:3;:::i;:::-;19388:14;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19388:30:0;;::::1;:14;::::0;;::::1;::::0;;;;;;;:30;19368:3;::::1;::::0;::::1;:::i;:::-;;;;19325:105;;;;19440:41;19457:6;;19440:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;19465:9:0;;-1:-1:-1;19476:4:0::1;::::0;-1:-1:-1;19440:16:0::1;::::0;-1:-1:-1;19440:41:0:i:1;:::-;19526:6;-1:-1:-1::0;;;;;19499:42:0::1;19520:4;-1:-1:-1::0;;;;;19499:42:0::1;;19512:6;;19534;19499:42;;;;;;;;:::i;:::-;;;;;;;;18836:713;;18641:908:::0;;;;;;;:::o;16597:116::-;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16676:29:0::1;:16;:29:::0;16597:116::o;15154:237::-;15225:10;15209:27;;;;:15;:27;;;;;:38;;15240:7;;15209:27;:38;;15240:7;;15209:38;:::i;:::-;;;;-1:-1:-1;;15263:29:0;;6306:25:1;;;15272:10:0;;15263:29;;6294:2:1;6279:18;15263:29:0;;;;;;;15304:12;15321:10;-1:-1:-1;;;;;15321:15:0;15344:7;15321:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15303:53;;;15375:7;15367:16;;;;;;15198:193;15154:237;:::o;16302:160::-;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;16389:8:::1;:16:::0;16375:41:::1;::::0;;-1:-1:-1;;;16389:16:0;;::::1;-1:-1:-1::0;;;;;16389:16:0;;::::1;25208:34:1::0;;25278:15;;25273:2;25258:18;;25251:43;16375:41:0::1;::::0;25128:18:1;16375:41:0::1;;;;;;;16427:8;:27:::0;;-1:-1:-1;;;;;16427:27:0;;::::1;-1:-1:-1::0;;;16427:27:0::1;::::0;::::1;::::0;;;::::1;::::0;;16302:160::o;11495:1998::-;4858:8;;4870:1;4858:13;4850:22;;;;;;4894:1;4883:8;:12;7450:6:::1;::::0;::::1;;7449:7;7441:26;;;::::0;-1:-1:-1;;;7441:26:0;;25507:2:1;7441:26:0::1;::::0;::::1;25489:21:1::0;25546:1;25526:18;;;25519:29;-1:-1:-1;;;25564:18:1;;;25557:36;25610:18;;7441:26:0::1;25305:329:1::0;7441:26:0::1;11701:4:::2;:9;;;11712:4;:10;;;7683:15;7772:23;7779:4;;3370:8;13600:18:::0;;;13599:33;;13501:139;7772:23:::2;7767:267;;3145:8;13600:18:::0;;;13599:33;7812:211:::2;;7907:16;::::0;-1:-1:-1;;;;;7881:22:0;::::2;;::::0;;;:15:::2;:22;::::0;;;;;:42:::2;;7873:75;;;::::0;-1:-1:-1;;;7873:75:0;;25841:2:1;7873:75:0::2;::::0;::::2;25823:21:1::0;25880:2;25860:18;;;25853:30;-1:-1:-1;;;25899:18:1;;;25892:50;25959:18;;7873:75:0::2;25639:344:1::0;7873:75:0::2;3549:6;7977:9;:30;;;;:::i;:::-;7967:40;;7812:211;7181:3:::3;::::0;-1:-1:-1;;;;;7181:3:0::3;7167:10;:17;7159:38;;;;-1:-1:-1::0;;;7159:38:0::3;;;;;;;:::i;:::-;11759:9:::4;::::0;::::4;::::0;-1:-1:-1;;;;;11789:23:0;::::4;::::0;;:45:::4;;;11829:5;-1:-1:-1::0;;;;;11816:18:0::4;:9;-1:-1:-1::0;;;;;11816:18:0::4;;11789:45;11781:72;;;::::0;-1:-1:-1;;;11781:72:0;;26190:2:1;11781:72:0::4;::::0;::::4;26172:21:1::0;26229:2;26209:18;;;26202:30;-1:-1:-1;;;26248:18:1;;;26241:44;26302:18;;11781:72:0::4;25988:338:1::0;11781:72:0::4;11875:12;11888:6;11875:20;;;;;;:::i;:::-;::::0;;;::::4;::::0;;;;;::::4;::::0;;;;::::4;;11874:21;11866:43;;;::::0;-1:-1:-1;;;11866:43:0;;26827:2:1;11866:43:0::4;::::0;::::4;26809:21:1::0;26866:1;26846:18;;;26839:29;-1:-1:-1;;;26884:18:1;;;26877:39;26933:18;;11866:43:0::4;26625:332:1::0;11866:43:0::4;11934:4;::::0;3324:3:::4;13600:18:::0;;;13599:33;11922:122:::4;;11985:16;12002:6;11985:24;;;;;;:::i;:::-;::::0;;;::::4;::::0;;::::4;::::0;;;;;;;;-1:-1:-1;;;;;11985:29:0;::::4;;::::0;;;;;;;;::::4;;11977:55;;;::::0;-1:-1:-1;;;11977:55:0;;27164:2:1;11977:55:0::4;::::0;::::4;27146:21:1::0;27203:2;27183:18;;;27176:30;-1:-1:-1;;;27222:18:1;;;27215:43;27275:18;;11977:55:0::4;26962:337:1::0;11977:55:0::4;12056:14;12073:60;12084:4;:11;;;12097:5;12104:4;:16;;;12122:4;:10;;;12073;:60::i;:::-;12153:21;::::0;;;:13:::4;:21;::::0;;;;;12056:77;;-1:-1:-1;12153:21:0::4;;12152:22;12144:49;;;::::0;-1:-1:-1;;;12144:49:0;;27506:2:1;12144:49:0::4;::::0;::::4;27488:21:1::0;27545:2;27525:18;;;27518:30;-1:-1:-1;;;27564:18:1;;;27557:44;27618:18;;12144:49:0::4;27304:338:1::0;12144:49:0::4;12206:12;12244:19;12282:8;;;;;;;;;-1:-1:-1::0;;;;;12282:8:0::4;-1:-1:-1::0;;;;;12282:16:0::4;;12299:3;12304:5;12311;12318:4;:16;;;12336:4;:10;;;12282:65;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::4;-1:-1:-1::0;;12282:65:0::4;::::0;::::4;;::::0;::::4;::::0;;;::::4;::::0;::::4;:::i;:::-;;;12278:345;;;;:::i;:::-;;;::::0;::::4;;;;;:::i;:::-;;;;;;;;12521:6:::0;-1:-1:-1;12278:345:0::4;;;;;;::::0;;;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;12601:6:0;-1:-1:-1;12278:345:0::4;;;12426:4:::0;;-1:-1:-1;12432:3:0;-1:-1:-1;12278:345:0::4;12673:3;-1:-1:-1::0;;;;;12642:82:0::4;12666:5;-1:-1:-1::0;;;;;12642:82:0::4;12653:4;:11;;;12642:82;12678:4;:16;;;12696:4;:10;;;12708:7;12717:6;12642:82;;;;;;;;;:::i;:::-;;;;;;;;12229:507;12752:7;12748:738;;;12776:21;::::0;;;:13:::4;:21;::::0;;;;:28;;-1:-1:-1;;12776:28:0::4;12800:4;12776:28;::::0;;12748:738:::4;;;-1:-1:-1::0;;;;;12826:23:0;::::4;12822:664;;12893:22;::::0;;;;::::4;::::0;;-1:-1:-1;;;;;12893:22:0;;::::4;::::0;;::::4;::::0;;::::4;::::0;;;-1:-1:-1;12866:24:0;;;:16:::4;:24:::0;;;;;;:49;;;;-1:-1:-1;;;;;;12866:49:0::4;::::0;::::4;::::0;;;::::4;::::0;;;;12893:22;;12866:24;-1:-1:-1;12866:49:0;::::4;::::0;::::4;::::0;;::::4;:::i;:::-;;;;;12976:3;-1:-1:-1::0;;;;;12935:82:0::4;12969:5;-1:-1:-1::0;;;;;12935:82:0::4;12956:4;:11;;;12935:82;12981:4;:16;;;12999:4;:10;;;13011:5;12935:82;;;;;;;;:::i;:::-;;;;;;;;12822:664;;;13146:5;:7:::0;;;:5:::4;:7;::::0;::::4;:::i;:::-;;;;;;13363:4;:16;;;13226:9;-1:-1:-1::0;;;;;13173:301:0::4;13202:5;-1:-1:-1::0;;;;;13173:301:0::4;;13277:25;;;13304:3;13309:5;13254:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1::0;;;;;13254:61:0::4;;;;;;;-1:-1:-1::0;;;;;13254:61:0::4;;;;;;;;;;;13342:1;13398::::0;13443:6:::4;13468:5;;13173:301;;;;;;;;;;:::i;:::-;;;;;;;;12822:664;-1:-1:-1::0;;8105:11:0;;;-1:-1:-1;8101:351:0::2;;8192:8;:16:::0;8133:17:::2;::::0;8178:30:::2;::::0;-1:-1:-1;;;8192:16:0;::::2;-1:-1:-1::0;;;;;8192:16:0::2;8178:11;:30;:::i;:::-;8164:9;8154:19;::::0;:7;:19:::2;:::i;:::-;8153:56;;;;:::i;:::-;-1:-1:-1::0;;;;;8241:22:0;::::2;8224:14;8241:22:::0;;;:15:::2;:22;::::0;;;;;8133:76;;-1:-1:-1;8286:18:0;;::::2;8278:47;;;::::0;-1:-1:-1;;;8278:47:0;;33077:2:1;8278:47:0::2;::::0;::::2;33059:21:1::0;33116:2;33096:18;;;33089:30;-1:-1:-1;;;33135:18:1;;;33128:46;33191:18;;8278:47:0::2;32875:340:1::0;8278:47:0::2;8365:18;8374:9:::0;8365:6;:18:::2;:::i;:::-;-1:-1:-1::0;;;;;8340:22:0;::::2;;::::0;;;:15:::2;:22;::::0;;;;:43;;;;8398:8:::2;:42:::0;;8430:9;;8340:22;8398:42:::2;::::0;8430:9;;-1:-1:-1;;;;;8398:42:0::2;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;8398:42:0::2;;;;;-1:-1:-1::0;;;;;8398:42:0::2;;;;;;8118:334;;8101:351;-1:-1:-1::0;;4929:1:0;4918:8;:12;-1:-1:-1;;;;;;11495:1998:0:o;13679:205::-;13827:48;;;;;;;33653:25:1;;;;-1:-1:-1;;;;;33714:32:1;;;;33694:18;;;33687:60;33763:18;;;33756:34;;;;33806:18;;;;33799:34;;;;13827:48:0;;;;;;;;;;33625:19:1;;;;13827:48:0;;13817:59;;;;;;13679:205::o;16865:139::-;7181:3;;-1:-1:-1;;;;;7181:3:0;7167:10;:17;7159:38;;;;-1:-1:-1;;;7159:38:0;;;;;;;:::i;:::-;16926:10:::1;:17:::0;;-1:-1:-1;;;;;;16926:17:0::1;-1:-1:-1::0;;;;;16926:17:0;;::::1;::::0;;::::1;::::0;;;16969:3:::1;::::0;16959:37:::1;::::0;16980:15:::1;6306:25:1::0;;16926:17:0;;16969:3:::1;::::0;16959:37:::1;::::0;6294:2:1;6279:18;16959:37:0::1;;;;;;;16865:139:::0;:::o;20593:516::-;-1:-1:-1;;;;;20690:22:0;;20667:20;20690:22;;;;;;;;;;20667:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20723:24;20750:9;20760:6;20750:17;;;;;;:::i;:::-;;;;;;;;;;;;;;20788:10;;20750:17;;-1:-1:-1;;;;;;20788:10:0;;;:21;;;;:46;;;;-1:-1:-1;;;;;;20813:21:0;;;;20788:46;20780:72;;;;-1:-1:-1;;;20780:72:0;;;;;;;:::i;:::-;20885:3;;-1:-1:-1;;;;;20885:3:0;20871:10;:17;;:50;;-1:-1:-1;20906:15:0;;;;-1:-1:-1;;;;;20906:15:0;20892:10;:29;20871:50;20863:69;;;;-1:-1:-1;;;20863:69:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20957:22:0;;:13;:22;;;;;;;;;;20951:36;;;;;:::i;:::-;:41;;-1:-1:-1;20943:71:0;;;;-1:-1:-1;;;20943:71:0;;34722:2:1;20943:71:0;;;34704:21:1;34761:2;34741:18;;;34734:30;-1:-1:-1;;;34780:18:1;;;34773:47;34837:18;;20943:71:0;34520:341:1;20943:71:0;21027:20;;-1:-1:-1;;;;;;21027:20:0;-1:-1:-1;;;;;21027:20:0;;;;;;;;21065:36;;;;;;;;;;21076:6;;21065:36;:::i;:::-;;;;;;;;20656:453;;20593:516;;:::o;26325:223::-;26468:7;26495:45;26508:6;;26495:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26516:10:0;;-1:-1:-1;26528:11:0;;-1:-1:-1;26495:12:0;;-1:-1:-1;26495:45:0:i;:::-;26488:52;26325:223;-1:-1:-1;;;;;26325:223:0:o;21148:404::-;-1:-1:-1;;;;;21256:19:0;;21233:20;21256:19;;;;;;;;;;21233:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21286:24;21313:9;21323:6;21313:17;;;;;;:::i;:::-;;;;;;;;;;;;;;21351:10;;21313:17;;-1:-1:-1;;;;;;21351:10:0;;;:18;;;;:40;;;;-1:-1:-1;;;;;;21373:18:0;;;;21351:40;21343:66;;;;-1:-1:-1;;;21343:66:0;;;;;;;:::i;:::-;21442:3;;-1:-1:-1;;;;;21442:3:0;21428:10;:17;;:50;;-1:-1:-1;21463:15:0;;;;-1:-1:-1;;;;;21463:15:0;21449:10;:29;21428:50;21420:69;;;;-1:-1:-1;;;21420:69:0;;;;;;;:::i;:::-;21502:42;21519:6;21527:10;21539:4;21502:16;:42::i;:::-;21222:330;;21148:404;;:::o;17814:190::-;7181:3;;-1:-1:-1;;;;;7181:3:0;7167:10;:17;7159:38;;;;-1:-1:-1;;;7159:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17885:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;::::1;;17884:16;17876:25;;;::::0;::::1;;-1:-1:-1::0;;;;;17912:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;:22;;-1:-1:-1;;17912:22:0::1;17930:4;17912:22:::0;;::::1;::::0;;;17945:6:::1;:19:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;17945:19:0::1;::::0;::::1;::::0;;17980:16;;2325:51:1;;;17980:16:0::1;::::0;2298:18:1;17980:16:0::1;;;;;;;17814:190:::0;:::o;22918:148::-;22995:16;23031:19;23051:6;23031:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;23024:34;;;;;;;;;;;;;;;23031:27;23024:34;;;23031:27;23024:34;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23024:34:0;;;;;;;;;;;;;;;;;;;;;;;22918:148;;;:::o;15981:207::-;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;16078:9:::1;16073:108;16093:18:::0;;::::1;16073:108;;;16133:4;:17;16151:7:::0;;16159:1;16151:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;16163:5;16133:36;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16113:3;;;;;:::i;:::-;;;;16073:108;;13934:764:::0;14043:14;14060:48;14071:7;14080:5;14087:12;14101:6;14060:10;:48::i;:::-;14128:21;;;;:13;:21;;;;;;14043:65;;-1:-1:-1;14128:21:0;;14127:22;14119:49;;;;-1:-1:-1;;;14119:49:0;;27506:2:1;14119:49:0;;;27488:21:1;27545:2;27525:18;;;27518:30;-1:-1:-1;;;27564:18:1;;;27557:44;27618:18;;14119:49:0;27304:338:1;14119:49:0;14181:25;14209:24;;;:16;:24;;;;;14252:9;;-1:-1:-1;;;;;14252:9:0;14244:51;;;;-1:-1:-1;;;14244:51:0;;35928:2:1;14244:51:0;;;35910:21:1;35967:2;35947:18;;;35940:30;-1:-1:-1;;;35986:18:1;;;35979:45;36041:18;;14244:51:0;35726:339:1;14244:51:0;14322:9;;;14363:11;;14342:32;;-1:-1:-1;;;;;14322:9:0;;;;14308:11;;14363;14342:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14412:22:0;;-1:-1:-1;;;;;;14412:22:0;;;-1:-1:-1;;14445:16:0;;;;;;;;;14432:1;14445:16;;14342:32;;-1:-1:-1;;14412:22:0;14445:11;;;:16;;:11;:16;:::i;:::-;-1:-1:-1;14492:8:0;;:57;;-1:-1:-1;;;14492:57:0;;14475:12;;-1:-1:-1;;;;;14492:8:0;;:16;;:57;;14509:3;;14514:5;;14521;;14528:12;;14542:6;;14492:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14492:57:0;;;;;;;;;;;;:::i;:::-;14474:75;;;14568:7;14560:16;;;;;;14589:21;;;;:13;:21;;;;;;;:28;;-1:-1:-1;;14589:28:0;14613:4;14589:28;;;14633:57;-1:-1:-1;;;;;14633:57:0;;;14653:7;;14633:57;;;;14669:12;;14683:6;;8857:25:1;;;8913:2;8898:18;;8891:34;8845:2;8830:18;;8683:248;23944:460:0;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;24147:11;24184:26;;::::1;:59:::0;::::1;;;-1:-1:-1::0;24214:29:0;;::::1;24184:59;24176:68;;;::::0;::::1;;24262:9;24257:140;24281:6;24277:1;:10;24257:140;;;24342:43;;;;;;;;24355:9;;24365:1;24355:12;;;;;;;:::i;:::-;;;;;;;24342:43;;;;24369:12;;24382:1;24369:15;;;;;;;:::i;:::-;;;;;;;24342:43;;::::0;24309:14:::1;:30;24324:11;;24336:1;24324:14;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;24309:30:::0;;-1:-1:-1;24309:30:0;;::::1;::::0;;;;;;-1:-1:-1;24309:30:0;:76;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;24289:3;::::1;::::0;::::1;:::i;:::-;;;;24257:140;;;;24119:285;23944:460:::0;;;;;;:::o;3832:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3832:55:0;;-1:-1:-1;3832:55:0;;-1:-1:-1;3832:55:0:o;25317:672::-;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25541:19:0;::::1;25518:20;25541:19:::0;;;::::1;::::0;;;;;;25518:42;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25571:24;25598:9;25608:6;25598:17;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;25634:10;;25598:17;;-1:-1:-1;;;;;;25634:10:0;;::::1;:18:::0;;::::1;;:40:::0;::::1;;;-1:-1:-1::0;;;;;;25656:18:0;::::1;::::0;::::1;25634:40;25626:66;;;;-1:-1:-1::0;;;25626:66:0::1;;;;;;;:::i;:::-;25722:11:::0;25759:32;;::::1;25751:41;;;::::0;::::1;;25831:15;25805;25821:6;25805:23;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;25864:9:::1;25859:123;25883:6;25879:1;:10;25859:123;;;25952:15;;25968:1;25952:18;;;;;;;:::i;:::-;;;;;;;25911:14;25926:6;25911:22;;;;;;:::i;:::-;;;;;;;;;;;;;:38;25934:11;;25946:1;25934:14;;;;;;;:::i;:::-;;;;;;;25911:38;;;;;;;;;;;:59;;;;25891:3;;;;;:::i;:::-;;;;25859:123;;;;25507:482;;;25317:672:::0;;;;;;:::o;26024:266::-;-1:-1:-1;;;;;26200:19:0;;26157:7;26200:19;;;;;;;;;;26177:42;;26157:7;;26200:19;26177:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26237:45;26250:6;26258:10;26270:11;26237:12;:45::i;:::-;26230:52;;;26024:266;;;;;;:::o;15509:210::-;15575:8;:20;;-1:-1:-1;;15606:24:0;;;;;15659:3;;:25;;-1:-1:-1;;;;;15575:20:0;;;;15560:12;;-1:-1:-1;;;;;15659:3:0;;15575:20;;15659:25;24771:205:1;19698:719:0;-1:-1:-1;;;;;19886:19:0;;19863:20;19886:19;;;;;;;;;;19863:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19916:24;19943:9;19953:6;19943:17;;;;;;:::i;:::-;;;;;;;;;;;;;;19981:10;;19943:17;;-1:-1:-1;;;;;;19981:10:0;;;:18;;;;:40;;;;-1:-1:-1;;;;;;20003:18:0;;;;19981:40;19973:66;;;;-1:-1:-1;;;19973:66:0;;;;;;;:::i;:::-;20072:3;;-1:-1:-1;;;;;20072:3:0;20058:10;:17;;:50;;-1:-1:-1;20093:15:0;;;;-1:-1:-1;;;;;20093:15:0;20079:10;:29;20058:50;20050:69;;;;-1:-1:-1;;;20050:69:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20136:20:0;;;20132:77;;20173:15;;;:24;;-1:-1:-1;;;;;;20173:24:0;-1:-1:-1;;;;;20173:24:0;;;;;20132:77;20219:15;;;:24;;;20258:21;;20254:96;;20296:42;20313:6;20321:10;;20296:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20333:4:0;;-1:-1:-1;20296:16:0;;-1:-1:-1;;20296:42:0:i;:::-;20394:6;-1:-1:-1;;;;;20367:42:0;20388:4;-1:-1:-1;;;;;20367:42:0;;20380:6;20402;20367:42;;;;;;;:::i;:::-;;;;;;;;19852:565;;19698:719;;;;;:::o;24449:829::-;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24680:19:0;::::1;24657:20;24680:19:::0;;;::::1;::::0;;;;;;24657:42;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24710:24;24737:9;24747:6;24737:17;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;24775:10;;24737:17;;-1:-1:-1;;;;;;24775:10:0;;::::1;:18:::0;;::::1;;:40:::0;::::1;;;-1:-1:-1::0;;;;;;24797:18:0;::::1;::::0;::::1;24775:40;24767:66;;;;-1:-1:-1::0;;;24767:66:0::1;;;;;;;:::i;:::-;24859:15;::::0;;::::1;::::0;13600:18;;13599:33;24844:69:::1;;;::::0;-1:-1:-1;;;24844:69:0;;37923:2:1;24844:69:0::1;::::0;::::1;37905:21:1::0;37962:2;37942:18;;;37935:30;-1:-1:-1;;;37981:18:1;;;37974:42;38033:18;;24844:69:0::1;37721:336:1::0;24844:69:0::1;24943:11:::0;24980:26;;::::1;:59:::0;::::1;;;-1:-1:-1::0;25010:29:0;;::::1;24980:59;24972:68;;;::::0;::::1;;25053:49;25105:13;25119:6;25105:21;;;;;;:::i;:::-;;;;;;;;;;;;;25053:73;;25142:9;25137:134;25161:6;25157:1;:10;25137:134;;;25216:43;;;;;;;;25229:9;;25239:1;25229:12;;;;;;;:::i;:::-;;;;;;;25216:43;;;;25243:12;;25256:1;25243:15;;;;;;;:::i;:::-;;;;;;;25216:43;;::::0;25189:8:::1;:24;25198:11;;25210:1;25198:14;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;25189:24:::0;;-1:-1:-1;25189:24:0;;::::1;::::0;;;;;;-1:-1:-1;25189:24:0;:70;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;25169:3;::::1;::::0;::::1;:::i;:::-;;;;25137:134;;;;24646:632;;;;24449:829:::0;;;;;;;:::o;3591:47::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17039:200::-;17101:10;;-1:-1:-1;;;;;17101:10:0;17087;:24;17079:33;;;;;;17142:10;;17137:3;;17128:42;;17154:15;6306:25:1;;-1:-1:-1;;;;;17142:10:0;;;;17137:3;;;;17128:42;;6294:2:1;6279:18;17128:42:0;;;;;;;17187:10;;;17181:3;:16;;-1:-1:-1;;;;;;17181:16:0;;;-1:-1:-1;;;;;17187:10:0;;17181:16;;;;17208:23;;;17039:200::o;26596:376::-;26687:4;26704:16;26723:14;26738:6;26723:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:34;;;;;;;;;;-1:-1:-1;3243:3:0;13600:18;;;13599:33;26768:89;;26841:4;26834:11;;;;;26768:89;26878:15;26894:6;26878:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;3243:3:0;13600:18;;;13599:33;26919:45;26912:52;;;26596:376;;;;;:::o;9602:1429::-;4858:8;;4870:1;4858:13;4850:22;;;;;;4894:1;4883:8;:12;7450:6:::1;::::0;::::1;;7449:7;7441:26;;;::::0;-1:-1:-1;;;7441:26:0;;25507:2:1;7441:26:0::1;::::0;::::1;25489:21:1::0;25546:1;25526:18;;;25519:29;-1:-1:-1;;;25564:18:1;;;25557:36;25610:18;;7441:26:0::1;25305:329:1::0;7441:26:0::1;-1:-1:-1::0;;;;;9816:23:0;::::2;::::0;;:50:::2;;-1:-1:-1::0;;;;;;9843:23:0;::::2;9856:10;9843:23;9816:50;9808:77;;;::::0;-1:-1:-1;;;9808:77:0;;26190:2:1;9808:77:0::2;::::0;::::2;26172:21:1::0;26229:2;26209:18;;;26202:30;-1:-1:-1;;;26248:18:1;;;26241:44;26302:18;;9808:77:0::2;25988:338:1::0;9808:77:0::2;9933:10;9896:20;9919:25:::0;;;::::2;::::0;;;;;;9896:48;;::::2;::::0;::::2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9966:12;9979:6;9966:20;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;::::2;;9965:21;9957:43;;;::::0;-1:-1:-1;;;9957:43:0;;26827:2:1;9957:43:0::2;::::0;::::2;26809:21:1::0;26866:1;26846:18;;;26839:29;-1:-1:-1;;;26884:18:1;;;26877:39;26933:18;;9957:43:0::2;26625:332:1::0;9957:43:0::2;10013:24;10040:33;10047:4;;3324:3;13600:18:::0;;;13599:33;;13501:139;10040:33:::2;10013:60;;10089:19;10084:115;;10133:16;10150:6;10133:24;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;10158:10:::2;10133:36;::::0;;;;;;;;::::2;;10125:62;;;::::0;-1:-1:-1;;;10125:62:0;;27164:2:1;10125:62:0::2;::::0;::::2;27146:21:1::0;27203:2;27183:18;;;27176:30;-1:-1:-1;;;27222:18:1;;;27215:43;27275:18;;10125:62:0::2;26962:337:1::0;10125:62:0::2;10223:4;::::0;3370:8:::2;13600:18:::0;;;13599:33;10211:697:::2;;10256:24;10283:9;10293:6;10283:17;;;;;;:::i;:::-;;;;;;;;;;;;;10256:44;;10342:19;:47;;;;-1:-1:-1::0;10365:10:0;;-1:-1:-1;;;;;10365:10:0::2;:24:::0;10342:47:::2;10341:94;;;-1:-1:-1::0;10425:10:0;;-1:-1:-1;;;;;10425:10:0::2;10411;:24;10341:94;10315:169;;;;-1:-1:-1::0;;;10315:169:0::2;;;;;;;:::i;:::-;3089:3;13600:18:::0;;;13599:33;10505:67:::2;;;;-1:-1:-1::0;10548:10:0;;-1:-1:-1;;;;;10548:10:0::2;10562;10548:24;10505:67;10501:133;;;10603:6;:15;;;10593:25;;;;10501:133;3145:8;13600:18:::0;;;13599:33;10650:247:::2;;10710:12;10725:46;10738:6:::0;10746:10;10758:5;10725:12:::2;:46::i;:::-;10710:61;;10790:17;10802:4;10790:11;:17::i;:::-;10691:132;10650:247;;;10833:9;:13:::0;10829:68:::2;;10867:14;10879:1;10867:11;:14::i;:::-;10241:667;10211:697;10920:5;:7:::0;;;:5:::2;:7;::::0;::::2;:::i;:::-;;;;;;10989:10;10966:3;-1:-1:-1::0;;;;;10943:80:0::2;10954:10;-1:-1:-1::0;;;;;10943:80:0::2;;10971:5;;10978:9;11001:6;11009;11017:5;;10943:80;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;4929:1:0;4918:8;:12;-1:-1:-1;;;;;;9602:1429:0:o;15762:167::-;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;15873:5:::1;15850:12;15863:6;;15850:20;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:28;;;::::1;;-1:-1:-1::0;;15850:28:0;;::::1;::::0;;;::::1;::::0;;;15894:27:::1;::::0;::::1;::::0;15907:6;;;;15915:5;;15894:27:::1;:::i;:::-;;;;;;;;15762:167:::0;;;:::o;23147:751::-;23219:48;23270:16;23287:6;23270:24;;;;;;:::i;:::-;;;;;;;;;;;;;23219:75;;23305:34;23342:19;23362:6;23342:27;;;;;;:::i;:::-;;;;;;;;;;;;;;23401:23;;23342:27;;-1:-1:-1;23401:23:0;23380:18;;23498:286;23522:8;23518:1;:12;23498:286;;;23556:16;23573:1;23556:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23556:19:0;23594:21;;;;;;;;;;;;23556:19;;-1:-1:-1;23594:21:0;;23590:183;;;23636:3;;;;:::i;:::-;;;;23498:286;;23590:183;23680:10;;;;:::i;:::-;;;;23731:16;23748:8;23731:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23731:26:0;23709:16;23726:1;23709:19;;;;;;;;:::i;:::-;;;;;;;;;:48;;;;;-1:-1:-1;;;;;23709:48:0;;;;;-1:-1:-1;;;;;23709:48:0;;;;;;23498:286;;;-1:-1:-1;23811:8:0;23794:97;23825:10;23821:1;:14;23794:97;;;23857:16;:22;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;23857:22:0;;;;;-1:-1:-1;;;;;;23857:22:0;;;;;;23837:3;;;;:::i;:::-;;;;23794:97;;;;23208:690;;;;;23147:751;:::o;16747:82::-;7311:10;7303:19;;;;:7;:19;;;;;;;;7295:42;;;;-1:-1:-1;;;7295:42:0;;;;;;;:::i;:::-;16809:4:::1;:12:::0;16747:82::o;21594:408::-;-1:-1:-1;;;;;21705:19:0;;21682:20;21705:19;;;;;;;;;;21682:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21735:24;21762:9;21772:6;21762:17;;;;;;:::i;:::-;;;;;;;;;;;;;;21800:10;;21762:17;;-1:-1:-1;;;;;;21800:10:0;;;:18;;;;:40;;;;-1:-1:-1;;;;;;21822:18:0;;;;21800:40;21792:66;;;;-1:-1:-1;;;21792:66:0;;;;;;;:::i;:::-;21891:3;;-1:-1:-1;;;;;21891:3:0;21877:10;:17;;:50;;-1:-1:-1;21912:15:0;;;;-1:-1:-1;;;;;21912:15:0;21898:10;:29;21877:50;21869:69;;;;-1:-1:-1;;;21869:69:0;;;;;;;:::i;:::-;21951:43;21968:6;21976:10;21988:5;21951:16;:43::i;18503:97::-;18550:16;18586:6;18579:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18579:13:0;;;;;;;;;;;;;;;;;;;;;;;18503:97;:::o;14865:153::-;-1:-1:-1;;;;;14928:25:0;;;;;;:15;:25;;;;;:38;;14957:9;;14928:25;:38;;14957:9;;14928:38;:::i;:::-;;;;-1:-1:-1;;14982:28:0;;15000:9;6306:25:1;;-1:-1:-1;;;;;14982:28:0;;;;;6294:2:1;6279:18;14982:28:0;;;;;;;14865:153;:::o;22718:149::-;22798:7;22825:19;22845:6;22825:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:34;;22718:149;-1:-1:-1;;22718:149:0:o;22010:654::-;22119:42;22164:16;22181:6;22164:24;;;;;;:::i;:::-;;;;;;;;;;;;;22119:69;;22199:34;22236:19;22256:6;22236:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;22274:12:0;;22297:360;22321:10;:17;22317:1;:21;22297:360;;;22367:10;22378:1;22367:13;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;22399:15:0;;;;;;;;;;;;;;;22367:13;;-1:-1:-1;22399:15:0;;:24;;;;;22395:73;22444:8;22395:73;22486:5;22482:73;;;22512:27;;;;;;;-1:-1:-1;22512:27:0;;;;;;;;;-1:-1:-1;;;;;;22512:27:0;-1:-1:-1;;;;;22512:27:0;;;;;22482:73;-1:-1:-1;;;;;22569:15:0;;;;;;;;;;;;;;;:23;;-1:-1:-1;;22569:23:0;;;;;;;22612:33;;;;;22625:6;;22569:23;;22612:33;:::i;:::-;;;;;;;;22297:360;22340:3;;;;:::i;:::-;;;;22297:360;;26980:961;27122:7;27142:30;27175:13;27189:6;27175:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:33;;;;;;;;;;27142:66;;;;;;;;;;;;;;;;;;;;;;27175:21;-1:-1:-1;27142:66:0;27342:38;27361:6;27175:33;27342:18;:38::i;:::-;27338:127;;;27421:32;27435:18;27421:11;:32;:::i;:::-;27404:49;;:14;:49;:::i;:::-;27397:56;;;;;;;27338:127;27477:31;27511:26;;;:14;:26;;;;;;;;27477:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27691:32;;;27690:69;;27744:15;27690:69;;;27727:14;27690:69;27671:88;;27770:19;27814;27793:18;:40;27792:85;;27858:19;27792:85;;;27837:18;27792:85;27770:107;-1:-1:-1;27908:25:0;27770:107;27908:11;:25;:::i;:::-;27897:36;;:8;:36;:::i;:::-;27890:43;26980:961;-1:-1:-1;;;;;;;;;;;;26980:961:0:o;8619:426::-;8695:4;8682:9;:17;;8674:47;;;;-1:-1:-1;;;8674:47:0;;39364:2:1;8674:47:0;;;39346:21:1;39403:2;39383:18;;;39376:30;-1:-1:-1;;;39422:18:1;;;39415:47;39479:18;;8674:47:0;39162:341:1;8674:47:0;8736:8;;8732:127;;8791:3;;:25;;8774:12;;-1:-1:-1;;;;;8791:3:0;;8807:4;;8774:12;8791:25;8774:12;8791:25;8807:4;8791:3;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8773:43;;;8839:7;8831:16;;;;;;8746:113;8732:127;8885:4;8873:9;:16;8869:169;;;8934:12;8951:10;8974:16;8986:4;8974:9;:16;:::i;:::-;8951:44;;;24771:205:1;8869:169:0;8619:426;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:225;232:4;224:6;220:17;303:6;291:10;288:22;-1:-1:-1;;;;;255:10:1;252:34;249:62;246:88;;;314:18;;:::i;:::-;350:2;343:22;-1:-1:-1;146:225:1:o;376:249::-;486:2;467:13;;-1:-1:-1;;463:27:1;451:40;;-1:-1:-1;;;;;506:34:1;;542:22;;;503:62;500:88;;;568:18;;:::i;:::-;604:2;597:22;-1:-1:-1;;376:249:1:o;630:187::-;679:4;-1:-1:-1;;;;;704:6:1;701:30;698:56;;;734:18;;:::i;:::-;-1:-1:-1;800:2:1;779:15;-1:-1:-1;;775:29:1;806:4;771:40;;630:187::o;822:421::-;887:5;917:36;946:6;917:36;:::i;:::-;982:2;976:9;994:31;1022:2;1014:6;994:31;:::i;:::-;1043:6;1034:15;;1073:6;1065;1058:22;1113:3;1104:6;1099:3;1095:16;1092:25;1089:45;;;1130:1;1127;1120:12;1089:45;1180:6;1175:3;1168:4;1160:6;1156:17;1143:44;1235:1;1228:4;1219:6;1211;1207:19;1203:30;1196:41;;;822:421;;;;;:::o;1248:222::-;1291:5;1344:3;1337:4;1329:6;1325:17;1321:27;1311:55;;1362:1;1359;1352:12;1311:55;1384:80;1460:3;1451:6;1438:20;1431:4;1423:6;1419:17;1384:80;:::i;1475:322::-;1544:6;1597:2;1585:9;1576:7;1572:23;1568:32;1565:52;;;1613:1;1610;1603:12;1565:52;1653:9;1640:23;-1:-1:-1;;;;;1678:6:1;1675:30;1672:50;;;1718:1;1715;1708:12;1672:50;1741;1783:7;1774:6;1763:9;1759:22;1741:50;:::i;1994:180::-;2053:6;2106:2;2094:9;2085:7;2081:23;2077:32;2074:52;;;2122:1;2119;2112:12;2074:52;-1:-1:-1;2145:23:1;;1994:180;-1:-1:-1;1994:180:1:o;2387:118::-;2473:5;2466:13;2459:21;2452:5;2449:32;2439:60;;2495:1;2492;2485:12;2510:241;2566:6;2619:2;2607:9;2598:7;2594:23;2590:32;2587:52;;;2635:1;2632;2625:12;2587:52;2674:9;2661:23;2693:28;2715:5;2693:28;:::i;2756:173::-;2824:20;;-1:-1:-1;;;;;2873:31:1;;2863:42;;2853:70;;2919:1;2916;2909:12;2853:70;2756:173;;;:::o;2934:186::-;2993:6;3046:2;3034:9;3025:7;3021:23;3017:32;3014:52;;;3062:1;3059;3052:12;3014:52;3085:29;3104:9;3085:29;:::i;3310:250::-;3395:1;3405:113;3419:6;3416:1;3413:13;3405:113;;;3495:11;;;3489:18;3476:11;;;3469:39;3441:2;3434:10;3405:113;;;-1:-1:-1;;3552:1:1;3534:16;;3527:27;3310:250::o;3565:270::-;3606:3;3644:5;3638:12;3671:6;3666:3;3659:19;3687:76;3756:6;3749:4;3744:3;3740:14;3733:4;3726:5;3722:16;3687:76;:::i;:::-;3817:2;3796:15;-1:-1:-1;;3792:29:1;3783:39;;;;3824:4;3779:50;;3565:270;-1:-1:-1;;3565:270:1:o;3840:314::-;-1:-1:-1;;;;;4015:32:1;;3997:51;;4084:2;4079;4064:18;;4057:30;;;-1:-1:-1;;4104:44:1;;4129:18;;4121:6;4104:44;:::i;:::-;4096:52;3840:314;-1:-1:-1;;;;3840:314:1:o;4159:348::-;4211:8;4221:6;4275:3;4268:4;4260:6;4256:17;4252:27;4242:55;;4293:1;4290;4283:12;4242:55;-1:-1:-1;4316:20:1;;-1:-1:-1;;;;;4348:30:1;;4345:50;;;4391:1;4388;4381:12;4345:50;4428:4;4420:6;4416:17;4404:29;;4480:3;4473:4;4464:6;4456;4452:19;4448:30;4445:39;4442:59;;;4497:1;4494;4487:12;4442:59;4159:348;;;;;:::o;4512:367::-;4575:8;4585:6;4639:3;4632:4;4624:6;4620:17;4616:27;4606:55;;4657:1;4654;4647:12;4606:55;-1:-1:-1;4680:20:1;;-1:-1:-1;;;;;4712:30:1;;4709:50;;;4755:1;4752;4745:12;4709:50;4792:4;4784:6;4780:17;4768:29;;4852:3;4845:4;4835:6;4832:1;4828:14;4820:6;4816:27;4812:38;4809:47;4806:67;;;4869:1;4866;4859:12;4884:965;5018:6;5026;5034;5042;5050;5058;5066;5119:3;5107:9;5098:7;5094:23;5090:33;5087:53;;;5136:1;5133;5126:12;5087:53;5176:9;5163:23;-1:-1:-1;;;;;5246:2:1;5238:6;5235:14;5232:34;;;5262:1;5259;5252:12;5232:34;5301:59;5352:7;5343:6;5332:9;5328:22;5301:59;:::i;:::-;5379:8;;-1:-1:-1;5275:85:1;-1:-1:-1;5275:85:1;;-1:-1:-1;5433:38:1;5467:2;5452:18;;5433:38;:::i;:::-;5423:48;;5490:38;5524:2;5513:9;5509:18;5490:38;:::i;:::-;5480:48;;5575:2;5564:9;5560:18;5547:32;5537:42;;5632:3;5621:9;5617:19;5604:33;5588:49;;5662:2;5652:8;5649:16;5646:36;;;5678:1;5675;5668:12;5646:36;;5717:72;5781:7;5770:8;5759:9;5755:24;5717:72;:::i;:::-;4884:965;;;;-1:-1:-1;4884:965:1;;-1:-1:-1;4884:965:1;;;;5691:98;;-1:-1:-1;;;4884:965:1:o;5854:301::-;5913:6;5966:2;5954:9;5945:7;5941:23;5937:32;5934:52;;;5982:1;5979;5972:12;5934:52;6021:9;6008:23;-1:-1:-1;;;;;6064:5:1;6060:46;6053:5;6050:57;6040:85;;6121:1;6118;6111:12;6722:1378;6867:6;6875;6883;6891;6899;6943:9;6934:7;6930:23;6973:3;6969:2;6965:12;6962:32;;;6990:1;6987;6980:12;6962:32;7013:29;7032:9;7013:29;:::i;:::-;7003:39;;7093:2;7082:9;7078:18;7065:32;-1:-1:-1;;;;;7157:2:1;7149:6;7146:14;7143:34;;;7173:1;7170;7163:12;7143:34;7211:6;7200:9;7196:22;7186:32;;7256:7;7249:4;7245:2;7241:13;7237:27;7227:55;;7278:1;7275;7268:12;7227:55;7301:74;7367:7;7362:2;7349:16;7344:2;7340;7336:11;7301:74;:::i;:::-;7291:84;;7394:38;7428:2;7417:9;7413:18;7394:38;:::i;:::-;7384:48;;7485:2;7474:9;7470:18;7457:32;7441:48;;7514:2;7504:8;7501:16;7498:36;;;7530:1;7527;7520:12;7498:36;;7553:52;7597:7;7586:8;7575:9;7571:24;7553:52;:::i;:::-;7543:62;-1:-1:-1;;7640:4:1;-1:-1:-1;;7621:17:1;;7617:28;7614:48;;;7658:1;7655;7648:12;7614:48;;7691:2;7685:9;7703:32;7728:6;7703:32;:::i;:::-;7787:3;7776:9;7772:19;7759:33;7751:6;7744:49;7826:40;7860:4;7849:9;7845:20;7826:40;:::i;:::-;7821:2;7809:15;;7802:65;7928:3;7913:19;;7900:33;7895:2;7883:15;;7876:58;7995:3;7980:19;;7967:33;7962:2;7950:15;;7943:58;8063:3;8048:19;;;8035:33;8029:3;8017:16;;8010:59;-1:-1:-1;6722:1378:1;;;;-1:-1:-1;6722:1378:1;7813:6;6722:1378::o;8105:391::-;8191:6;8199;8207;8215;8268:3;8256:9;8247:7;8243:23;8239:33;8236:53;;;8285:1;8282;8275:12;8236:53;8321:9;8308:23;8298:33;;8350:38;8384:2;8373:9;8369:18;8350:38;:::i;:::-;8105:391;;8340:48;;-1:-1:-1;;;;8435:2:1;8420:18;;8407:32;;8486:2;8471:18;8458:32;;8105:391::o;8936:260::-;9004:6;9012;9065:2;9053:9;9044:7;9040:23;9036:32;9033:52;;;9081:1;9078;9071:12;9033:52;9104:29;9123:9;9104:29;:::i;:::-;9094:39;;9152:38;9186:2;9175:9;9171:18;9152:38;:::i;:::-;9142:48;;8936:260;;;;;:::o;9201:547::-;9290:6;9298;9306;9314;9367:2;9355:9;9346:7;9342:23;9338:32;9335:52;;;9383:1;9380;9373:12;9335:52;9423:9;9410:23;-1:-1:-1;;;;;9448:6:1;9445:30;9442:50;;;9488:1;9485;9478:12;9442:50;9527:59;9578:7;9569:6;9558:9;9554:22;9527:59;:::i;:::-;9605:8;;9501:85;;-1:-1:-1;9687:2:1;9672:18;;9659:32;;9738:2;9723:18;9710:32;;-1:-1:-1;9201:547:1;-1:-1:-1;;;;9201:547:1:o;9976:390::-;10054:6;10062;10115:2;10103:9;10094:7;10090:23;10086:32;10083:52;;;10131:1;10128;10121:12;10083:52;10171:9;10158:23;-1:-1:-1;;;;;10196:6:1;10193:30;10190:50;;;10236:1;10233;10226:12;10190:50;10259;10301:7;10292:6;10281:9;10277:22;10259:50;:::i;:::-;10249:60;10356:2;10341:18;;;;10328:32;;-1:-1:-1;;;;9976:390:1:o;10371:1067::-;10464:6;10472;10525:2;10513:9;10504:7;10500:23;10496:32;10493:52;;;10541:1;10538;10531:12;10493:52;10564:29;10583:9;10564:29;:::i;:::-;10554:39;;10612:2;10665;10654:9;10650:18;10637:32;-1:-1:-1;;;;;10729:2:1;10721:6;10718:14;10715:34;;;10745:1;10742;10735:12;10715:34;10783:6;10772:9;10768:22;10758:32;;10828:7;10821:4;10817:2;10813:13;10809:27;10799:55;;10850:1;10847;10840:12;10799:55;10886:2;10873:16;10908:2;10904;10901:10;10898:36;;;10914:18;;:::i;:::-;10960:2;10957:1;10953:10;10943:20;;10992:2;10986:9;11004:40;11040:2;11036;11032:11;11024:6;11004:40;:::i;:::-;11079:18;;;11155:11;;;11151:20;;;11113:15;;;11183:19;;;11180:39;;;11215:1;11212;11205:12;11180:39;11239:11;;;;11259:148;11275:6;11270:3;11267:15;11259:148;;;11341:23;11360:3;11341:23;:::i;:::-;11329:36;;11292:12;;;;11385;;11259:148;;;11263:3;11426:6;11416:16;;;;;;;10371:1067;;;;;:::o;11443:658::-;11614:2;11666:21;;;11736:13;;11639:18;;;11758:22;;;11585:4;;11614:2;11837:15;;;;11811:2;11796:18;;;11585:4;11880:195;11894:6;11891:1;11888:13;11880:195;;;11959:13;;-1:-1:-1;;;;;11955:39:1;11943:52;;12050:15;;;;12015:12;;;;11991:1;11909:9;11880:195;;;-1:-1:-1;12092:3:1;;11443:658;-1:-1:-1;;;;;;11443:658:1:o;12106:578::-;12210:6;12218;12226;12279:2;12267:9;12258:7;12254:23;12250:32;12247:52;;;12295:1;12292;12285:12;12247:52;12335:9;12322:23;-1:-1:-1;;;;;12360:6:1;12357:30;12354:50;;;12400:1;12397;12390:12;12354:50;12439:70;12501:7;12492:6;12481:9;12477:22;12439:70;:::i;:::-;12528:8;;-1:-1:-1;12413:96:1;-1:-1:-1;;12613:2:1;12598:18;;12585:32;12626:28;12585:32;12626:28;:::i;:::-;12673:5;12663:15;;;12106:578;;;;;:::o;12689:1088::-;12847:6;12855;12863;12871;12879;12887;12940:2;12928:9;12919:7;12915:23;12911:32;12908:52;;;12956:1;12953;12946:12;12908:52;12996:9;12983:23;-1:-1:-1;;;;;13066:2:1;13058:6;13055:14;13052:34;;;13082:1;13079;13072:12;13052:34;13121:70;13183:7;13174:6;13163:9;13159:22;13121:70;:::i;:::-;13210:8;;-1:-1:-1;13095:96:1;-1:-1:-1;13298:2:1;13283:18;;13270:32;;-1:-1:-1;13314:16:1;;;13311:36;;;13343:1;13340;13333:12;13311:36;13382:72;13446:7;13435:8;13424:9;13420:24;13382:72;:::i;:::-;13473:8;;-1:-1:-1;13356:98:1;-1:-1:-1;13561:2:1;13546:18;;13533:32;;-1:-1:-1;13577:16:1;;;13574:36;;;13606:1;13603;13596:12;13574:36;;13645:72;13709:7;13698:8;13687:9;13683:24;13645:72;:::i;:::-;12689:1088;;;;-1:-1:-1;12689:1088:1;;-1:-1:-1;12689:1088:1;;13736:8;;12689:1088;-1:-1:-1;;;12689:1088:1:o;13782:916::-;13922:6;13930;13938;13946;13954;13962;14015:3;14003:9;13994:7;13990:23;13986:33;13983:53;;;14032:1;14029;14022:12;13983:53;14055:29;14074:9;14055:29;:::i;:::-;14045:39;;14131:2;14120:9;14116:18;14103:32;14093:42;;14186:2;14175:9;14171:18;14158:32;-1:-1:-1;;;;;14250:2:1;14242:6;14239:14;14236:34;;;14266:1;14263;14256:12;14236:34;14305:70;14367:7;14358:6;14347:9;14343:22;14305:70;:::i;:::-;14394:8;;-1:-1:-1;14279:96:1;-1:-1:-1;14482:2:1;14467:18;;14454:32;;-1:-1:-1;14498:16:1;;;14495:36;;;14527:1;14524;14517:12;14703:396;14781:6;14789;14842:2;14830:9;14821:7;14817:23;14813:32;14810:52;;;14858:1;14855;14848:12;14810:52;14898:9;14885:23;-1:-1:-1;;;;;14923:6:1;14920:30;14917:50;;;14963:1;14960;14953:12;14917:50;14986;15028:7;15019:6;15008:9;15004:22;14986:50;:::i;:::-;14976:60;;;15055:38;15089:2;15078:9;15074:18;15055:38;:::i;15104:322::-;15181:6;15189;15197;15250:2;15238:9;15229:7;15225:23;15221:32;15218:52;;;15266:1;15263;15256:12;15218:52;15289:29;15308:9;15289:29;:::i;:::-;15279:39;15365:2;15350:18;;15337:32;;-1:-1:-1;15416:2:1;15401:18;;;15388:32;;15104:322;-1:-1:-1;;;15104:322:1:o;15431:654::-;15544:6;15552;15560;15568;15576;15629:3;15617:9;15608:7;15604:23;15600:33;15597:53;;;15646:1;15643;15636:12;15597:53;15669:29;15688:9;15669:29;:::i;:::-;15659:39;;15717:38;15751:2;15740:9;15736:18;15717:38;:::i;:::-;15707:48;;15802:2;15791:9;15787:18;15774:32;15764:42;;15857:2;15846:9;15842:18;15829:32;-1:-1:-1;;;;;15876:6:1;15873:30;15870:50;;;15916:1;15913;15906:12;15870:50;15955:70;16017:7;16008:6;15997:9;15993:22;15955:70;:::i;:::-;15431:654;;;;-1:-1:-1;15431:654:1;;-1:-1:-1;16044:8:1;;15929:96;15431:654;-1:-1:-1;;;15431:654:1:o;16090:1163::-;16257:6;16265;16273;16281;16289;16297;16305;16358:3;16346:9;16337:7;16333:23;16329:33;16326:53;;;16375:1;16372;16365:12;16326:53;16398:29;16417:9;16398:29;:::i;:::-;16388:39;;16478:2;16467:9;16463:18;16450:32;-1:-1:-1;;;;;16542:2:1;16534:6;16531:14;16528:34;;;16558:1;16555;16548:12;16528:34;16597:70;16659:7;16650:6;16639:9;16635:22;16597:70;:::i;:::-;16686:8;;-1:-1:-1;16571:96:1;-1:-1:-1;16774:2:1;16759:18;;16746:32;;-1:-1:-1;16790:16:1;;;16787:36;;;16819:1;16816;16809:12;16787:36;16858:72;16922:7;16911:8;16900:9;16896:24;16858:72;:::i;:::-;16949:8;;-1:-1:-1;16832:98:1;-1:-1:-1;17037:2:1;17022:18;;17009:32;;-1:-1:-1;17053:16:1;;;17050:36;;;17082:1;17079;17072:12;17258:219;17407:2;17396:9;17389:21;17370:4;17427:44;17467:2;17456:9;17452:18;17444:6;17427:44;:::i;17482:696::-;17588:6;17596;17604;17612;17620;17628;17681:3;17669:9;17660:7;17656:23;17652:33;17649:53;;;17698:1;17695;17688:12;17649:53;17721:29;17740:9;17721:29;:::i;:::-;17711:39;;17801:2;17790:9;17786:18;17773:32;-1:-1:-1;;;;;17820:6:1;17817:30;17814:50;;;17860:1;17857;17850:12;17814:50;17899:59;17950:7;17941:6;17930:9;17926:22;17899:59;:::i;:::-;17977:8;;-1:-1:-1;17873:85:1;-1:-1:-1;18031:38:1;;-1:-1:-1;18065:2:1;18050:18;;18031:38;:::i;:::-;18021:48;;18116:2;18105:9;18101:18;18088:32;18078:42;;18167:3;18156:9;18152:19;18139:33;18129:43;;17482:696;;;;;;;;:::o;18183:540::-;18260:6;18268;18276;18329:2;18317:9;18308:7;18304:23;18300:32;18297:52;;;18345:1;18342;18335:12;18297:52;18385:9;18372:23;-1:-1:-1;;;;;18410:6:1;18407:30;18404:50;;;18450:1;18447;18440:12;18404:50;18489:59;18540:7;18531:6;18520:9;18516:22;18489:59;:::i;18959:334::-;19161:2;19143:21;;;19200:2;19180:18;;;19173:30;-1:-1:-1;;;19234:2:1;19219:18;;19212:40;19284:2;19269:18;;18959:334::o;19298:331::-;19500:2;19482:21;;;19539:1;19519:18;;;19512:29;-1:-1:-1;;;19572:2:1;19557:18;;19550:38;19620:2;19605:18;;19298:331::o;19634:127::-;19695:10;19690:3;19686:20;19683:1;19676:31;19726:4;19723:1;19716:15;19750:4;19747:1;19740:15;19766:128;19833:9;;;19854:11;;;19851:37;;;19868:18;;:::i;19899:127::-;19960:10;19955:3;19951:20;19948:1;19941:31;19991:4;19988:1;19981:15;20015:4;20012:1;20005:15;20031:135;20070:3;20091:17;;;20088:43;;20111:18;;:::i;:::-;-1:-1:-1;20158:1:1;20147:13;;20031:135::o;20171:127::-;20232:10;20227:3;20223:20;20220:1;20213:31;20263:4;20260:1;20253:15;20287:4;20284:1;20277:15;20303:380;20382:1;20378:12;;;;20425;;;20446:61;;20500:4;20492:6;20488:17;20478:27;;20446:61;20553:2;20545:6;20542:14;20522:18;20519:38;20516:161;;20599:10;20594:3;20590:20;20587:1;20580:31;20634:4;20631:1;20624:15;20662:4;20659:1;20652:15;20516:161;;20303:380;;;:::o;21373:273::-;21558:6;21550;21545:3;21532:33;21514:3;21584:16;;21609:13;;;21584:16;21373:273;-1:-1:-1;21373:273:1:o;22114:545::-;22216:2;22211:3;22208:11;22205:448;;;22252:1;22277:5;22273:2;22266:17;22322:4;22318:2;22308:19;22392:2;22380:10;22376:19;22373:1;22369:27;22363:4;22359:38;22428:4;22416:10;22413:20;22410:47;;;-1:-1:-1;22451:4:1;22410:47;22506:2;22501:3;22497:12;22494:1;22490:20;22484:4;22480:31;22470:41;;22561:82;22579:2;22572:5;22569:13;22561:82;;;22624:17;;;22605:1;22594:13;22561:82;;;22565:3;;;22205:448;22114:545;;;:::o;22835:1206::-;-1:-1:-1;;;;;22954:3:1;22951:27;22948:53;;;22981:18;;:::i;:::-;23010:94;23100:3;23060:38;23092:4;23086:11;23060:38;:::i;:::-;23054:4;23010:94;:::i;:::-;23130:1;23155:2;23150:3;23147:11;23172:1;23167:616;;;;23827:1;23844:3;23841:93;;;-1:-1:-1;23900:19:1;;;23887:33;23841:93;-1:-1:-1;;22792:1:1;22788:11;;;22784:24;22780:29;22770:40;22816:1;22812:11;;;22767:57;23947:78;;23140:895;;23167:616;22061:1;22054:14;;;22098:4;22085:18;;-1:-1:-1;;23203:17:1;;;23304:9;23326:229;23340:7;23337:1;23334:14;23326:229;;;23429:19;;;23416:33;23401:49;;23536:4;23521:20;;;;23489:1;23477:14;;;;23356:12;23326:229;;;23330:3;23583;23574:7;23571:16;23568:159;;;23707:1;23703:6;23697:3;23691;23688:1;23684:11;23680:21;23676:34;23672:39;23659:9;23654:3;23650:19;23637:33;23633:79;23625:6;23618:95;23568:159;;;23770:1;23764:3;23761:1;23757:11;23753:19;23747:4;23740:33;23140:895;;;22835:1206;;;:::o;24046:125::-;24111:9;;;24132:10;;;24129:36;;;24145:18;;:::i;24176:267::-;24265:6;24260:3;24253:19;24317:6;24310:5;24303:4;24298:3;24294:14;24281:43;-1:-1:-1;24369:1:1;24344:16;;;24362:4;24340:27;;;24333:38;;;;24425:2;24404:15;;;-1:-1:-1;;24400:29:1;24391:39;;;24387:50;;24176:267::o;24448:318::-;24635:2;24624:9;24617:21;24598:4;24655:62;24713:2;24702:9;24698:18;24690:6;24682;24655:62;:::i;:::-;24647:70;;24753:6;24748:2;24737:9;24733:18;24726:34;24448:318;;;;;;:::o;26331:289::-;26462:3;26500:6;26494:13;26516:66;26575:6;26570:3;26563:4;26555:6;26551:17;26516:66;:::i;:::-;26598:16;;;;;26331:289;-1:-1:-1;;26331:289:1:o;27647:560::-;27869:4;27915:1;27911;27906:3;27902:11;27898:19;27956:2;27948:6;27944:15;27933:9;27926:34;27996:3;27991:2;27980:9;27976:18;27969:31;28017:45;28057:3;28046:9;28042:19;28034:6;28017:45;:::i;:::-;28098:15;;28093:2;28078:18;;28071:43;-1:-1:-1;28145:2:1;28130:18;;28123:34;;;;28188:3;28173:19;;;28166:35;28009:53;27647:560;-1:-1:-1;;27647:560:1:o;28212:825::-;28297:6;28305;28358:2;28346:9;28337:7;28333:23;28329:32;28326:52;;;28374:1;28371;28364:12;28326:52;28406:9;28400:16;28425:28;28447:5;28425:28;:::i;:::-;28521:2;28506:18;;28500:25;28472:5;;-1:-1:-1;;;;;;28537:30:1;;28534:50;;;28580:1;28577;28570:12;28534:50;28603:22;;28656:4;28648:13;;28644:27;-1:-1:-1;28634:55:1;;28685:1;28682;28675:12;28634:55;28714:2;28708:9;28736:32;28765:2;28736:32;:::i;:::-;28797:2;28791:9;28809:31;28837:2;28829:6;28809:31;:::i;:::-;28864:2;28856:6;28849:18;28904:7;28899:2;28894;28890;28886:11;28882:20;28879:33;28876:53;;;28925:1;28922;28915:12;28876:53;28938:68;29003:2;28998;28990:6;28986:15;28981:2;28977;28973:11;28938:68;:::i;:::-;29025:6;29015:16;;;;;;28212:825;;;;;:::o;29042:179::-;29077:3;29119:1;29101:16;29098:23;29095:120;;;29165:1;29162;29159;29144:23;-1:-1:-1;29202:1:1;29196:8;29191:3;29187:18;29095:120;29042:179;:::o;29226:671::-;29265:3;29307:4;29289:16;29286:26;29283:39;;;29226:671;:::o;29283:39::-;29349:2;29343:9;-1:-1:-1;;29414:16:1;29410:25;;29407:1;29343:9;29386:50;29465:4;29459:11;29489:16;-1:-1:-1;;;;;29595:2:1;29588:4;29580:6;29576:17;29573:25;29568:2;29560:6;29557:14;29554:45;29551:58;;;29602:5;;;;;29226:671;:::o;29551:58::-;29639:6;29633:4;29629:17;29618:28;;29675:3;29669:10;29702:2;29694:6;29691:14;29688:27;;;29708:5;;;;;;29226:671;:::o;29688:27::-;29792:2;29773:16;29767:4;29763:27;29759:36;29752:4;29743:6;29738:3;29734:16;29730:27;29727:69;29724:82;;;29799:5;;;;;;29226:671;:::o;29724:82::-;29815:57;29866:4;29857:6;29849;29845:19;29841:30;29835:4;29815:57;:::i;:::-;-1:-1:-1;29888:3:1;;29226:671;-1:-1:-1;;;;;29226:671:1:o;29902:442::-;30127:6;30116:9;30109:25;30170:6;30165:2;30154:9;30150:18;30143:34;30227:6;30220:14;30213:22;30208:2;30197:9;30193:18;30186:50;30272:3;30267:2;30256:9;30252:18;30245:31;30090:4;30293:45;30333:3;30322:9;30318:19;30310:6;30293:45;:::i;:::-;30285:53;29902:442;-1:-1:-1;;;;;;29902:442:1:o;30349:1350::-;30473:3;30467:10;-1:-1:-1;;;;;30492:6:1;30489:30;30486:56;;;30522:18;;:::i;:::-;30551:97;30641:6;30601:38;30633:4;30627:11;30601:38;:::i;:::-;30595:4;30551:97;:::i;:::-;30703:4;;30767:2;30756:14;;30784:1;30779:663;;;;31486:1;31503:6;31500:89;;;-1:-1:-1;31555:19:1;;;31549:26;31500:89;-1:-1:-1;;22792:1:1;22788:11;;;22784:24;22780:29;22770:40;22816:1;22812:11;;;22767:57;31602:81;;30749:944;;30779:663;22061:1;22054:14;;;22098:4;22085:18;;-1:-1:-1;;30815:20:1;;;30933:236;30947:7;30944:1;30941:14;30933:236;;;31036:19;;;31030:26;31015:42;;31128:27;;;;31096:1;31084:14;;;;30963:19;;30933:236;;;30937:3;31197:6;31188:7;31185:19;31182:201;;;31258:19;;;31252:26;-1:-1:-1;;31341:1:1;31337:14;;;31353:3;31333:24;31329:37;31325:42;31310:58;31295:74;;31182:201;-1:-1:-1;;;;;31429:1:1;31413:14;;;31409:22;31396:36;;-1:-1:-1;30349:1350:1:o;31704:359::-;31907:6;31896:9;31889:25;31950:6;31945:2;31934:9;31930:18;31923:34;31993:2;31988;31977:9;31973:18;31966:30;31870:4;32013:44;32053:2;32042:9;32038:18;32030:6;32013:44;:::i;32068:629::-;32355:3;32344:9;32337:22;32318:4;32382:45;32422:3;32411:9;32407:19;32399:6;32382:45;:::i;:::-;-1:-1:-1;;;;;32463:32:1;;32458:2;32443:18;;32436:60;32527:2;32512:18;;32505:34;;;32575:22;;;32570:2;32555:18;;32548:50;32615:32;32579:6;32632;32615:32;:::i;:::-;32607:40;;;32684:6;32678:3;32667:9;32663:19;32656:35;32068:629;;;;;;;;:::o;32702:168::-;32775:9;;;32806;;32823:15;;;32817:22;;32803:37;32793:71;;32844:18;;:::i;33220:197::-;-1:-1:-1;;;;;33342:10:1;;;33354;;;33338:27;;33377:11;;;33374:37;;;33391:18;;:::i;:::-;33374:37;33220:197;;;;:::o;33844:337::-;34046:2;34028:21;;;34085:2;34065:18;;;34058:30;-1:-1:-1;;;34119:2:1;34104:18;;34097:43;34172:2;34157:18;;33844:337::o;34186:329::-;34388:2;34370:21;;;34427:1;34407:18;;;34400:29;-1:-1:-1;;;34460:2:1;34445:18;;34438:36;34506:2;34491:18;;34186:329::o;34866:522::-;34944:4;34950:6;35010:11;34997:25;35104:2;35100:7;35089:8;35073:14;35069:29;35065:43;35045:18;35041:68;35031:96;;35123:1;35120;35113:12;35031:96;35150:33;;35202:20;;;-1:-1:-1;;;;;;35234:30:1;;35231:50;;;35277:1;35274;35267:12;35231:50;35310:4;35298:17;;-1:-1:-1;35341:14:1;35337:27;;;35327:38;;35324:58;;;35378:1;35375;35368:12;35393:328;35574:2;35563:9;35556:21;35537:4;35594:62;35652:2;35641:9;35637:18;35629:6;35621;35594:62;:::i;:::-;35586:70;;35706:6;35699:14;35692:22;35687:2;35676:9;35672:18;35665:50;35393:328;;;;;;:::o;37426:290::-;37603:2;37592:9;37585:21;37566:4;37623:44;37663:2;37652:9;37648:18;37640:6;37623:44;:::i;:::-;37615:52;;37703:6;37698:2;37687:9;37683:18;37676:34;37426:290;;;;;:::o;38062:649::-;38351:3;38340:9;38333:22;38314:4;38378:63;38436:3;38425:9;38421:19;38413:6;38405;38378:63;:::i;:::-;-1:-1:-1;;;;;38477:32:1;;38472:2;38457:18;;38450:60;38541:2;38526:18;;38519:34;;;38589:22;;;38584:2;38569:18;;38562:50;38629:32;38593:6;38646;38629:32;:::i;:::-;38621:40;;;38698:6;38692:3;38681:9;38677:19;38670:35;38062:649;;;;;;;;;:::o;38716:136::-;38755:3;38783:5;38773:39;;38792:18;;:::i;:::-;-1:-1:-1;;;38828:18:1;;38716:136::o;38857:300::-;39028:2;39017:9;39010:21;38991:4;39048:44;39088:2;39077:9;39073:18;39065:6;39048:44;:::i;:::-;39040:52;;39142:6;39135:14;39128:22;39123:2;39112:9;39108:18;39101:50;38857:300;;;;;:::o

Swarm Source

ipfs://d1961d3f495572601149d9444e90f149baa4e46aecbcd030adb8829edf9c5de8

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.