Contract 0x93BB030735747708b4D33093A98d4c804Cd6B58C

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x671477c6586e26fc0db97012aa522a8cf70d6985744e994ce169afefd5b267570x6080604060772552022-02-15 2:46:40100 days 11 hrs ago0xb5af4138f0f33be0d6414eb25271b9c2dc245fb5 IN  Create: L2Migrator0 ETH0.028916657895 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x03fba1ece33dde26dce6b84558d259844785a19f6184b9a10580aad9e1216c37129861652022-05-26 10:42:443 hrs 49 mins ago 0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x18d546b1e75bbe452a86f547dbd672f503f9c494a0efbc9dc96e826c03f722b6128926832022-05-25 1:48:571 day 12 hrs ago 0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x20d546cab876d9f036329b1e34f13576f8f84fc2999ef327ccc4420be4919730128925452022-05-25 1:45:301 day 12 hrs ago 0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x6ba755f435f4ec3c59fbe4bf5db44ff64e5e660c2d44ca6c4973ac0104b63ed3128924162022-05-25 1:42:351 day 12 hrs ago 0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x77f97709832940ddebd77eccef5fc005f44981680d0819d884c958aeaaef766d128920922022-05-25 1:29:031 day 13 hrs ago 0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x110ab475155ced2e056fc7f47cfecbd5df7f8eb8f87a9373fa786510c46f54dd128778462022-05-24 18:57:251 day 19 hrs ago 0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x03cc00bad1cf83540e4b97c80e91517a9980293f5d5717b5b3d3fa0c23fb3bf0128631112022-05-24 14:06:552 days 25 mins ago 0x148d5b6b4df9530c7c76a810bd1cdf69ec4c2085 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x135f46fb6351d159986b2d13723f9341f2c6e5e7dc539100f7233404438864df128339622022-05-24 5:47:312 days 8 hrs ago 0xa89f778740c6562daac0fa1e09f48e0283a39611 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xdeb1ea8d70e99a0adf6028c351aec629f5b2234fa18263dd460df75530bf7bd0128218582022-05-24 1:29:322 days 13 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x27bd4e8b384e4a9836d7981eb28ee1314f699e612c4c7bd9b4305194b070d066128215612022-05-24 1:24:462 days 13 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x22ff9ce6a36f247182acd34d271d43158805b3b9bf19740464f0700477bd2fe4128214472022-05-24 1:21:292 days 13 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xf39a53927a5398984d0fdf57cba277aeedd2ac8d04478aedec2d114f44710fc0128209262022-05-24 1:10:102 days 13 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xd1f158994ec8a2843b30f13cd09d94826fa1a0dafcbb5d4e7e05c20e6903ef1f128209262022-05-24 1:10:102 days 13 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xc5333752916afac447c35c509b83b73fda8dc5733ef2d09e1ea8387dfb88b3d3128102762022-05-23 20:51:352 days 17 hrs ago 0xef83273cbd014c4ae7998467c422275a8b37827e 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xa93de52013605f037eef28e894992ce4bbf37be742aea43f3de0530f6c1a2b46127347622022-05-22 21:55:053 days 16 hrs ago 0x8e812e03cc6b2cefefac00a11551a17153592743 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x9cc6c60da845df82d4644cae332dcd62b8459cfdaf29bc49121777b1cff35203127321872022-05-22 20:37:373 days 17 hrs ago 0xe96c3e1d842beccb10bf57c453b84bf75725241d 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xff14ef88f56983c592728ba717fe40afa0c71bc7ff9726d32bd9162b3ef4da4a126550012022-05-21 17:46:254 days 20 hrs ago 0x3b97083e944cf0e937c5b9b6c033c856bc975dd3 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xdad907816239864e5409dae6280d77d8f5901757aa00bf93bcff23357a0600ad126221982022-05-21 8:58:255 days 5 hrs ago 0x42647285714407c7e4664be52e3a4ab38a2a7ef1 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x5433d02fc68a29fa28357c3b972d49e36b3cdc0452a0429b94f5e38704c9dd61125792692022-05-20 17:38:125 days 20 hrs ago 0xd8442a5843d7415bc9dabd98d5f3f73de46cff2f 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x8e4b062310c68201a696b68324ae5ebd5097be6f715066fbc1c0fa7a2092bf35125097052022-05-19 20:43:136 days 17 hrs ago 0x5cb59f4d4b6f57ad1afdcb48b67ef6754682ace0 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xd5bacebb5e377025b0c2d53f847cd04e784df0df8efa7dc171f0a3ff22360b62125019752022-05-19 17:48:466 days 20 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xf0ead9c558406543bbbe8f0aac52ac5bccabf2e3c8e3dad2fb8405a45c6ce7f3124378022022-05-19 1:00:267 days 13 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0xc6d6c2c7d44a8a9071df99c52d93e29a7f4b76e1059a45f8c647488195ff6784124373032022-05-19 0:50:047 days 13 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x7177043f497253d12afd20c45be9c993fd3ea63b1d26ebf623b25cb66710b191124372432022-05-19 0:48:397 days 13 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
0x70191e37a254f26b8cf1964a78acd6173e338d6f3c9b045f4ce1679882ec4b80124371482022-05-19 0:45:277 days 13 hrs ago 0x32256b872d3a95d2cf9afed03ee5a783dae9b9ab 0x93bb030735747708b4d33093a98d4c804cd6b58c0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
L2Migrator

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 9 : Clones.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol)

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt)
        internal
        view
        returns (address predicted)
    {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

File 2 of 9 : L2ArbitrumMessenger.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import {IArbSys} from "../../arbitrum/IArbSys.sol";

abstract contract L2ArbitrumMessenger {
    event TxToL1(
        address indexed _from,
        address indexed _to,
        uint256 indexed _id,
        bytes _data
    );

    function sendTxToL1(
        address user,
        address to,
        bytes memory data
    ) internal returns (uint256) {
        // note: this method doesn't support sending ether to L1 together with a call
        uint256 id = IArbSys(address(100)).sendTxToL1(to, data);
        emit TxToL1(user, to, id, data);
        return id;
    }

    modifier onlyL1Counterpart(address l1Counterpart) {
        require(
            msg.sender == applyL1ToL2Alias(l1Counterpart),
            "ONLY_COUNTERPART_GATEWAY"
        );
        _;
    }

    uint160 internal constant OFFSET =
        uint160(0x1111000000000000000000000000000000001111);

    // l1 addresses are transformed durng l1->l2 calls
    function applyL1ToL2Alias(address l1Address)
        internal
        pure
        returns (address l2Address)
    {
        l2Address = address(uint160(l1Address) + OFFSET);
    }
}

File 3 of 9 : L2Migrator.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import {L2ArbitrumMessenger} from "./L2ArbitrumMessenger.sol";
import {IMigrator} from "../../interfaces/IMigrator.sol";
import "../../proxy/ManagerProxyTarget.sol";
import "@openzeppelin/contracts/proxy/Clones.sol";

interface IBondingManager {
    function bondForWithHint(
        uint256 _amount,
        address _owner,
        address _to,
        address _oldDelegateNewPosPrev,
        address _oldDelegateNewPosNext,
        address _newDelegateNewPosPrev,
        address _newDelegateNewPosNext
    ) external;
}

interface ITicketBroker {
    function fundDepositAndReserveFor(
        address _addr,
        uint256 _depositAmount,
        uint256 _reserveAmount
    ) external payable;
}

interface IMerkleSnapshot {
    function verify(
        bytes32 _id,
        bytes32[] memory _proof,
        bytes32 _leaf
    ) external view returns (bool);
}

interface IDelegatorPool {
    function initialize(address _bondingManager) external;

    function claim(address _addr, uint256 _stake) external;
}

interface ApproveLike {
    function approve(address _addr, uint256 _amount) external;
}

contract L2Migrator is ManagerProxyTarget, L2ArbitrumMessenger, IMigrator {
    address public bondingManagerAddr;
    address public ticketBrokerAddr;
    address public merkleSnapshotAddr;
    address public tokenAddr;

    address public l1MigratorAddr;
    address public delegatorPoolImpl;
    bool public claimStakeEnabled;

    mapping(address => bool) public migratedDelegators;
    mapping(address => address) public delegatorPools;
    mapping(address => uint256) public claimedDelegatedStake;
    mapping(address => mapping(uint256 => bool)) public migratedUnbondingLocks;
    mapping(address => bool) public migratedSenders;

    event L1MigratorUpdate(address _l1MigratorAddr);

    event ControllerContractUpdate(bytes32 id, address addr);

    event MigrateDelegatorFinalized(MigrateDelegatorParams params);

    event MigrateUnbondingLocksFinalized(MigrateUnbondingLocksParams params);

    event MigrateSenderFinalized(MigrateSenderParams params);

    event DelegatorPoolImplUpdate(address _delegatorPoolImpl);

    event DelegatorPoolCreated(address indexed l1Addr, address delegatorPool);

    event ClaimStakeEnabled(bool _enabled);

    event StakeClaimed(
        address indexed delegator,
        address delegate,
        uint256 stake,
        uint256 fees
    );

    /**
     * @notice L2Migrator constructor. Only invokes constructor of base Manager contract with provided Controller address
     * @dev This constructor will not initialize any state variables besides `controller`.
     * - initialize() function must be called on a proxy that uses this implementation contract immediately after deployment
     * @param _controller Address of Controller that this contract will be registered with
     */
    constructor(address _controller) Manager(_controller) {}

    function initialize(address _l1MigratorAddr, address _delegatorPoolImpl)
        external
        onlyControllerOwner
    {
        l1MigratorAddr = _l1MigratorAddr;
        delegatorPoolImpl = _delegatorPoolImpl;

        syncControllerContracts();
    }

    /**
     * @notice Sets L1Migrator
     * @param _l1MigratorAddr L1Migrator address
     */
    function setL1Migrator(address _l1MigratorAddr)
        external
        onlyControllerOwner
    {
        l1MigratorAddr = _l1MigratorAddr;
        emit L1MigratorUpdate(_l1MigratorAddr);
    }

    /**
     * @notice Sets DelegatorPool implementation contract
     * @param _delegatorPoolImpl DelegatorPool implementation contract
     */
    function setDelegatorPoolImpl(address _delegatorPoolImpl)
        external
        onlyControllerOwner
    {
        delegatorPoolImpl = _delegatorPoolImpl;
        emit DelegatorPoolImplUpdate(_delegatorPoolImpl);
    }

    /**
     * @notice Enable/disable claimStake()
     * @param _enabled True/false indicating claimStake() enabled/disabled
     */
    function setClaimStakeEnabled(bool _enabled) external onlyControllerOwner {
        claimStakeEnabled = _enabled;
        emit ClaimStakeEnabled(_enabled);
    }

    /**
     * @notice Called by L1Migrator to complete transcoder/delegator state migration
     * @param _params L1 state relevant for migration
     */
    function finalizeMigrateDelegator(MigrateDelegatorParams calldata _params)
        external
        onlyL1Counterpart(l1MigratorAddr)
    {
        require(
            !migratedDelegators[_params.l1Addr],
            "DELEGATOR_ALREADY_MIGRATED"
        );

        migratedDelegators[_params.l1Addr] = true;

        if (_params.l1Addr == _params.delegate) {
            // l1Addr is an orchestrator on L1:
            // 1. Stake _params.stake on behalf of _params.l2Addr
            // 2. Create delegator pool
            // 3. Stake non-self delegated stake on behalf of the delegator pool
            bondFor(_params.stake, _params.l2Addr, _params.l2Addr);

            // _params.delegatedStake includes _params.stake which is the orchestrator's self-stake
            // Subtract _params.stake to get the orchestrator's non-self delegated stake
            uint256 nonSelfDelegatedStake = _params.delegatedStake -
                _params.stake;
            uint256 unclaimedNonSelfDelegatedStake = nonSelfDelegatedStake -
                claimedDelegatedStake[_params.l1Addr];
            if (unclaimedNonSelfDelegatedStake > 0) {
                address poolAddr = Clones.clone(delegatorPoolImpl);

                delegatorPools[_params.l1Addr] = poolAddr;

                bondFor(
                    unclaimedNonSelfDelegatedStake,
                    poolAddr,
                    _params.l2Addr
                );

                IDelegatorPool(poolAddr).initialize(bondingManagerAddr);

                emit DelegatorPoolCreated(_params.l1Addr, poolAddr);
            }
        } else {
            // l1Addr is a delegator on L1:
            // If a delegator pool exists for _params.delegate claim stake which
            // was already migrated by delegate on behalf of _params.l2Addr.
            // Otherwise, stake _params.stake on behalf of _params.l2Addr.
            address pool = delegatorPools[_params.delegate];

            if (pool != address(0)) {
                // Claim stake that is held by the delegator pool
                IDelegatorPool(pool).claim(_params.l2Addr, _params.stake);
            } else {
                bondFor(_params.stake, _params.l2Addr, _params.delegate);
            }
        }

        claimedDelegatedStake[_params.delegate] += _params.stake;

        // Use .call() since l2Addr could be a contract that needs more gas than
        // the stipend provided by .transfer()
        // The .call() is safe without a re-entrancy guard because this function cannot be re-entered
        // by _params.l2Addr since the function can only be called by the L1Migrator via a cross-chain retryable ticket
        if (_params.fees > 0) {
            (bool ok, ) = _params.l2Addr.call{value: _params.fees}("");
            require(ok, "FINALIZE_DELEGATOR:FAIL_FEE");
        }

        emit MigrateDelegatorFinalized(_params);
    }

    /**
     * @notice Called by L1Migrator to complete unbonding locks migration
     * @param _params L1 state relevant for migration
     */
    function finalizeMigrateUnbondingLocks(
        MigrateUnbondingLocksParams calldata _params
    ) external onlyL1Counterpart(l1MigratorAddr) {
        uint256 unbondingLockIdsLen = _params.unbondingLockIds.length;
        for (uint256 i; i < unbondingLockIdsLen; i++) {
            uint256 id = _params.unbondingLockIds[i];
            require(
                !migratedUnbondingLocks[_params.l1Addr][id],
                "UNBONDING_LOCK_ALREADY_MIGRATED"
            );
            migratedUnbondingLocks[_params.l1Addr][id] = true;
        }

        bondFor(_params.total, _params.l2Addr, _params.delegate);

        emit MigrateUnbondingLocksFinalized(_params);
    }

    /**
     * @notice Called by L1Migrator to complete sender deposit/reserve migration
     * @param _params L1 state relevant for migration
     */
    function finalizeMigrateSender(MigrateSenderParams calldata _params)
        external
        onlyL1Counterpart(l1MigratorAddr)
    {
        require(!migratedSenders[_params.l1Addr], "SENDER_ALREADY_MIGRATED");

        migratedSenders[_params.l1Addr] = true;

        // msg.value for this call must be equal to deposit + reserve amounts
        ITicketBroker(ticketBrokerAddr).fundDepositAndReserveFor{
            value: _params.deposit + _params.reserve
        }(_params.l2Addr, _params.deposit, _params.reserve);

        emit MigrateSenderFinalized(_params);
    }

    receive() external payable {}

    /**
     * @notice Completes delegator migration using a Merkle proof that a delegator's state was included in a state
     * snapshot represented by a Merkle tree root
     * @dev Assume that only EOAs are included in the snapshot
     * Regardless of the caller of this function, the EOA from L1 will be able to access its stake on L2
     * @param _delegate Address that is migrating
     * @param _stake Stake of delegator on L1
     * @param _fees Fees of delegator on L1
     * @param _proof Merkle proof of inclusion in Merkle tree state snapshot
     * @param _newDelegate Optional address of a new delegate on L2
     */
    function claimStake(
        address _delegate,
        uint256 _stake,
        uint256 _fees,
        bytes32[] calldata _proof,
        address _newDelegate
    ) external {
        require(claimStakeEnabled, "CLAIM_STAKE_DISABLED");

        address delegator = msg.sender;

        require(!migratedDelegators[delegator], "CLAIM_STAKE:ALREADY_MIGRATED");

        IMerkleSnapshot merkleSnapshot = IMerkleSnapshot(merkleSnapshotAddr);

        bytes32 leaf = keccak256(
            abi.encodePacked(delegator, _delegate, _stake, _fees)
        );

        require(
            merkleSnapshot.verify(keccak256("LIP-73"), _proof, leaf),
            "CLAIM_STAKE:INVALID_PROOF"
        );

        migratedDelegators[delegator] = true;

        if (_delegate != address(0)) {
            claimedDelegatedStake[_delegate] += _stake;

            address pool = delegatorPools[_delegate];

            address delegate = _delegate;
            if (_newDelegate != address(0)) {
                delegate = _newDelegate;
            }

            if (pool != address(0)) {
                // Claim stake that is held by the delegator pool
                IDelegatorPool(pool).claim(delegator, _stake);
            } else {
                bondFor(_stake, delegator, delegate);
            }
        }

        // Only EOAs are included in the snapshot so we do not need to worry about
        // the insufficeint gas stipend with transfer()
        if (_fees > 0) {
            payable(delegator).transfer(_fees);
        }

        emit StakeClaimed(delegator, _delegate, _stake, _fees);
    }

    function bondFor(
        uint256 _amount,
        address _owner,
        address _to
    ) private {
        IBondingManager bondingManager = IBondingManager(bondingManagerAddr);

        ApproveLike(tokenAddr).approve(address(bondingManager), _amount);
        bondingManager.bondForWithHint(
            _amount,
            _owner,
            _to,
            address(0),
            address(0),
            address(0),
            address(0)
        );
    }

    /**
     * @notice Fetches addresses and sets bondingManagerAddr, ticketBrokerAddr, merkleSnapshotAddr
     * if they are different from the stored addresses
     */
    function syncControllerContracts() public {
        // Check and update BondingManager address
        bytes32 bondingManagerId = keccak256("BondingManager");
        address _bondingManagerAddr = controller.getContract(bondingManagerId);

        if (_bondingManagerAddr != bondingManagerAddr) {
            bondingManagerAddr = _bondingManagerAddr;
            emit ControllerContractUpdate(
                bondingManagerId,
                _bondingManagerAddr
            );
        }

        // Check and update TicketBroker address
        bytes32 ticketBrokerId = keccak256("TicketBroker");
        address _ticketBrokerAddr = controller.getContract(ticketBrokerId);

        if (_ticketBrokerAddr != ticketBrokerAddr) {
            ticketBrokerAddr = _ticketBrokerAddr;
            emit ControllerContractUpdate(ticketBrokerId, _ticketBrokerAddr);
        }

        // Check and update MerkleSnapshot address
        bytes32 merkleSnapshotId = keccak256("MerkleSnapshot");
        address _merkleSnapshotAddr = controller.getContract(merkleSnapshotId);

        if (_merkleSnapshotAddr != merkleSnapshotAddr) {
            merkleSnapshotAddr = _merkleSnapshotAddr;
            emit ControllerContractUpdate(
                merkleSnapshotId,
                _merkleSnapshotAddr
            );
        }

        // Check and update LivepeerToken address
        bytes32 tokenId = keccak256("LivepeerToken");
        address _tokenAddr = controller.getContract(tokenId);

        if (_tokenAddr != tokenAddr) {
            tokenAddr = _tokenAddr;
            emit ControllerContractUpdate(tokenId, _tokenAddr);
        }
    }
}

File 4 of 9 : IArbSys.sol
// SPDX-License-Identifier: Apache-2.0

/*
 * Copyright 2021, Offchain Labs, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

pragma solidity 0.8.9;

/**
 * @title Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. Exposes a variety of system-level functionality.
 */
interface IArbSys {
    /**
     * @notice Get internal version number identifying an ArbOS build
     * @return version number as int
     */
    function arbOSVersion() external pure returns (uint256);

    function arbChainID() external view returns (uint256);

    /**
     * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)
     * @return block number as int
     */
    function arbBlockNumber() external view returns (uint256);

    /**
     * @notice Send given amount of Eth to dest from sender.
     * This is a convenience function, which is equivalent to calling sendTxToL1 with empty calldataForL1.
     * @param destination recipient address on L1
     * @return unique identifier for this L2-to-L1 transaction.
     */
    function withdrawEth(address destination)
        external
        payable
        returns (uint256);

    /**
     * @notice Send a transaction to L1
     * @param destination recipient address on L1
     * @param calldataForL1 (optional) calldata for L1 contract call
     * @return a unique identifier for this L2-to-L1 transaction.
     */
    function sendTxToL1(address destination, bytes calldata calldataForL1)
        external
        payable
        returns (uint256);

    /**
     * @notice get the number of transactions issued by the given external account or the account sequence number of the given contract
     * @param account target account
     * @return the number of transactions issued by the given external account or the account sequence number of the given contract
     */
    function getTransactionCount(address account)
        external
        view
        returns (uint256);

    /**
     * @notice get the value of target L2 storage slot
     * This function is only callable from address 0 to prevent contracts from being able to call it
     * @param account target account
     * @param index target index of storage slot
     * @return stotage value for the given account at the given index
     */
    function getStorageAt(address account, uint256 index)
        external
        view
        returns (uint256);

    /**
     * @notice check if current call is coming from l1
     * @return true if the caller of this was called directly from L1
     */
    function isTopLevelCall() external view returns (bool);

    event EthWithdrawal(address indexed destAddr, uint256 amount);

    event L2ToL1Transaction(
        address caller,
        address indexed destination,
        uint256 indexed uniqueId,
        uint256 indexed batchNumber,
        uint256 indexInBatch,
        uint256 arbBlockNum,
        uint256 ethBlockNum,
        uint256 timestamp,
        uint256 callvalue,
        bytes data
    );
}

File 5 of 9 : IMigrator.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IMigrator {
    struct MigrateDelegatorParams {
        // Address that is migrating from L1
        address l1Addr;
        // Address to use on L2
        // If null, l1Addr is used on L2
        address l2Addr;
        // Stake of l1Addr on L1
        uint256 stake;
        // Delegated stake of l1Addr on L1
        uint256 delegatedStake;
        // Fees of l1Addr on L1
        uint256 fees;
        // Delegate of l1Addr on L1
        address delegate;
    }

    struct MigrateUnbondingLocksParams {
        // Address that is migrating from L1
        address l1Addr;
        // Address to use on L2
        // If null, l1Addr is used on L2
        address l2Addr;
        // Total tokens in unbonding locks
        uint256 total;
        // IDs of unbonding locks being migrated
        uint256[] unbondingLockIds;
        // Delegate of l1Addr on L1
        address delegate;
    }

    struct MigrateSenderParams {
        // Address that is migrating from L1
        address l1Addr;
        // Address to use on L2
        // If null, l1Addr is used on L2
        address l2Addr;
        // Deposit of l1Addr on L1
        uint256 deposit;
        // Reserve of l1Addr on L1
        uint256 reserve;
    }
}

File 6 of 9 : IController.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IController {
    function owner() external view returns (address);

    function paused() external view returns (bool);

    function getContract(bytes32 _id) external view returns (address);
}

File 7 of 9 : IManager.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IManager {
    event SetController(address controller);

    function setController(address _controller) external;
}

File 8 of 9 : Manager.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import {IManager} from "./IManager.sol";
import {IController} from "./IController.sol";

// Copy of https://github.com/livepeer/protocol/blob/confluence/contracts/Manager.sol
// Tests at https://github.com/livepeer/protocol/blob/confluence/test/unit/ManagerProxy.js
contract Manager is IManager {
    // Controller that contract is registered with
    IController public controller;

    // Check if sender is controller
    modifier onlyController() {
        _onlyController();
        _;
    }

    // Check if sender is controller owner
    modifier onlyControllerOwner() {
        _onlyControllerOwner();
        _;
    }

    // Check if controller is not paused
    modifier whenSystemNotPaused() {
        _whenSystemNotPaused();
        _;
    }

    // Check if controller is paused
    modifier whenSystemPaused() {
        _whenSystemPaused();
        _;
    }

    constructor(address _controller) {
        controller = IController(_controller);
    }

    /**
     * @notice Set controller. Only callable by current controller
     * @param _controller Controller contract address
     */
    function setController(address _controller) external onlyController {
        controller = IController(_controller);

        emit SetController(_controller);
    }

    function _onlyController() private view {
        require(msg.sender == address(controller), "caller must be Controller");
    }

    function _onlyControllerOwner() private view {
        require(
            msg.sender == controller.owner(),
            "caller must be Controller owner"
        );
    }

    function _whenSystemNotPaused() private view {
        require(!controller.paused(), "system is paused");
    }

    function _whenSystemPaused() private view {
        require(controller.paused(), "system is not paused");
    }
}

File 9 of 9 : ManagerProxyTarget.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import "./Manager.sol";

/**
 * @title ManagerProxyTarget
 * @notice The base contract that target contracts used by a proxy contract should inherit from
 * @dev Both the target contract and the proxy contract (implemented as ManagerProxy) MUST inherit from ManagerProxyTarget in order to guarantee
 that both contracts have the same storage layout. Differing storage layouts in a proxy contract and target contract can
 potentially break the delegate proxy upgradeability mechanism
 */
abstract contract ManagerProxyTarget is Manager {
    // Used to look up target contract address in controller's registry
    bytes32 public targetContractId;
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"ClaimStakeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ControllerContractUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"l1Addr","type":"address"},{"indexed":false,"internalType":"address","name":"delegatorPool","type":"address"}],"name":"DelegatorPoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_delegatorPoolImpl","type":"address"}],"name":"DelegatorPoolImplUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_l1MigratorAddr","type":"address"}],"name":"L1MigratorUpdate","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"address","name":"delegate","type":"address"}],"indexed":false,"internalType":"struct IMigrator.MigrateDelegatorParams","name":"params","type":"tuple"}],"name":"MigrateDelegatorFinalized","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"}],"indexed":false,"internalType":"struct IMigrator.MigrateSenderParams","name":"params","type":"tuple"}],"name":"MigrateSenderFinalized","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256[]","name":"unbondingLockIds","type":"uint256[]"},{"internalType":"address","name":"delegate","type":"address"}],"indexed":false,"internalType":"struct IMigrator.MigrateUnbondingLocksParams","name":"params","type":"tuple"}],"name":"MigrateUnbondingLocksFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"controller","type":"address"}],"name":"SetController","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"}],"name":"StakeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"TxToL1","type":"event"},{"inputs":[],"name":"bondingManagerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"},{"internalType":"uint256","name":"_stake","type":"uint256"},{"internalType":"uint256","name":"_fees","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"address","name":"_newDelegate","type":"address"}],"name":"claimStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStakeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedDelegatedStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegatorPoolImpl","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegatorPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"address","name":"delegate","type":"address"}],"internalType":"struct IMigrator.MigrateDelegatorParams","name":"_params","type":"tuple"}],"name":"finalizeMigrateDelegator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"}],"internalType":"struct IMigrator.MigrateSenderParams","name":"_params","type":"tuple"}],"name":"finalizeMigrateSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256[]","name":"unbondingLockIds","type":"uint256[]"},{"internalType":"address","name":"delegate","type":"address"}],"internalType":"struct IMigrator.MigrateUnbondingLocksParams","name":"_params","type":"tuple"}],"name":"finalizeMigrateUnbondingLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_l1MigratorAddr","type":"address"},{"internalType":"address","name":"_delegatorPoolImpl","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l1MigratorAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleSnapshotAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"migratedDelegators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"migratedSenders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"migratedUnbondingLocks","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setClaimStakeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorPoolImpl","type":"address"}],"name":"setDelegatorPoolImpl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_l1MigratorAddr","type":"address"}],"name":"setL1Migrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"syncControllerContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"targetContractId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ticketBrokerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162003952380380620039528339818101604052810190620000379190620000ea565b80806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200011c565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b28262000085565b9050919050565b620000c481620000a5565b8114620000d057600080fd5b50565b600081519050620000e481620000b9565b92915050565b60006020828403121562000103576200010262000080565b5b60006200011384828501620000d3565b91505092915050565b613826806200012c6000396000f3fe60806040526004361061014f5760003560e01c80638a716fbb116100b6578063b76087361161006f578063b760873614610487578063cc14c988146104b0578063d0b1cba2146104d9578063d2f40c5a14610504578063e89320e514610541578063f77c47911461056c57610156565b80638a716fbb146103795780638f2c17ed146103b6578063923f475c146103e157806392eefe9b1461040a57806396f995a214610433578063b3f5ccae1461045e57610156565b8063485cc95511610108578063485cc955146102555780635118d8cf1461027e57806351720b41146102bb5780635cf207f8146102e65780635fbe4d1d1461031157806389bec3441461033c57610156565b80631a0725d81461015b57806324583d97146101845780633aceba5d146101ad5780633f1c49cc146101ea5780633f23f8de146102135780634413a2e71461022a57610156565b3661015657005b600080fd5b34801561016757600080fd5b50610182600480360381019061017d919061261f565b610597565b005b34801561019057600080fd5b506101ab60048036038101906101a691906126aa565b610cf8565b005b3480156101b957600080fd5b506101d460048036038101906101cf91906126aa565b610d7b565b6040516101e191906126f2565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c91906127a8565b610d9b565b005b34801561021f57600080fd5b506102286112a8565b005b34801561023657600080fd5b5061023f61193e565b60405161024c9190612851565b60405180910390f35b34801561026157600080fd5b5061027c6004803603810190610277919061286c565b611964565b005b34801561028a57600080fd5b506102a560048036038101906102a091906126aa565b6119fa565b6040516102b291906128bb565b60405180910390f35b3480156102c757600080fd5b506102d0611a12565b6040516102dd91906128ef565b60405180910390f35b3480156102f257600080fd5b506102fb611a18565b6040516103089190612851565b60405180910390f35b34801561031d57600080fd5b50610326611a3e565b6040516103339190612851565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e919061290a565b611a64565b60405161037091906126f2565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b91906126aa565b611a93565b6040516103ad91906126f2565b60405180910390f35b3480156103c257600080fd5b506103cb611ab3565b6040516103d89190612851565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190612976565b611ad9565b005b34801561041657600080fd5b50610431600480360381019061042c91906126aa565b611b35565b005b34801561043f57600080fd5b50610448611bb7565b60405161045591906126f2565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906129c2565b611bca565b005b34801561049357600080fd5b506104ae60048036038101906104a991906126aa565b611e66565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190612a0e565b611ee9565b005b3480156104e557600080fd5b506104ee61217e565b6040516104fb9190612851565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906126aa565b6121a4565b6040516105389190612851565b60405180910390f35b34801561054d57600080fd5b506105566121d7565b6040516105639190612851565b60405180910390f35b34801561057857600080fd5b506105816121fd565b60405161058e9190612ab6565b60405180910390f35b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166105c381612221565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062790612b2e565b60405180910390fd5b6008600083600001602081019061064791906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156106cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c690612b9a565b60405180910390fd5b6001600860008460000160208101906106e891906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508160a001602081019061074c91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1682600001602081019061077591906126aa565b73ffffffffffffffffffffffffffffffffffffffff161415610a18576107c482604001358360200160208101906107ac91906126aa565b8460200160208101906107bf91906126aa565b61224a565b6000826040013583606001356107da9190612be9565b90506000600a60008560000160208101906107f591906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261083b9190612be9565b90506000811115610a11576000610873600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661237f565b9050806009600087600001602081019061088d91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610922828287602001602081019061091d91906126aa565b61224a565b8073ffffffffffffffffffffffffffffffffffffffff1663c4d66de8600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161097d9190612851565b600060405180830381600087803b15801561099757600080fd5b505af11580156109ab573d6000803e3d6000fd5b505050508460000160208101906109c291906126aa565b73ffffffffffffffffffffffffffffffffffffffff167ff8a0d4273560c59d7022f3feaae470fc5b68c55cff078a6ab7e618203b53041882604051610a079190612851565b60405180910390a2505b5050610b80565b6000600960008460a0016020810190610a3191906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b4a578073ffffffffffffffffffffffffffffffffffffffff1663aad3ec96846020016020810190610af191906126aa565b85604001356040518363ffffffff1660e01b8152600401610b13929190612c1d565b600060405180830381600087803b158015610b2d57600080fd5b505af1158015610b41573d6000803e3d6000fd5b50505050610b7e565b610b7d8360400135846020016020810190610b6591906126aa565b8560a0016020810190610b7891906126aa565b61224a565b5b505b8160400135600a60008460a0016020810190610b9c91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610be59190612c46565b92505081905550600082608001351115610cbd576000826020016020810190610c0e91906126aa565b73ffffffffffffffffffffffffffffffffffffffff168360800135604051610c3590612ccd565b60006040518083038185875af1925050503d8060008114610c72576040519150601f19603f3d011682016040523d82523d6000602084013e610c77565b606091505b5050905080610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290612d2e565b60405180910390fd5b505b7fab2cb96eeb8726c709227935b01f6a5c6f7e9b518ab69eda0670c7ceda752d1a82604051610cec9190612e45565b60405180910390a15050565b610d00612454565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff274fcfe10d70df2c1a3555476ecfb830e80115781fd0c9a10024291df991b2f81604051610d709190612851565b60405180910390a150565b600c6020528060005260406000206000915054906101000a900460ff1681565b600760149054906101000a900460ff16610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190612eac565b60405180910390fd5b6000339050600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390612f18565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600082898989604051602001610ebc9493929190612fa1565b6040516020818303038152906040528051906020012090508173ffffffffffffffffffffffffffffffffffffffff16630a02831c7facef05f736f89c16facc0f940c13f4c3a386cf48a9b54b50f59defd8b301c40a8888856040518563ffffffff1660e01b8152600401610f339493929190613070565b60206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8391906130c5565b610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb99061313e565b60405180910390fd5b6001600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146111fa5787600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461109d9190612c46565b925050819055506000600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008a9050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614611145578590505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146111eb578173ffffffffffffffffffffffffffffffffffffffff1663aad3ec96868c6040518363ffffffff1660e01b81526004016111b4929190612c1d565b600060405180830381600087803b1580156111ce57600080fd5b505af11580156111e2573d6000803e3d6000fd5b505050506111f7565b6111f68a868361224a565b5b50505b600087111561124b578273ffffffffffffffffffffffffffffffffffffffff166108fc889081150290604051600060405180830381858888f19350505050158015611249573d6000803e3d6000fd5b505b8273ffffffffffffffffffffffffffffffffffffffff167fc08c27d872ca12215b2df3f441676fe2c084a204a487086d7436a4ac433d417a8a8a8a6040516112959392919061315e565b60405180910390a2505050505050505050565b60007f2517d59a36a86548e38734e8ab416f42afff4bca78706a66ad65750dae7f9e37905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b815260040161132991906128ef565b60206040518083038186803b15801561134157600080fd5b505afa158015611355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137991906131aa565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461144b5780600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d82826040516114429291906131d7565b60405180910390a15b60007fbd1aa3e8d2464256d7fd3dcf645c16418d5d8c51d971f1ad7d57e7b1b5eee239905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b81526004016114cc91906128ef565b60206040518083038186803b1580156114e457600080fd5b505afa1580156114f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151c91906131aa565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115ee5780600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d82826040516115e59291906131d7565b60405180910390a15b60007fb6138afe6f306a47bdf645c5aebcb9781efe787d221a1880e62d1f76dae58b84905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b815260040161166f91906128ef565b60206040518083038186803b15801561168757600080fd5b505afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf91906131aa565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117915780600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d82826040516117889291906131d7565b60405180910390a15b60007f3443e257065fe41dd0e4d1f5a1b73a22a62e300962b57f30cddf41d0f8273ba7905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b815260040161181291906128ef565b60206040518083038186803b15801561182a57600080fd5b505afa15801561183e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186291906131aa565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119345780600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d828260405161192b9291906131d7565b60405180910390a15b5050505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61196c612454565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119f66112a8565b5050565b600a6020528060005260406000206000915090505481565b60015481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60086020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ae1612454565b80600760146101000a81548160ff0219169083151502179055507f370171e543b14c71782f52c505a6b233744e5b2a35486e12ddf379221e49dfaf81604051611b2a91906126f2565b60405180910390a150565b611b3d612561565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f7081604051611bac9190612851565b60405180910390a150565b600760149054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611bf681612221565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a90612b2e565b60405180910390fd5b600c6000836000016020810190611c7a91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf99061324c565b60405180910390fd5b6001600c6000846000016020810190611d1b91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663989f789c83606001358460400135611dbe9190612c46565b846020016020810190611dd191906126aa565b856040013586606001356040518563ffffffff1660e01b8152600401611df99392919061315e565b6000604051808303818588803b158015611e1257600080fd5b505af1158015611e26573d6000803e3d6000fd5b50505050507f71adb0cec7763a4cfefd893fc873369117ed172979f7b8f7b683f6a5787c52c082604051611e5a91906132e1565b60405180910390a15050565b611e6e612454565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe51b4d409fd6629b39368b4863ab2212c8e0e0a970dccfaa5800888e507ce79d81604051611ede9190612851565b60405180910390a150565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611f1581612221565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990612b2e565b60405180910390fd5b6000828060600190611f94919061330b565b9050905060005b8181101561210e576000848060600190611fb5919061330b565b83818110611fc657611fc561336e565b5b905060200201359050600b6000866000016020810190611fe691906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff161561207f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612076906133e9565b60405180910390fd5b6001600b600087600001602081019061209891906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061210690613409565b915050611f9b565b50612142836040013584602001602081019061212a91906126aa565b85608001602081019061213d91906126aa565b61224a565b7f9e36876ab9fc404649651fb29b8aebacf24393e00799e53abef98a59c5a003948360405161217191906135d1565b60405180910390a1505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007311110000000000000000000000000000000011118261224391906135f3565b9050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b382866040518363ffffffff1660e01b81526004016122ce929190612c1d565b600060405180830381600087803b1580156122e857600080fd5b505af11580156122fc573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663ee4e804a8585856000806000806040518863ffffffff1660e01b8152600401612347979695949392919061363d565b600060405180830381600087803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b5050505050505050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f0915050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561244f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612446906136f8565b60405180910390fd5b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124ba57600080fd5b505afa1580156124ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f291906131aa565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690613764565b60405180910390fd5b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e6906137d0565b60405180910390fd5b565b600080fd5b600080fd5b600080fd5b600060c08284031215612616576126156125fb565b5b81905092915050565b600060c08284031215612635576126346125f1565b5b600061264384828501612600565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126778261264c565b9050919050565b6126878161266c565b811461269257600080fd5b50565b6000813590506126a48161267e565b92915050565b6000602082840312156126c0576126bf6125f1565b5b60006126ce84828501612695565b91505092915050565b60008115159050919050565b6126ec816126d7565b82525050565b600060208201905061270760008301846126e3565b92915050565b6000819050919050565b6127208161270d565b811461272b57600080fd5b50565b60008135905061273d81612717565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261276857612767612743565b5b8235905067ffffffffffffffff81111561278557612784612748565b5b6020830191508360208202830111156127a1576127a061274d565b5b9250929050565b60008060008060008060a087890312156127c5576127c46125f1565b5b60006127d389828a01612695565b96505060206127e489828a0161272e565b95505060406127f589828a0161272e565b945050606087013567ffffffffffffffff811115612816576128156125f6565b5b61282289828a01612752565b9350935050608061283589828a01612695565b9150509295509295509295565b61284b8161266c565b82525050565b60006020820190506128666000830184612842565b92915050565b60008060408385031215612883576128826125f1565b5b600061289185828601612695565b92505060206128a285828601612695565b9150509250929050565b6128b58161270d565b82525050565b60006020820190506128d060008301846128ac565b92915050565b6000819050919050565b6128e9816128d6565b82525050565b600060208201905061290460008301846128e0565b92915050565b60008060408385031215612921576129206125f1565b5b600061292f85828601612695565b92505060206129408582860161272e565b9150509250929050565b612953816126d7565b811461295e57600080fd5b50565b6000813590506129708161294a565b92915050565b60006020828403121561298c5761298b6125f1565b5b600061299a84828501612961565b91505092915050565b6000608082840312156129b9576129b86125fb565b5b81905092915050565b6000608082840312156129d8576129d76125f1565b5b60006129e6848285016129a3565b91505092915050565b600060a08284031215612a0557612a046125fb565b5b81905092915050565b600060208284031215612a2457612a236125f1565b5b600082013567ffffffffffffffff811115612a4257612a416125f6565b5b612a4e848285016129ef565b91505092915050565b6000819050919050565b6000612a7c612a77612a728461264c565b612a57565b61264c565b9050919050565b6000612a8e82612a61565b9050919050565b6000612aa082612a83565b9050919050565b612ab081612a95565b82525050565b6000602082019050612acb6000830184612aa7565b92915050565b600082825260208201905092915050565b7f4f4e4c595f434f554e544552504152545f474154455741590000000000000000600082015250565b6000612b18601883612ad1565b9150612b2382612ae2565b602082019050919050565b60006020820190508181036000830152612b4781612b0b565b9050919050565b7f44454c454741544f525f414c52454144595f4d49475241544544000000000000600082015250565b6000612b84601a83612ad1565b9150612b8f82612b4e565b602082019050919050565b60006020820190508181036000830152612bb381612b77565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bf48261270d565b9150612bff8361270d565b925082821015612c1257612c11612bba565b5b828203905092915050565b6000604082019050612c326000830185612842565b612c3f60208301846128ac565b9392505050565b6000612c518261270d565b9150612c5c8361270d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9157612c90612bba565b5b828201905092915050565b600081905092915050565b50565b6000612cb7600083612c9c565b9150612cc282612ca7565b600082019050919050565b6000612cd882612caa565b9150819050919050565b7f46494e414c495a455f44454c454741544f523a4641494c5f4645450000000000600082015250565b6000612d18601b83612ad1565b9150612d2382612ce2565b602082019050919050565b60006020820190508181036000830152612d4781612d0b565b9050919050565b6000612d5d6020840184612695565b905092915050565b612d6e8161266c565b82525050565b6000612d83602084018461272e565b905092915050565b612d948161270d565b82525050565b60c08201612dab6000830183612d4e565b612db86000850182612d65565b50612dc66020830183612d4e565b612dd36020850182612d65565b50612de16040830183612d74565b612dee6040850182612d8b565b50612dfc6060830183612d74565b612e096060850182612d8b565b50612e176080830183612d74565b612e246080850182612d8b565b50612e3260a0830183612d4e565b612e3f60a0850182612d65565b50505050565b600060c082019050612e5a6000830184612d9a565b92915050565b7f434c41494d5f5354414b455f44495341424c4544000000000000000000000000600082015250565b6000612e96601483612ad1565b9150612ea182612e60565b602082019050919050565b60006020820190508181036000830152612ec581612e89565b9050919050565b7f434c41494d5f5354414b453a414c52454144595f4d4947524154454400000000600082015250565b6000612f02601c83612ad1565b9150612f0d82612ecc565b602082019050919050565b60006020820190508181036000830152612f3181612ef5565b9050919050565b60008160601b9050919050565b6000612f5082612f38565b9050919050565b6000612f6282612f45565b9050919050565b612f7a612f758261266c565b612f57565b82525050565b6000819050919050565b612f9b612f968261270d565b612f80565b82525050565b6000612fad8287612f69565b601482019150612fbd8286612f69565b601482019150612fcd8285612f8a565b602082019150612fdd8284612f8a565b60208201915081905095945050505050565b600082825260208201905092915050565b600080fd5b82818337600083830152505050565b60006130208385612fef565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561305357613052613000565b5b602083029250613064838584613005565b82840190509392505050565b600060608201905061308560008301876128e0565b8181036020830152613098818587613014565b90506130a760408301846128e0565b95945050505050565b6000815190506130bf8161294a565b92915050565b6000602082840312156130db576130da6125f1565b5b60006130e9848285016130b0565b91505092915050565b7f434c41494d5f5354414b453a494e56414c49445f50524f4f4600000000000000600082015250565b6000613128601983612ad1565b9150613133826130f2565b602082019050919050565b600060208201905081810360008301526131578161311b565b9050919050565b60006060820190506131736000830186612842565b61318060208301856128ac565b61318d60408301846128ac565b949350505050565b6000815190506131a48161267e565b92915050565b6000602082840312156131c0576131bf6125f1565b5b60006131ce84828501613195565b91505092915050565b60006040820190506131ec60008301856128e0565b6131f96020830184612842565b9392505050565b7f53454e4445525f414c52454144595f4d49475241544544000000000000000000600082015250565b6000613236601783612ad1565b915061324182613200565b602082019050919050565b6000602082019050818103600083015261326581613229565b9050919050565b6080820161327d6000830183612d4e565b61328a6000850182612d65565b506132986020830183612d4e565b6132a56020850182612d65565b506132b36040830183612d74565b6132c06040850182612d8b565b506132ce6060830183612d74565b6132db6060850182612d8b565b50505050565b60006080820190506132f6600083018461326c565b92915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613328576133276132fc565b5b80840192508235915067ffffffffffffffff82111561334a57613349613301565b5b60208301925060208202360383131561336657613365613306565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f554e424f4e44494e475f4c4f434b5f414c52454144595f4d4947524154454400600082015250565b60006133d3601f83612ad1565b91506133de8261339d565b602082019050919050565b60006020820190508181036000830152613402816133c6565b9050919050565b60006134148261270d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561344757613446612bba565b5b600182019050919050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261347e5761347d61345c565b5b83810192508235915060208301925067ffffffffffffffff8211156134a6576134a5613452565b5b6020820236038413156134bc576134bb613457565b5b509250929050565b600082825260208201905092915050565b60006134e183856134c4565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561351457613513613000565b5b602083029250613525838584613005565b82840190509392505050565b600060a083016135446000840184612d4e565b6135516000860182612d65565b5061355f6020840184612d4e565b61356c6020860182612d65565b5061357a6040840184612d74565b6135876040860182612d8b565b506135956060840184613461565b85830360608701526135a88382846134d5565b925050506135b96080840184612d4e565b6135c66080860182612d65565b508091505092915050565b600060208201905081810360008301526135eb8184613531565b905092915050565b60006135fe8261264c565b91506136098361264c565b92508273ffffffffffffffffffffffffffffffffffffffff0382111561363257613631612bba565b5b828201905092915050565b600060e082019050613652600083018a6128ac565b61365f6020830189612842565b61366c6040830188612842565b6136796060830187612842565b6136866080830186612842565b61369360a0830185612842565b6136a060c0830184612842565b98975050505050505050565b7f455243313136373a20637265617465206661696c656400000000000000000000600082015250565b60006136e2601683612ad1565b91506136ed826136ac565b602082019050919050565b60006020820190508181036000830152613711816136d5565b9050919050565b7f63616c6c6572206d75737420626520436f6e74726f6c6c6572206f776e657200600082015250565b600061374e601f83612ad1565b915061375982613718565b602082019050919050565b6000602082019050818103600083015261377d81613741565b9050919050565b7f63616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000600082015250565b60006137ba601983612ad1565b91506137c582613784565b602082019050919050565b600060208201905081810360008301526137e9816137ad565b905091905056fea264697066735822122066b86eceb7ddfc038bc8e5be0f564cb4e2c604e36eababd132fa6d053e0abd6864736f6c63430008090033000000000000000000000000d8e8328501e9645d16cf49539efc04f734606ee4

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d8e8328501e9645d16cf49539efc04f734606ee4

-----Decoded View---------------
Arg [0] : _controller (address): 0xd8e8328501e9645d16cf49539efc04f734606ee4

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d8e8328501e9645d16cf49539efc04f734606ee4


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.